此为本人学习笔记,不具备参考价值,禁止任何形式的传播
匿名函数
匿名函数形式:
lambda x:表达式
这里x是参数,匿名函数使用lambda关键字定义,其结果就是返回值。匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
def short_function(x):
return x * 2
等价于
equiv_anon = lambda x: x * 2
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25
同样,也可以把匿名函数作为返回值返回,比如:
def build(x, y):
return lambda: x * x + y * y
关于匿名函数的参数问题
In [1]: strings=['foo','card','bar','aaaa','abab']
In [2]: strings.sort(key=lambda x: len(set(list(x))))
In [3]: strings
Out[3]: ['aaaa', 'foo', 'abab', 'bar', 'card']
在这里,匿名函数的x是指什么呢?
实际上,sort方法的key的默认值是None,在默认的情况下,是逐个读取列表中的元素,就其元素本身进行比较,像字符串就是按字母顺序进行排序。
而key=lambda x: len(set(list(x))),这里匿名函数也是处理sort方法逐个读取的元素。
\quad
\quad
\quad
生成器
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()
大部分以列表或列表型对象为参数的方法都可以接受任意的迭代对象,包括内建方法比如min,max和sum,以及类型构造函数比如list和tuple。
生成器是构造新的可遍历对象的一种非常简便的方式。普通函数执行并一次返回单个结果,而生成器则“惰性”地返回一个多结果序列,在每一个元素产生之后暂停,直到下一个请求。
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
In [1]:
def squares(n=10):
print('Generating squares from 1 to {0}'.format(n ** 2))
for i in range(1, n + 1):
yield i ** 2
In [2]:
gen = squares()
gen
Out[2]:
<generator object squares at 0x0000011A6A7D9A40>
In [3]:
for x in gen:
print(x, end=' ')
Out[3]:
Generating squares from 1 to 100
1 4 9 16 25 36 49 64 81 100
引:itertools模块
标准库中的itertools模块是适用于大多数数据算法的生成器集合。例如,groupby可以根据任意的序列和一个函数,通过函数的返回值对序列中连续的元素进行分组。
In [1]:
import itertools
first_letter = lambda x: x[0]
names = ['Alan', 'Adam', 'Wes', 'Will', 'Albert', 'Steven']
for letter, names in itertools.groupby(names, first_letter):
print(letter, list(names)) # names is a generator
Out[1]:
A ['Alan', 'Adam']
W ['Wes', 'Will']
A ['Albert']
S ['Steven']
这里我是这样理解的:itertools.groupby有两个参数,一个是列表,一个分组的标准,和前面的sort方法一样,传入匿名函数的参数就是方法逐个读取的列表元素。通过letter,names分别将生成器的分好的组名和组元素取出(以列表的形式打印)