Python常用高级函数

一 、匿名函数

  有些时候,我们不需要显式的定义函数,可以使用匿名函数临时快速定义函数。

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("\t"*n, fi)
read(fi_d, n+1) # 继续进行相同的操作
else:
print("\t"*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('', base=2)
337

python的functools模块的partial函数就可以创建一个偏函数:

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('')
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()函数接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的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
上一篇:hdu2091JAVA


下一篇:JAVA获取时间戳,哪个更快