8.3 学习笔记


g=(i*i for i in range(10)) #每取一个mext,其中的表达式执行一次
#g生成器 右边为生成器表达式 []
#[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历之后挨个处理
#[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件] #筛选功能
# #30以内所有能被3整除的数
ret=[i for i in range(30) if i %3==0]
print(ret)
# # 例三:找到嵌套列表中名字含有两个‘e’的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
det=[name for list in names for name in list if name.count('e')==2] #注意顺序 前一个阶段为for list in names
print(det) #后一个阶段为 for name in list 此时光标处于第二个列表位置
#字典推导式

# 例一:将一个字典的key和value对调
mcase = {'a': 10, 'b': 34}
mcase1={mcase[k]:k for k in mcase} #循环字典拿到key,然后让新的字典里放value:key
print(mcase1) #{10: 'a', 34: 'b'} ??????????????
# 例二:合并大小写对应的value值,将k统一成小写
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
mcase1={k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase.keys()} #否则返回0,便于相加
print(mcase1) #先从for循环看,后面循环值,:前为键,:到for为止为值 p69 17.30 ??????????
#集合推导式,自带结果去重功能
# squared = {x**2 for x in [1, -1, 2]}
# print(squared)
#各种推导式 : 生成器 列表 字典 集合
#遍历操作
#筛选操作
# 迭代器和生成器
# 迭代器
# 可迭代协议 —— 含有iter方法的都是可迭代的
# 迭代器协议 —— 含有next和iter的都是迭代器
# 特点
# 节省内存空间
# 方便逐个取值,一个迭代器只能取一次。
# 生成器 —— 迭代器
# 生成器函数
# 含有yield关键字的函数都是生成器函数
# 生成器函数的特点
#调用之后函数内的代码不执行,返回生成器
#每从生成器中取一个值就会执行一段代码,遇见yield就停止。
#如何从生成器中取值:
# for :如果没有break会一直取直到取完
# next :每次只取一个
# send :不能用在第一个,取下一个值的时候给上个位置传一个新的值
# 数据类型强制转换 :会一次性把所有数据都读到内存里
# 生成器表达式
# (条件成立想放在生成器中的值 for i in 可迭代的 if 条件)
#面试题
def demo():
for i in range(4):
yield i

g=demo()

g1=(i for i in g)
g2=(i for i in g1)
print(g) #之前的都没执行,只有在要输出的时候才去取,g1已经取完了,g2就要不到值了、
print(list(g1))
print(list(g2))
posted @ 2018-08-16 15:29  SHORI  阅读(168)  评论(0编辑  收藏  举报