---恢复内容开始---
1.生成器和生成器函数
2.列表推导式
一生成器
什么是生成器。生成器实质就是迭代器。
python中有三种方式来获取生成器。
1通过生成器函数
2通过各种推导式来实现生成器
3通过数据的转换也可以获取生成器
将函数中的return换成yield就是生成器
运行的结果和上面啊不一样,为什么呢,由于函数中存在yield。那么这个函数就是一个生成器函数。这个时候。我们在执行这个函数的时候,就不再是函数的执行了。而是获取这个生成器,如何使用?想想迭代器。生成器的本质就是迭代器。所以。我们可以直接执行__next__()来执行
那么我们可以看到,yield和return的效果一样,区别就是yield是分段来执行1个函数。return 呢?直接停止执行函数。
当程序运行完最后一个yield。那么后面继续走 --next--()程序会报错
def c():
lst=[]
for i in range(0,10000):
lst.appende("衣服"+str(i))
return lst
cl=c()
这样就是一下子全部打印出来,太站内存
def c():
for i in range(0,10000):
yield "衣服“+str(i)
cl=c()
print(c.__next__())
print(c.__next__())print(c.__next__()) 这样就是你打印一次出一个,不会占用内存
一次出一个,生成器一个一个的指向下一个,不会回去__next__()到哪指针就到哪下一次继续获取指针指向的值
然后是 send方法send和__next__()一样都可以让生成器执行到下一个yield。
send和next的区别
都是往下走一次
send可以给上一个yeild的位置传递值,不能给最后一个yield发送值,在第一次执行生成器代码的时候不能使用send()
生成器可以使用for循环来循环内部元素
def func(): print(111)
yield 222 print(333) yield 444 print(555) yield 666
gen = func() for i in gen:
print(i)
结果: 111 222 333 444 555 666
二,列表推导式,生成器表达式以及其他推导式
列表推导式是通过一行行来构建你要的列表,列表推导式看起来代码简单。但是出现错误之后很难排查。
列表推导式的常用用法:
【结果 for 变量 in可迭代对象】
还可以进行筛选
筛选模式:
[ 结果 for 变量 in 可迭代对象 if 条件 ]
生成器表达式和列表推导式基本一样 就是()换成【】但是更重要的是 生成器打印出的是地址,列表推导式表达的是人能看懂的字符
gen = ("麻花藤我第%s次爱你" % i for i in range(10))for i in gen:
print(i)
生成器表达方式也可以筛选 整除2是否为0count XX出现几次 出现几次怎样 没有怎样
生成器表达式,和列表推导式
1,列表推导式比较耗内存,一次性加载,生成器表达式几乎不占用内存使用的时候才分配和使用内存
2.得到的值不一样。列表推导式得到的是一个列表,生成器表达式获取的是一个生成器
生成器的惰性机制生成器只有在访问的时候才取值,说白了,你找他要他才给你值,不找他他就不执行。
深坑--生成器,要值得时候才拿值
字典推导式:
# 把字典中的key和value互换
dic = {'a': 1, 'b': '2'}
new_dic = {dic[key]: key for key in dic}
print(new_dic)
# 在以下list中. 从lst1中获取的数据和lst2中相对应的位置的数据组成⼀一个新字典
lst1 = ['jay', 'jj', 'sylar']
lst2 = ['周杰伦', '林林俊杰', '邱彦涛']
dic = {lst1[i]: lst2[i] for i in range(len(lst1))}
print(dic)
集合推导式:
集合推导式可以帮我们直接⽣成一个集合. 集合的特点: ⽆序, 不重复. 所以集合推导式⾃带去重功能
推导式有,列表推导式有,字典推导式,集合推导式,没有元组推导式
生成器表达式(结果 for 变量 in 可迭代对象 if条件筛选)
生成器表达式可以直接获取到生成器对象。生成器对象可以直接进行for循环,生成器具有惰性机制。