Python语言之快速解析生成器
从安 2019-06-14 来源 : 阅读 1484 评论 0

摘要:本篇文章主要讲述Python语言之快速解析生成器,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

本篇文章主要讲述Python语言之快速解析生成器,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

Python语言之快速解析生成器

生成器

首先让我们了解迭代器。根据Wikipedia,迭代器是一个对象,它使程序员能够遍历容器,特别是列表。但是,迭代器执行遍历并允许访问容器中的数据元素,但不执行迭代。你可能会感到困惑,所以让我们慢一点。有三个部分: 

· 可迭代

· 迭代器

· 迭代

所有这些部分都相互关联。我们将逐一讨论它们,然后讨论生成器。

可迭代

Python中的任何对象都有一个__iter__或一个__getitem__定义的 方法,它返回一个迭代器,简而言之,iterable是任何可以为我们提供迭代器的对象。什么是迭代器?

迭代器

Python中的只要定义了next(Python2)或 __next__方发就是一个迭代器。现在让我们理解迭代。

迭代

简单来说,它是从例如列表中获取元素的过程。当我们使用循环来循环某对象时,它被称为迭代。它是流程本身的名称。现在我们对这些术语有了基本的了解,让我们了解生成器。

 

生成器

生成器是迭代器,但您只能迭代它们一次。这是因为它们不会将所有值存储在内存中,它们会动态生成值。您可以通过迭代它们来使用它们,或者使用'for'循环,或者将它们传递给任何迭代的函数或构造。大多数时候generators都是作为函数实现的。这是一个generator函数的简单示例:

def generator_function():
    for i in range(10):
        yield i
 
for item in generator_function():
    print(item)
 
# Output: 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9

在这种情况下,它并没有真正有用。生成器最适合计算大量结果(特别是涉及循环本身的计算),您不希望同时为所有结果分配内存。lists在Python 2 中返回的许多标准库函数 已在Python 3中被修改为generators返回,因为generators需要的资源更少。

这是一个generator计算斐波纳契数的例子: 

# generator version
def fibon(n):
    a = b = 1
    for i in range(n):
        yield a
        a, b = b, a + b
现在我们可以像这样使用它:
 
for x in fibon(1000000):
    print(x)

这样我们就不必担心使用大量资源了。但是,如果我们这样实现它: 

def fibon(n):
    a = b = 1
    result = []
    for i in range(n):
        result.append(a)
        a, b = b, a + b
    return result

在计算大量输入时,它会耗尽我们所有的资源。我们已经讨论过,我们只能迭代generators一次,但我们还没有测试过。在测试之前,您需要了解Python的另外一个内置函数next()。它允许我们访问序列的下一个元素。让我们测试一下:

def generator_function():
    for i in range(3):
        yield i
 
gen = generator_function()
print(next(gen))
# Output: 0
print(next(gen))
# Output: 1
print(next(gen))
# Output: 2
print(next(gen))
# Output: Traceback (most recent call last):
#            File "<stdin>", line 1, in <module>
#         StopIteration

我们可以看到,在取出所有值之后next()会导致 StopIteration错误。基本上这个错误告诉我们所有的值都已被取出了。您可能想知道为什么我们在使用for循环时不会出现此错误?答案很简单, for循环自动捕获这个错误并停止 next。您是否知道Python中的一些内置数据类型也支持迭代?让我们来看看:

my_string = "Yasoob"
next(my_string)
# Output: Traceback (most recent call last):
#      File "<stdin>", line 1, in <module>
#    TypeError: str object is not an iterator

那不是我们所期望的。str不是迭代器。嗯,这是对的!它是可迭代的但不是迭代器。这意味着它支持迭代但我们不能直接迭代它。那么我们如何迭代呢?现在是时候学习一个内置函数了iter。虽然 int不是可迭代的,但我们可以在字符串上使用它!

int_var = 1779
iter(int_var)
# Output: Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: 'int' object is not iterable
# This is because int is not iterable
 
my_string = "Yasoob"
my_iter = iter(my_string)
print(next(my_iter))
# Output: 'Y'


本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!

 

本文由 @从安 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程