【Python】深究for循环迭代

简介: 【Python】深究for循环迭代

拓展概念


在py中,为方便理解,我们会把可迭代对象也比作容器,容器算是可迭代对象的一个大类,绝大部分容器都可被迭代


详解可迭代对象被迭代的过程


官方给出的解释如下:


在幕后,for 语句会在容器对象上调用 iter()。 该函数返回一个定义了 next() 方法的迭代器对象,此方法将逐一访问容器中的元素。 当元素用尽时,next() 将引发 StopIteration 异常来通知终止 for 循环。 你可以使用 next() 内置函数来调用 next() 方法


事实上,也是如此。py的将__iter__(),next()实现成了内置函数iter(),next()

我们看看先看看iter、next是怎么解释的:

def iter(source, sentinel=None): # known special case of iter
    """
    iter(iterable) -> iterator
    iter(callable, sentinel) -> iterator
    Get an iterator from an object.  In the first form, the argument must
    supply its own iterator, or be a sequence.
    In the second form, the callable is called until it returns the sentinel.
    """
    pass


iter (iterable) - >迭代器

Iter (callable, sentinel) ->迭代器

从对象获取迭代器。在第一种形式中,论证必须

提供它自己的迭代器,或者是一个序列。

在第二种形式中,调用可调用对象直到它返回哨兵为止。

def next(iterator, default=None): # real signature unknown; restored from __doc__
    """
    next(iterator[, default])
    Return the next item from the iterator. If default is given and the iterator
    is exhausted, it is returned instead of raising StopIteration.
    """
    pass


下一个(迭代器(违约))

返回迭代器的下一项。如果给出了default,则迭代器

耗尽时,将返回它,而不是引发StopIteration。


众所周知,py一切皆对象,故列表对象有__iter__()函数,故__iter__()返回的迭代器对象有__next__()函数。综述:调用内置iter(),next()与__iter__(),next()是一样的

因此我们可以通过它们来模拟for循环运作,代码如下:

method 1

stmt=[1,2,3,4]
stmt_iter=stmt.__iter__()
print(stmt_iter.__dir__())
print(stmt_iter.__next__())
print(stmt_iter.__next__())
print(stmt_iter.__next__())
print(stmt_iter.__next__())
print(stmt_iter.__next__())


method 2

stmt=[1,2,3,4]
stmt_iter=iter(stmt)
print(stmt_iter.__dir__())
print(next(stmt_iter))
print(next(stmt_iter))
print(next(stmt_iter))
print(next(stmt_iter))
print(next(stmt_iter))

1684139071805.jpg


事实证明:确实如文档所说,返回了带__next__()函数的迭代器。也实如for循环运作原理。至于更深更底层的设计,与我们而言或许意义不大了。


剖析iter、next的分别两种参数


刚才提到了iter、next函数 ,显然模拟for循环只用到了两种方法中两个参数的第一个。所以我觉得应该复现一下包含第二种参数的用法,参数解释在上文已经给出。复现如下:

iter:当next的值等于预设值4时,抛出异常。

import random
stmt__=lambda :random.choice([1,2,3,4,5])
stmt_iter=iter(stmt__,4)
print(next(stmt_iter))
print(next(stmt_iter))
print(next(stmt_iter))
print(next(stmt_iter))

1684139106502.jpg

next:当next的值超出限制时,返回自定义参数

stmt=[1,2,3,4,5]
stmt_iter=iter(stmt)
print(next(stmt_iter))
print(next(stmt_iter))
print(next(stmt_iter))
print(next(stmt_iter))
print(next(stmt_iter))
print(next(stmt_iter,'超出限制'))


1684138935749.jpg

相关文章
|
2月前
|
Python
Python 学习之路 03 之循环
03-运行时数据区概述及线程
34 0
|
2月前
|
开发者 Python 容器
深入理解Python迭代器:迭代机制的核心与应用
本文介绍了Python迭代器的核心概念、工作原理和应用场景。迭代器是遍历容器类型数据结构(如列表、元组、字典和集合)的对象,遵循迭代器协议,具有记忆遍历位置和一次性特点。通过实现迭代器协议,开发者能为自定义类型定义迭代行为,实现高效处理大量数据和与其他迭代工具协同工作。迭代器与可迭代对象的区别在于,可迭代对象实现`__iter__()`方法,返回迭代器,而迭代器实现`__next__()`方法,用于逐个访问元素。理解并运用迭代器能提升Python代码的性能和可读性。
|
1月前
|
程序员 Python
Python控制结构:条件语句和循环详解
【4月更文挑战第8天】本文介绍了Python的两种主要控制结构——条件语句和循环。条件语句包括`if`、`elif`和`else`,用于根据条件执行不同代码块。`if`检查条件,`else`提供替代路径,`elif`用于多个条件检查。循环结构有`for`和`while`,前者常用于遍历序列,后者在满足特定条件时持续执行。`for`可结合`range()`生成数字序列。`while`循环适用于未知循环次数的情况。循环控制语句`break`和`continue`能改变循环执行流程。理解和熟练运用这些控制结构是Python编程的基础。
|
2月前
|
存储 算法 索引
python用户输入和while循环(六)
python用户输入和while循环(六)
20 0
|
2月前
|
存储 索引 Python
python用户输入和while循环(七)
python用户输入和while循环(七)
17 0
|
5天前
|
机器学习/深度学习 JSON 数据库
Python每循环一次保存一次结果
Python每循环一次保存一次结果
9 1
|
12天前
|
Python 容器
Python中的for循环用法详解,一文搞定它
Python中的for循环用法详解,一文搞定它
|
12天前
|
Python
Python中的while循环,知其然知其所以然
Python中的while循环,知其然知其所以然
|
18天前
|
算法 数据挖掘 数据处理
使用 Python 循环创建多个列表
在Python中,动态创建多个列表对于数据处理和算法实现十分有用。本文介绍了四种方法:1) 列表推导式,如创建偶数和奇数列表;2) 使用循环和`append()`,示例为生成斐波那契数列;3) 结合字典与循环,按条件(如正负数)分组;4) 列表生成器,用于一次性生成多组随机数列表。这些方法有助于提高代码效率和可读性。
28 1
|
25天前
|
Python
python-基本类型,运算,循环
python-基本类型,运算,循环
30 0