一   生成器

  生成器的本质就是迭代器

  生成器的特点和迭代器一样,取值方式和迭代器一样(__next__(),  send():  给上一个yield传值)

  生成器一般由生成器函数或者生成器表达式来创建

  其实就是手写的迭代器

 def func():
print("")
yield 123 ret = func()
print(ret)

由于函数中含有yelid,那么这个函数就是生成器函数,  且执行这个函数的时候就不再试函数的执行了,而是获取这个生成器.

如何使用:

def func():
print("")
yield 123
ret = func() #这个时候函数不会被执行而是获取生成器
print(ret) #按以前函数的方法执行会打印出地址
s = ret.__next__()
print(s) 结果
<generator object func at 0x000002EB35432C50>
111
123

yield     是分段执行这个函数, return    是直接停止执行这个函数

 def func():
print(123)
yield 456
print(789)
yield 147
print(258)
yield 369 ret = func()
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__()) #最后一个yield 执行完毕,再次 __next__()程序会报错, 与return无关 #结果
123
456
789
147
258
369
Traceback (most recent call last):
File "E:/Python/day13/练习.py", line 48, in <module>
print(ret.__next__())
StopIteration # 报错

生成器函数:

1  和普通函数没有区别,里面有   yield   的函数就是生成器函数

2  生成器函数在执行的时候,  默认不会执行函数体,  返回生成器

3 通过生成器的__next__()  分段执行这个函数

4 send()   给上一个  yield   传值,  不能再开头(没有上一个yield)    最后一个yield  也不能用send()

生成器作用:

举一个例子---

比如   你比较喜欢吃鸡蛋,一次性给你买几千个鸡蛋 , 够你吃几年了,  那么这些鸡蛋你怎么存放, 需要很多地方存放,

所以这样你想吃鸡蛋了就去买一个,想吃了就买一个,是不是也能一直吃鸡蛋

ef func():
for i in range(1,5000):
yield "鸡蛋"+str(i) ret = func()
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__()) # 结果
鸡蛋1
鸡蛋2
鸡蛋3
鸡蛋4
鸡蛋5

区别 :  如果直接买几千个给你吃 ,  会很占地方,  在程序中就是很占内存,   然而上面的方法是  你想吃就买一个, 不会占地方

所以   生成器非常省内存

send()

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

def func():
print(1)
a = yield 2
print(a)
b = yield 4
print(b)
c = yield 6
print(c)
d = yield 8 gen = func()
ret = gen.__next__()
print(ret)
ret1 = gen.send("金")
print(ret1)
ret2 = gen.send("天")
print(ret2)
ret3 = gen.send("下")
print(ret3) #结果 1
2

4

6

8

send() 和  __next__的区别:

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

2 send 可以个上一个yield的位置传递值,不能给最后一个  yield   发送值,在第一次执行生成器代码的时候不能使用  send()

推导式:

列表推导式: 就是用一句话来生成一个列表

语法:   [结果   for循环   判断]

lis = [i for i in range(50) if i%2==1]
print(lis) 结果
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]

字典推导式

语法:{k:v   for循环    条件判断}

lis = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]
dic = {i:lis[i] for i in range(len(lis)) if i%3!=0}
print(dic) #结果 {1: 3, 2: 5, 4: 9, 5: 11, 7: 15, 8: 17, 10: 21, 11: 23, 13: 27, 14: 29, 16: 33, 17: 35, 19: 39, 20: 41, 22: 45, 23: 47}

集合推导式

语法: {k  for循环    条件判断}

lis = [1,2,3,4,5,6,7,8,12,1,2,3,4,3,3,33,44,55,11,22,33,44,55,333,442,223,3,21]
set = {i for i in lis}
print(set) #结果
{1, 2, 3, 4, 5, 6, 7, 8, 33, 11, 12, 44, 333, 21, 22, 55, 442, 223}

生成器表达式:

格式: (结果  for循环  条件判断)

特点:

1  惰性机制

2 只能向前

3 节省内存

重点:      面试题

def add(a,b):
return a + b def test():
for te in range(4):
yield te g = test()
for i in [2,10]:
g = (add(i,n) for n in g ) print(list(g))
上面的程序详解步骤:
for i in [2,10]:
g = (add(i,n) for n in g )
由于for循环 i = 2的时候没有取值
所以当i = 10 的时候才取值
i = 2时
g = (add(i,n) for n in g ) 但是没有取值
i = 10时
g = (add(i,n) for n in (add(i,n) for n in g ) )
把i 换成10
g = (add(10,n) for n in (add(10,n) for n in g ) ) 因为g 是0, 1 , 2 , 3
所以 10 11 12 13
g = (add(10,n) for n in (add(10,n) for n in g ) ) g = (add(10,n) for n in (10,11,12,13) ) g = [20,21,22,23]

