Python-VBA函数之旅-iter函数

目录

一、iter函数的常见应用场景:

二、iter函数使用注意事项:

三、如何用好iter函数?

1、iter函数:

1-1、Python:

1-2、VBA:

2、推荐阅读:

个人主页:神奇夜光杯-CSDN博客 



一、iter函数的常见应用场景:

        在Python中,iter()函数具有广泛的应用场景,主要用于创建迭代器对象,这些对象可以逐个访问集合的元素而不需要一次性加载整个集合到内存中,常见的应用场景有:

1、遍历可迭代对象:对于任何可迭代的对象,如列表、元组、字符串、字典、集合等,都可以使用iter()函数获取其迭代器,然后通过迭代器逐个访问其元素,这在处理大量数据或需要按顺序访问数据的场景中非常有用。

2、逐行读取大型文件:对于大型文本文件,使用迭代器可以逐行读取文件内容,而不是一次性将整个文件加载到内存中,这不仅可以节省内存,还可以提高代码的效率。

3、实现惰性求值:生成器是一种特殊的迭代器,它只在需要时生成值,从而节省了内存。通过结合使用`iter()`函数和生成器表达式或生成器函数,可以实现惰性求值,即只在需要时才计算并返回结果,这在处理大量数据或计算密集型任务时非常有用,因为它可以避免不必要的计算和资源浪费。

4、表示无限序列:迭代器可以用于表示无限序列,因为它们只在需要时生成数据,而不需要事先知道序列的长度,例如,可以使用迭代器来表示斐波那契数列或素数序列等。

5、自定义迭代器:通过实现`__iter__()`和`__next__()`方法,可以创建自定义的迭代器类,这允许你定义自己的迭代逻辑,并在需要时返回特定的元素,自定义迭代器在处理复杂数据结构或实现特定算法时非常有用。

6、与for循环结合使用:在for循环中,Python会自动处理迭代器的创建和迭代过程,但是,有时你可能需要更精细地控制迭代过程,例如提前终止迭代或跳过某些元素,在这种情况下,你可以使用iter()函数和next()函数来手动控制迭代过程,并与for循环结合使用。

        总之,iter()函数在Python编程中具有广泛的应用场景,它提供了一种灵活且高效的方式来处理可迭代对象并控制迭代过程。

二、iter函数使用注意事项:

        在Python中使用iter()函数时,需注意以下几点:

1、确保对象是可迭代的:在调用iter()函数之前,你需要确保传入的对象是可迭代的,可迭代对象包括列表、元组、字符串、字典、集合以及任何实现了`__iter__()`方法的自定义对象,如果你尝试对一个不可迭代的对象使用iter()函数,Python会抛出一个TypeError异常。

2、避免重复迭代:迭代器只能从头至尾遍历一次,一旦迭代器耗尽(即所有元素都被访问过),再次尝试获取元素将引发StopIteration异常,因此,如果你需要多次遍历同一个集合,你应该在每次遍历之前重新创建迭代器。

3、处理StopIteration异常:当你使用next()函数从迭代器中获取元素时,一旦迭代器耗尽,就会引发StopIteration异常,你通常需要捕获这个异常来避免程序崩溃;在Python中,for循环会自动处理这个异常,因此在大多数情况下你不需要显式地捕获它,但是,如果你手动使用next()函数,你应该确保正确处理这个异常。

4、避免无限循环:当使用iter()函数结合自定义的`__iter__()`和`__next__()`方法创建迭代器时,需要确保迭代器在某个时刻能够引发StopIteration异常,以避免无限循环,否则,程序可能会陷入死循环,无法继续执行。

5、不要混淆iter()和iterable:iter()函数用于获取一个迭代器的对象,而一个可迭代对象(iterable)是一个实现了`__iter__()`方法的对象,这两者并不相同;可迭代对象可以被转换为迭代器对象,而迭代器对象则用于遍历可迭代对象的元素。

