day 012 生成器 与 列表推导式
生成器的本质就是迭代器,写法和迭代器不一样,用法一样。
获取方法:
1、通过生成器函数
2、通过各种推导式来实现生成器
3、通过数据的转换也可以获取生成器
例如:

更改return 为 yield 即成为生成器 该函数就成为了一个生成器函数。再执行这个函数的时候,就不再是函数的执行了,而是获得这个生成器。执行生成器可以直接用__next__()来执行。
return和yield的区别:
yield是分段开执行一个函数,而return直接停止执行函数。
当程序运行完最后一个yield。那么后面继续进行__next__()程序会报错。
生成器的作用:
例如:
def cloth():
lst = []
for i in range(0,10000):
lst.append('衣服'+strt(i))
return lst
cl = cloth()
再看另一种方式:
def cloth():
for i in range(0,10000):
yield'衣服'+str(i)
cl = cloth()
print(cl.__next__())
print(cl.__next__())
print(cl.__next__())
print(cl.__next__())
两个案例的区别:第一种直接一次性全部拿出来,会很占用内存。第二种使用生成器,一次就一个。用多少生成多少,生成器是一个一个的指向下一个。不会回去,__next__()到哪,指针就指到哪。下一次继续获取指针指向的值。
生成器函数:函数中带有yield,执行生成器函数的时候返回生成器
生成器特点:
1、节省内存,几乎不占用内存。应用于数据量比较大、而单次使用不会用太多数据量的场合
2、惰性机制
3、只能往前
send 和__next__()的区别:
1.send 和next()都是让生成器向下走一次。
2.send可以给上一个yield的位置传递值,不能给最后一个yield发送值。在第一次执行生成器代码的时候不能使用send()。
生成器可以使用for循环来获取内部的元素:
def func():
print(111)
yield 222
print(333)
yield 444
print(555)
yield 666
gen = func()
for i in gen:
print (i)
结果:
111
222
333
444
555
666
二、列表推导式,生成器表达式以及其他推导式
1、列表推导式;

替换成列表推导式:

列表推导式是通过一行来构建需要的列表,看起来代码简单,但出现错误后很难排查。
推导式的常用写法:
[结果 for变量 in 可迭代对象]
生成器表达式和列表推导式的语法基本上是一样的。只是把[]替换成()。

打印的结果就是一个生成器。可以使用for循环来循环这个生成器:

