内容梗概:
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. Mysql优化知识点总结(转自CS-Notes)

    转载地址:https://github.com/CyC2018/CS-Notes/blob/master/notes/MySQL.md 一.索引 B+ Tree 原理 MySQL 索引 索引优化 索引 ...

  2. How Flyway works

    The easiest scenario is when you point Flyway to an empty database. It will try to locate its schema ...

  3. p2596 书架(Treap)

    写平衡树修锅快修到死系列 我太蠢了 其实是平衡树裸体裸题 插入,删除,交换前驱或后继,查询rank和kth 维护一个pos数组,表示第i个书的编号 然后注意许许多多的细节,没了 #include &l ...

  4. 题解——loj6281 数列分块入门5 (分块)

    分块 若块内最大值为0或1,则不用再开方 然后暴力修改 可以证明,如果开方后向下取整,则最多开方4次一个数就会变成0或1 #include <cstdio> #include <cm ...

  5. Java中sort实现降序排序

    利用Collections的reverseOrder方法: import java.util.Arrays; import java.util.Collections; public class Ma ...

  6. Unity3D代码动态修改材质球的颜色

    代码动态修改材质球的颜色: gameObject.GetComponent<Renderer>().material.color=Color.red;//当材质球的Shader为标准时,可 ...

  7. 安装ik分词器以及版本和ES版本的兼容性

    一.查看自己ES的版本号与之对应的IK分词器版本 https://github.com/medcl/elasticsearch-analysis-ik/blob/master/README.md 二. ...

  8. ros 充电topic

    #!/usr/bin/env python #coding=utf- import rospy from std_msgs.msg import String i= def talker(): glo ...

  9. Vs自定nuget push菜单

    1.需要准备 nuget.exe 和 nuget-push.cmd 命名行 nuget.ext 下载地址:https://files.cnblogs.com/files/liuxiaoji/nuget ...

  10. IIS字体 404错误

    问题:最近在IIS上部署web项目的时候,发现浏览器总是报找不到woff.woff2字体的错误.导致浏览器加载字体报404错误,白白消耗了100-200毫秒的加载时间. 原因:因为服务器IIS不认SV ...