一.昨日内容回顾
惰性机制(只有执行__next__()才会取值)
二.今日主要内容
1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样.
※生成器记录的是代码 2.生成器函数
生成器函数: 在函数中return换成yield. 这个函数就是生成器函数
def func():
yield      yield from iterable 相当于 for el in iterable: yield el 取值:
gen.__next__() 下一个
gen.send() 可以给上一个yield传值,第一次执行不能用send(),不能给最后一个yield传值 gen = func() 函数并不会被执行,而是创建一个生成器对象 def func()
print('你好啊,我叫赛利亚.')
yield '西岚的武士刀' #return 和yield都可以返回数据 ret = func() #generator ret是一个生成器
print(ret)
s = ret.__next__()
print(s)      yield from:
      
def func():
lst = ["三国演义", "红楼梦", "北国的雪", "了不起的盖茨比"]
# for el in lst:
# yield el
yield from lst gen = func()
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
def func():
lst = ["三国演义", "红楼梦", "北国的雪", "了不起的盖茨比"]
# for el in lst:
# yield el
yield from lst
        -------------生成器取值-------------------------
def func():
print(111)
yield 222 g = func() # 生成器 g1 = (i for i in g) # 生成器
g2 = (i for i in g1) # 生成器 # print(list(g)) # 才会开始真正的取数据
print(list(g1)) # 222
print(list(g2))
print(list(g))
--------------------------------------
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("胡辣汤") # a胡辣汤'赋值给a
print(ret2)
ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send("猫粮")
print(ret4)
-------------------------------------- 库存10000件衣服,每次领用1件
def func():
for i in range(10000):
yield '衣服%s' % i gen = func() #生成器 注意:生成器不能直接替换到下面yf中,否则会生成新的生成器
yf1 = gen.__next__()
yf2 = gen.__next__()
yf3 = gen.next__()
-----------------一次拿50个---------------------
def func():
lst = []
for i in range(1, 10000):
lst.append('衣服%s' % i)
if i % 50 == 0:
yield lst
lst = [] gen = func()
print(gen.__next__())
print(gen.__next__())
-----------------send()---------------------
def func():
print('韭菜盒子')
a = yield '娃哈哈'
print('肉包子', a)
b = yield '脉动'
print('锅包肉', b)
yield '冰红茶' gen = func()
ret = gen.__next__()
print(ret)
# ret = gen.__next__()
# print(ret) ret = gen.send('大熊猫') #给上一个yield传值
print(ret) ret = gen.send('长颈鹿') #给上一个yield传值
print(ret)
--------------------------------------
# 计算两个数的和
def add(a, b):
return a + b # 生成器函数, 0-3
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) # 循环的内部也是一个生成器 # 生成器记录的是代码 # __next__()
# list() print(list(g)) # 刚开始拿数据 --------------------------------------
-------------------------------------- def func():
print('拿出手机')
print('打开陌陌')
yield '手机'
print('搜索附近的人')
print('找到小姐姐')
yield '电脑'
print('我是最后一行') gen = func()
print(gen.__next__()) #打印到第一个yield
print(gen.__next__()) #从上一次打印结束的位置开始打印到第二个yield, yield起到分段作用
print(gen.__next__()) #报错. 打印完最后一行后找不到yield,所以提示StopIteration. 3.各种推导式
1.列表推导式:[结果 for循环 if条件]
2.字典推导式:{key: value for循环 if条件}
3.集合推导式: {key for循环 if条件} 列表推导式:
lst = ['python%s期' % i for i in range(1, 17)]
print(lst) --------------------------------------
# 创建列表
# for i in range(1,100,2):
lst = [i for i in range(1, 100, 2)]
print(lst) lst = [i for i in range(1, 100) if i % 2 == 1]
print(lst)
在列表中装入python1期到python16期
lst = []
for i in range(1, 17):
lst.append('python%s期'i)
print(lst) --------------------------------------
寻找名字中带有2个e的名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] lst = [el2 for el in names for el2 in el if el2.count('e') >= 2]
print(lst) 字典推导式
dic = {'张无忌': '九阳神功', '周芷若': '九阴真经', '楚留香': '帅'}
d = {dic[k]: k for k in dic}
print(d) lst1 = ['东北', '陕西']
lst2 = ['大拉皮儿', '油泼面']
dic = {lst1[i]: lst2[i] for i in range(len(lst1))}
print(dic) 集合推导式
{key for if} lst = [1, 1, 2, 2, 3, 3, 45]
s = {el for el in lst}
print(s) 4.生成器表达式(笔试题)
(结果 for循环 if条件)
可以使用生成器表达式直接创建生成器 gen = (i for i in range(10)) #generator
print(gen.__next__())
print(gen.__next__()) 生成器表达式:记录一下代码.然后每次需要的时候去生成器中执行一次这个代码
列表推导式: 一次性把所有的数据创建出来,容易产生内存浪费 特点:
1.节省内存
2.惰性机制 ※
3.只能向前

