推导式
定义: 通过一行循环判断遍历一系列数据
意义:
语法: val for val in Iterable(把想要的值写在for的左侧)
里面是一行循环判断,通过套在推导式外边的符号判断具体是什么类型的推导式
列表推导式
(1) 普通推导式
# 遍历0-9内的所有数字
res = [i for i in range(10)]
(2) 带有判断条件的推导式
# 遍历0-9内的所有偶数
res1 = [i for i in range(10) if i%2==0]
(3)多循环推导式
lst1 = ["至尊宝","周瑜","孙策","刘备"]
lst2 = ["紫霞","小乔","小乔","香香"]
res2 = [i + '❤'+ j for i in lst1 for j in lst2]
(4)带有条件判断的多循环推导式
lst = [i + "❤" + j for i in lst1 for j in lst2 if lst1.index(i) == lst2.index(j) ]
推导式小练习:
(1) 把字典dic写成x=A,y=B,z=C的列表推导式
dic = {'x': 'A', 'y': 'B', 'z': 'C' }
res = [i + '='+ dic[i] for i in dic]
(2).把列表中所有字符变成小写
lst = ["ADDD","dddDD","DDaa","sss"]
res= [ i.lower() for i in lst]
(3). x是0-5之间的偶数,y是0-5之间的奇数 把x,y组成一起变成元组,放到列表当中
# 1
res = [ (i,j)for i in range(6) for j in range(6) if i%2==0 and j %2==1 ]
# 2
lst = [(i,j)for i in range(6) if i%2==0 for j in range(6) if j%2==1]
集合推导式 就是在 推导式外边套上{}
字典推导式
(1) enumerate
enumerate(Iterable,start=0)
功能: 枚举 将索引和Iterable中的值一个个拿出来进行匹配组成元组迭代器中 (可在转为字典)
start:可以选择开始的索引值(默认为0)
返回值: 迭代器
# enumerate 练习
lst = ['东邪','西毒','南帝','北丐']
res = enumerate(lst) # 不加start 默认从0 开始
print(res.__next__()) # (0, '东邪')
# dict强转为字典
print( dict(res) ) # {0: '东邪', 1: '西毒', 2: '南帝', 3: '北丐'}
(2) zip
zip(Iterable,Iterable,...)
功能: 将多个 Iterable中的值,一个个拿出来匹配成元组放入迭代器中
返回: 迭代器
特征: 如果找不到的对应匹配的元素,当前元素会被舍弃
# 例
lst1= ['上单','中单','下单']
lst2= ['花木兰','妲己','后羿 ']
res = zip(lst1,lst2)
# 调用迭代器方式: next , next + for ,list
print(dict(res)) # 强转为字典
enumerate() + try except 的用法
lst = ['a','b','c','d']
res = enumerate(lst,start=2)
while True:
try:
print(res.__next__())
except StopIteration:
break
生成器(generator): 自定义的迭代器
在函数内一旦存在yield,关键字,调用函数并不会执行函数体代码,会返回一个生成器对象
def func():
print(1)
yield 1
gen = func() # # 初始化生成器函数,返回是生成器对象,简称生成器
gen.__next__() # 生成器的__next__才会调用
# send用法:
next 只能取值,send不但能取值,还能发送值
send注意点:
第一个send不能给yield传值,默认只能写None
最后一个yield接收不到send的发送值
send是给上一个yield发送值
yield from
将可迭代数据转换成迭代器返回