本文python学习基于廖雪峰老师的学习网站:字符串和编码 - 廖雪峰的官方网站 (liaoxuefeng.com),其内容相对完整,适合初学者学习。由于楼主之前有c语言的学习经验,在此本文仅对其中与c语言相差比较大的部分进行总结回顾,如有纰漏还请指出。
前接:Python学习细节总结以及python与c语言区别比较(3)
7.高阶函数
在python中,可以将函数赋值给变量,从而使变量拥有函数的功能,类似于给变量定义成为一个已知函数。同样,函数名也被视为变量,如果给函数名赋值,那么函数名便失去了作为函数的功能。在一个函数内部的参数也可以是另一个函数。
7.1map函数、reduce函数、filter函数、sorted函数
map()函数的功能是接收2个参数,一个是函数,一个是序列(list/tuple)来进行所有元素的函数计算。当然,如果是自定义函数要先进行函数的定义。
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce()函数与map()类似,区别是reduce()函数是把结果继续和序列的下一个元素做累积计算,也就是(注:要前缀from functools import reduce)
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
filter()函数则是一个过滤序列的函数,与map()函数类似作用与每一个元素,通过传入函数与序列来对序列中元素进行筛选,确定是否保留。例如,在一个list中,删掉偶数,只保留奇数,可以这么写:
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
sorted()函数是一个排序序列的函数,一般会将序列从小到大排序,我们也可以给key函数赋值自定义函数使其作用在每一个元素后进行排序。比如:
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
7.2返回函数
我们可以通过返回函数,从而使代码能根据需要再进行计算。如
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
我们只有在使用lazy_sum(x)时才会返回值,而不是立刻计算所有元素。
注意:返回函数不要引用任何循环变量,或者后续会发生变化的变量。这与c语言的使用方法不同,如果这么使用返回的值都会是变量的最终结果。如果一定要引用循环变量,我们需要再创建一个函数,用该函数的参数绑定循环变量当前的值。
7.3匿名函数
匿名函数lambda只能有一个表达式,不用写return,返回值就是该表达式的结果。使用匿名函数后不必担心函数名冲突。此外,由于匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数,或作为返回值返回。
如lambda x:x*x就相当于定义一个x*x的函数。
7.4装饰器
装饰器(decorator)能在代码运行期间动态增加功能。
比如我们要定义一个能打印日志的decorator,我们的代码是
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
7.5偏函数
我们可以利用python的functools模块来创建偏函数,比如我们可以在int函数里面传入base参数来改变int函数输出的进制,如:
>>> int('12345', base=8)
5349
>>> int('12345', 16)
74565
创建偏函数我们一般利用functools.partial来进行,这样就不用我们自己对函数进行定义再创建,比如我们要创建一个转换为2进制的偏函数:
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85