十二、推导式
1、推导式(列表推导式)
用一行循环判断遍历出一系列数据的方式
注:推导式在使用时只能使用for循环和if判断,if判断只能式单项判断
推导式得三种形式:列表推导式、集合推导式、字典推导式
(1)普通推导式:通过 [] 和 for 形式构成
(2)带有判断的推导式:通过 [] for if 形式构成
(3)多循环推导式:通过 [] for for … 形式构成
(4)带有判断条件的循环推导式:通过 [] for for if 的形式构成
列表推导式,获取的数据在列表中
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
lst_new = []
for i in range(1, 51):
lst_new.append(i)
print(lst_new)
# 基本语法
lst = [i for i in range(1, 51)]
print(lst)
# 普通推导式
lst = [1, 2, 3, 4]
lst = [i << i for i in lst]
print(lst)
lst = [1, 2, 3, 4, 5, 6, 67, 7, 8]
lst_new = []
for i in lst:
if i % 2 == 0:
lst_new.append(i)
print(lst_new)
# 带有判断的推导式
lst = [i for i in lst if i % 2 == 0]
print(lst)
list1 = ['a', 'b', 'c']
list2 = ['x', 'y', 'z']
lst_new = []
for i in list1:
for j in list2:
res = i + "♥" + j
lst_new.append(res)
print(lst_new)
# 多循环推导式
lst = [i + "♥" + j for i in list1 for j in list2]
print(lst)
lst_new = []
for i in list1:
for j in list2:
if list1.index(i) == list2.index(j):
res = i + "♥" + j
lst_new.append(res)
print(lst_new)
# 带有判断条件的多循环推导式
lst = [i + "♥" + j for i in list1 for j in list2 if list1.index(i) == list2.index(j)]
print(lst)
2、集合推导式
集合推导式,获取的数据在集合中并自动去重
三目运算可应用在推导式中
listvar = [
{"name": "jack", "age": 18, "money": 10000},
{"name": "eric", "age": 19, "money": 5100},
{"name": "pdd", "age": 20, "money": 4800},
{"name": "asd", "age": 21, "money": 2000},
{"name": "erick", "age": 180, "money": 20}
]
setvar = set()
for i in listvar:
if 18 <= i["age"] <= 21 and 5000 <= i["money"] <= 5500:
res = "尊贵VIP卡老" + i["name"][0]
else:
res = "黄金VIP卡老" + i["name"][0]
setvar.add(res)
print(setvar)
setvar = {"尊贵VIP卡老" + i["name"][0] if 18 <= i["age"] <= 21 and 5000 <= i["money"] <= 5500 else "黄金VIP卡老" + i["name"][0] for i in listvar}
print(setvar)
3、字典推导式
字典推导式,获取的数据在字典
内置方法:
enumerate:枚举,将索引和iterable中的值,一个一个拿出来配对组成元组放入迭代器中
参数:可迭代性数据;start:设置开始的索引,默认从0开始
返回值:迭代器
zip:将多个iterable中的值,一个一个拿出来配对组成元组放入迭代器中
参数:可迭代性数据;
返回值:迭代器
注:不能匹配多余值会被舍弃
注:三目运算可应用在推导式中
# enumerate
lst = ["a", 'b', 'c', 'd', 'e', 'f', 'g', 'h']
it = enumerate(lst)
it = enumerate(lst, start=5)
from collections import Iterator, Iterable
res = isinstance(it, Iterator)
print(res)
for i in range(3):
res = next(it)
print(res)
res = list(it)
print(res)
dic = {k: v for k, v in enumerate(lst, start=1)}
print(dic)
# zip
from collections import Iterator,Iterable
lst1 = ['a', 'b', 'c', 'd', 'e']
lst2 = ['1', '2', '3', '4']
lst3 = ['+', '-', '/']
it = zip(lst1, lst2)
print(isinstance(it, Iterator))
print(list(it))
dic = {k: v for k, v in zip(lst1, lst2)}
print(dic)
dic = dict(zip(lst1, lst2))
print(dic)
十三、生成器
生成器本质是迭代器,允许自定义逻辑的迭代器
迭代器和生成器的区别:迭代器本身是系统内置的,不能被重写;生成器是用户自定义的,可以重写迭代逻辑
生成器的两种创建方式:
(1)生成器表达式:里面用推导式,外面用圆括号
(2)生成器函数:用def定义,里面含有yield
1、生成器表达式
推导式 + 圆括号
from collections import Iterator
gen = (i * 2 for i in range(1, 5))
print(gen)
print(isinstance(gen, Iterator))
ret = next(gen)
print(ret)
gen = (i * 2 for i in range(1, 5))
for i in gen:
print(i)
gen = (i * 2 for i in range(1, 5))
for i in range(2):
ret = next(gen)
print(ret)
res = list(gen)
print(res)
2、生成器函数
yield类似return
共同点:执行到这句话都会把值返回出去
不同点:yield每次返回时,会记住上次离开时执行的位置,下次在调用生成器,会从上次执行的位置往下继续执行;而return直接终止函数,每次从头调用
yield from : 将一个可迭代对象变成一个迭代器返回
写法:yield 6 和 yield(6) 推荐使用前者,避免记混
send方法:send 可以发送数据,发送给上一个yield
send与next区别:
next 只能取值
send 不但能取值,还能发送值
send需要注意:
第一个send不能给yield传值默认只能写None
最后一个yield接受不到send的发送值
初始化生成器函数 -> 生成器对象 -> 简称生成器
# 语法
from collections import Iterator
def mygen():
print("one")
yield 1
print("two")
yield 2
print("three")
yield 3
gen = mygen()
print(isinstance(gen, Iterator))
res = next(gen)
print(res)
res = next(gen)
print(res)
res = next(gen)
print(res)
# for + next
def mygen():
for i in range(1, 101):
yield "我的球衣号码是%s"%(1)
gen = mygen()
for i in range(5):
ret = next(gen)
print(ret)
for i in range(3):
res = next(gen)
print(res)
# send传值
def mygen():
print("start")
ret = yield 111
print(ret)
ret = yield 222
print(ret)
ret = yield 333
print(ret)
print("end")
gen = mygen()
val = gen.send(None)
print(val)
val = gen.send(444)
print(val)
val = gen.send(555)
print(val)
# yield from
def mygen():
lst = ['a', 'b', 'c']
yield from lst
gen = mygen()
print(next(gen))
print(next(gen))
print(next(gen))