6、避免迭代中修改集合:在迭代一个集合(如列表或字典)时,直接修改该集合可能会导致不可预测的行为或错误,例如,在迭代列表时删除元素可能会导致迭代器跳过某些元素或引发异常。如果你需要在迭代过程中修改集合,最好先创建集合的副本,然后在副本上进行操作。

7、性能考虑:虽然迭代器在处理大型数据集时非常有用,但它们并不总是最快的解决方案,在某些情况下,使用列表推导式或生成器表达式可能会更高效,因此,在选择使用迭代器时,需要考虑性能需求。

        总之,只有遵循这些注意事项,你才能够更安全、更有效地在Python中使用iter()函数和迭代器。

三、如何用好iter函数?

        在Python中,iter()函数是一个强大的工具,用于获取可迭代对象的迭代器,从而可以遍历集合的元素,用好iter()函数的相关建议如下:

1、理解迭代器概念:迭代器是一个可以记住遍历的位置的对象,它可以从头到尾访问数据集合的元素,但是只能前进不能后退;迭代器实现了`__iter__()`和`__next__()`方法,`__iter__()`方法返回迭代器对象本身,而`__next__()`方法返回下一个元素,并在没有更多元素时引发StopIteration异常。

2、识别可迭代对象:在使用iter()函数之前,首先要确保你正在处理的对象是可迭代的。内置的可迭代对象包括列表、元组、字典、集合、字符串等;自定义的类也可以实现`__iter__()`方法,从而变得可迭代。

3、创建迭代器:使用iter()函数可以很容易地创建迭代器,例如,`my_iter = iter(my_list)`将创建一个可以遍历`my_list`的迭代器。

4、使用next()函数遍历元素:一旦你有了迭代器,就可以使用next()函数来获取集合中的下一个元素,当没有更多元素时,next()将引发StopIteration异常,你可以使用`try-except`块来捕获这个异常,以便在迭代完成时执行一些清理操作或退出循环。

5、结合for循环使用:尽管你可以手动使用iter()和next()来遍历集合,但在大多数情况下,使用for循环会更方便和简洁,for循环内部会自动处理迭代器的创建和元素的获取,直到遇到StopIteration异常为止。

6、处理无限迭代器:有些迭代器表示无限序列,例如生成器,在这种情况下,你需要确保有一个明确的退出条件或限制迭代次数,以避免无限循环。

7、自定义迭代器:如果需要,你可以通过实现`__iter__()`和`__next__()`方法来创建自定义的迭代器类,这允许你控制迭代过程,例如实现特定的迭代逻辑或添加额外的功能。

8、理解迭代器的优势:迭代器的一个主要优势是它们支持懒惰计算,即只在需要时生成值,这对于处理大型数据集或执行复杂计算特别有用,因为它可以节省内存并提高效率。

1、iter函数:
1-1、Python:
# 1.函数:iter
# 2.功能:
# 2-1、用于根据指定的可迭代集合对象生成一个迭代器
# 2-2、用于根据指定的可调用对象来生成一个迭代器
# 3.语法:
# 3-1、iter(object)
# 3-2、iter(object, sentinel)
# 4.参数:
# 4-1、object:单参数形式出现,则是支持迭代的集合对象,即任意可迭代对象;若指定了sentinel参数,则必须是一个可调用的对象
# 4-2、sentinel:若此参数出现,则object必须是一个可调用的对象
# 5.返回值:返回一个迭代器iterator对象
# 6.说明:
# 7.示例:
# 利用dir()函数获取函数的相关内置属性和方法
print(dir(iter))
# ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
# '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__',
# '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__',
# '__str__', '__subclasshook__', '__text_signature__']

# 利用help()函数获取函数的文档信息
help(iter)

# 应用一:遍历可迭代对象
# 示例1:遍历列表
my_list = [1, 2, 3, 4, 5]
it = iter(my_list)
try:
    while True:
        print(next(it))
except StopIteration:
    print("遍历结束")
# 1
# 2
# 3
# 4
# 5
# 遍历结束

