一 、匿名函数
有些时候,我们不需要显式的定义函数,可以使用匿名函数临时快速定义函数。
lambda x: x * x
关键字lambda表示匿名函数,冒号前面的x表示函数的参数,多个参数用','隔开,返回值就是表达式的结果。
二 、递归函数
递归函数就是在函数内部调用函数本身。如:
def fact(n): if n==1: return 1 return n * fact(n - 1)
递归函数必须有终止条件,否则会导致无限递归,使栈溢出。python的递归最大深度为1000,但会在深度为998左右出现报错。
递归使用:
1. 遍历某文件夹中所有文件
import os def read(filepath, n): files = os.listdir(filepath) # 获取到当前文件夹中的所有文件 for fi in files: # 遍历文件夹中的文件,这里获取的只是本层文件名 fi_d = os.path.join(filepath, fi) if os.path.isdir(fi_d): # 如果该路径下的文件是文件夹 print(" "*n, fi) read(fi_d, n+1) # 继续进行相同的操作 else: print(" "*n, fi) # 递归出口,最终在这里隐含着return # 递归遍历目录下所有文件 read('e:/pythonDemo', 0)
2. 汉诺塔问题
# 无论多少个圆块,可以抽象成为同一套思路:就是想办法把(n-1)个a柱上的圆块先移动到b柱,
# 然后把最底部最大的一个圆块移动到c柱,最后把b柱上的(n-1)个圆块移动到c柱 def hanoi(n, a, buffer, c): if n == 1: print(a, '--->', c) # 定义从a柱移动到c柱的操作 else: hanoi(n-1, a, c, buffer) # 把(n-1)个a柱上的圆块移动到缓冲区buffer柱 hanoi(1, a, buffer, c) # 把最底部的最大的圆块移动到c柱 hanoi(n-1, buffer, a, c) # 把(n-1)个缓冲区buffer柱上的圆块移动到c柱 hanoi(3, 'A', 'B', 'C')
三 、偏函数
函数可以通过设置参数的默认值降低函数调用的难度,偏函数就有这种用处。
如用int()函数实现二进制的转换:
>>>int('101010001', base=2) 337
python的functools模块的partial函数就可以创建一个偏函数:
>>> import functools >>> int2 = functools.partial(int, base=2) >>> int2('1010101') 85
四 、sorted
python内置的sorted()函数可以对list进行排序,它的key参数控制排序方式是以什么作为排序参照的,reverse=False/True控制是正向排序还是反向排序。
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True) ['Zoo', 'Credit', 'bob', 'about']
五 、filter
filter()函数用于过滤序列,函数传入两个参数,第一个是一个返回布尔值的函数,第二个是list,filter会将列表中的元素依次传入第一个函数中,返回值是True的将保留。
def not_empty(s): return s and s.strip() list(filter(not_empty, ['A', '', 'B', None, 'C', ' '])) # 结果: ['A', 'B', 'C']
六 、map
map()
函数接收两个参数,一个是函数,一个是Iterable
,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator
返回。
>>> r = map(lambda x: x*x, [1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> list(r) [1, 4, 9, 16, 25, 36, 49, 64, 81]
七 、reduce
reduce
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算。
即:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
把序列[1, 3, 5, 7, 9]
变换成整数13579:
>>> from functools import reduce >>> def fn(x, y): ... return x * 10 + y ... >>> reduce(fn, [1, 3, 5, 7, 9]) 13579