一、生成器
生成器的本质就是迭代器
唯一的区别是:生成器我们自己用python代码构建的数据结构,而迭代器是python提供的,或者转化得来的。
-
获取生成器的三种方式
1.生成器函数
2.生成器表达式
3.python内部提供
-
生成器函数获取生成器
def func():
yield 3
yield 4
ret = func()
print(ret) # <generator object func at 0x0000025DF985F580>生成器对象
print(next(ret)) # 3
print(next(ret))
'''
3
4
''' # 一个next对应一个yield
-
return 和yield的区别:
return是结束函数,一个函数只存在一个return,并给函数执行者返回值
函数中只要有yield,那么它就是生成器函数而不是函数了
生成器函数中可以存在多个yield,一个yield对应一个next,yield不会结束函数
def gen_fun():
for i in range(1,5001):
yield i
ret = gen_fun()
for i in range(200):
print(next(ret))
for i in range(100):
print(next(ret))
- yield from
def func():
li = [1, 2, 3, 4, 5]
yield from li # 将li这个列表变成了迭代器返回
ret = func()
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))
def func():
list1 = [1, 2, 3, 4, 5]
list2 = [6, 7, 8]
yield from list1
yield from list2
g = func()
for i in range(8):
print(next(g))
二、生成器表达式,列表推导式
- 列表推导式
用一行代码构建一个比较复杂有规律的列表
- 循环模式:[变量(加工后的变量) for 变量 in iterable]
li = [i for i in range(1, 11)]
print(li)
# 1.将10以内的所有整数的平方写入列表
list1 = [i ** 2 for i in range(1, 11)]
print(list1)
# 2.100以内所有偶数
list2 = [i for i in range(2, 101, 2)]
print(list2)
# 3.从Jason的女朋友1号到Jason的女朋友100号写入列表
list3 = [f'Jason的女朋友{i}号' for i in range(1, 101)]
print(list3)
# 4.构建[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
list4 = [i for i in range(1, 11)] + list('JQKA')
print(list4)
- 筛选模式:[变量(加工后的变量) for 变量 in iterable if 条件]
# 1.100以内能被3整除的数字
list1 = [i for i in range(101) if i % 3 == 0]
print(list1)
# 2.过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
li = ['jason', 'a', 'carly', 'cc', 'dog']
list2 = [i.upper() for i in li if len(i) >= 3]
print(list2)
# 3.筛选出来含有两个'e'的所有的字符串全部大写
list3 = [['jason', 'a', 'ceely', 'cc', 'eeg', 'aece'], ['eye', 'uuueee', 'sex']]
list4 = [j.upper() for i in list3 for j in i if j.count('e') == 2]
print(list4)
- 生成器表达式:
写法上与列表推导式唯一的区别就是[]变成(),但是生成器推导式非常节省内存
list1 = (i for i in range(101) if i % 3 == 0)
print(list1)
print(next(list1))
print(next(list1))
print(next(list1))
列表推导式和生成器表达式的区别:
1.写法上[] 和 ()
2.本质上iterable(可迭代对象) 和iterator(迭代器)的区别
- 字典推导式
list1 = ['k1', 'k2', 'k3']
list2 = ['v1', 'v2', 'v3']
dic = {list1[i]: list2[i] for i in range(len(list1))}
print(dic)
- 集合推导式
set1 = {i for i in range(1, 11)}
print(set1)