# 示例2:遍历字符串
my_string = "Myelsa"
it = iter(my_string)
try:
    while True:
        print(next(it))
except StopIteration:
    print("遍历结束")
# M
# y
# e
# l
# s
# a
# 遍历结束

# 示例3:遍历字典的键
my_dict = {'a': 1, 'b': 2, 'c': 3}
it = iter(my_dict)
try:
    while True:
        print(next(it))
except StopIteration:
    print("遍历结束")
# a
# b
# c
# 遍历结束

# 示例4:遍历字典的值
my_dict = {'a': 1, 'b': 2, 'c': 3}
it = iter(my_dict.values())
try:
    while True:
        print(next(it))
except StopIteration:
    print("遍历结束")
# 1
# 2
# 3
# 遍历结束

# 示例5:使用自定义可迭代对象
class MyIterable:
    def __init__(self, start, end):
        self.value = start
        self.end = end
    def __iter__(self):
        return self
    def __next__(self):
        if self.value < self.end:
            current = self.value
            self.value += 1
            return current
        else:
            raise StopIteration
# 创建一个自定义可迭代对象
my_iterable = MyIterable(0, 5)
# 使用iter()和next()遍历它
it = iter(my_iterable)
try:
    while True:
        print(next(it))
except StopIteration:
    print("遍历结束")
# 0
# 1
# 2
# 3
# 4
# 遍历结束

# 应用二:逐行读取大型文件
# 打开文件,准备读取
with open('file.txt', 'r') as file:
    # 获取文件对象的迭代器
    line_iter = iter(file)
    try:
        # 循环调用next()直到抛出StopIteration异常
        while True:
            line = next(line_iter)
            print(line, end='')
    except StopIteration:
        # 当没有更多行时,捕获StopIteration异常并退出循环
        print("\n文件读取完毕")
# 121314536273838390
# 123
# 456
# 789
# 587
# 1024
# 文件读取完毕

# 应用三:实现惰性求值
# 示例1:计算一个无限序列的平方数
# 使用生成器表达式创建一个生成器
square_gen = (x ** 2 for x in iter(int, 1))  # iter(int, 1) 创建了一个无限迭代器,从0开始递增,直到触发StopIteration(通过传递哨兵值1)
# 使用next()函数惰性求值,获取平方数序列的前几个数
print(next(square_gen))  # 输出: 0
print(next(square_gen))  # 输出: 1
print(next(square_gen))  # 输出: 4
print(next(square_gen))  # 输出: 9
# ... 可以继续调用next()获取更多的平方数
# 如果我们想要获取前N个平方数,可以这样做:
N = 10
squares = [next(square_gen) for _ in range(N)]
print(squares)  # 输出前10个平方数

# 示例2:创建一个自定义的迭代器类,并在其__iter__方法中使用iter()来实现惰性求值
class LazySquares:
    def __init__(self, start=0):
        self.start = start
    def __iter__(self):
        return (x ** 2 for x in iter(int, 1))
# 创建一个LazySquares对象
lazy_squares = LazySquares()
# 获取LazySquares对象的迭代器
sq_iter = iter(lazy_squares)
# 使用next()函数惰性求值,获取平方数序列的前几个数
print(next(sq_iter))  # 输出: 0
print(next(sq_iter))  # 输出: 1
print(next(sq_iter))  # 输出: 4
print(next(sq_iter))  # 输出: 9
# ... 可以继续调用next()获取更多的平方数

# 应用四:表示无限序列
# 示例1: 无限自然数序列
def natural_numbers():
    n = 1
    while True:
        yield n
        n += 1
# 创建无限自然数序列的迭代器
nat_nums_iter = iter(natural_numbers())
# 打印前几个自然数
for _ in range(10):
    print(next(nat_nums_iter))
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10

# 示例2: 无限平方数序列
def square_numbers():
    n = 1
    while True:
        yield n ** 2
        n += 1
# 创建无限平方数序列的迭代器
sq_nums_iter = iter(square_numbers())
# 打印前几个平方数
for _ in range(10):
    print(next(sq_nums_iter))
