匿名(lambda)函数
Python支持一种被称为匿名的、 或lambda函数。 它仅由单条语句组成, 该语句的结果就是返回值。 它是通过lambda关键字定义的, 这个关键字没有别的含义, 仅仅是说“我们正在声明的是一个匿名函数”
def short_function(x):
return x * 2
equiv_anon = lambda x : x * 2
直接传入lambda函数比编写完整函数声明要少输入很多字
def apply_to_list(some_list, f):
return [f(x) for x in some_list]
ints = [4, 0, 1, 5, 6]
apply_to_list(ints, lambda x : x * 2)
- 上面的例子也提供了一种传入函数的方法,毕竟Python中一切皆对象
再来看另外一个例子。 假设有一组字符串, 你想要根据各字符串不同字母的数量对其进行排序
>>> strings = ['foo', 'card', 'bar', 'aaaa', 'abab']
>>> strings.sort(key=lambda x : len(set(list(x))))
['aaaa', 'foo', 'abab', 'bar', 'card']
上例中, list
将字符串中的每一个字符变成列表中的一个元素; set
对列表进行去重
序列函数
enumerate函数
>>> some_list = ['foo', 'bar', 'baz']
>>> mapping = {}
>>> for i, v in enumerate(some_list):
mapping[v] = i
>>> mapping
{'bar': 1, 'baz': 2, 'foo': 0}
zip函数
zip
可以将多个列表、 元组或其它序列成对组合成一个元组列表
>>> seq1 = ['foo', 'bar', 'baz']
>>> seq2 = ['one', 'two', 'three']
>>> zipped = zip(seq1, seq2)
>>> list(zipped)
[('foo', 'one'), ('bar', 'two'), ('baz', 'three')]
zip
可以处理任意多的序列, 元素的个数取决于最短的序列
>>> seq3 = [False, True]
>>> list(zip(seq1, seq2, seq3))
[('foo', 'one', False), ('bar', 'two', True)]
zip
的创建用法之一是同时迭代多个序列,可能结合 enumerate
使用
>>> for i, (a, b) in enumerate(zip(seq1, seq2)):
print('{0}: {1}, {2}' % (i, a, b))
0: foo, one
1: bar, two
2: baz, three
给出一个“被压缩的”序列, zip
可以被用来解压序。也可以当作把行的列表转换为列的列表
>>> pitchers = [('Nolan', 'Ryan'), ('Roger', 'Clemens'), ('Schilling', 'Curt')]
>>> first_names, last_names = zip(*pitchers)
- 上面的’*’运算符是序列解包用的记号
reverses函数
reversed
函数从后向前迭代一个序列>>> list(reversed(range(10)))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
itertools模块
标准库itertools模块中有一组用于许多常见数据算法的生成器。 例如,groupby
可以接受任何序列和一个函数。 它根据函数的返回值对序列中的连续元素进行分组。
>>> import itertools
>>> first_letter = lambda x : x[0]
>>> names = ['Alan', 'Adam', 'Wes', 'Will', 'Albert', 'Stevev']
>>> for letters, names in itertools.groupby(names, first_letter):
print(letter, list(names)) # names is a generator