Day14 推导式和生成器

​ 推导式

定义: 通过一行循环判断遍历一系列数据
意义: 
语法: 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 
将可迭代数据转换成迭代器返回
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值