python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程
1. 函数定义
deftest(x)#discription
y = 2 *xreturn y
返回一个值,则返回原本的object;
过程与函数的区别,过程无return返回值,但是python会自动赋予一个None返回值。
deftest(x)#discription
y = 2 *xprint(y)
若返回多个值,python会将多个元素包装成一个元组,并返回。即实际上仍然只返回一个值。
函数只要碰到第一个return就会结束调用。
2. 传参数的方法
位置参数,一一对应
关键字参数,不须一一对应
test(x=5)
混用位置参数与关键字参数时,位置参数必须位于关键字参数前面,且同一个形参不能传多个值。
3. 参数组
可变长短的参数,*args,**kwargs
*的作用就是for循环取参数
def test(x,*args)print(x)print(args[1])
test(1,2,3,4,5,6)
test(1,[2,3,4,5]) #传入整个列表作为一个整体
test(1,*[2,3,4,5]) #传入列表中的单个元素
**kwargs处理键值对,字典
def test(x,**kwargs)print(x)print(kwargs)
test(1,y=2,z=3)
连起来用,*args必须位于**kwargs前面
def test(x,*args,**kwargs)print(x)print(args)print(kwargs)
test(1,2,3,5,66,y=2,z=3)
test(1,*[1,1,2,3],**{'y':1})
4. 默认参数
如果定义函数时指定了默认参数,则在调用时可指定该参数,也可忽略该参数。
def test(x,y,z=2):print(x,y,z)
test(1,2)
test(1,2,5)
5. 递归函数
递归类似函数递推公式:
#recursion
defcalc(n):print(n)if int(n/2) ==0:returnnelse:return calc(int(n/2))
calc(10)
函数递归调用过程如下图所示,递归函数重复调用自身,相当于重复调用子函数,当最终嗲用结束时,最内层的子函数返回值逐层返回给各个子函数
6. 函数作用域
一个函数在调用时,不管在哪里调用,都只与该函数在定义时有关系。嵌套定义的函数必须从外层到内层逐层调用,不可只运行嵌套定义的子函数。
deffoo():
name= 'abc'
defbar():
name= 'xyz'
print(name)deftt():print(name)returnttreturnbarprint(foo()()())
7. 匿名函数
匿名函数使用lambda关键词定义,需将lambda赋值给一个变量才能调用该匿名函数,lambda会自动将冒号后面的内容return返回给函数句柄。
#the next two functions are of the same function#first
defcalc(x):return x+1
#second
func = lambda x:x+1
#lambda(10) is wrong
print(func(10))
lambda匿名函数的定义相当于一个值,如果不赋值给一个变量,则此匿名函数会在定义后在内存里立即被释放
lambda函数不能返回复杂逻辑,只能返回一行,一个确定的最终的结果
若需要返回多个值,则需要手动组成一个元组,这里与用def定义的函数不同
lambda x,y,z:(x+1,y+1,z+1)
8. 编程风格(方法论)
面向过程编程
函数式编程不用变量保存状态,不修改变量
函数即变量地址
高阶函数:函数接收的参数是函数名,或函数的返回值中包含函数
尾调用优化:函数在最后一步调用另一个函数
面向对象编程