Python——生成器&推导式

生成器

生成器的本质就是迭代器,那么还为什么有生成器呢,两者唯一的不同就是迭代器都是Python给你提供能够的已经写好的工具或者通过数据转化得来的。而生成器是需要我们自己用Python代码构建的工具。

生成器的构建方式:

在python中有两种方式来创建生成器:

  • 通过生成器函数
  • 通过生成器推导式

生成器函数:

首先我们来一个简单的函数结构:

def func():
    print(‘111‘)
    return 222
result = func()
print(result)

没得问题,那么在看看生成器函数是啥样的。

def func():
    print(‘111‘)
    yield 222
result = func()
print(result)
# <generator object func at 0x000002980E331C10>

以这样打印,就给打印了个这东西。这意思是,当函数看到返回值是yield的时候,就说明这个函数时一个生成器函数。返回的是一个生成器。那么要调用怎么办呢。

def func():
    print(‘111‘)
    yield 222
result = func()  #这会还不会调用,而是获取到一个生成器
ret = result.__next__() #这个时候函数才会被执行。
print(ret)   #而且yield会将func返回的222给ret

就是将return该成yield,再用next来提取就成了。

还有yield可以写多个,一个next对应一个yield,next多了就会报错。

def func():
    print(‘111‘)
    yield 222
    print(‘222‘)
    yield 333
    print(‘333‘)
    yield 444
result = func()
print(next(result))
print(next(result))
print(next(result))

发现它的用处了吗~?? 那就是可以暂停函数执行,并返回出来。这样带来的好处是可以暂时执行其他的,然后再返回执行下面的代码。

当一个数字循环不用保存而只是使用一次的话,那么使用yield是非常省内存的方法。

def func():
    for i in range(10000):
        yield ‘包子‘+ str(i)
v = func()
for i in range(200):
    print(v.__next__())

send方法:

def func():
    for i in range(10000):            #3-10-17
        count = yield str(i)+‘来了‘    #4-8-11-15-18
        print(f‘{count}再吃包子{i}‘)    #9-16
v = func()                             #1
print(v.__next__())                    #2-5
for i in range(2):                     #6-13
    v2 = v.send(i)                     #7-14-19
    print(v2)                          #12-20

这里比较绕哦,需要好好看。

send和next的相同点,不同点:

相同点:

  • 都可以让商城器对应的yield向下执行一次
  • 都可以获取到yield生成的值

不同点:

  • 第一次获取yield值智能用next,不能用send(可以用send(None))
  • send可以给上一个yield传递值

yield from:

def func():
    lis =[1,2,3,4,5]
    yield lis
v = func()
print(next(v))
‘‘‘
[1,2,3,4,5]
‘‘‘
?
?
def func():
    lis =[1,2,3,4,5]
    yield from lis
v = func()
print(next(v))
print(next(v))
print(next(v))
print(next(v))
‘‘‘
1
2
3
4
5
‘‘‘

yield from的主要作用是将列表中的每一个元素返回一次。next多了还是会报错。没啥鸟用。了解即可。

生成器表达式:

gen = (i**2 for i in range(10))
for i2 in gen:
    print(i2)

gen = (i for i in range(10) if i > 2) for i2 in gen: print(i2)

推导式

主要目的是为了方便将比较单一且有规律的做法使用简单的语句进行处理。

缺点是比较占用内存资源。

基本语句:

lis = [ i for i in range(10)]
print(lis)

这样就生成了一个0-9的列表。

推导式的分类:

  1. 循环推导式

    #[变量(值) for 变量 in iterable]

  2. 筛选推导式

    #[变量 for 变量 in iterable if 条件]

列表推导式:

lis = [ i for i in range(10)]

字典推导式:

lis1 = [‘a‘,‘b‘,‘c‘]
lis2 = [‘1‘,‘2‘,‘3‘]
dic = {lis1[i]:lis2[i] for i in range(len(lis1))}
print(dic)
?
lis1 = ‘abc‘
lis2 = ‘123‘
dic = {lis1[i]:lis2[i] for i in range(len(lis1))}
print(dic)

集合推导式:

lis = [1,2,3,4,5,2,2,1,1,3,2,1]
s = {i for i in lis}
print(s)

原文地址:https://www.cnblogs.com/xinbing/p/12074242.html

时间: 2024-11-06 07:16:44

Python——生成器&推导式的相关文章

