广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python 生成器&迭代器
  • 119
分享到

python 生成器&迭代器

生成器迭代python 2023-01-30 23:01:50 119人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

  一、生成器 1、列表生成器:列表生成式就像是一个厨师,他只会做这n(n为任意整数)道菜,想吃甚麽做甚麽,不吃不做,不浪费空间;而列表表达式就相当于已经做好的n盘菜,占用空间。2、生成器的创建方法: s = (x*2 for x in

 

一、生成器

1、列表生成器:列表生成式就像是一个厨师,他只会做这n(n为任意整数)道菜,想吃甚麽做甚麽,不吃不做,不浪费空间;而列表表达式就相当于已经做好的n盘菜,占用空间。
2、生成器的创建方法:

  • s = (x*2 for x in range(5))
  • yield+数字     只要有yield就是一个生成器对象

注意:生成器在创建的时候已经决定了能计算出值得个数,调用next的个数一旦超过这个值就会报错

   第一种:

s = (x*2 for x in range(5))

# 生成器的调用方法:next() print(next(s)) # 提取生成器里面的值,in python2中等价于 s._next_(),next() 一次打印一次
print(next(s))
print(next(s)) # 生成器就是一个可迭代对象(Iterable) for i in s: # 遍历生成器可迭代对象 print(i) # 打印完一个数之后这个数就被回收,不占用内存,只占用被引用值的哪一个内存

>>> 0  2  4  6  8

运行机制:从0开始,第一次next()时,取出一个数*2输出,然后每next()一次,取一个数,一直到2,for循环遍历时,因为前面next()已经取到了数字2的位置,所以从3开始,故输出为0 2 4 6 8

   第二种:

def fun():         # 注意:生成器对象是fun(),而不是fun
    print('s')
    yield 1

    print('ss')
    yield 2

g = fun()
print(g)           # <generator object fun at 0x000001D54E12A0F8>
 
next(g)            # 有返回值,为yield后的值
next(g)

解释:程序运行时先执行g = fun(), 执行到第一个next()时,返回到函数中执行具体内容,一直到执行完yield 1 停止,然后继续下一个next(),再到函数中寻找yield 2 的内容,以此类推。 注意:如果再多一个next(g),就会报错:StopIteration(停止迭代),因为超过了迭代次数

什么是可迭代对象:内部有 _iter_() 的都是可迭代对象(列表、元组、字典)

def fun():   
    print('s')
    yield 1

    print('ss')
    yield 2

for i in fun():
    print(i)       # yield 有返回值,返回值赋给了i

>>>

s
1
ss
2

例1:输出斐波那契数列

def fib(maxs):
    n, before, after = 0, 0, 1
    while n < maxs:
        print(after)       # 从1开始,如打印before则从从0开始
        before, after = after, before+after      # 先计算后赋值(先右后左)
        n = n+1

fib(10)     # 输出前10个斐波那契数

注意:before, after = after, before+after  和 下面的两条语句不等价,原因见例1对应标注;

before = after
after =  before+after

例2:斐波那契数列生成器

def fib(maxs):
    n, before, after = 0, 0, 1
    while n < maxs:
        yield before
        before, after = after, before+after      # 先计算后赋值(先右后左)
        n = n+1

g = fib(8)
print(g)     # 生成器所在的内存地址

# 需要几个next() 几次,但最多不能超过8次,否则应修改fib() 里面的数字
print(next(g))
print(next(g))
print(next(g))
print(next(g))

3、 .send() 方法

def fun():        # fun()是一个生成器对象而不是fun
    print('qwer')
    count = yield 1  # 先把yield的值返回,然后把‘xss’赋值给变量count
    print(count)

    print('asdf')
    yield 2

f = fun()
# next(f)      # 进入函数体
f.send(None)   # 等价于next(f)  
s = f.send('xss')   # 给yield前面的变量赋值
print(s)    
# s 是yield 2 的返回值

  注意:第一次send前如果没有next,只能传一个send(None),否则报错,TypeError: can't send

non-None value to a just-started generator,第一次通过进入send(None) 进入函数之后首先执行

print(),yield返回一个1,再次进入之后就把send()里面的值传给count,然后就可以对count进行操作

例3:yield 伪并发的实现

import time

def consumer(name):
    print("%s准备吃包子!" % name)
    while True:
        baozi = yield
        print("包子[%s]来了,被[%s]吃了!" % (baozi, name))

def producer(name):
    a1 = consumer('A')
    a2 = consumer('B')
    next(a1)
    next(a2)
    print("%s准备吃包子了!" % name)
    for i in range(5):
        time.sleep(1)
        print("做了2个包子")
        a1.send(i)
        a2.send(i)

producer("xiaoss")

>>>

      A准备吃包子!
      B准备吃包子!
      xiaoss准备吃包子了!
      做了2个包子
      包子[0]来了,被[A]吃了!
      包子[0]来了,被[B]吃了!
      做了2个包子
      包子[1]来了,被[A]吃了!
      包子[1]来了,被[B]吃了!
      做了2个包子
      包子[2]来了,被[A]吃了!
      包子[2]来了,被[B]吃了!
      做了2个包子
      包子[3]来了,被[A]吃了!
      包子[3]来了,被[B]吃了!
      做了2个包子
      包子[4]来了,被[A]吃了!
      包子[4]来了,被[B]吃了!

 

二、迭代器

1、什么是迭代器?

    迭代是指可以用for循环来遍历

     for循环内部三件事: 1.调用可跌代对象的iter方法返回一个可迭代对象
                                        2.不断调用可迭代对象的next方法
                                        3.处理StopIteration

  处理StopIteration的过程如下:

 

while:
    try:
        I = next(list_Iterator)
    
    except StopIteration:
        break

  注:生成器都是迭代器,迭代器不一定是生成器

2、满足两个条件: (1)有iter方法  (2) 有next方法   

from collections import Iterable,Iterator   # 调用Iterable和Iterator

lis = [1, 2, 3, 4]
d = iter(lis)   # 相当于 l._iter_()
print(d)        # <list_iterator object at 0x00000206700DC358>
print(next(d))
print(next(d))
print(next(d))
print(next(d))

for i in [1, 2, 3, 4]:
    iter([1, 2, 3, 4])

print(isinstance([1, 2], list))    # 判断一个字符是不是某个特定的数据类型 isinstance(数据, 数据类型)
print(isinstance(lis, Iterable))   # 判断lis是不是迭代器

>>>

<list_iterator object at 0x000002756B321240>
1
2
3
4
True
True

例1:用迭代找出文档中最长的行

F = max(len(x.strip()) for x in open('file_1', 'r'))      # 文件读取,找出最长的行
print(F)       # 最长行字符的个数

--结束END--

本文标题: python 生成器&迭代器

本文链接: https://www.lsjlt.com/news/181215.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python 生成器&迭代器
      一、生成器 1、列表生成器:列表生成式就像是一个厨师,他只会做这n(n为任意整数)道菜,想吃甚麽做甚麽,不吃不做,不浪费空间;而列表表达式就相当于已经做好的n盘菜,占用空间。2、生成器的创建方法: s = (x*2 for x in...
    99+
    2023-01-30
    生成器 迭代 python
  • python迭代器和生成器
    1.经典迭代器 import re RE_WORD = re.compile('\w+') class Sentence: def __init__(self, text): self.text = te...
    99+
    2023-01-30
    生成器 迭代 python
  • Python迭代器与生成器
    生成器仅仅拥有生成某种东西的能力,如果不用__next__方法是获取不到值得。创建一个生成器函数>>> def scq(): ...    print("11") # 当函数代码块中遇到yield关键字的时候,这个函数就是...
    99+
    2023-01-31
    生成器 迭代 Python
  • python迭代器,生成器详解
    目录迭代器 生成器 总结迭代器 聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结...
    99+
    2022-11-12
  • Python学习 :迭代器&生成器
    列表生成式 列表生成式的操作顺序: 1、先依次来读取元素 for x 2、对元素进行操作 x*x 3、赋予变量 Eg.列表生成式方式一 a = [x*x for x in range(10)] print(a) >>&g...
    99+
    2023-01-30
    生成器 迭代 Python
  • python迭代器与生成器详解
    例子 老规矩,先上一个代码: def add(s, x): return s + x def gen(): for i in range(4): yield i base = gen() ...
    99+
    2022-06-04
    生成器 详解 迭代
  • Python生成器与迭代器详情
    目录1、生成器 2、迭代器与可迭代的生成器1、生成器 现在可以通过生成器来直接创建一个列表,但是由于内存的限制,列表的容量肯定是有限的,如果我们需要一个包含几百个元素的列表,但是每...
    99+
    2022-11-12
  • python迭代器与生成器小结
    2016.3.10关于例子解释的补充更新 源自我的博客 例子 老规矩,先上一个代码: def add(s, x): return s + x def gen(): for i in range(4): ...
    99+
    2023-01-31
    生成器 小结 迭代
  • python基础:迭代器与生成器
    一、迭代器 迭代器只能向前访问,不能后退字典,列表,元组,字符串,range都是可以迭代的对象。 1、创建迭代器 `dict={1:3,2:4,3:5,4:6}key = iter(dict)print(key)print(next(key...
    99+
    2023-01-31
    生成器 迭代 基础
  • 8 python的迭代器和生成器
    概述         在上一节,我们介绍了Python的模块和包,包括:什么是模块、导入模块、自定义模块、__name__、什么是包、创建包、导入包等内容。在这一节中,我们将介绍Python的迭代器和生成器。在Python中,迭代器是一个非...
    99+
    2023-09-01
    python 迭代器 生成器
  • python学习之可迭代对象、迭代器、生成器
    Iterable – 可迭代对象 能够逐一返回其成员项的对象。 可迭代对象的例子包括所有序列类型 (例如 list, str 和 tuple) 以及某些非序列类型例如 dict, 文...
    99+
    2022-11-12
  • python-装饰器&生成器&迭代器&推
     一:普通装饰器 概念:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能,为已存在的对象添加某个功能 普通装饰器编写的格式 def 外层函数(参数) def 内层函数(*args,**kwargs) ...
    99+
    2023-01-31
    生成器 迭代 python
  • python3--迭代器,生成器
    一 迭代器1 什么是可迭代对象?字符串,列表,元组,字典,集合都可以被for循环,说明他们都是可迭代的怎么来证明这一点呢?注释:type只能判断是什么类型isintance判断方面更广,不仅能判断类型,还能判断是否可迭代Iterable是否...
    99+
    2023-01-30
    生成器 迭代
  • 迭代器与生成器
    这一部分待加强!                (一)迭代器    一:简介    迭代是Python最强大的功能之一,是访问集合元素的一种方式。    迭代器是一个可以记住遍历的位置的对象。    迭代器对象从集合的第一个元素开始访问,...
    99+
    2023-01-30
    生成器 迭代
  • 详解Python之可迭代对象,迭代器和生成器
    目录一、概念描述二、序列的可迭代性三、经典的迭代器模式四、生成器也是迭代器五、实现惰性迭代器六、使用生成器表达式简化惰性迭代器总结 一、概念描述 可迭代对象就是可以迭代的对象,我们可...
    99+
    2022-11-12
  • python基础之迭代器与生成器
    目录1. 迭代器1.1 迭代器的使用1.2 创建类的迭代器2. 生成器2.1 生成器的使用2.2 生成器表达式总结 1. 迭代器 1.1 迭代器的使用 迭代器对象从集合的第一个元素开...
    99+
    2022-11-12
  • Python学习之迭代器和生成器
    迭代器 在Python如果一个对象可被循环(遍历)该对象中每一个元素的过程叫做迭代。例如 ,字典、字符串、列表、元祖、集合等。他们可被迭代的原因是,都有一个共同的内置函数__iter__。通过执行内置对象的__next__函数,可以依次打...
    99+
    2023-01-30
    生成器 迭代 Python
  • Python生成器与迭代器怎么用
    这篇文章给大家分享的是有关Python生成器与迭代器怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、生成器现在可以通过生成器来直接创建一个列表,但是由于内存的限制,列表的容量肯定是有限的,如果我们需要一个...
    99+
    2023-06-25
  • python3迭代器和生成器
    迭代对象:在我看来就是可以用for循环依次取值的一个序列就叫可迭代对象迭代器:就是可以用next()来进行取值的对象生成器:我的理解就是在迭代器的基础上给了与暂停功能的函数生成器其实就是一种特殊的迭代器。它使一种更为高级、更为优雅的迭代器。...
    99+
    2023-01-31
    生成器 迭代
  • python3.7 迭代器和生成器
    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 迭代器和生成器 #迭代器协议: ''' 1、迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的...
    99+
    2023-01-30
    生成器 迭代
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作