函数的参数和变量类型
- parameter:形参; argument:实参
- 函数文档:‘函数下面第一行进行解释函数内容’,funtion_name.doc 可以返回函数文档
- 关键字参数:
>>> def saysome(name, words):
print(name + '->' + words)
>>> saysome('李宁', '一切皆有可能')
李宁->一切皆有可能
>>> saysome('一切皆有可能', '李宁')
一切皆有可能->李宁
>>> saysome(words = '一切皆有可能', name = '李宁')
李宁->一切皆有可能
- 默认参数:在函数定义的时候赋予初值,如果忘了传递参数,它就会使用初值
>>> def saysome(name = '苍井空', words = '我脱光衣服躺在镜头前是为了生存,而你衣冠楚楚的站在镜头前,却只是为了私欲和欺骗!'):
print(name + '->' + words)
>>> saysome()
苍井空->我脱光衣服躺在镜头前是为了生存,而你衣冠楚楚的站在镜头前,却只是为了私欲和欺骗
- 收集参数:可变参数,不清楚函数需要几个参数,系统默认将收集参数存为一个元组,所以可以很多个
>>> def test(*parameter):
print('参数的长度是:',len(parameter))
print('第二个参数是:',parameter[1])
>>> test(1,'小甲鱼', 3.14, 36, '44')
参数的长度是: 5
第二个参数是: 小甲鱼
- 在收集参数和确定参数同时使用时,在调用函数时,应用关键字参数进行调用确定参数,否则它会将默认全为收集参数
- print(*objects, sep=’’,end=’\n’,file=sys.stdout,flush=False) : 这是print()函数的定义方式
- 函数和过程:Python只有函数没有过程,过程可以理解为没有返回值的函数
- Return 返回多个返回值时,用列表[1,2,3]、元组(1,2,3)即可
- 局部变量(Local)和全局(Global)变量
- 函数内部对全局变量重新赋值,Python会自动在栈里面创建一个相同名字的局部变量,函数运行完不会影响原来的全局变量。但是如果是调用全局变量,进行一些操作,比如说逆序,排序之类的,还是会影响的
- global 关键字:在按函数中可以修改全局变量,只需要用global关键字即可
内嵌函数和闭包
- 内嵌函数:定义一个函数的时候,里面可以再定义一个函数,需要注意作用于,内部函数作用域在外部函数之内
>>> def fun1():
print("我正调用fun1()")
def fun2():
print("我正调用fun2()")
fun2()
>>> fun1()
我正调用fun1()
我正调用fun2()
>>> fun2
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
fun2
NameError: name 'fun2' is not defined
- 闭包:编程范式:closure :下面的funy()就是一个闭包,它返回的是函数 Return funy!!!
>>> def funx(x):
def funy(y):
return x * y
return funy
>>> i = funx(8)
>>> i
<function funx.<locals>.funy at 0x000001BB9F4B65E0>
>>> type(i)
<class 'function'>
>>> i(5)
40
>>> funx(8)(5)
40
- Return fun2() 和 Return fun是不同的,前者是返回fun2()运算后的结果,不加就是返回fun2这个函数
- nonlocal:在内嵌函数(假设一共两层)想使用外层函数的变量时,可以用这个声明它是非局部变量,这里只涉及内外层,而不涉及全局变量。
lambda表达式->(匿名函数)
- g = lambda x : 2 * x + 1;g(5) -> 11 # 对于使用次数不太多的函数可以这样定义,易读
>>> lambda x,y : x+y
<function <lambda> at 0x0000024C474355E0>
>>> a = lambda x,y : x+y
>>> a(5,6)
11
两个牛逼的BIF
- filter()函数:返回经过函数运算后是真的运算结果。第一个参数为None时,筛选出真的值
>>> odd = lambda x : x % 2
>>> show = filter(odd,[i for i in range(1,101)])
>>> list(show)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
可以改写成一行:
list(filter(lambda x : x % 2, [i for i in range(1,101)]))
- map():映射:将第二个可迭代数据进行第一个函数的运算后输出
list(map(lambda x : x * 2, range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]