一.生成器

  什么是生成器,生成器的实质就是迭代器

  在python中有三种方式来获取生成器:

    1.通过生成器函数

    2.通过各种推导式来实现生成器

    3.通过数据的转换也可以获取生成器

1 def func()
2 print("111")
3 yield 222
4 ret = func()
5 print(ret)
6
7 结果:
8 <generator object func at 0x10567ff68>

   send方法和__next__()

   send和__next__()一样都可以让生成器执行到下一个yield.

 def eat():
print("我吃什么啊")
a = yield "馒头"
print("a=",a)
b = yield "大饼"
print("b=",b)
c = yield "韭菜盒子"
print("c=",c)
yield "GAME OVER"
gen = eat() # 获取生成器器
ret1 = gen.__next__()
print(ret1)
ret2 = gen.send("胡辣汤")
print(ret2)
ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send("猫粮")
print(ret4)

    send和__next__() 的区别:

    1.send和next()都是让生成器向下走一次

    2.send可以让上一个yield的位置传递值,不能给最后一个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

二.列表推导式,生成器表达式以及其他推导式

  首先给出如下代码

 lst = []
for i in range(1,15)
lst.append(i)
print(lst)

  替换成列表推导式:

 lst = [i for i in range(1,15)]
print(lst)

  语法:

    [结果 for 变量 in 可迭代对象 if 条件]

  列表推导式可对结果进行筛选:

 lst = [i for i in range(1,15) if i%2 ==0]
print(lst)

  生成器表达式与列表推导式的语法是一致的,只是把[]替换成了()

 gen = (i for i in range(1,15))
print(gen) 结果:
<generator object <genexpr> at 0x106768f10>

  打印的结果是一个生成器,我们可以通过for循环来循环这个生成器:

 gen = (i for i in range(10))
for i in gen:
print(i)

  生成器表达式同样可以进行筛选:

 #获取1-100内能被3整除的数
gen = (i for i in range(1,100) if i %3 == 0) for num in gen:
print(num)

  生成器表达式和列表推导式的区别:

  1.列表推导式比较耗内存,一次性加载,生成器表达式几乎不占用内存,使用的时候采配合使用内存

    2.得到的值不一样,列表推导式得到的是一个列表,生成器表达式获取的是一个生成器.

  生成器的惰性机制:

 def func()
print("")
yield 222 g = func() #生成器g
g1 = (i for i in g) #生成器g1,但是生成器的数据来源于g
g2 = (i for i in g1) #生成器g2,来源于g1 print(list(g)) #获取g中的数据,这时func()才会被执行,打印,获取到222,g完毕
print(list(g1)) #获取g1中的数据,g1的数据来源于g,但是g已经取完,g1也没有数据
print(list(g2)) #与g1同理

  字典推导式:

  

 # 把字典中的key和value互换
dic = {'a': 1, 'b': ''}
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)

  集合推导式:

    集合推导式可以帮我们直接生成一个集合,集合的特点:无序,不重复,所以集合推导式自带去重功能

 lst = [1, -1, 8, -8, 12]
# 绝对值去重
s = {abs(i) for i in lst}
print(s)

  生成器表达式:

 def add(a, b):
return a + b def test():
for r_i in range(4):
yield r_i
g = test() for n in [2, 10]:
g = (add(n, i) for i in g) print(list(g)) 结果:
[20,21,22,23]

  生成器的惰性机制

python 生成器函数.推导式.生成器表达式的更多相关文章

  1. Python_Mix*生成器,生成器函数,推导式,生成器表达式

    生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...

  2. Day12--Python--生成器,生成器函数,推导式,生成器表达式

    一.昨日内容回顾 惰性机制(只有执行__next__()才会取值)二.今日主要内容 1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样. ※生成器记录的是代码 2.生成器函数 生成 ...

  3. day13 python生成器函数 推导式 生成器

    day13 python   一.生成器     生成器的本质就是迭代器     生成器的特点和迭代器一样. 取值方式和迭代器一样(__next__())     由生成器函数或生成器表达式来创建   ...

  4. python全栈开发 生成器 :生成器函数,推导式及生成器表达式

    python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...

  5. python之生成器(~函数,列表推导式,生成器表达式)

    一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...

  6. Python生成器、推导式之前襟后裾

    生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...

  7. python基础学习笔记——生成器与推导式

    生成器 首先我们来看看什么是个生成器,生成器本质就是迭代器 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 首先,我们先 ...

  8. Learn day5 迭代器\生成器\高阶函数\推导式\内置函数\模块(math.time)

    1.迭代器 # ### 迭代器 """能被next调用,并不断返回下一个值的对象""" """ 特征:迭代器会 ...

  9. Python【day 12】生成器和推导式

    一.生成器和生成器函数1.生成器和生成器函数的概念 1.生成器的本质是迭代器 2.函数中包含yield,就是生成器函数 2.生成器函数的写法 def func(): a =10 yield 20 ge ...

随机推荐

  1. Djang学习笔记-1

    1.django的生命周期: url匹配 -> 视图函数 -> 返回用户字符串 url匹配 -> 视图函数 -> 打开一个HTML文件,并读取内容2.创建Django proj ...

  2. software collection

    software software Table of Contents 1. Privacy 2. GFW 2.1. google search 2.2. 修改 DNS 服务器 2.2.1. 修改ip ...

  3. calculate Cp history (from Fluent) using Matlab

    input data : unscaled time history of moment/thrust from ANSYS fluent example of input data, "m ...

  4. react入门----基础语法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. redis 指定端口 启动

    由于资源紧张 需要多创建一个redis实例 重新copy一份实例,然后修改redis.conf文件, 找到port 6379 处修改 端口号 6380 通过下面命令启动就好了 src/redis-se ...

  6. 洛谷 P3203 BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊

    题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...

  7. python之MD5、base64\base32解密

    # -*- coding:utf-8 -*- import hashlib import base64 # 求最大公约数gys # def gys(m, n): # c = 1 # while(c ! ...

  8. Quartz原理解密

    Quartz原理解密 Author: Dorae Date:2018年7月17日15:55:02 转载请注明出处 一.quartz概述 quartz是一个用java实现的开源任务调度框架,可以用来创建 ...

  9. JAVA NIO 之Channel

    缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.Channel 通道就是将数据传输给 ByteBuffer 对象或者从 ByteBuffer 对象获取数据进行传输. Channel 用于在 ...

  10. - > 动规讲解基础讲解七——最长单增子序列

    (LIS Longest Increasing Subsequence)给定一个数列,从中删掉任意若干项剩余的序列叫做它的一个子序列,求它的最长的子序列,满足子序列中的元素是单调递增的. 例如给定序列 ...