Python不归路_生成器

生成器:生成器是一次生成一个值的特殊类型函数。可以将其视为可恢复函数。调用该函数将返回一个可用于生成连续 x 值的生成器【Generator】,生成器具有一边计算一边生生成的功能,起到节省空间的作用,真正能做到按需所取。来看下面这段代码:

[ x**2 for x in range(20) ]输出结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]---------------------------------------------------------------------------------------A = [x**2 for x in range(20)]type(A)输出结果:<class ‘list‘>---------------------------------------------------------------------------------------B=( x**2 for x in range(20) )print(B)输出结果:<generator object <genexpr> at 0x0000015C857D7EB8>

我们可以看到A的输出结果是一个列表,我们试想一下,当列表中元素的数量很多时,会大大占用系统空间,加重cpu负载。而B的输出结果是生成器的内存空间,但是我们也想要得到A的输出结果,怎么办呢?我们可以使用__next__()来调用元素,每执行一次__next__(),向后调用一个元素。


B=( x**2 for x in range(20) )
print(B.__next__())
print(B.__next__())
print(B.__next__())
print(B.__next__())输出结果:0  # x=01  # x=1  4  # x=29  # x=3

每次调用一个元素,如果元素多了是不是很麻烦?所以__next__基本不会使用,而会使用for循环来迭代。generator非常强大,如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。一般带有yield关键字的函数就被称为生成器。

来看这段代码

def func1(x):
    while x < 1000:
        n = x**2
        yield n
        x+=1
f=func1(200)
for i in f:
    print(i)

func1(x)函数就是一个生成器,当运行该func1(x),函数成了生成器,并通过yield来调用每一次的值。

总结:

一般带有yield的函数都是生成器,生成器使用方法__next__()取值,而且一次只能调取一个值,如要调取多个值,可以使用for来迭代取值。生成器可以作到按需取值,减少负载的作用。

-------不会开发的运维不是好厨师

时间: 2024-10-23 07:51:01

Python不归路_生成器的相关文章

Python不归路_字符编码操作

文件操作补充 上篇随笔中写了文件操作的几个方法,其中truncate()方法遗漏,truncate()方法作用是截取内容,f.truncate()不带参数会清空文件内容,带参数表示截取从零到参数的位置 字符编码 在<Python不归路_零基础学习二>中我们已经学习了一些编码的知识,比如ASCII一共有255个符号,Unicode中,中文字符占两个字节,英文占一个字节,utf-8是unicode的优化方案,中文字节占三个字符.不同字符编码之间需要相互转化才能正常读取.encode和decode,

Python不归路_迭代器

迭代器: for循环可以对两类数据类型进行迭代: 1.比如list.tuple.dict.set等 2.带有yield关键字的函数或者能用__next__()进行调用的,也就是生成器 能被for调用的对象都是Iterable的,可以使用isinstance方法验证是不是Iterable from collections import Iterable a=[1,'b','c'] b={'name':'gally','age':23} isinstance(a,Iterable) isinstan

Python不归路_文件操作(一)

Python文件操作 Python文件操作的语法是: open(file,mode,buffering,encoding,erros,newline,closefd) 我们先来看下各个参数, file:很明显,输入文件的路径. mode:mode参数有很多  r 以只读方式打开文件,默认参数  r+ 以读写方式打开文件   w 以写入方式打开文件,如果文件存在,先删除原文件,再创建文件:如果文件不存在直接创建  w+ 以读写方式打开文件,如果文件存在,先删除原文件,再创建文件:如果文件不存在直接

Python不归路_装饰器(二)

装饰器上节回顾 装饰器主要是由高阶函数和嵌套函数组成的,它由有两大特性:1.不改变被装饰函数原代码:2.不改变被装饰函数调用方式 高阶函数主要有两大特性:1.被装饰函数作为高阶函数的参数:2.return函数 嵌套函数特性:在一个函数内,新定义一个函数 下面我们来看一段代码,给login_index()和login_mang()添加用户密码认证的功能的装饰器. user='gally' #定义用户名 password='123' #定义密码 def auth(func): #定义装饰器 被装饰函

Python不归路_装饰器(一)

装饰器 装饰器 什么是装饰器?给现有函数添加新功能的函数,不更改现有函数源代码,现有函数调用方式.装饰器是由高阶函数和嵌套函数组成. 概括上面这句话的意思:1.装饰器 - - - > 函数 : 2.不更改现有函数源代码 3.不更改现有函数调用方式 4.装饰器对于函数来说是透明的(不产生任何影响) 装饰器运用的情景:在生产环境中,业务不能中断时,要给某些大量调用函数填加新功能时. 高阶函数  怎么样的函数才是高阶函数 1.把函数名作为实参传递给另外一个函数 2.返回值中包括函数 下面我们来感受下高

python之路系列-生成器和迭代器-景丽洋老师

返回顶部 楔子 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式? 首先,我可以通过索引取值l[0],其次我们是不是还可以用for循环来取值呀? 你有没有仔细思考过,用索引取值和for循环取值是有着微妙区别的. 如果用索引取值,你可以取到任意位置的值,前提是你要知道这个值在什么位置. 如果用for循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接去取其他位置的值. 但你有没有想过,我们为什么可以

学习python之路_入门篇A

偶尔经同事的介绍进入了金角大王的博客里,看到大王编写的文章都是关于python编程的,由于自己一直也是做软件测试方面的工作,也一直想往自动化测试方面发展,了解到利用python可以进行自动化测试操作,可以减少人工测试的繁锁操作. 读了python的基础篇了解了python的发展历史及python的基础知识点,就开始跟着课程去编写一些小脚本. 如下面是使用了for循环的语句: 1 for i in range(10): 2 print("*******",i) 3 for j in ra

Python不归路_os和system模块

OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作,OS模块提供对操作系统进行调用的接口. 几个重要函数: os.getcwd()#查看当前所在路径,默认是Python程序所在路径 os.chdir()#切换目录,功能和linux中cd命令一样 os.curdir#返回当前目录'.' os.pardir#返回当前父目录'..' os.makedirs()#新建多级目录,功能和linux中的mkdir -p命令一样 os.removedirs

Python不归路_logging模块

Logging模块学习 1.Logging的五个等级 debug:诊断性的信息 info:确认一切按预期运行 warning:警告性信息,如CPU负载过高,硬盘空间少 error:更严重的事情,但系统还能运行 critical:系统无法继续运行 这5个等级,也分别对应5种打日志的方法: debug .info .warning .error .critical.默认的是WARNING,当在WARNING或之上时才被跟踪. 2.将日志输出到屏幕 2.1简单输出 1 import logging 2