# 1
# 4
# 9
# 16
# 25
# 36
# 49
# 64
# 81
# 100

# 示例3: 无限斐波那契数列
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
# 创建无限斐波那契数列的迭代器
fib_iter = iter(fibonacci())
# 打印前几个斐波那契数
for _ in range(10):
    print(next(fib_iter))
# 0
# 1
# 1
# 2
# 3
# 5
# 8
# 13
# 21
# 34

# 应用五:自定义迭代器
# 示例1: 自定义迭代器用于遍历列表
class MyListIterator:
    def __init__(self, data):
        self.index = 0
        self.data = data
    def __iter__(self):
        return self
    def __next__(self):
        if self.index < len(self.data):
            result = self.data[self.index]
            self.index += 1
            return result
        else:
            raise StopIteration
# 使用自定义迭代器
my_list = [1, 2, 3, 4, 5]
my_iter = MyListIterator(my_list)
# 使用iter()函数获取迭代器
iter_obj = iter(my_iter)
# 打印列表中的元素
for item in iter_obj:
    print(item)
# 1
# 2
# 3
# 4
# 5

# 示例2: 自定义迭代器用于遍历文件行
class FileLineIterator:
    def __init__(self, file_path):
        self.file = open(file_path, 'r')
        self.line = self.file.readline()
    def __iter__(self):
        return self
    def __next__(self):
        if self.line:
            line = self.line
            self.line = self.file.readline()
            return line.strip()
        else:
            self.file.close()
            raise StopIteration
# 使用自定义迭代器遍历文件行
file_path = 'file.txt'
file_iter = FileLineIterator(file_path)
# 使用iter()函数获取迭代器
iter_obj = iter(file_iter)
# 打印文件的每一行
for line in iter_obj:
    print(line)
# 121314536273838390
# 123
# 456
# 789
# 587
# 1024

# 示例3: 自定义迭代器用于生成偶数序列
class EvenNumberIterator:
    def __init__(self, start=0):
        self.number = start
    def __iter__(self):
        return self
    def __next__(self):
        if self.number % 2 == 0:
            result = self.number
            self.number += 1
            return result
        else:
            self.number += 1
            return self.__next__()
# 使用自定义迭代器生成偶数
even_iter = EvenNumberIterator()
# 使用iter()函数获取迭代器
iter_obj = iter(even_iter)
# 打印前几个偶数
for _ in range(10):
    print(next(iter_obj))
# 0
# 2
# 4
# 6
# 8
# 10
# 12
# 14
# 16
# 18

# 应用六:与for循环结合使用
# 示例1: 遍历列表
my_list = [1, 2, 3, 4, 5]
# 使用iter()函数获取列表的迭代器
list_iter = iter(my_list)
# 使用for循环遍历迭代器
for item in list_iter:
    print(item)
# 1
# 2
# 3
# 4
# 5

# 示例2: 遍历字典的键
my_dict = {'a': 1, 'b': 2, 'c': 3}
# 使用iter()函数获取字典键的迭代器
dict_keys_iter = iter(my_dict.keys())
# 使用for循环遍历字典的键
for key in dict_keys_iter:
    print(key)
# a
# b
# c

# 示例3: 遍历字典的值
my_dict = {'a': 1, 'b': 2, 'c': 3}
# 使用iter()函数获取字典值的迭代器
dict_Values_iter = iter(my_dict.values())
# 使用for循环遍历字典的值
for Value in dict_Values_iter:
    print(Value)
# 1
# 2
# 3

# 示例4: 遍历自定义迭代器的元素
class MyCustomIterator:
    def __init__(self, start, end):
        self.current = start
        self.end = end
    def __iter__(self):
        return self
    def __next__(self):
        if self.current < self.end:
            result = self.current
            self.current += 1
            return result
        else:
            raise StopIteration
