函数 定义及调用 定义函数:用关键字def
,注意加冒号
1 2 >>> def Function (): print ('我是一个函数' )
调用函数:写函数名字,再加上小括号
形参及实参 在函数的参数中分 形式参数(parameter)及 实际参数(argument)
1 2 3 4 5 >>> def MyFirstFunction (xingcan ): print ('传递进来的参数' + xingcan) >>> MyFirstFunction('shican' )传递进来的参数shican
函数文档 用来给函数解释说明用的,定义是在函数里用引号引起来
也可以通过 help 来查看
1 2 3 4 5 6 7 8 >>> def MyFirstFunction (xingcan ): '这是一个文档' print ('传递进来的参数' + xingcan) >>> MyFirstFunction.__doc__'这是一个文档'
关键字参数 如果你的参数调换了位置,还想匹配形参,那么可以用这个方法
1 2 3 4 5 6 7 >>> def f1 (a,b ): print (a + '是个' + b) >>> f1("我" ,'帅哥' )我是个帅哥 >>> f1(b = "帅哥" ,a = "我" )我是个帅哥
收集参数 如果你也不知道形参到底有多少个的话,可以这么建立函数
1 2 3 4 5 >>> def f1 (*params ): print ('形参有' ,len (params) , '个' ) >>> f1('1' ,1 ,22 ,3 ,4 ,6 )形参有 6 个
常见有形式参数的有 print
函数的返回值 1 2 3 4 5 6 7 8 9 10 >>> def hello (): print ('hello fishC' ) >>> hello()hello fishC >>> hello<function hello at 0x000001E6039C4948 > >>> temp = hello()hello fishC >>> print (temp)None
全局变量与函数 如果你想试图用函数来改变全局变量的值,这是不被允许的
1 2 3 4 5 6 7 8 >>> count = 1 >>> def MyFunction (): count= 2 print (count) >>> MyFunction()2 >>> print (count)1
如果你想改变全局的值,用关键字global
来声明一下
1 2 3 4 5 6 7 8 9 10 11 >>> count = 1 >>> def MyFunction (): global count count= 2 print (count) >>> print (count)1 >>> MyFunction()2 >>> print (count)2
内嵌函数和闭包 1 2 3 4 5 6 7 8 >>> def fx (x ): def fy (y ): return x * y return fy >>> i = fx(5 )>>> i(8 )40
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 >>> def fx (): x = 5 def fy (): x *= x return x return fy() >>> fx()Traceback (most recent call last): File "<pyshell#33>" , line 1 , in <module> fx() File "<pyshell#32>" , line 6 , in fx return fy() File "<pyshell#32>" , line 4 , in fy x *= x UnboundLocalError: local variable 'x' referenced before assignment >>> def fx (): x = 5 def fy (): nonlocal x x *= x return x return fy() >>> fx()25
匿名函数 lambda 我们首先那一条直线方程来说明
1 2 3 4 5 6 7 >>> def ds (x ): return 2 * x + 1 >>> ds(5 )11 >>> lambda x : 2 * x + 1 <function <lambda > at 0x000001743018B168 >
可以看到lambda
表达式,冒号前面是变量,后边是执行的函数体
如果想调用的话,就把这个表达式复制,然后调用即可
1 2 3 >>> f = lambda x : 2 * x + 1 >>> f(5 )11
如果是多参数的话就可以用逗号隔开参数
1 2 3 >>> f1 = lambda x,y : x+ y>>> f1(5 ,6 )11
lambda 的优点:
省下函数定义的过程
不用考虑给孩子起名字
简化代码
两个牛逼的 BIF 函数 Filter 过滤器 实质:是把非 true 的结果统统过滤掉,只保留 true 的结果
1 2 3 4 5 6 >>> filter (None ,[False ,0 ,'' ,True ,1 ])<filter object at 0x0000017430203E48 > >>> list (filter (None ,[False ,0 ,'' ,True ,1 ]))[True , 1 ]
再来看一个实用的
1 2 3 4 5 6 7 >>> def odd (x ): return x % 2 >>> temp = range (10 )>>> show = filter (odd,temp)>>> list (show)[1 , 3 , 5 , 7 , 9 ]
结合 lambda 实现简洁代码
1 2 >>> list (filter (lambda x:x % 2 ,range (10 )))[1 , 3 , 5 , 7 , 9 ]
map 映射 我理解为加工车间
1 2 >>> list (map (lambda x:x * 2 ,range (10 )))[0 , 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 ]
递归 设置递归的深度
1 2 >>> import sys>>> sys.setrecursionlimit(10000 )
递归要有结束的条件
还要调用自己
缺点:
消耗空间、时间,效率低
斐波那契
1 2 3 4 5 6 7 8 9 10 11 >>> def f1 (n ): if n == 1 : return 1 elif (n == 2 ): return 1 else : return f1(n-1 ) + f1(n-2 ) >>> f1(12 )144
汉诺塔问题 1 2 3 4 5 6 7 8 9 def hanoi (n,x,y,z ): if (n == 1 ): print (x ,'->' ,z) else : hanoi(n-1 ,x,z,y) print (x,'->' ,z) hanoi(n-1 ,y,x,z) n = int (input ('输入多少个盘子:' )) hanoi(n,"x" ,'y' ,'z' )