内容梗概:
1. 生成器和生成器函数.
2. 列表推导式. 1.生成器函数
1.1 生成器函数. 就是把return换成yield
def gen():
print("爽歪歪")
yield "娃哈哈" # 可以让我们的函数分段运行
print("酸酸乳")
yield "AD钙奶"
print("黄焖鸡米饭") ret = gen() # 不会执行你的函数, 获取到生成器对象
# 迭代器不能等价代换
print(ret) # <generator object gen at 0x00000195518CFE60> generator 生成器
print(ret.__next__()) # 必须执行__next__()才可以触发生成器的运行 娃哈哈
print(ret.__next__()) # 必须执行__next__()才可以触发生成器的运行 AD钙奶
print(ret.__next__()) # StopIteration 迭代器, 就找yield, 执行不到才会报错
1.2 生成器函数的作用:节省内存,要多少用多少
def gen():
lst = []
for i in range(1, 10000):
lst.append("衣服%s" % i)
if i % 50 == 0: # 1 2 3 4 5 6 7 8 9 .. 49 50
yield lst
lst = [] # 每次生成一个新列表 g = gen() # 获取到生成器 print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

  

生成器和迭代器有相同的特点
# 节省内存
# 惰性机制
# 只能往前 生成器还可以使用__next__(), send()来访问生成器
send()可以给上一个yield位置传值
详见实例:
def func():
print("水饺")
a = yield "大馅水饺"
print("a=", a)
print("烧饼")
b = yield "武大郎烧饼"
print("b=",b)
print("老婆饼")
c = yield "只要老婆不要饼"
print("c=", c)


1.3 x.send()的用法
gen = func() # 生成器
print("返回值是:", gen.__next__())
print("返回值是:",gen.send("混沌面")) # 和__next__()一样也是向下找yield. 给上一个yield传值
print("返回值是:",gen.send("胡辣汤")) # 和__next__()一样也是向下找yield. 给上一个yield传值
print("返回值是:",gen.send("马拉")) # 和__next__()一样也是向下找yield. 给上一个yield传值
 send()不可以在第一个位置和最后一个位置出现
最后的yield后的代码是可以执行的但是会报错. StopIteration 注意:
生成器函数里不要写return
def  func():
print("哈哈")
yield "呵呵"
print("吼吼")
return "嘻嘻" # don't do this! gen = func()
gen.__next__()
gen.__next__()

2.推导式
2.1列表推导式:
lis = [结果 for循环 if判断语句]
实例1 筛选出名字长度小于二的
lst = ["中岛美雪", "夏川美里", "原由子", "汪峰", "田震","那英","周杰伦"]
new_lst = [ el for el in lst if len(el) == 2] #此处快速创建了一个新列表,并用IF语句做出来筛选
print(new_lst)

  

实例2
[3,6,9]  已知 求转换成[(1,2,3), (4,5,6), (7,8,9)]

lst = [3,6,9]
new_lst = [(el-2, el-1, el) for el in lst]

  

2.2 字典推导式  {结果 for循环 if判断}
实例一
lst = [11, 22, 33] # => {0:11, 1:22, 2:33}
dic = {i:lst[i] for i in range(len(lst)) } #字典推导式
print(dic)
实例二
dic = {"张无忌":"赵敏", "杨过":"小龙女", "郭靖":"黄蓉"}
# 把字典中的key和value互换
# dic = {"赵敏":"张无忌", "小龙女":"杨过", "黄蓉":"郭靖"}
法1
dic1 = { v:k for k, v in dic.items()} # 强化
print(dic1)
法2
dic2 = { dic[k]:k for k in dic} # 强化
print(dic2)
2.3 集合推导式   # 特点: 不可变. 不重复, 无序
{结果 for循环 if判断}
s = {i*"胡辣汤" for i in range(10)}
print(s) 注意: 没有元组推导式 2.1 生成器表达式 (结果 for循环 if判断) => 生成器表达式
2.1.1特点: 本质是迭代器. __next__()
1. 省内存
2. 惰性机制
3. 只能向前 2.1.2为啥省内存?
lst = ["衣服%s" % i for i in range(100000000)] # 占内存
print(lst) g = ("衣服%s" % i for i in range(100000000)) # 生成器表达式. 节省内存,要多少多少
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
生成器推导式的一些坑
1. list()里面包含循坏,会循环生成器,打印成列表
2.生成器的惰性机制,拿一次取一次
详见实例: 实例1:
g = (i for i in range(10))
print(list(g)) # 把传递进来的数据转化成列表. 里面包含了for循环
list() => for=> __iter__() ==> __next__()
print(list(g)) # 上一次已经拿没了,因为生成器是一次性的,且只能往前取值,所以会打印出空表格
print(g.__next__())
for el in g:
print(el)
for el in g: # 已经没有数据了 惰性机制-> 只能往前
print(el)
实例2 :
def func(): # 生成器函数
print(111)
yield 222
g = func() # 生成器 -> 没有执行过__next__()
g1 = (i for i in g) # 生成器表达式. 也没有__Next__()
g2 = (i for i in g1) # 生成器表达式. 也没有__Next__()
# 到此为止, 没有人拿过值
print(list(g)) # 111 [222]
print(list(g1)) # [] #因为前面的g已将拿过值了,g已经空了,先到先得
print(list(g2)) # []

