python摸爬滚打之day12----生成器, 各种生成式
1、生成器
生成器的本质就是迭代器.
1.1 获取生成器
1: 生成器函数
函数中出现 "yield" 的函数就是一个生成器函数, 再次执行函数时就不是运行函数而是获取生成器.
2: 生成器推导式
( i for i in range( 20) ) ----> 不是元组生成式, 而是生成器推导式, 它获取的是一个生成器.
gen = ( i for i in range( 20) ), gen就是一个生成器
1.2 生成器取值方式:
1, 通过__next__()取值. 2 , 通过send(" ")取值并传值.
def func():
print("黄焖鸡") #
yield "黄焖鸡yield" #
print("烧鸭") #
yield "烧鸭yield" #
print("蒸鹿茸") #
yield "蒸鹿茸yield" #
print("蒸熊掌") gen = func() # 函数中出现"yield" 时,表示该函数为生成器,获取生成器.
print(gen) # 结果是一个生成器地址. <generator object func at 0x000002798C873C78>
gen.__next__() # 取到函数体中yield的那行就停止(第1,2行),并将yield后面的内容返回给调用者
print(gen.__next__()) # 再次调用就从上次停止的yield下行(第3行)开始运行,截止到第四行.
print(gen.__next__())
print(gen.__next__()) # 如果yield内容结束,还继续调用,则报错,但是print("蒸熊掌")还是会继续执行的
生成器__next__()取值
1.2 生成器本质就是迭代器, 如何满足迭代器的三个特点呢?
def buy():
lst = []
for i in range(1000):
lst.append("帽子%s" %(i)) # 把多有的帽子放在内存的列表里,占得内存大
return lst
print(buy()) def buy_gen():
for i in range(1000):
yield "帽子%s" %(i) # 不是一次性全部把帽子0.......帽子999放在内存,
# 而是通过__next__()一个一个取,比较省内存,但是不能往前执行,
# 满足迭代器的三个特点
gen = buy_gen()
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
如何满足迭代器的三个特点
def baocaiming():
print("蒸鹿茸")
a = yield "蒸鹿茸yield"
print("a=",a)
print("蒸熊掌")
b = yield "蒸熊掌yield"
print("b=", b)
print("烧花鸭")
c = yield "烧花鸭yield"
print("c=", c)
print("烧子鹅") gen = baocaiming()
print(gen.__next__()) # 第一次只能用__next__()取值
print(gen.send("a++")) # 从上一次停止的yield开始执行,并将"a++"传给上次yield之前的变量a, a == "a++"
print(gen.send("b++"))
print(gen.send("c++")) # 函数里没有yield了,还继续调用,则报错,但是print("蒸熊掌")还是会继续执行的
生成器send()取值
send()取值方式机理?
2、各种推导式
2.1 列表推导式
[ 结果 for循环 if条件 ]
# 1到20 所有奇数的平方
lst = [i**2 for i in range(20) if i % 2 == 1]
print(lst) # 将 a = [3,6,9] 转化成----> [(1,2,3),[4,5,6],[7,8,9]]
print([(ele-2,ele-1,ele-0) for ele in a]) # 查找名字里面有两个"e"的名字
names = [
['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva'],
]
print([r for i in names for r in i if r.count("e") == 2])
列表推导式
2.2 字典、集合推导式
{结果 for循环 if条件}
dic = {"张无忌":"赵敏", "杨过":"小龙女", "郭靖":"黄蓉"} # 将键,值换成值,键
new_dic = {v:k for k,v in dic.items()}
print(new_dic) # lst = [11, 22, 33] # => {0:11, 1:22, 2:33}
lst = [11, 22, 33]
dic = {i:lst[i] for i in range(len(lst))}
print(dic)
字典推导式
2.3 生成器推导式
(结果 for循环 if条件) 注意: 不是元组推导式, 元组是没有推导式!
生成器表达式和列表推导式有什么不同?
1: 列表推导式是一次性加载完, 耗内存; 生成器表达式几乎不占内存, 只有取值时候才分配和使用内存;
2: 列表推导式得到的是一个列表, 生成器表达式得到的是一个生成器.
2.4 生成器的惰性机制?
def func():
print(111)
yield(222)
g = func() # 生成器 g
g1 = (i for i in g) # 生成器 g1, g1数据来源于g
g2 = (i for i in g1) # 生成器 g2, g2数据来源于g1
# --------------------------------截至到此,还没有生成器拿过值
# 惰性机制----只要不访问就永远拿不到值
print(list(g)) # ----> [222] 获取到g中的数据,此时才执行func()函数,将222返回给g.
print(list(g1)) # ----> [] list(g)已经将生成器g中的数据拿完了,所以g1拿不到数据,只能为[]
print(list(g2)) # ----> [] g2和g1一样,拿不到值. # list() 的机理? (list()包含了for循环的机理)
# list() ----> 包含了for循环 ----> 通过__iter__()将可迭代对象转化成了
# 迭代器 ----> 通过__next__()从迭代器里取值 ----> 将拿到的值添加进列表里
生成器惰性机制
2.5 yield from
把可迭代对象中的每一个元素作为生成器的结果返回.
def gen():
lst = ["⿇花藤", "胡辣汤", "微星牌饼铛", "Mac牌锅铲"]
lst2 = ["饼铛还是微星的好", "联想不能煮鸡蛋", "微星就可以", "还可以烙饼"]
yield from lst # 把 lst中的每一个元素作为生成器的结果返回给调用者.
yield from lst2 # 两个yield不会产生交替的效果. g = gen()
for el in g:
print(el)
yield from
python摸爬滚打之day12----生成器, 各种生成式的更多相关文章
- python基础学习Day12 生成器、列表推导式、字典的表达式、字典键值对的互换、集合推导式
一.生成器 1.1 生成器:就是(python)自己用代码写的迭代器,生成器的本质就是迭代器. 1.2 生成器函数 def func1(x): x += print() yield x print() ...
- 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ
一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...
- python基础语法9 生成器,面向对象编程思想,三元表达式,列表生成式,生成器表达式(生成式),匿名函数,内置函数
生成器 1.什么是生成器? 生成的工具. 生成器是一个 "自定义" 的迭代器, 本质上是一个迭代器. 2.如何实现生成器 但凡在函数内部定义了的yield, 调用函数时,函数体代码 ...
- Python迭代器生成器与生成式
Python迭代器生成器与生成式 什么是迭代 迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次"迭代",而每一次迭代得到的结果会作为下一次迭 ...
- python之迭代器与生成器
python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...
- day12——生成器、推导式、简单内置函数
day12 生成器 迭代器:python中内置的一种节省空间的工具 生成器的本质就是一个迭代器 迭代器和生成器的区别:一个是pyhton自带的,一个是程序员自己写的 写一个生成器 基于函数 在函数中将 ...
- Python之路,Day12 - 那就做个堡垒机吧
Python之路,Day12 - 那就做个堡垒机吧 本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多 ...
- python基础—迭代器、生成器
python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...
- Python之迭代器,生成器
迭代器 1.什么是可迭代对象 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. from collections import Iterable l = [1,2,3,4] t ...
随机推荐
- python初级 2 字符串格式化
一.回顾 上次我们讲解的数据类型,有int,float,str,bool,NoneType五种 前两种和后两种都比较简单,str较为复杂 二.字符串格式化的使用场景: 有一种字符串, xxx 的内容都 ...
- RedHat Linux7.3 使用yum安装时报错,改用CentOS yum源
在使用redhat linux的yum来安装或者更新软件的时候会有如下提示: [root@node1 home]# yum install package_name Loaded plugins: p ...
- Docker 基本指令整理(一)
安装Docker yum install docker 1 1 yum install docker 开机自启动 -- centos 6 service docker start chkconfi ...
- Mac mysql 修改密码
如果你知道密码: mysqladmin -u root -p password 新密码 MYSQL数据库密码忘记: 1. 在系统偏好 中,中止MYSQL服务.: 2. cd/usr/local/mys ...
- electron安装+运行+打包成桌面应用+打包成安装文件+开机自启动
1.初始化node项目,生成package.json文件 npm init 2.安装electron,并保存为开发依赖项 npm install electron -D 3.根目录下新建index.j ...
- [Algorithm] Warm-up puzzles
闲下来后,需要讲最近涉及到的算法全部整理一下,有个indice,方便记忆宫殿的查找 MIT的算法课,地球上最好:https://ocw.mit.edu/courses/electrical-engin ...
- Mac和Windows中常见中文字体的英文名称
我们在给HTML元素设置字体的时候经常会有类似 “ font-family:"微软雅黑", "黑体" ” 这样的写法,尤其是在使用Dreamweaver.Apt ...
- 【IBM-WALA】Step by Step : use WALA to generate System Dependency Graph PDF and Dot File (Mac)
Preparations: 1. IDE : eclipse (my version is luna) 2. maven (my version is 3.5.0) 3. git 4. JAVA 1. ...
- C语言程序设计--文件操作
前言 这里尝试与Python对别的方法来学习C语言的文件操作,毕竟我是Pythoner. 文件打开与关闭 Python #因为是和C语言比对,所以不使用with filename = "/e ...
- JVM内存GC的骗局——JVM不抛出OOM但内存已经泄露
概述 在日常测试中,我们会去重点观察java的内存使用情况,比如:进程会抛出OOM异常,不再接收新的请求:响应时间在固定时间段内变长,超时或者不响应,CPU使用率时常像过山车一样等.有时候JVM还会发 ...