匿名(lambda)函数
Python支持一种被称为匿名的、 或lambda函数。 它仅由单条语句组成, 该语句的结果就是返回值。 它是通过lambda关键字定义的, 这个关键字没有别的含义, 仅仅是说“我们正在声明的是一个匿名函数”
def short_function(x):return x * 2equiv_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, one1: bar, two2: 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