# 创建自定义迭代器的实例
my_custom_iter = MyCustomIterator(0, 5)
# 使用iter()函数获取迭代器(实际上这一步是可选的,因为my_custom_iter本身就是一个迭代器)
custom_iter = iter(my_custom_iter)
# 使用for循环遍历自定义迭代器的元素
for item in custom_iter:
    print(item)
# 0
# 1
# 2
# 3
# 4

# 示例4: 遍历文件的行
with open('file.txt', 'r') as file:
    # 使用iter()函数获取文件行的迭代器
    line_iter = iter(file)
    # 使用for循环遍历文件的每一行
    for line in line_iter:
        print(line.strip())
# 121314536273838390
# 123
# 456
# 789
# 587
# 1024
1-2、VBA:
略,待后补。
2、推荐阅读:

1、Python-VBA函数之旅-issubclass()函数

Python算法之旅:Algorithm

Python函数之旅:Functions 

个人主页:神奇夜光杯-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/572467.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AndroidStudio 新建工程的基本修改及事件添加

注&#xff1a;2022.3.1&#xff0c;新建Empty Activity默认是Kotlin&#xff0c;可以选择新建Empty View Activity&#xff0c;修改语言为JAVA 应用名称 修改应用名称 路径&#xff1a;res-values-strings.xml 是否显示应用名称 路径&#xff1a;res-values-themes.xml …

SpringMVC基础篇(一)

文章目录 1.基本介绍1.特点2.SpringMVC跟SpringBoot的关系 2.快速入门1.需求分析2.图解3.环境搭建1.创建普通java工程2.添加web框架支持3.配置lib文件夹1.导入jar包2.Add as Library3.以后自动添加 4.配置tomcat1.配置上下文路径2.配置热加载 5.src下创建Spring配置文件applica…

React.js 3D开发快速入门

如果你对 3D 图形的可能性着迷&#xff0c;但发现从头开始创建 3D 模型的想法是不可能的 - 不用担心&#xff01; Three.js 是一个强大的 JavaScript 库&#xff0c;它可以帮助我们轻松地将现有的 3D 模型集成到 React 应用程序中。因此&#xff0c;在本文中&#xff0c;我将深…

Educational Codeforces Round 164 (Rated for Div. 2) A-E

A. Painting the Ribbon 暴力模拟即可 #include <bits/stdc.h>using namespace std; const int N 2e5 5; typedef long long ll; typedef pair<ll, ll> pll; typedef array<ll, 3> p3; // int mod 998244353; const int maxv 4e6 5; // #define endl &…

ICCV2023人脸识别TransFace论文及代码学习笔记

论文链接&#xff1a;https://arxiv.org/pdf/2308.10133.pdf 代码链接&#xff1a;GitHub - DanJun6737/TransFace: Code of TransFace 背景 尽管ViTs在多种视觉任务中展示了强大的表示能力&#xff0c;但作者发现&#xff0c;当应用于具有极大数据集的人脸识别场景时&#…

Leaflet实现离线地图展示,同时显示地图上的坐标点和热力图

在实际工作中,因为部署环境的要求,必须使用离线地图,而不是调用地图接口。我们应该怎么解决这种项目呢? 下面介绍一种解决该问题的方案:Leaflet+瓦片地图 一、Leaflet Leaflet 是一个开源并且对移动端友好的交互式地图 JavaScript 库。 它大小仅仅只有 42 KB of JS, 并且拥…

opencv图片绘制图形-------c++

绘制图形 #include <opencv2/opencv.hpp> #include <opencv2/core.hpp> #include <filesystem>bool opencvTool::drawPolygon(std::string image_p, std::vector<cv::Point> points) {cv::Mat ima cv::imread(image_p.c_str()); // 读取图像&#xf…

如何调节电脑屏幕亮度?让你的眼睛更舒适!

电脑屏幕亮度的调节对于我们的视力保护和使用舒适度至关重要。不同的环境和使用习惯可能需要不同的亮度设置。可是如何调节电脑屏幕亮度呢&#xff1f;本文将介绍三种不同的电脑屏幕亮度调节方法&#xff0c;帮助您轻松调节电脑屏幕亮度&#xff0c;以满足您的需求。 方法1&…

