首页 > 编程语言 >Python生成器表达式和生成器(yield)用法总结

Python生成器表达式和生成器(yield)用法总结

时间:2024-02-06 22:11:08浏览次数:31  
标签:__ generator Python self 生成器 yield 表达式

 

Python 中,在处理一个新序列,不想在内存中放置一个新的列表、集合或者字典。因为可能数据量比较大,不能将所有数据都放到内存中。可能只做一次遍历,而不关心是否要创建一个最终的对象容器。此时就可以使用生成器了。生成器是一种使用简洁的语法创建迭代器的工具。主要有两种方式来创建生成器:使用生成器表达式和使用带有 yield 关键字的函数。

 参考文档:Python生成器表达式和生成器(yield)用法总结-CJavaPy

1、生成器表达式

生成器表达式是一种类似于列表推导的语法,但是它返回的是一个生成器对象而不是列表。生成器表达式使用圆括号 ()

# 使用生成器表达式创建生成器
ret = (x ** 2 for x in range(10))

# 遍历生成器
for value in ret:
    print(value)

如对G量级的日志文件做处理。使用for循环,可以一次只处理一行而不需要将下一行读入内存。并且不会创建一个最终的容器对象。则可以创建一个生成器表达式,语法很简洁。代码如下,

import sys
inname = sys.argv[1]
outname = sys.argv[2]
with open(inname) as infile:
    with open(outname, "w") as outfile:
    warnings = (l for l in infile if 'WARNING' in l)
    for l in warnings:
        outfile.write(l) 

2、生成器(yield)

yield是生成器的关键字,可以通过编写一个普通的函数,然后在其中使用 yield 语句而不是 return 来创建生成器。当函数执行到 yield 时,它会返回一个值并暂停执行。下次从生成器中获取值时,它会从停止的地方继续执行。

# 使用 yield 创建生成器函数
def myYield():
    for x in range(10):
        yield x ** 2

# 创建生成器
generator = myYield()

# 遍历生成器
for value in generator:
    print(value)

可以通过yield删除日志文件中WARNING列的例子,代码如下,

import  sys
iname, outname = sys.argv[1:3]
def warnings_filter(p) :
    for l in p:
        if 'WARNING'  in l:
            yield l.replace('\tWARNING',' ')
with open(inname)  as infile:
    with open(outname, "w") as outfile:
        filter = warnings_filter(infile)
        for l in filter:
            outfile.write(l)

带有yield关键字函数返回的是一个生成器对象,这个对象有__iter____next__方法,每当__next__被调用,生成器都会执行到yield语句。然后它会返回yield的值。当__next__下一次被调用时,它会在上次停止的地方继续执行。

yield方法返回生成器对象

>>> help(warnings_filter([]))
Help on generator object:
warnings_filter = class generator(object)
| Methods defined here:
|
| __del__(...)
|
| __getattribute__(self, name, /)
| Return getattr(self, name).
|
| __iter__(self, /)
| Implement iter(self).
|
| __next__(self, /)
| Implement next(self).
|
| __repr__(self, /)
| Return repr(self).
|
| close(...)
| close() -> raise GeneratorExit inside generator.
|
| send(...)
| send(arg) -> send 'arg' into generator,
| return next yielded value or raise StopIteration.
|
| throw(...)
| throw(typ[,val[,tb]]) -> raise exception in generator,
| return next yielded value or raise StopIteration.
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| gi_code
|
| gi_frame
|
| gi_running
|
| gi_yieldfrom
| object being iterated by yield from, or None

通过生成器(yield)实现,可读性可以,代码也很简洁。如果只是用for循环或面向对象方式实现,代码应该都会稍微复杂一点。

参考文档:Python生成器表达式和生成器(yield)用法总结-CJavaPy

标签:__,generator,Python,self,生成器,yield,表达式
From: https://www.cnblogs.com/tinyblog/p/18010366

相关文章

  • Python编写游戏有什么注意
    标题:Python游戏开发的注意事项与技巧Python作为一种功能丰富且易于学习的编程语言,在游戏开发领域也有着广泛的应用。然而,在使用Python编写游戏时,开发者需要注意一些特定的技巧和注意事项,以确保游戏的性能、可维护性和用户体验。本文将介绍Python游戏开发中的一些关键注意事项和技巧......
  • python 自学的学习方法有哪些?
    自学的学习方法是什么?我发现好多人不会自学。在此再次讲下如何自学。自学流程:1:找一篇python教程。百度搜一篇免费的教程最好的教程符合几个特点:免费,文档,有源码实例。2:以最快的方式粗疏的过一遍python教程,不要深究细节,最慢一周看完,然后不管懂不懂,都开始下一步。3......
  • python入门教程详细从零基础入门到精通一站式解决方案
    前言众所周知,Python以优雅、简洁著称,入行门槛低,可以从事Linux运维、PythonWeb网站工程师python自动化测试、数据分析、人工智能等职位,薪资待遇呈上涨趋势,对于许多未曾涉足IT行业「小白」来说,深入地学习python是一件十分困难的事。我这个小萌新当时什么也不懂,就傻乎乎地开始了学......
  • python之面向对象学习二
     1.字段普通字段(如构造函数里面的实例参数),访问普通参数需要实例化静态字段(类里面的参数),访问静态字段类名.字段名1#!/usr/bin/python2classPeople(object):3test=[1,2,3,4]#类参数4def__init__(self,name,age,sex):#实例化、实例参数5......
  • python学习笔记37-pandas
    内容来自https://www.runoob.com/pandas/pandas-tutorial.html目录1.Series1.1Series特点1.2更多Series说明1.2.1基本操作1.2.2基本运算1.2.3属性和方法2.DataFrame2.1DataFrame特点2.2更多DataFrame说明2.2.1基本操作2.2.2属性和方法2.2.3数据操作2.2.4从外部数据......
  • python之面向对象学习一
    面向对象的几个核心特性如下Class类一个类即是对一类拥有相同属性的对象。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法Object对象一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同......
  • Liunx安装配置python3
    liunx系统下会默认自带python2.0版本,查看python版本:python-V官网下载python3.10.0版本上传到liunx机器解压并移动到/usr目录下#解压命令tar-zxvfPython-3.10.0.tgz#移动到/usr/python3目录下mkdir/usr/python3mvPython-3.10.0/usr/python3安装依赖包yumins......
  • python推荐音乐系统
    importpandasaspdimportnumpyasnpimporttimeimportsqlite3data_home='E:/python学习/项目/python推荐系统/Python实现音乐推荐系统/'读取数据triplet_dataset=pd.read_csv(filepath_or_buffer=data_home+'train_triplets.txt',......
  • 2 Python数据类型
    介绍Python3中主要的内置类型为:数字、列表、字典、类、实例和异常。通常使用到的基本数据类型有:数字(int、float、complex):int表示整数;float表示浮点数;complex表示复数,并用j或J表示虚数部分。布尔值(bool):实际上bool是int的子类型,其只有两种取值(True和False),并支持直接与int类型的......
  • 1 使用venv创建Python虚拟环境
    Python从3.3版本开始,自带虚拟环境配置包venv。虚拟环境下通过pip命令下载的Python包不会影响到系统中的Python,可以做到项目之间环境的分离(目前Pycharm新建环境默认使用这种方式)。创建环境py-mvenvenviron上述命令创建虚拟环境environ。激活环境首先进入Scripts文件夹:cde......