python 基础笔记二 函数
- 函数传参
- 位置传参
- 默认传参
- 关键字传参
- 收集参数
“*” 将参数收集为元组
“**” 将参数收集为集合
- 所有的函数都有返回值。默认为 None
- 可以使用元组或列表一次返回多个值。
- 全局变量和局部变量
函数内试图直接修改全局变量,Python会创建一个新的局部变量代替,名字与全局变量相同。而真正的全局变量不变
局部变量不可在作用域函数外被访问。python在运行函数时,利用栈(Stack)进行存储,当执行完函数后,函数相关的值将会被全部删除。 - global 关键字
在函数内部修改全局变量 - 闭包
如果在一个内部函数里,对外部函数的变量进行引用,则内部函数被认为是一个闭包。
py
>>> def funX(x):
... def funY(y):
... return x*y
... return funY
...
>>> i = funX(8)
>>> i(5)
40
>>> funX(5)(8)
40
x被称为自有变量,funY被称为闭包,x是闭包携带的自有变量。当funX被回收后,x因为被闭包引用所以依旧存在。
闭包中不可以修改外部函数的变量 - nonlocal 关键字
在闭包中修改外部函数的变量值
py
>>> def fun1():
... x=5
... def fun2():
... nonlocal x
... x *= x
... return x
... return fun2
...
>>> fun1()()
25
- 匿名函数 lambda
py
>>> def fun(x,y):
... return x+y
...
>>> fun(1,2)
3
>>> fun = lambda x,y:x+y
>>> fun(3,4)
7
- filter(fun or none,iterable) 过滤器
py
>>> list(map(lambda x:x%2,range(10)))
[1, 3, 5, 7, 9]
filter的函数可以为none,none时直接返回可迭代对象中所有为true的值筛选出来
py3中返回值是一个filter对象,可以使用list()转换
py2中返回值是一个list - map(fun,iterable)
py
>>> list(map(lambda x:x*2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
map的函数不可以为none,必须存在。 - 可迭代对象和迭代器
常见的序列(列表,元组,字符串)和字典等被称为可迭代对象
迭代器是通过对可迭代对象使用 iter() 方法获得
py
>>> name = [1,2,3,4]
>>> it = iter(name)
>>> type(it)
<class 'list_iterator'>
>>> type(name)
<class 'list'>
>>> next(name)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not an iterator
>>> next(it)
1
>>> next(it)
2
上面例子可以看出迭代器的类型为 list_iterator,而可迭代对象的类型为 list
可迭代对象并不具备 next() 方法。