匿名(lambda)函数

Python支持一种被称为匿名的、 或lambda函数。 它仅由单条语句组成, 该语句的结果就是返回值。 它是通过lambda关键字定义的, 这个关键字没有别的含义, 仅仅是说“我们正在声明的是一个匿名函数”

  1. def short_function(x):
  2. return x * 2
  3. equiv_anon = lambda x : x * 2

直接传入lambda函数比编写完整函数声明要少输入很多字

  1. def apply_to_list(some_list, f):
  2. return [f(x) for x in some_list]
  3. ints = [4, 0, 1, 5, 6]
  4. apply_to_list(ints, lambda x : x * 2)
  • 上面的例子也提供了一种传入函数的方法,毕竟Python中一切皆对象

再来看另外一个例子。 假设有一组字符串, 你想要根据各字符串不同字母的数量对其进行排序

  1. >>> strings = ['foo', 'card', 'bar', 'aaaa', 'abab']
  2. >>> strings.sort(key=lambda x : len(set(list(x))))
  3. ['aaaa', 'foo', 'abab', 'bar', 'card']

上例中, list 将字符串中的每一个字符变成列表中的一个元素; set 对列表进行去重

序列函数

enumerate函数

  1. >>> some_list = ['foo', 'bar', 'baz']
  2. >>> mapping = {}
  3. >>> for i, v in enumerate(some_list):
  4. mapping[v] = i
  5. >>> mapping
  6. {'bar': 1, 'baz': 2, 'foo': 0}

zip函数

zip 可以将多个列表、 元组或其它序列成对组合成一个元组列表

  1. >>> seq1 = ['foo', 'bar', 'baz']
  2. >>> seq2 = ['one', 'two', 'three']
  3. >>> zipped = zip(seq1, seq2)
  4. >>> list(zipped)
  5. [('foo', 'one'), ('bar', 'two'), ('baz', 'three')]

zip 可以处理任意多的序列, 元素的个数取决于最短的序列

  1. >>> seq3 = [False, True]
  2. >>> list(zip(seq1, seq2, seq3))
  3. [('foo', 'one', False), ('bar', 'two', True)]

zip 的创建用法之一是同时迭代多个序列,可能结合 enumerate 使用

  1. >>> for i, (a, b) in enumerate(zip(seq1, seq2)):
  2. print('{0}: {1}, {2}' % (i, a, b))
  3. 0: foo, one
  4. 1: bar, two
  5. 2: baz, three

给出一个“被压缩的”序列, zip 可以被用来解压序。也可以当作把行的列表转换为列的列表

  1. >>> pitchers = [('Nolan', 'Ryan'), ('Roger', 'Clemens'), ('Schilling', 'Curt')]
  2. >>> first_names, last_names = zip(*pitchers)
  • 上面的’*’运算符是序列解包用的记号

    reverses函数

    reversed 函数从后向前迭代一个序列
    1. >>> list(reversed(range(10)))
    2. [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

    itertools模块

    标准库itertools模块中有一组用于许多常见数据算法的生成器。 例如,groupby 可以接受任何序列和一个函数。 它根据函数的返回值对序列中的连续元素进行分组。
  1. >>> import itertools
  2. >>> first_letter = lambda x : x[0]
  3. >>> names = ['Alan', 'Adam', 'Wes', 'Will', 'Albert', 'Stevev']
  4. >>> for letters, names in itertools.groupby(names, first_letter):
  5. print(letter, list(names)) # names is a generator