1、循环模式。[变量(加工后的变量) for 变量 in iterable]
print([i for i in range(1,101)])
# map:返回一个迭代器, 循环 类似于列表推导式的循环模式。 l1 = [1, 2, 3, 4, 5] print([i**2 for i in l1]) iter3 = map(lambda x: x**2, l1) print(list(iter3))
2、三元模式
# 如果i可以整除3就返回一个*,else返回i print(['*' if i % 3 == 0 else i for i in range(1,21)])
3、筛选模式 [变量(加工后的变量) for 变量 in iterable if 条件]
# 三十以内所有的偶数留到列表中 print([i for i in range(1,31) if i % 2 == 0])
# filter:返回一个迭代器 *** # 过滤 类似于列表推导式的筛选模式。 l1 = [2, 4, 5, 6, 7, 8, 10] iter2 = filter(lambda x: x % 2 == 0, l1) for i in iter2: print(i)
生成器:本质就是迭代器,自己用python代码构建的迭代器。
1,生成器函数。(yield)
def func(): print(111) print(222) yield 666 yield 777 ret = func() print(ret) # 一个next 对应一个yield print(next(ret)) print(next(ret))
2,生成器表达式。(i for i in range(100))就是列表推导式把中括号变成小括号。生成器对象:gentor
2.1)第一次取值不能用send传参
2.2)最后一个yield 永远也得不到send的传的值
send:send(gentor)
给上一个yield发送一个值
send 对应yield取值。
next:next(gentor)
对应一个yield 取值。
def func(): count = yield 666 print(count) num = yield 'rock' print(num) yield 'wwww' n1 = yield 'fff' print(n1) genor = func() # print(next(genor)) # print(next(genor)) # # send不仅能对应yield取值,而且可以给上一个yield发送一个值 print(genor.send(None)) print(genor.send('888')) print(genor.send('777')) print(genor.send('111')) # print(genor.send('222'))
yield 与 return 区别?
return 终止函数,yield 不会终止生成器函数。
都会返回一个值,return给函数的执行者返回值,yield是给next()返回值
yield 返回的单个值时返回的是原数据类型返回多个值时返回的是一个元组
def func(): yield 3, 4, 5, 6 genor = func() print(next(genor))
yield from 将一个可迭代对象变成一个迭代器返回。
# yield from 将一个可迭代对象变成一个迭代器返回 def func(): lst = ['111', '222', '333', '444'] yield from lst genor = func() print(next(genor)) # 111 print(next(genor)) # 222 print(next(genor)) # 333 for i in genor: print(i)
yeild详解 https://juejin.im/post/5b3af9fb51882507d4487144
# 字符串 astr = 'ABC' # 列表 alist = [1, 2, 3] # 字典 adict = {"name": "wangbm", "age": 18} # 生成器 agen = (i for i in range(4, 8)) def gen(*args, **kw): for item in args: yield from item new_list = gen(astr, alist, adict, agen) print(list(new_list)) # ['A', 'B', 'C', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]