无名商城论坛

搜索
查看: 333|回复: 0

[其他技术] 【HC】python装B语法八

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32464
发表于 2022-5-8 18:36:27 | 显示全部楼层 |阅读模式
这里小亚
——————
yield 以及生成器和迭代器
yield 这词儿,真不好翻译,翻词典也没用。我干脆就读作“一爱得”,算是外来词汇吧。要理解 yield,得先了解 generator(生成器)。要了解generator,得先知道 iterator(迭代器)。哈哈哈,绕晕了吧?算了,我还是说白话吧。

话说py2时代,range()返回的是list,但如果range(10000000)的话,会消耗大量内存资源,所以,py2又搞了一个xrange()来解决这个问题。py3则只保留了xrange(),但写作range()。xrange()返回的就是一个迭代器,它可以像list那样被遍历,但又不占用多少内存。generator(生成器)是一种特殊的迭代器,只能被遍历一次,遍历结束,就自动消失了。总之,不管是迭代器还是生成器,都是为了避免使用list,从而节省内存。那么,如何得到迭代器和生成器呢?
python内置了迭代函数 iter,用于生成迭代器,用法如下:
>>> a = [1,2,3]
>>> a_iter = iter(a)
>>> a_iter

>>> for i in a_iter:
        print(i, end=', ')

1, 2, 3,
yield 则是用于构造生成器的。比如,我们要写一个函数,返回从0到某正整数的所有整数的平方,传统的代码写法是这样的:
>>> def get_square(n):
        result = list()
        for i in range(n):
                result.append(pow(i,2))
        return result

>>> print(get_square(5))
[0, 1, 4, 9, 16]
但是如果计算1亿以内的所有整数的平方,这个函数的内存开销会非常大,这是 yield 就可以大显身手了:
>>> def get_square(n):
        for i in range(n):
                yield(pow(i,2))

>>> a = get_square(5)
>>> a

>>> for i in a:
        print(i, end=', ')

0, 1, 4, 9, 16,
如果再次遍历,则不会有输出了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表