当前位置: 首页 > news >正文

Python 程序设计讲义(50):Python 的可迭代对象与迭代器

Python 程序设计讲义(50):Python 的可迭代对象与迭代器

目录

  • Python 程序设计讲义(50):Python 的可迭代对象与迭代器
    • 一、可迭代对象(Iterable)
    • 二、迭代器(Iterator)
    • 三、可迭代对象相关的内置函数
        • 1、enumerate()函数
        • 2、`zip()`函数
        • 3、map()函数
        • 4、`filter()`函数

一、可迭代对象(Iterable)

列表、元组、字符串、集合、字典可以用for ... in进行遍历。

表面上看,只要可以用for ... in进行遍历的对象就是可迭代对象。那么列表、元组、字符串、集合、字典都是可迭代对象。

实际上,如果一个对象实现了__iter__方法,那么这个对象就是可迭代对象。

以列表为例:

help(list)  # 查看list所拥有的方法程序运行结果如下:
Help on class list in module builtins:class list(object)|  list(iterable=(), /)|
......|  __iter__(self, /)|      Implement iter(self).
.......

我们还可以使用Python的内置函数isinstance()来判断一个对象是否属于可迭代对象。

代码如下:

from collections.abc import Iterable
obj1=[1,2,3]  #列表
obj2=(4,5,6)  #元组
obj3={1,2,3}  #集合
obj4={1:"党员",2:"团员"}  #字典
obj5=range(3)
print(isinstance(obj1,Iterable))
print(isinstance(obj2,Iterable))
print(isinstance(obj3,Iterable))
print(isinstance(obj4,Iterable))程序运行结果如下:
True
True
True
True
True

二、迭代器(Iterator)

实现了__iter__方法和__next__方法,并且可以通过__next__方法不断返回下一个值的对象称为迭代器。迭代器可以通过内置函数next()访问下一个元素。

列表、元组、字符串、集合、字典实现了__iter__方法,但并未实现__next__方法,因此这些对象都不是迭代器。

可以使用Python的内置函数isinstance()来判断一个对象是否属于迭代器。

代码如下:

from collections.abc import Iterator
obj1=[1,2,3]  #列表
obj2=(4,5,6)  #元组
obj3={1,2,3}  #集合
obj4={1:"党员",2:"团员"}  #字典
obj5=range(3)
print(isinstance(obj1,Iterator))
print(isinstance(obj2,Iterator))
print(isinstance(obj3,Iterator))
print(isinstance(obj4,Iterator))
print(isinstance(obj5,Iterator))程序运行结果如下:
False
False
False
False
False

虽然列表、元组、字符串、集合、字典都是可迭代对象而不是迭代器。但可以通过iter()函数获得一个迭代器。

代码如下:

from collections.abc import Iterator
list=[1,2,3]
iter1=iter(list)
print(iter1)
print(next(iter1))
print(next(iter1))
print(next(iter1))程序运行结果如下:
<list_iterator object at 0x0000022E1F06D2A0>
1
2
3

三、可迭代对象相关的内置函数

1、enumerate()函数

enumerate()函数返回包含下标和值的 enumerate对象。 enumerate对象是一个可迭代对象,也是一个迭代器对象。

enumerate()函数的语法格式如下:

enumerate(iterable, start=0)

说明:

(1)第一个参数表示可迭代对象,第二个参数表示下标的开始值,默认为0

(2)使用list()tuple()set()dict()函数可以将可迭代对象转换为列表、元组、集合与字典。

例如:

l1=["zhang","wang","li","zhao","liu"]
enum1=enumerate(l1)
print(enum1)
print(type(enum1))
print(list(enum1))enum1=enumerate(l1,101)
print(enum1)
print(list(enum1))#说明:可迭代对象转换为其他类型的可迭代对象,其实就是把可迭代对象的内容取出来,然后转换。#转换之后,可迭代对象的内容就清空了。
print(dict(enum1)) #可迭代对象里面已经没有内容了,显示一个空字典程序运行结果如下:
<enumerate object at 0x000001C05EC4DF80>
<class 'enumerate'>
[(0, 'zhang'), (1, 'wang'), (2, 'li'), (3, 'zhao'), (4, 'liu')]
<enumerate object at 0x000001C05E75D710>
[(101, 'zhang'), (102, 'wang'), (103, 'li'), (104, 'zhao'), (105, 'liu')]
{}

上面的程序可以修改为:

l1=["zhang","wang","li","zhao","liu"]
enum1=enumerate(l1)
print(enum1)
print(type(enum1))
print(list(enum1))print(enumerate(l1,101))
print(list(enumerate(l1,101)))
print(dict(enumerate(l1,101)))
print(set(enumerate(l1,101)))
print(tuple(enumerate(l1,101)))程序运行结果如下:
<enumerate object at 0x000001FD7833DF80>
<class 'enumerate'>
[(0, 'zhang'), (1, 'wang'), (2, 'li'), (3, 'zhao'), (4, 'liu')]
<enumerate object at 0x000001FD77E4D710>
[(101, 'zhang'), (102, 'wang'), (103, 'li'), (104, 'zhao'), (105, 'liu')]
{101: 'zhang', 102: 'wang', 103: 'li', 104: 'zhao', 105: 'liu'}
{(103, 'li'), (105, 'liu'), (101, 'zhang'), (104, 'zhao'), (102, 'wang')}
((101, 'zhang'), (102, 'wang'), (103, 'li'), (104, 'zhao'), (105, 'liu'))
2、zip()函数

zip()函数可以将多个迭代器对象,或者可迭代对象中的元素压缩在一起,返回一个zip对象。zip对象是一个可迭代对象,也是一个迭代器对象。

zip()函数的语法格式如下:

zip(iter1[,iter2[,...]])

说明:

zip()函数将多个可迭代对象对应的元素打包成一个一个的元组。因此,zip对象的元素是元组。

例如:

(1)指定一个参数

注意:如果zip()函数只有一个参数,则zip对象不能转换为字典。

代码如下:

l1=["zhang","wang","li","zhao","liu"]
z1=zip(l1)
print(z1)
print(type(z1))
print(list(z1))程序运行结果如下:
<zip object at 0x000002425751D0C0>
<class 'zip'>
[('zhang',), ('wang',), ('li',), ('zhao',), ('liu',)]

(2)指定两个参数

如果zip()函数包含两个参数,则zip对象可以转换为字典。

代码如下:

t1=(101,102,103,104,105)
l1=["zhang","wang","li","zhao","liu"]
z1=zip(t1,l1)
print(z1)
print(type(z1))
print(dict(z1))程序运行结果如下:
<zip object at 0x00000255C5FCD000>
<class 'zip'>
{101: 'zhang', 102: 'wang', 103: 'li', 104: 'zhao', 105: 'liu'}

(3)指定多个参数

注意:如果zip()函数不是两个参数,则zip对象不能转换为字典。

代码如下:

t1=(101,102,103,104,105)
l1=["zhang","wang","li","zhao","liu"]
l2=[25,22,23,21,25]
z1=zip(t1,l1,l2)
print(z1)
print(type(z1))
print(list(z1))程序运行结果如下:
<zip object at 0x0000016D79FCD0C0>
<class 'zip'>
[(101, 'zhang', 25), (102, 'wang', 22), (103, 'li', 23), (104, 'zhao', 21), (105, 'liu', 25)]
3、map()函数

map()函数把一个函数依次映射到可迭代对象的每一个元素,返回一个map对象。

map对象既是一个可迭代对象,也是一个迭代器。

map()函数的语法如下:

map(func, *iterables)

说明:

