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

序列和可迭代

可迭代对象和迭代器

英文中文定义必须实现的方法
Iterable可迭代对象“可以被 for 遍历的东西”__iter__(或旧协议 __getitem__
Iterator迭代器“真正负责逐个吐出值的东西”__iter__ + __next__
Iteration protocol迭代协议官方约定的接口见下文

2 迭代协议(The Iterator Protocol)

Python 官网给出的两条规则:

  1. 可迭代对象
    实现

def __iter__(self):return <iterator>

迭代器
实现

def __iter__(self):return self          # 迭代器本身也是可迭代对象def __next__(self):      #  Python 2 叫 next...return value# 没数据时抛 StopIteration

协议工作流(for 循环伪代码):

_iter = obj.__iter__()      # 先拿迭代器
while True:try:x = _iter.__next__() # 再不断拿值except StopIteration:break

旧式序列协议:__getitem__

没有 __iter__ 但有

def __getitem__(self, index):...

且索引从 0 开始,连续抛 IndexError 时,Python 会自动把它包装成迭代器。
典型例子:标准库 collections.abc.Sequence 的默认实现。
仅作兼容,写新代码请优先 __iter__

序列和可迭代对象

“序列”一定是可迭代的,但“可迭代对象”未必是序列。

概念抽象基类必须实现的方法额外保证
可迭代对象 Iterablecollections.abc.Iterable__iter__只能“逐个吐出值”
序列 Sequencecollections.abc.Sequence__getitem__ + __len__还有长度按下标取值切片反向遍历等能力

拆包对可迭代对象

拆包的目标可以是任何可迭代对象,包括不支持索引表示法([])的迭代器。拆包对可迭代对象的唯一要求是,一次只能产出一项,提供给接收端变量。不过也有例外,可以使用星号(*)捕获余下的项。

最明显的拆包形式是并行赋值(parallel assignment),即把可迭代对象中的项赋值给变量元组,如以下示例所示。

>>> lax_coordinates = (33.9425, -118.408056)
>>> latitude, longitude = lax_coordinates  # 拆包
>>> latitude
33.9425
>>> longitude
-118.408056

调用函数时在参数前面加上一个 *,利用的也是拆包。

>>> divmod(20, 8)
(2, 4)
>>> t = (20, 8)
>>> divmod(*t)
(2, 4)
>>> quotient, remainder = divmod(*t)
>>> quotient, remainder
(2, 4)

http://www.dtcms.com/a/600697.html

相关文章:

  • 16.udp_socket(二)
  • 如何在不使用iTunes的情况下在电脑上访问iPhone文件
  • python+websockets,报错RuntimeError: no running event loop
  • 自己做网站流程龙口市最新公告
  • 自助建站系统介绍wordpress 百度推广
  • 基于Springboot的汽车推荐系统设计与实现7f7h74np(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
  • DBLoss: Decomposition-based Loss Function for Time Series Forecasting 论文阅读
  • STM32F103学习笔记-16-RCC(第4节)-使用 HSI 配置系统时钟并用 MCO 监控系统时钟
  • Git 中新建学习分支 + 暂存修改 + VSCode 可视化查看改动(超详细教程)
  • Linux高效编程与实战:自动化构建工具“make/Makefile”和第一个系统程序——进度条
  • Docker 相关使用收录
  • 【详细步骤解析】爬虫小练习——爬取豆瓣Top250电影,最后以csv文件保存,附源码
  • Docker-存储
  • wap手机网站模板上饶网站建设3ao cc专业a
  • 【Nginx】Nginx 多协议负载均衡实战:StarRocks 与 MinIO 代理配置全解析
  • 域名注册和网站设计服务如何做贴吧类网站多钱
  • python+uniapp基于微信小程序的垃圾分类信息系统
  • C语言编译器安卓版 | 强大功能助力编程学习与实践
  • STM32使用金属探测传感器自制金属探测仪
  • vmware嵌套安装esxi7.0.3扩容vmfs
  • 使用 BR 备份 TiDB 到 AWS S3 存储
  • 【OpenCV + VS】OpenCV 绘图:绘制矩形、圆形、椭圆形、线条等
  • 易语言反编译工具 - 高效破解易语言程序的利器
  • 11年始终专注营销型网站提供网站建设小程序制作
  • AOSP Android13 Launcher3——TransformParams 类
  • 网站推广问题推广公司网站有哪些方式
  • 成都网站建设公司电话美食网站建设多少钱
  • 【把Linux“聊”明白】进程的概念与状态
  • GIT版本管理工具轻松入门 | TortoiseGit,本地 Git 仓库和 Git 概念,笔记02
  • 什么是美颜sdk?美型功能开发与用户体验优化实战