函数详解
函数名赋予变量
个人理解,由于函数名其实就是指向函数的变量,当赋予另一个变量时,该变量就指向了该空间,从而可以代替函数名,即又给了某个函数取了一个别名。如下:
f = abs
print(f(-10))
print(abs(-10)) #我们可以从中知道f()与abs()是完全相同的。
输出:10
10
传入参数
由上面,我们知道其实函数名只是一个指向函数的变量,因此我们可以将函数名作为另一个函数的参数(与C++中传入函数指针类似)。带有函数名参数的函数又称为高阶函数。
def add(x, y, f):
return f(x) + f(y)
print(add(-10,-11,abs))
map/reduce
map()与reduce()是Python的内建函数。
map
map为一个简单的映射,它有两个参数,一个是映射函数,一个是定义域。如下:
r = map(abs,[-1,-2,-3,-4])
print(list(r))
一般形式为:
map(f,Iterable) #可看作[f(x) for x in Iterable]
如果有多个参数怎么办呢?下面有个例子
def add(x, y, f):
return f(x) + f(y)
r = map(add,[-1,-2,-3],[-5,-6,-7],[abs,abs,abs])
print(list(r))
输出:[6, 8, 10]
明显,当映射函数有多个参数,就有多少个Iterable,且第n个Iterable为第n个参数的集合。
需要注意的是map()函数返回的是Iterator,因此可有list()函数将其变成list。
reduce
reduce的一般形式
reduce(f, [x1, x2, x3, x4])
#效果等于f(f(f(x1, x2), x3), x4)
str2int
from functools import reduce
def fn(x,y):
return 10*x + y
# fn = lambda x , y :10*x+y
def str2int(s):
return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]
print(reduce(fn,map(str2int,'12345')))
注意lambda允许用户快速定义单行函数,即只有一个表达式的函数。
filter
filter函数用于过滤序列。filter返回的是一个Iterator
r = filter(lambda x: x%2==1,[1,2,3,4,5,6,7,8,9])
print(list(r))
'''
list(filter(f,L)) = [x for x in L if f(x)]
'''
寻找素数
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
def _not_divisible(n):
return lambda x:x%n > 0
def primes():
yield 2
it = _odd_iter()
while True:
n = next(it)
yield n
it = filter(_not_divisible,it)
for n in primes():
if n < 25:
print(n)
else:
break
该函数整体简单,需要理解的是_not_divisible函数,该函数是经过简化的,展开为:
def fn(x,n):
return x % n > 0
原来_not_divisible函数中只有一个参数,是因为关键字lambda隐藏了另一个参数,每次过滤时序列输入的待检测元素。
sorted
sorted(L,key = f,reverse=True)
L为集合,key为一个排序前对L中的每个元素进行处理的函数,reverse结果是否逆序。
函数返回函数
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
f = lazy_sum(1,2,3,4,5)
print(f())
一个函数可以返回一个计算结果,也可以返回一个函数。
返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。
版权声明:本文为博主原创文章,未经博主允许不得转载。