C++必修:从C到C++的过渡(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 缺省参数 1.1. 缺省参数的使用 缺省参数是声明或定义函数时为函数的参数指定…

直接插入排序与希尔排序的详解及对比

目录 1.直接插入排序&#xff08;至少有两个元素才可以使用&#xff09; 排序逻辑 B站动画演示&#xff1a;直接插入排序 逻辑转为代码&#xff1a; 稳定性&#xff1a;稳定 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) 应用场景 2.希尔排序&#xff08;对…

VUE父组件向子组件传递值

创作灵感 最近在写一个项目时&#xff0c;遇到了这样的一个需求。我封装了一个组件&#xff0c;这个组件需要被以下两个地方使用&#xff0c;一个是搜索用户时用到&#xff0c;一个是修改用户信息时需要用到。其中&#xff0c;在搜索用户时&#xff0c;可以根据姓名或者账号进…

C++之STL-String

目录 一、STL简介 1.1 什么是STL 1.2 STL的版本 1.3 STL的六大组件 ​编辑 1.4 STL的重要性 二、String类 2.1 Sting类的简介 2.2 string之构造函数 2.3 string类对象的容量操作 2.3.1 size() 2.3.2 length() 2.3.3 capacity() 2.3.4 empty() 2.3.5 clear() 2.3.6…

【Unity】苹果(IOS)开发证书保姆级申请教程

前言 我们在使用xcode出包的时候&#xff0c;需要用到iOS证书(.p12)和描述文件(.mobileprovision) 开发证书及对应的描述文件用于开发阶段使用&#xff0c;可以直接将 App 安装到手机上&#xff0c;一个描述文件最多绑定100台测试设备 1.证书管理 进入网站Apple Developer &…

从虚拟化走向云原生,红帽OpenShift“一手托两家”

汽车行业已经迈入“软件定义汽车”的新时代。吉利汽车很清醒地意识到&#xff0c;只有通过云原生技术和数字化转型&#xff0c;才能巩固其作为中国领先汽车制造商的地位。 和很多传统企业一样&#xff0c;吉利汽车在走向云原生的过程中也经历了稳态业务与敏态业务并存带来的前所…

视频美颜SDK原理与实践:从算法到应用

当下&#xff0c;从社交媒体到视频通话&#xff0c;人们越来越依赖于视频美颜功能来提升自己的形象。而视频美颜SDK作为支撑这一技术的重要工具&#xff0c;其原理和实践至关重要。 一、什么是视频美颜SDK&#xff1f; 视频美颜SDK是一种软件开发工具包&#xff0c;用于集成到…

FloodFill算法---DFS

目录 floodfill算法概念&#xff1a; 算法模板套路&#xff1a; 例题1&#xff1a;图像渲染 例题2&#xff1a;岛屿数量 例题3&#xff1a;岛屿的最大面积 例题4&#xff1a;被围绕的区域 floodfill算法概念&#xff1a; floodfill算法是一种常用的图像处理算法&#xf…

【IDEA】在IntelliJ IDEA中导入Eclipse项目:详细指南

IntelliJ IDEA和Eclipse是两款常用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;在软件开发中经常会遇到需要在它们之间迁移项目的情况。本文将重点介绍如何在IntelliJ IDEA中导入Eclipse项目&#xff0c;以帮助开发者顺利地迁移他们的项目&#xff0c;并在IntelliJ …

云主机修复监控插件异常的方法

首先&#xff0c;进入云监控服务--选择主机监控&#xff0c;勾选上网络配置异常的云主机&#xff0c;最上面的修复插件配置&#xff0c;然后等待大约半个小时多&#xff0c;再观察下主机的状态。 一般情况下问题都可以被解决&#xff0c;如果解决不了&#xff0c;可以尝试卸载…

剑指 Offer 03.:数组中重复的数字

剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。…