Python全栈之路8--迭代器(iter)和生成器(yield)

一、生成器( iter )

从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码。

它基于yield指令,允许停止函数并立即返回结果。
此函数保存其执行上下文,如果需要,可立即继续执行。

1、对比 range 和 xrange 的区别

1
2
3
4
>>> print range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print xrange(10)
xrange(10)

  如上代码所示,range会在内存中创建所有指定的数字而xrange不会立即创建,只有在迭代循环时,才去创建每个数组。

复制代码
def nrange(num):
    temp = -1
    while True:
        temp = temp + 1
        if temp >= num:
            return
        else:
            yield temp
自定义迭代数字生成器
复制代码
复制代码
#!/usr/bin/env python
# _*_ coding:utf-8 _*_

def xrange():
    print(11)
    yield 1

    print(22)
    yield 2

    print(33)
    yield 3

# 仅仅获取到了一个生成器 #含有yield的函数叫做生成器函数
r = xrange() #这是一个生成器

#生成器的__next__方法

ret  = r.__next__()
print(ret)
ret  = r.__next__()
print(ret)
ret  = r.__next__()
print(ret)
课上实验代买 生成器
复制代码
复制代码
#!/usr/bin/env python
# _*_ coding:utf-8 _*_

def n2(start,stop):
    start = start
    while stop:
        yield start
        start +=1
def xrange2(start,stop):
    obj = n2(start,stop)
    for i in range(start,stop):
        j = obj.__next__()
        print(j)
def n1(stop):
    start = 0
    while stop:
        yield start
        start +=1
def xrange1(stop):
    obj = n1(stop)
    for i in range(stop):
        j = obj.__next__()
        print(j)

def xrange(*args):
    if len(args) == 1:
        xrange1(*args)
    elif len(args) == 2:
        xrange2(*args)
    else:
        print("参数不对 1 or 2")

if __name__ == "__main__":
    xrange(2,11)
课上练习
复制代码

2、文件操作的 read 和 xreadlinex 的的区别

1
2
read会读取所有内容到内存
xreadlines则只有在循环迭代时才获取
复制代码
def NReadlines():
    with open('log','r') as f:
        while True:
            line = f.next()
            if line:
                yield line
            else:
                return

for i in NReadlines():
    print i
基于next自定义生成器NReadlines
复制代码
复制代码
def NReadlines():
    with open('log','r') as f:
        seek = 0
        while True:
            f.seek(seek)
            data = f.readline()
            if data:
                seek = f.tell()
                yield data
            else:
                return

for item in NReadlines():
    print item
基于seek和tell自定义生成器NReadlines
复制代码

二、迭代器  iterators

迭代器仅是一容器对象,它实现了迭代器协议。它有两个基本方法:
1)next方法
返回容器的下一个元素
2)__iter__方法
返回迭代器自身

迭代器可使用内建的iter方法创建,见例子:

1
2
3
4
5
6
7
8
9
10
11
>>> i = iter('abc')
>>> i.next()
'a'
>>> i.next()
'b'
>>> i.next()
'c'
>>> i.next()
Traceback (most recent call last):
  File "<string>", line 1, in <string>
StopIteration: 

  

 

posted @   想做土匪的书生  阅读(354)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!
点击右上角即可分享
微信分享提示