个人理解:把函数作为参数
语法
(1)列表解析,将range(5)的每个元素进行平方:
list = [item**2 for item in range(5)]
print(list) #[0,1,4,9,16]
(2)
字典解析,将range(5)的每个元素进行平方并作为value,key为一个指示:
dict = {"%d^2" % item:item**2 for item in range(5)}
print(dict) #{'0^2': 0, '1^2': 1, '2^2': 4, '3^2': 9, '4^2': 16}
(3)生成器:和列表解析类似,区别在于它的结果是generator(生成器) object,不能直接打印,但是可以进行迭代(放入for循环等等)
generator = (item**2 for item in range(5))
print(generator) # <generator object <genexpr> at 0x10e366570>
print(next(generator)) # 0
print(next(generator)) # 1
print(next(generator)) # 4
(4)
lambda表达式,即定义一些比较简单的匿名函数,lambda表达式和map、reduce、filter等函数混合使用威力巨大。例如求x的y次方:
func = lambda x, y: x**y #匿名函数
print(func(3, 2)) # 9
内置函数
(1) iter函数和next函数:一个list类型不能使用next函数,需将其转化为iterator(迭代器)类型。list_generator = iter(list)
print(next(list_generator)) # 0
print(type(list), type(list_generator)) # <class 'list'> <class 'list_iterator'>
(2)map函数:将一个函数应用于一个或多个可迭代对象(什么是可迭代对象),返回一个map object。这里的函数可以为内置函数、operator模块中的函数或者一个lambda函数等:
print(map(abs, range(-4, 5))) # <map object at 0x1097bd6d8>
print(list(map(abs, range(-4, 5)))) # [4, 3, 2, 1, 0, 1, 2, 3, 4]
print(list(map(lambda x: x**2, range(5)))) # [0, 1, 4, 9, 16]
print(list(map(lambda x, y: x**y, range(1, 5), range(1, 5)))) # [1, 4, 27, 256]
(3)
reduce函数:这个函数并不能直接调用,而是需要通过functools库进行引入。该函数的作用是将一个可迭代对象中的元素进行
reduce(累加等),最后一个参数可选,为初始值。
print(reduce(lambda x, y: x+y, range(10))) # 45
print(reduce(lambda x, y: x+y, range(10), 100)) # 145
print(reduce(lambda x, y: x+y, [[1, 2], [3, 4]], [0])) # [0, 1, 2, 3, 4]
(4)
filter函数:按照字面意思理解即可,
即过滤一个可迭代对象,保留为True的元素。注意第二个例子,只过滤掉0,因为即使是负数也会被判定为True。
配合lambda定义匿名函数进行过滤,好用的一批。
print(filter(None, range(-4, 5))) # <filter object at 0x10c096710>
print(list(filter(None, range(-4, 5)))) # [-4, -3, -2, -1, 1, 2, 3, 4]
print(list(filter(lambda x: x > 0, range(-4, 5)))) # [1, 2, 3, 4]
(5)
all、any函数:比较简单,还是可以按照字面意思理解,即判定一个可迭代对象是否全为True或者有为True的,(可以用来判断存在或者所有)。
print(all([0, 1, 2])) # False
print(any([0, 1, 2])) # True
(6)
enumerate函数,如果你想迭代一个列表或者元组,又想知道当前迭代元素的index值,那么enumerate就能满足你的需求(好像debug会用的到??):
for index, item in enumerate(range(5)):
print("%d: %d" % (index, item)) # 0: 0 \n 1: 1 \n 2: 2 ......
(7)zip函数(建立映射关系),映射两个或多个可迭代对象,组成新的可迭代对象,直接看实例:
for a, b in zip([1, 2, 3], ["a", "b", "c"]):
print(a, b) # 1 a \n 2 b \n 3 c
dict = dict(zip([1, 2, 3], ["a", "b", "c"]))
print(dict) # {1: 'a', 2: 'b', 3: 'c'}
(8)sorted函数(排序),python3 sorted取消了对cmp的支持(用惯了C++stl的说)。 python3 帮助文档: sorted(iterable, key=None, reverse=False)。
>>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave','B', 10)]
>>> sorted(students,key=lambda x: x[2]) #习惯用Key值来比较
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]