Python生成器/推导式/生成器表达式的更多相关文章

  1. python 列表推导式,生成器推导式,集合推导式,字典推导式简介

    1.列表推导式multiples = [i for i in range(30) if i % 2 is 0]names = [[],[]]multiples = [name for lst in n ...

  2. day15(PYTHON)推导式{生成器,字典,列表,集合}

    #[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历之后挨个处理 #[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件] #筛选功能 # ...

  3. Python——生成器&推导式

    生成器 生成器的本质就是迭代器,那么还为什么有生成器呢,两者唯一的不同就是迭代器都是Python给你提供能够的已经写好的工具或者通过数据转化得来的.而生成器是需要我们自己用Python代码构建的工具. ...

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

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

  5. python 生成器函数.推导式.生成器表达式

    一.生成器 什么是生成器,生成器的实质就是迭代器 在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也可以获取生成器 1 def func ...

  6. 12.Python略有小成(生成器,推导式,内置函数,闭包)

    Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...

  7. 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ

    一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...

  8. Python函数04/生成器/推导式/内置函数

    Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...

  9. day14(2)---列表推导式、生成器推导式、字典推导式、三元表达式

    一.列表推导式: ls = [元素表达式 for i in 可迭代对象 if 筛选条件] 案例: # -*- coding: utf-8 -*- '''列表生成式练习''' # 练习一(三元表达式): ...

随机推荐

  1. STM32F407: USART 遇到的问题

    今天初次使用STM32F407进行USART串口通讯实验,按照f103的代码写完了,发现没法发送数据, 查看文档后发现是由于没有将端口映射到USART1,然后添加如下代码: 1 GPIO_PinAFC ...

  2. canvas - 圆圈内 hover 高亮 效果

    各种计算还挺繁琐的, 关键点在角度的计算, 根据鼠标位置, 利用atan(y/x) 得到反正切值 , 角度  (tan输入的是r和x围成的那个角,输出的是y/x.反tan就是输入y/x输出角.) &l ...

  3. jQuery对象[0]倒底是什么?

    s[0]倒底是什么?(s为jQuery对象)代码:var s=$("div"); alert(s.length);alert(s[0]); jQuery对象默认都有个0索引,s为j ...

  4. aac adts & LATM封装码流分析

    本文继续上一篇文章的内容,介绍一个音频码流处理程序.音频码流在视频播放器中的位置如下所示. 本文中的程序是一个AAC码流解析程序.该程序可以从AAC码流中分析得到它的基本单元ADTS frame,并且 ...

  5. POSIX线程同步

    在posix编程中,如果在不同的线程中几乎同一时间操作同一个变量的时候,就会出现不同步. 如何解决这样的问题,这里需要用到互斥量,互斥锁的概念.请看UNIX环境高级编程P299页 #include & ...

  6. openlayers自定义图层控制的实现

    好久没写博文了,今天出来冒个泡. 最近一直在考虑一件事情,那就是openlayers中自定义wms的图层控制.用过openlayers的人都知道,在openlayers中有自带的图层控制的控件,调用方 ...

  7. 21天学通C++_Day3_Part3

    控制程序流程 0.switch...case...语句中省略了break? break让程序能够退出switch结构,如果没有将继续评估后面的case语句 1.如何退出无限循环? 使用break退出当 ...

  8. PTA L3-020 至多删三个字符 (序列dp/序列自动机)

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 1] 内的字符串. 输 ...

  9. 安装Oracle数据库操作步骤

    第一步: 第二步: 第三步: 第四步: 第五步:输入密码 第六步:继续 第七步: 第八步:进入主页后 第九步:登录进去后是这样子 第十步: 第十一步: 第十二步: 最后一步:看到桌面上有个图标就说明安 ...

  10. AtCoder Regular Contest 077 被虐记&题解

    直到\(7:58\)才知道今天\(8:00\)有\(AtCoder\)的菜鸡来写题解啦. C - pushpush 题目: 给定一个长为\(n\)的序列,第\(i\)次操作做如下的事 : 将\(a_i ...