(一)Python入门-4控制语句:10推导式创建序列-列表推导式-字典推导式-集合推导式-生成器推导式

推导式创建序列: 推导式是从一个或者多个迭代器快速创建序列的一种方法.它可以将循环和条件判断结合, 从而避免冗长的代码.推导式是典型的Python 风格,会使用它代表你已经超过Python初 学者的水平. 一:列表推导式 列表推导式生成列表对象,语法如下: [表达式 for item in 可迭代对象 ] 或者:{表达式 for item in 可迭代对象 if 条件判断} 1 #列表推导式 2 x = [x for x in range(1,5)] 3 print(x) 4 5 x = [x*

python 第十二章 生成器+推导式+内置函数一(不常用的)

生成器 # 迭代器:python中内置的一种节省空间的工具 # 生成器的本质就是一个迭代器 # 区别:迭代器自带的,生成器自己写的 # return可以写多个,但是只执行一次 # yield会记录执行位置 # 一个next()对应一个yield def func(): print(123) return "you" print(func()) # 123 # you # return和yield 都是返回值 # 在函数体内将return改成yield的就是一个生成器 def func(

4-4日 列表推导式,生成器推导式

1,列表推导式就是在列表中进行for 循环if语句判断,最多两个for,一个if判断 #求1到30 被3整除的数的平方 li = [i*i for i in range(1,31)if i%3 == 0] print(li) li = [i for i in range(1,101)if i%2 == 0] l2 = [i for i in range(1,101)if i%2 == 1] print(li) print(l2) #求列表中带两个'e'名字 names = [['Tom', 'B

part4-2 流程控制二(循环结构,while、for循环,列表推导式、生成器推导式,常用工具函数,控制循环结构,4个简单实例)

循环语句在循环条件满足时,可反复执行某一段代码,这段被重复执行的代码称为循环体.在循环体中,需要在合适的时候把循环条件设置为假,从而结束循环:否则循环一直执行下去形成死循环.循环语句通常包含如下4个部分.(1).初始化语句(init_statements):在循环开始前执行,有一条或多条语句,用于完成一些起初始化工作.(2).循环条件(test_expression):一个布尔表达式,决定是否执行循环体.(3).循环体(body_statements):循环的主体,根据循环条件是否允许,这个代码

python 列表推导式----轻量级循环

列表推导式(list comprehension)是利用其他列表创建新列表(类似于数学术语中的集合推导式)的一种方法.它的工作方式类似于for循环,也很简单: In [39]: [x*x for x in range(10)]Out[39]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 如果只想打印出那些能被3整除的平方数,只需要通过添加一个if部分在推导式中就可以完成: In [41]: [x*x for x in xrange(10) if x % 3 == 0

Python之推导式、生成器表达式

l = [i for i in range(10)] print(l) l1 = ['选项%s'%i for i in range(10)] print(l1) 1.把列表解析的[]换成()得到的就是生成器表达式 2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存 3.Python不但使用迭代器协议,让for循环变得更加通用.大部分内置函数,也是使用迭代器协议访问对象的.例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议

python(列表推导式和生成器表达式)

从母鸡下蛋的故事讲起 1 老母鸡 = ('鸡蛋%s'%i for i in range(10)) 2 print(老母鸡) 3 for 蛋 in 老母鸡: 4 print(蛋) 5 g = (i*i for i in range(10)) 6 for i in g: 7 print(i) ①把列表解析的[]换成()得到的就是生成器表达式 ②列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更加节省内存空间 ③Python不但使用迭代器协议,让for循环变得更加通用.大部分内置函数,

python迭代器,生成器,推导式

可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: 内部含有'__iter__'方法的对象,就是可迭代对象. 内置函数:dir() print(dir(str)) 判断一个对象是否是可迭代对象: print('iter' in dir(str)) 优点: 直观. 操作方法较多. 缺点: 占内存. 不能迭代取值(索引,字典的key). 迭代器 字面意

python之路---12 生成器 推导式

三十.函数进阶 1.生成器    函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器   一个一个的创建对象     节省内存 ①创建生成器       最后以yield结束 1. 通过?成器函数   2. 通过各种推导式来实现?成器 3. 通过数据的转换也可以获取?成器 ②send用法 send 和 __next__都是下一个的意思 但send可以给上一个yield 位置传值   不能给最后?个yield发送值. 在第?次执?? 成器代码的时候不能使?send() ③y