从生成器中取值的方法
next
for循环
数据类型的强制转换 缺点:占内存
生成器函数的进阶
send的使用效果
def generator(): print(123) content = yield 1 print(\'=====\',content) print(456) yield 2 g = generator() ret = g.__next__() print(\'***\',ret) ret = g.send(\'hello\') print(\'***\',ret)
123
*** 1
===== hello
456
*** 2
send获取下一个值的效果和next基本一致
只是在获取下一个之的时候,给上一个之的位置传递一个数据
使用send的注意事项
第一次使用生成器的时候,是用next获取下一个值
最后一个yield不能接受外部的值
yield from
def gen1(): for c in \'AB\': yield c for i in range(3): yield i print(list(gen1())) def gen2(): yield from \'AB\' yield from range(3) print(list(gen2()))
从一个容器中取值,集体返回 可以一个一个接收
列表推导式
g = (i*i for i in range(10)) for i in g: print(i)
效果是打印出十以内的每个数的平方
names = [[\'Tom\', \'Billy\', \'Jefferson\', \'Andrew\', \'Wesley\', \'Steven\', \'Joe\'], [\'Alice\', \'Jill\', \'Ana\', \'Wendy\', \'Jennifer\', \'Sherry\', \'Eva\']] print([name for lst in names for name in lst if name.count(\'e\') >= 2])
[\'Jefferson\', \'Wesley\', \'Steven\', \'Jennifer\']
找到嵌套列表中名字含有两个‘e’的所有名字
生成器表达式
g = [i*i for i in range(30) if i%3==0] print(g)
在列表中打印出能整除三的数的平方
列表推导式和生成器表达式的区别
括号不一样
返回的值不一样===几乎不占用内存
各种推导式:生成器 列表 字典 集合
字典
合并大小写对应的value值,将k统一成小写
mcase = {\'a\':10,\'b\':34,\'A\':7,\'Z\':3}
mcase_frequency = {k.lower():mcase.get(k.lower(),0)+mcase.get(k.upper(),0) for k in mcase.keys()}
print(mcase_frequency)
{\'a\': 17, \'z\': 3, \'b\': 34}
将一个字典的key和value对调
mcase = {\'a\':10,\'b\':34,\'A\':7,\'Z\':3}
mcase_frequency = {mcase[k]: k for k in mcase}
print(mcase_frequency)
{10: \'a\', 3: \'Z\', 34: \'b\', 7: \'A\'}
集合
计算列表中每个值的平方,自带去重功能
squared = {x**2 for x in [1,-1,2]}
print(squared)
{1, 4}
它们都有遍历操作和筛选操作