func函数的参数个数必须和*iterables参数中可迭代对象的个数一致。运行时,先依次取出每个可迭代对象的第一个元素,作为函数的实参,得到一个返回值作为map对象的第一个元素。再依次取出每个可迭代对象的第二个元组,作为函数的实参,得到的返回值作为map对象的第二个元素。以此类推。

例如:

(1)func是类型名

代码如下:

t1=(10.1,10,3.75,115,38)
m1=map(int,t1)
m2=map(float,t1)
print(m1)
print(type(m1))
print(list(m1))
print(list(m2))程序运行结果如下:
<map object at 0x0000017854099E40>
<class 'map'>
[10, 10, 3, 115, 38]
[10.1, 10.0, 3.75, 115.0, 38.0]

(2)func是函数名

def func1(x,y):return x**2+y**2
t1=[1,2,3,4,5]
t2=[11,12,13,14,15]
m1=map(func1,t1,t2)
print(m1)
print(type(m1))
print(list(m1))程序运行结果如下:
<map object at 0x000001AE88779ED0>
<class 'map'>
[122, 148, 178, 212, 250]
4、filter()函数

filter()函数把一个带有一个参数的函数作用到一个可迭代对象上,返回一个filter对象。

filter对象中的元素由可迭代对象中使得函数返回值为True的元素组成。如果指定函数为None,则返回可迭代对象中等价于True的元素。

filter()函数的语法格式如下:

filter(func|None, iterable)

例如:

(1)第一个参数为None的情况

代码如下:

t1=[18.75,2,0,4,5,0.0]
f1=filter(None,t1)
print(f1)
print(type(f1))
print(list(f1))程序运行结果如下:
<filter object at 0x0000011B7E24D300>
<class 'filter'>
[18.75, 2, 4, 5]

(2)第一个参数为一个函数

def func1(x):return x%2==0
r1=range(10)
f1=filter(func1,r1)  #把所有的偶数添加到filter对象中。
print(f1)
print(type(f1))
print(list(f1))程序运行结果如下:
<filter object at 0x000002ADA9B49D50>
<class 'filter'>
[0, 2, 4, 6, 8]
http://www.dtcms.com/a/311772.html

相关文章:

  • Flutter基础知识
  • SpringBoot与TurboGears2跨栈、整合AI服务、智能客服路由系统整合实战
  • SpringCloud学习第一季-4
  • 第15届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2024年3月10日真题
  • 17、原坐标变换和逆变换在实战中用法
  • 无人机数字图传技术的前沿探索与应用
  • 【昇腾推理PaddleOCR】生产级部署方式
  • 机器学习实战:KNN算法全解析 - 从原理到创新应用
  • LangChain框架入门05:输出解析器使用技巧
  • SpringBoot 服务器配置
  • Json简单的实现
  • 【Android】RecyclerView实现新闻列表布局(1)适配器使用相关问题
  • 【Leetcode】2561. 重排水果
  • 【Django】-6- 登录用户身份鉴权
  • 知识随记-----Qt 实战教程:使用 QNetworkAccessManager 发送 HTTP POST
  • 面试小总结
  • 解决技术问题思路
  • STM32学习记录--Day6
  • Spring 中 Bean 的生命周期
  • 知识蒸馏 - 基于KL散度的知识蒸馏 HelloWorld 示例
  • Linux网络编程【UDP网络通信demon】
  • 网页操作自动化解决方案:如何用Browser-Use+CPolar提升企业运营效率
  • React ahooks——副作用类hooks之useThrottleFn
  • 【智能体cooragent】新智能体创建相关代码解析
  • 双网卡UDP广播通信机制详解
  • 海洋大地测量基准与水下导航系列之九我国海洋PNT最新技术进展(下)
  • P13014 [GESP202506 五级] 最大公因数
  • 使用WSL2开发zephyr
  • 重型机械作业误伤预警响应时间缩短80%!陌讯多模态识别算法在工程现场的应用优化
  • 音频3A处理简介之AGC(自动增益控制)