Python3 迭代器与生成器_python3迭代器-程序员宅基地

技术标签: 爬虫  程序员  python  人工智能  numpy  开发语言  

迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()

字符串,列表或元组对象都可用于创建迭代器:

实例(Python 3.0+)

>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>

迭代器对象可以使用常规for语句进行遍历:

实例(Python 3.0+)

#!/usr/bin/python3
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

执行以上程序,输出结果如下:

1 2 3 4

也可以使用 next() 函数:

实例(Python 3.0+)

#!/usr/bin/python3
 
import sys         # 引入 sys 模块
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
 
while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()

执行以上程序,输出结果如下:

1
2
3
4

创建一个迭代器

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。

如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。

__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。

创建一个返回数字的迭代器,初始值为 1,逐步递增 1:

实例(Python 3.0+)

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

执行输出结果为:

1
2
3
4
5

StopIteration

StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

在 20 次迭代后停止执行:

实例(Python 3.0+)

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)

执行输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

以下实例使用 yield 实现斐波那契数列:

实例(Python 3.0+)

#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

执行以上程序,输出结果如下:

0 1 1 2 3 5 8 13 21 34 55

最后

如果对Python感兴趣的话,可以试试我的学习方法以及相关的学习资料

Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、Python必备开发工具
 

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

四、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、Python练习题

检查学习结果。

七、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

大家拿到脑图后,根据脑图对应的学习路线,做好学习计划制定。根据学习计划的路线来逐步学习,正常情况下2个月以内,再结合文章中资料,就能够很好地掌握Python并实现一些实践功能。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_59236127/article/details/127807167

智能推荐

五分钟了解物联网SIM卡——这个文章刷新了我对sim卡的认识_中移物联nb-iot模块 不认识sim卡-程序员宅基地

文章浏览阅读6.7k次,点赞32次,收藏108次。嵌入式软件自留地 今天编者荐语:五分钟了解物联网SIM卡——这个文章刷新了我对sim卡的认识,不熟悉的可以看看~~以下文章来源于华为云IoT ,作者我是卤蛋这个文章来自网络,看了觉得不错,因此特意整理转载下。是华为iot小助手分享的,都知道华为在物联网领域是国内老大的地位,分享的文章还是比较有价值的。【摘要】SIM卡是移动通信中不可或缺的组成部分,在物联网解决方案中,设备移动上网也需要使用SIM卡。那么,SIM卡是什么?SIM卡有几种?各种SIM卡有什么区别?本文将为您答疑.._中移物联nb-iot模块 不认识sim卡

js获取当前Unix时间戳_js unix时间戳-程序员宅基地

文章浏览阅读1.1w次。JavaScript 获取当前时间戳:第一种方法:var timestamp = Date.parse(new Date());第二种方法:var timestamp=new Date().getTime();第三种方法:var timestamp = (new Date()).valueOf();第一种:获取的时间戳是把毫秒改成000显示,_js unix时间戳

Chrome浏览器各种文件的存放路径汇总_chrome 浏览器 网页 pdf 文件 保存在哪里-程序员宅基地

文章浏览阅读5.1k次。2021-03-18首次编辑Profile文件什么是Profile文件?chrome://version可以查看 个人资料路径书签文件的存贮路径/Users/username/Library/Application Support/Google/Chrome/Default/Bookmarks扩展插件存放位置/Users/username/Library/Application Support/Google/Chrome/Default/Extensions..._chrome 浏览器 网页 pdf 文件 保存在哪里

黑马程序员Java Swing笔记分享(AWT篇)_黑马程序员awt代码-程序员宅基地

文章浏览阅读1.4k次,点赞5次,收藏39次。本文章为Java Swing的笔记分享,这一篇就够了_黑马程序员awt代码

IDE到底是什么?——详细且通俗的解释-程序员宅基地

文章浏览阅读2.5k次,点赞26次,收藏24次。一.简介1.概念:集成(简称:IDE;英文名:Integrated Development Environment )是用于提供程序开发环境的,一般包括编辑器、和等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。具备这一特性的软件或者软件套(组)都可以叫集成开发环境。不理解的小朋友也没事的,就一句话总结:IDE就是可以给我们提供很多必要工具,把一堆工具集成起来,变成了一个软件,我们可以在上面开发各种程序。可以类比成一个医药箱~~~2.举例:如的系列等。_ide

app加急审核-程序员宅基地

文章浏览阅读55次。原文地址:http://www.cnblogs.com/Twisted-Fate/p/4915184.html最近公司app由于疏忽审核被拒绝了,但是计划是最近两天上线时间紧急,希望能快速审核上线,了解到淘宝里面有加速商店,但是价格真是黑心,首次上线12000元,APP若已经上线的更新5999,据网上了解他们也是编写加急理由,已经无法忍受这种坑爹的赚钱方式,总结了一些加急经历的给与建议,..._加急审app

随便推点

Android Fragment 解析_fragmentmanager fm=getsupportfragmentmanager();-程序员宅基地

文章浏览阅读347次。Android是通过FragmentManager来管理Fragment,每次对Fragment进行添加和移除时需要开启事务,通过事务处理这些相应的操作,然后commit事务。在对Fragment进行管理前,需要开启一个事务,如下: FragmentManager fm = getSupportFragmentManager(); FragmentT_fragmentmanager fm=getsupportfragmentmanager();

树莓派笔记-程序员宅基地

文章浏览阅读455次。LCD和hdmi切换/home/LCD-show-master 目录下LCD-hdmiLCD35-show时区修改sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimedate -Rwifi配置cat /etc/wpa_supplicant/wpa_supplica..._hw perfevents: pmu driver, 7 counters available 那个文件

IIC通信协议-程序员宅基地

文章浏览阅读3.9w次,点赞38次,收藏237次。IIC通信协议介绍_iic通信协议

c++基础-继承与派生,定义基类person和公有派生类student_c++定义person类-程序员宅基地

文章浏览阅读4.1k次,点赞6次,收藏33次。①定义基类person,数据成员name,sex,age,构造函数,析构函数,输出name,sex,age的函数display()。②定义公有派生类student,数据成员:num,构造函数,析构函数,输出name,sex,age,num的函数display()。③ 主函数定义并使用student 对象stu。#include<iostream>#include<stri..._c++定义person类

Unity Inspector面板只读属性ReadOnly_unity readonly-程序员宅基地

文章浏览阅读5.8k次。public class ReadOnlyAttribute : PropertyAttribute{}[CustomPropertyDrawer(typeof(ReadOnlyAttribute))]public class ReadOnlyDrawer : PropertyDrawer{ public override float GetPropertyHeight(S..._unity readonly

Java 拷贝对象集合属性 集合泛型不一致 也可拷贝_java集合泛型不一样数据互传-程序员宅基地

文章浏览阅读1.7k次。Demo 对象如图我们同时创建三个相同属性Vo对象当我们使用BeanUtils进行拷贝时,会发现这样的问题public static void main(String[] args) { Student student = new Student(); student.setStudentName("大明"); List<Student> studentList = new ArrayList<>(..._java集合泛型不一样数据互传

推荐文章

热门文章

相关标签