tips:生成器表达式和列列表推导式的区别:
1. 列表推导式比较耗内存. 一次性加载. 生成器表达式几乎不占⽤用内存. 使用的时候才分配和使用内存
2. 得到的值不一样. 列表推导式得到的是⼀个列列表. 生成器表达式获取的是⼀个生成器. 补充知识点:yield from
在python3中提供了了一种可以直接把可迭代对象中的每一个数据作为生成器的结果进行返回
def gen():
lst1 = ["⿇花藤", "胡辣汤", "微星牌饼铛", "Mac牌锅铲"]
lst2 = ["饼铛还是微星的好", "联想不能煮鸡蛋", "微星就可以", "还可以烙饼"]
yield from lst1
yield from lst2
g = gen()
for el in g:
print(el) #结果会先将lst1先打印完,然后再打印lst2

python基础之生成器,生成器函数,列表推导式的更多相关文章

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

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

  2. python day12 ——1.生成器2.生成器表达式 3.列表推导式

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

  3. Python函数——列表推导式、生成器与迭代器

    列表推导式 产生背景 现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求你把列表里的每个值加1,你怎么实现? 第一种方法: a = [1,3,4,6,7,7,8,9 ...

  4. python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)

    一.列表生成式 生成1-100的列表 li = [] for i in range(1,101): li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期 ...

  5. Python 速通爆肝、列表推导式、生成器、装饰器、生命游戏

    列表推导式.赋值.切片(替换.插入).字符串处理与判断.enumerate().格式化字符串.读写文件.global 关键字.字符串startswith().类与对象.生成器.装饰器.Self.*ar ...

  6. python基础17_列表推导式 vs 生成器表达式

    [ ] 列表推导式,是用简单的语法来生成列表, ( ) 生成器表达式,是用简单的语法创建个生成器. 外观上仅括号不一样. 虽然写起来方便,但是读起来稍显费力,另外,不易调试. # 列表推导式 prin ...

  7. day5--装饰器函数的信息打印,迭代器,生成器,列表推导式,内置函数

    本文档主要内容: 一 装饰器函数的信息打印 二 迭代器 三 生成器 四 生成器表达式和列表推导式 五 内置函数 一 装饰器函数的信息打印 一个函数一旦被装饰器给装饰后,这个函数的信息使用原来的命令打印 ...

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

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

  9. python之迭代器、生成器及列表推导式

    一.迭代器 迭代器就是迭代的工具,迭代是一个重复的过程,每次重复都是一次迭代并且每次迭代的结果都是下次迭代的初始值. lst=[1,2,3,4,5] count=0 while count<le ...

随机推荐

  1. 用vim + xdebug 来追踪thinkphp的执行过程

    tree命令的使用几个有实际应用的参数 -a 这是默认的 -d: 只显式目录, 不需要显式目录下的文件 -L: 列出显式的深度. 当前目录下的所有东西为第一级... 在tp下, 有多个Common但是 ...

  2. Baseline

    Baseline Baselines an existing database, excluding all migrations upto and including baselineVersion ...

  3. 通过cmd调用Powershell脚本

    一共需要3个文件,把这3个文件放在一个路径下 UTF8NoBOM.bat   这个文件是为了调用ps1 pwsh -file "%cd%\UTF8NoBOM.ps1" UTF8No ...

  4. nginx重新编译添加ssl模块

    https://www.cnblogs.com/zhming26/p/6278667.html https nginx配置 找到安装nginx的源码根目录,如果没有的话下载新的源码 http://ng ...

  5. 【.Net】在windows server 2016 和Windows10这些server上安装.net fw3.5

    一般就是打开server manager. 一直next到add feature 讲net3.5勾选 发现需要指定一个路径是什么 source\sxs之类的 下载microsoft-windows-n ...

  6. 转入Python3.5

    Future 我决定从python2.7转到python3.5,毕竟python3才是未来,业余程序员也是有追求的 嵌入发布 版本3.5中的新特性.可以将python嵌入用户程序,变成程序的一部分,随 ...

  7. 1、iptables-netfilter基础

    .iptables: 包过滤型防火墙功能.四表五链 .iptables规则.规则管理工具.iptables命令 .iptables链管理.规则管理.查看等 .iptables匹配条件.目标.显式扩展. ...

  8. Git 常用使用技巧

    1.创建代码仓库 Step 1:先配置下我们的身份吧,这样在提交代码的时候Git就可以知道是谁提交的,命令如下: git config --global user.name "coder-p ...

  9. tarjan 缩点(模板)

    描述: 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 注:允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 思路: ...

  10. 【汇总】基于.NET平台常用的框架整理

    分布式缓存框架: Microsoft Velocity:微软自家分布式缓存服务框架. Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度. Redis:是一个高性能的K ...