IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python-迭代器和生成器案例 -> 正文阅读

[Python知识库]python-迭代器和生成器案例

手动迭代

对于迭代器和迭代对象,可以使用迭代工具,比如for循环,也可以自己手动迭代
手动迭代需要自己处理StopIteration异常

迭代器手动迭代

因为迭代器内置了__next__方法,调用next()就会自动调用__next__方法
(1)文件是一个迭代器

f=open("text.text")

try:
    while True:
        line=next(f)
        print(line,end='')
except StopIteration:
    pass
finally:
    f.close()

(2)列表是一个可迭代对象,需要先调用iter函数生成一个迭代器

L=[1,2]

l=iter(L)

print(next(l))
print(next(l))
print(next(l))

运行结果:

1
2
Traceback (most recent call last):
  File "/Users/jingsli/PycharmProjects/mocklearn/gernatorlearn/demo6.py", line 8, in <module>
    print(next(l))
StopIteration

生成器

函数中只要出现了yield语句,就会将其转变成一个生成器,生成器只会在next调用时才会运行

def countdown(n):
    print("Starting to count from ",n)
    while n>0:
        yield n
        n-=1
    print("done")


#将生成器赋值给一个变量
c=countdown(3)
#第一次调用next
print(next(c))
print("*"*20)
print(next(c))
print("*"*20)
print(next(c))
print("*"*20)
print(next(c))

运行结果:

Starting to count from  3
3
********************
2
********************
1
********************
done
Traceback (most recent call last):
  File "/Users/jingsli/PycharmProjects/mocklearn/gernatorlearn/demo7.py", line 20, in <module>
    print(next(c))
StopIteration

运行过程分析:
c=countdown(3),只是将生成器赋值给一个变量,没有调用next,所以生成器不会运行
第一个next调用时,执行以下语句:

print("Starting to count from ",n)
    while n>0:
        yield n

遇到yield时,就返回n给调用的函数,生成器保存变量n的值
再次执行next时,从上次停止的地方再次执行,从n-=1处开始执行,到yield时再次将n的值返回

对于生成器,可以使用for循环,或者sum(),list()等可以访问迭代器中元素的函数

def frange(start,stop,increment):
    x=start
    while x<stop:
        yield x
        x+=increment

for n in frange(0,4,0.5):
    print(n,end=' ')

print("\n")
print(list(frange(0,4,0.5)))

运行结果:

0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 

[0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5]

反转迭代器,迭代对象

内置的reserved函数可以实现反转
调用对象的__reversed__方法

L=[1,2,3,4]

for n in reversed(L):
    print(n,end=' ')

运行结果:

4 3 2 1 

enumerate,以索引-值对的形式迭代序列

迭代序列,又想记录索引

my_list=['a','b','c']

for index,value in enumerate(my_list):
    print(index,value)

运行结果:

0 a
1 b
2 c

可以指定索引从某一个数字开始,比如1

my_list=["a","b","c"]

for index,value in enumerate(my_list,1):
    print(index,value)

运行结果:

1 a
2 b
3 c

enumerate通常用来做计数器,或者行号

zip同时迭代多个序列

如果想要迭代的元素包含在多个序列中,可以使用zip函数来同时迭代多个序列

x=[1,5,3,2,6]
y=[3,4,6,8,0]

for x,y in zip(x,y):
    print(x,y)

运行结果:

1 3
5 4
3 6
2 8
6 0

zip是一个生成器,元素是元组

使用zip生成一个dict
headers=["name","shares","price"]
values=["ACME",100,490.1]

dict1=dict(zip(headers,values))

print(dict1)

运行结果:

{'name': 'ACME', 'shares': 100, 'price': 490.1}
使用zip生成一个list
headers=["name","shares","price"]
values=["ACME",100,490.1]

l=list(zip(headers,values))

print(l)

运行结果:

[('name', 'ACME'), ('shares', 100), ('price', 490.1)]
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:19:02  更:2022-04-09 18:19:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:56:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码