匿名函数
匿名函数lambda 匿名函数不需要以标准的形式来申明, 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果
语法:lambda [arg1[, arg2, arg3...agrn]]: expression
f = lambda x, y: x ** 2 + y ** 2
f(2, 3)
13
map函数
map(func, Iterable):将函数func作用于给定的可迭代对象的每个元素,并返回一个迭代器
results = map((lambda x: x + 2), [1, 2, 3, 4, 5])
for i in results:
print(i)
3
4
5
6
7
或者
print(next(results))
3
print(next(results))
4
print(next(results))
print(next(results))
print(next(results))
5
6
7
res = map((lambda x, y: (x+y, x-y)), [1, 3, 5], [2, 4, 6])
for i in res:
print(i)
(3, -1)
(7, -1)
(11, -1)
reduce
functools.reduce(function, iterable[, initializer]),接受两个参数,一个函数,一个可迭代对象,将可迭代对象的元素从左到右累积计算,直到将可迭代对象的元素“减少”为一个单一的值。它取出前两个值传入函数进行计算,计算后的结果又和第三个值计算,一直到将可迭代对象的元素都计算完毕,得出最终结果。
形象化:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
Python3将reduce()函数移到了functools模块中
from functools import reduce
reduce(lambda x, y: x * y, [1, 2, 3, 4, 5])
120
可以设置初始值
func = lambda x, y: x + y
reduce(func, [2, 3, 4], 10)
19
filter
filter(func, seq):调用一个布尔函数func来迭代遍历每个seq中的元素;返回一个使func返回值为true的元素的序列
相当于“过滤”,将符合条件的过滤出来,返回一个filter迭代器
ff = filter(lambda n: n % 2, [i for i in range(20)])
print(list(ff))
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
type(ff)
filter
sorted()
sorted(iterable, *, key=None, reverse=False):用于可迭代对象的排序,返回排序好的新的对象,默认为正序排序,将reverse设置为True可逆序排序,key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序
sorted([2, 34, -221, 33, -87, 0])
[-221, -87, 0, 2, 33, 34]
sorted([2, 34, -221, 33, -87, 0], reverse=True) # 逆序排列
[34, 33, 2, 0, -87, -221]
sorted([2, 34, -221, 33, -87, 0], key=abs) # 实现自定义排序
[0, 2, 33, 34, -87, -221]
偏函数
functools.partial(func, *args, **keywords)
可以把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单
int()函数可以把字符串转换为整数,当仅传入字符串时,int()函数默认按十进制转换
int('100101', base=2)
37
int('100101', base=8)
32833
int('1234567', base=16)
19088743
但是大量转化时,可以使用函数,比如大量二进制转化
def int_2(x, base=2):
return int(x, base)
int_2('1010001')
81
以使用偏函数functools.partial,就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2
from functools import partial
int2 = partial(int, base=2)
int2('1001011')
75
int2('1000010101010')
4266