Day12--Python--生成器,生成器函数,推导式,生成器表达式的更多相关文章

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

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

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

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

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

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

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

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

  5. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  6. python全栈开发day13-迭代器、生成器、列表推导式等

    昨日内容:函数的有用信息.带参数的装饰器.多个装饰器修饰一个函数 迭代器 可迭代对象:内部含有__iter__方法 迭代器 定义:可迭代对象.__iter__()就是迭代器,含有__iter__且__ ...

  7. python基础(14):生成器、列表推导式

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

  8. python学习笔记013——推导式

    1 推导式简介 推导式comprehensions(又称解析式),是Python的一种独有特性. 推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 推导式有三种形式: 1)列表推导式 (li ...

  9. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数

    本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...

随机推荐

  1. 关于mysql远程登录问题

    问题:mysql不能实现远程登录 前提:mysql开启了远程登录账号,安全组也放行了3306,防火墙是iptables,也加入了3306放行,但是还是不能实现远程访问 解决办法,使用iptables ...

  2. 使用mysqlbinlog恢复数据

    前提:mysql数据库开启了binlog日志,并且有对应的日志文件 起因:今天由于同事对数据库的误操作不小心删除了一条数据 方法一:通过binlog日志文件恢复数据 通过mysqlbinlog恢复My ...

  3. Java多线程1:进程与线程的概念、区别和联系

    一.进程的的概念 引用线程之前进程的概念: 进程是表示资源分配的基本单位,也是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括内存空间.磁盘空间.I/O设备等.然 ...

  4. Ajax之Jquery封装使用举例

    <html> <head> <meta charset="UTF-8"> <title>登陆页面</title> < ...

  5. Lodop打印连续的纸张

    连续的纸张,有时有会被误解为没有高度,高度自适应,其实不是,这属于纸张连续打印,纸张高度和实际单个纸张高度相同.纸张高度自适应适用于没有高度的那种小票打印(卷纸没有纸张分界线),不是这种连续纸张.关于 ...

  6. HTML5获取地理位置信息

    <!DOCTYPE html> <html> <head> <title>Location</title> <meta charset ...

  7. 如何下载旧版本的MySQL

    可能存在这样的场景,比如一些老系统需要使用MySQL 5.5版本才能运行,其余的不行. 1.登录下载站点 https://dev.mysql.com/downloads/mysql/ 此时的最新版本为 ...

  8. eclipse中无法查看引用的jar包源码

    本文来源:http://blog.csdn.NET/zljjava/article/details/7545270(这篇博客也是转载的,向最原始的作者致敬) 1.下载JAD jad官方地址的官方下载地 ...

  9. LOJ6436 [PKUSC2018] 神仙的游戏 【FFT】

    题目分析: 题目要求前后缀相同,把串反过来之后是一个很明显的卷积的形式.这样我们可以完成初步判断(即可以知道哪些必然不行). 然后考虑一下虽然卷积结果成立,但是存在问号冲突的情况. 箭头之间应当不存在 ...

  10. 序列化模块组 pickle,json , xml , shelve , configparser

    序列化是什么? 序列化指的是将内存中的数据结构转化为一种中间格式 并存储到硬盘上. 反序列化是什么? 将硬盘上存储的中间格式数据再还原为内存中的数据结构. 为什么要有序列化? 是为了将数据持久存储 较 ...