Lesson 17 | 用return返回函数值时,return()直接放返回的内容 |
Lesson 18 | 函数文档是函数下面的第一行注释。用‘ ’包括 |
| 可以用函数.__doc__调用,也可以用help(函数)调用。用help时,格式会美观 |
| 默认参数实在函数定义是,写入括号的。 |
| 在参数前面加*号,表示收集参数(即没有制定个数的参数) |
| 收集参数本质上是个打包的元组,所以用,隔开 |
| 如果有收集参数,则其他参数最好设默认值,否则所有参数有可能都会给去收集参数,并报错,因为其他参数没有赋值。其他参数也可以用关键值设置 |
Lesson 19 | 局部变量只在其所在的函数域中有效。当函数执行时,所有的局部变量都放在一个栈中。函数执行完后,该栈被清理。所以其他语句根本不能访问里面的局部变量 |
| 与其相对,有全局变量。作用域时整个语句/模块。在函数中可以访问全局变量,但若要修改,可能出现问题。因为在函数内试图修改时,Python会直接创建一个新的局部变量,名字和外部的全局变量而已。与外部的全局变量互不影响。(全局变量不储存在栈中) |
| |
Lesson 20 | Global,如果在函数里需要修改全局变量,在函数里添加 Global xxx语句,然后再修改。就可以。这种操作方式不推荐 |
| e.g |
| >>> count=5 |
| >>> def changeCount(): |
| global count |
| count=100 |
| print("Count in the function",count) |
| return count |
| 运行后,全局变量变成了100。如果没有global count,函数内部会创建一个count的局部变量。函数内部运算不改变外部count全局函数。 |
| |
| 闭包:函数可以嵌套。如果内部函数只引用其外部函数内的变量。这个函数就是闭包。外部函数的变量对于内部函数就类似全局变量和函数内变量的关系。一般不能在内部函数内对其改变。P3.3以后,定义了nonlocal关键字。可以进行修改了。类似使用global来改变本地函数。 |
| |
| 下列例子比较: |
| 怎样访问内部funIn函数? |
<1> | def funOut(): |
| def funIn(): |
| print('宾果!你成功访问到我啦!') |
| return funIn() |
| |
| 回答: |
| funOut() |
| |
<2> | def funOut(): |
| def funIn(): |
| print('宾果!你成功访问到我啦!') |
| return funIn |
| 回答: |
| funOut()() |
| 感觉类似代数。此例中funOut()=>funIn. 要访问funIn()就再加一个() |
| |
| |
| |
Lesson 21 | 匿名函数 |
| lambda x: x if x/2=0 else None |
| 冒号前面时原函数参数,冒号后面是原函数的返回值 |
| 要使用Lambda函数,只需要把它赋值给变量。 A=lambda x: x if x/2=0 else None |
| A(5)就可以调用这个函数了。用完后,内存直接回收。 参数可以多个,用逗号隔开。
比如g=Lambda x,y:x+y
g(3,4) |
| Filter 和map功能强大,比较实用 |
| Filter可以和lambda合作把符合规则的内容变成元组 |
| map可以把他们变成列表 |
| |
| Filter过滤器,把任何非true的项目过滤 |
| show=filter(odd,temp),讲座例子中,odd是函数,引用时不用加() |
| |
| map是映射。将函数的序列作为每一个运算的参数进行加工 |
| list(map(lambdax:x*2,range(10)))-即把range(10)中的数据一一代入function |
| >>> list(map(lambda x, y : [x, y], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]))
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
map()后面可以接受多个序列作为参数 |
| 列表推导式: |
| [I for I in range(1,100) if not (i%3)] |
Lesson 22 | 递归 |
| 设置递归层数 |
| import sys |
| sys.setrecursionlimit(10000) |
| 递归本质就是调用自己,但参数少1只到回到起点。 |
| 因为写的时候是,逻辑是从最大的参数(比如n)向起点(比如1)递归和一般思考的逻辑方向相反。举例如下 |
| Def factorial(n) |
| result =n |
| if n==1: |
| return 1 |
| else |
| return n*factorial(n-1) |
| 如果=5则计算5*4*3*2*1 |
| 从5*f(4)=>5*4*f(3)……>5*4*3*2*f(1). 而f(1)直接就是1,完成整个计算 |
| 从上到下是执行过程。从下到上是返回值的过程。 |
| factorial(5)=5*factorial(4) |
| factorial(4)=4*factorial(3) |
| factorial(3)=3*factorial(2) |
| factorial(2)=2*factorial(1) |
| factorial(1)=1 (第一条if语句) |
| 递归不断调用自己,创建栈,是非常消耗资源的。 |
| 如果递归忘了底层的返回(菜鸟易犯的错误),则会不停调用知道内存满或达到递归层数限制 |