生成器表达式和列表推导式的区别:
a、列表推导式比较耗内存。一次性加载。生成器表达式几乎不占用内存。使用的时候才分配和使用内存。
b、得到的值不一样。列表推导式得到的是一个列表。生成器表达式获得的是一个生成器。
生成器的惰性机制:生成器只有在访问的时候才取值,即找他要才给值,不找他要,是不会执行的。
深坑==>生成器,要值的时候才拿值。
def func():
print(111)
yield 222
g = func() #此处生成一个生成器g
g1 = (i for i in g) # 生成器g1 数据来源于g
g2 = (i for i in g1) #生成器g2 来源于g1
print(list(g)) # 获取g中的数据。这时func()才会被执行。打印111获取到222 g 获值完毕。
print(list(g1)) #获取g1中的数据。g1的数据来源是g,但是g已经取完了。g1也就没有数据了。
print(list(g2))# 同g1
2、字典推导式:
例如:
在以下列表中,从lst1中获取的数据和lst2中相对应的位置的数据组成一个新字典。
lst1 = ['jay','jj','sylar']
lst2 = ['周杰伦','林俊杰','邱彦涛']
dic = {lst[i]:lst2[i] for i in range(len(lst1))}
print (dic)
集合推导式:
集合推导式可以帮我们直接生成一个集合。集合的特点:无序,不重复。所以自带去重功能。
总结:推导式有:列表推导式、字典推导式、集合推导式,没有元组推导式。
生成器表达式:(结果 for 变量 in 可迭代对象 if条件筛选)
生成器表达式可以直接获取到生成器对象。生成器对象可以直接进行for 循环 生成器具有惰性机制。
day 012 生成器 与 列表推导式的更多相关文章
- Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数
Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: 就是迭代器 生成器产生的方式: 1.生成器函数
- Python-02 生成器表达式,列表推导式
列表推导式和生成器表达式 列表推导式,生成器表达式1,列表推导式比较直观,占内存2,生成器表达式不容易看出内容,省内存. [ 变量(加工后的数据) for 变量i in 可迭代的数据类型 ] 列表 ...
- python之生成器和列表推导式
一.生成器函数 1.生成器 就是自己用python代码写的迭代器,生成器的本质就是迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现). 2.构建生成器的两种方式 1,生成 ...
- 【python】 迭代器、生成器、列表推导式
一.可迭代对象.迭代器 1.可以被for循环的数据类型(可迭代对象): 字符串(str).列表(list).字典(dict).元祖(tuple).range() 2.迭代器 2.1 将可迭代对象==& ...
- Python_迭代器、生成器、列表推导式,生成器表达式
1.迭代器 (1)可迭代对象 s1 = ' for i in s1: print(i) 可迭代对象 示例结果: D:\Python36\python.exe "E:/Python/课堂视频/ ...
- python全栈开发day13-迭代器、生成器、列表推导式等
昨日内容:函数的有用信息.带参数的装饰器.多个装饰器修饰一个函数 迭代器 可迭代对象:内部含有__iter__方法 迭代器 定义:可迭代对象.__iter__()就是迭代器,含有__iter__且__ ...
- python基础之生成器,生成器函数,列表推导式
内容梗概: 1. 生成器和生成器函数. 2. 列表推导式. 1.生成器函数1.1 生成器函数. 就是把return换成yield def gen(): print("爽歪歪") y ...
- day5--装饰器函数的信息打印,迭代器,生成器,列表推导式,内置函数
本文档主要内容: 一 装饰器函数的信息打印 二 迭代器 三 生成器 四 生成器表达式和列表推导式 五 内置函数 一 装饰器函数的信息打印 一个函数一旦被装饰器给装饰后,这个函数的信息使用原来的命令打印 ...
- python基础学习Day12 生成器、列表推导式、字典的表达式、字典键值对的互换、集合推导式
一.生成器 1.1 生成器:就是(python)自己用代码写的迭代器,生成器的本质就是迭代器. 1.2 生成器函数 def func1(x): x += print() yield x print() ...
随机推荐
- [poj3041]Asteroids(二分图的最小顶点覆盖)
题目大意:$N*N$的网格中有$n$颗行星,若每次可以消去一整行或一整列,求最小的攻击次数使得消去所有行星. 解题关键:将光束当做顶点,行星当做连接光束的边建图,题目转化为求该图的最小顶点覆盖,图的最 ...
- Entity Framework Tutorial Basics(7):DBContext
DBContext: As you have seen in the previous Create Entity Data Model section, EDM generates the Scho ...
- c++中怎么实现Java中finally语句
所有学习c++的书籍都明确提出了,不要使用goto, 以免造成程序流程的混乱,使理解和调试程序都产生困难. 但是我们遇到这样一个场景怎么办:就是不管程序执行成功与否,都要执行一些资源释放语句,相当ja ...
- HDU 5033 Building (维护单调栈)
题目链接 题意:n个建筑物,Q条询问,问所在的位置,看到天空的角度是多少,每条询问的位置左右必定是有建筑物的. 思路 : 维护一个单调栈,将所有的建筑物和所有的人都放到一起开始算就行,每加入一个人,就 ...
- 如何使用ArcPy
ArcPy可以很方便的通过脚本调用ArcGIS的各种函数和功能.在此简单介绍一下.方法包括两种,第一种是直接使用ArcGIS中的命令行,输入一句,执行一句:第二种是创建一个Python脚本,直接执行其 ...
- Java的post(HTTPS)请求-----接口测试
package com.ju.util; import java.io.BufferedReader; import java.io.IOException; import java.io.Input ...
- Server.MapPath方法的应用方法
老是忘记Server.MapPath的使用方法了,下面记录一下,以备后用:总注:Server.MapPath获得的路径都是服务器上的物理路径,也就是常说的绝对路径1.Server.MapPath(&q ...
- 静态-static
静态 1. 静态初始化块 (1)可初始化类的静态字段 (2)静态初始化块只调用一次 (3)创建子类时会调用父类的静态初始化块 源代码: class Root { static{ System.out. ...
- Codeforces Round #538 (Div. 2)D(区间DP,思维)
#include<bits/stdc++.h>using namespace std;int a[5007];int dp[5007][5007];int main(){ int n ...
- 【BZOJ 3326】[Scoi2013]数数
题目描述 Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩.他数数玩的具体规则是: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串, ...