Python中生成器generator和迭代器Iterator的使用方法

一、生成器

1. 生成器的定义

  • 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间

2. 生成器的创建方式

  • 第一种只要把一个列表生成式的 [ ] 改成 ( )
ret = (n + 1 for n in range(0,10))
# 返回值是生成了一个生成器对象<genexpr>储存在16进制的地址中<generator object <genexpr> at 0x7f909f4be150>
# 如果调用次数超过生成器内值的总数量,会报错
  • 第二种方法使用yield创建生成器
  • 只要在一个函数中存在至少一个yield关键字,该函数就不是普通函数,是一个生成器
  • 返回一个对象,需要使用变量接收
  • 生成器可以用for进行遍历得到所有的值
# 定义一个斐波那契数列的生成器
def creatnum():print('-----start------')a,b = 0,1for i in range(5):print('----1-----')# 每次执行函数都会停在此处,并将b值返回yield bprint('----2-----')a,b = b,a+bprint('----3-----')print('-----stop-----')f = creatnum()
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
  • 打印结果
-----start------
----1-----
1
----2-----
----3-----
----1-----
1
----2-----
----3-----
----1-----
2
----2-----
----3-----
----1-----
3
----2-----
----3-----
----1-----
5

3. 启动生成器的方法

  • 第一种:
next(生成器的名称)
  • 第二种:
# 生成器第一次调用时尽量不要使用send,非要使用必须用send(None)
send()方法

二、迭代器

  1. 可迭代数据类型(具有可迭代功能)

    • 把可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)
      例如:列表,元组,字典,集合等数据类型,但他们不是可迭代对象
    • generator(生成器)
      • yield
      • 列表生成器
      • 生成器都是可迭代对象
  2. 如何判断一个对象是不是有可迭代功能

    from collections import Iterator
    # 列表是可迭代的
    result = isinstance([1,2], Iterable)
    print(result)
    # isinstance函数会返回一个bool值 True为可迭代,反之False
    
  3. 将具有迭代功能的数据类型转化为可迭代器

    • 可以被next()调用并不断返回下一个值的对象称之为迭代器Iterator
  4. 迭代器的判断方式

    from collections import Iterator 
    # 列表是可迭代对象
    # isinstance函数会返回一个bool值 True为迭代器,反之False
    result = isinstance([1,2], Iterator)
    print(result)
  5. 可迭代对象的本质

    • 我们分析对可迭代对象进行迭代使用的过程,发现每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。那么,在这个过程中就应该有一个“人”去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据。我们把这个能帮助我们进行数据迭代的“人”称为迭代器(Iterator)。

    • 可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。

    • 可迭代对象通过__iter__方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.

    • 那么也就是说,一个具备了__iter__方法的对象,就是一个可迭代对象。

    from collections import Iterable
    # 使用isinstance() 函数检测某个对象是否是一个可迭代的对象class MyClass(object):# 可迭代对象的本质是,类中是否定义了 __iter__() 方法def __iter__(self):return selfc1 = MyClass()
    # 对象c1不是可迭代对象
    result = isinstance(c1, Iterable)
    print(result)
    
  • 举例说明迭代器本质原理

    比如,数学中有个著名的斐波拉契数列(Fibonacci),数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
    现在我们想要通过for...in...循环来遍历迭代斐波那契数列中的前n个数。那么这个斐波那契数列我们就可以用迭代器来实现,每次迭代都通过数学计算来生成下一个数。

class Fibonacci():def __init__(self, num):# 通过构造方法,保存num到类的成员属性中self.num = num# 定义变量保存斐波那契数列前两个值self.a = 0self.b = 1# 记录当前的变量值self.current_index = 0def __iter__(self):# 返回迭代器,因自身就是迭代器,故可以返回自己return selfdef __next__(self):# 判断是否生成完毕if self.current_index < self.num:# 返回result = self.a# 交换两个变量值self.a, self.b = self.b, self.a+self.bself.current_index += 1return resultelse:# 停止迭代raise StopIterationif __name__ == '__main__':# 创建迭代器fib_iterator = Fibonacci(5)# 使用迭代器,输出斐波那契数列值for value in fib_iterator:print(value, end=" ")

 

转载于:https://www.cnblogs.com/yanguhung/p/10145767.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 8中使用Lambda表达式的策略模式

策略模式是“ 设计模式&#xff1a;可重用对象的元素”书中的模式之一 。 本书所述的策略模式的意图是&#xff1a; 定义一系列算法&#xff0c;封装每个算法&#xff0c;并使它们可互换。 策略使算法独立于使用该算法的客户端而变化。 在本文中&#xff0c;我想给出一个或两个…

Html5移动开发之Localstorage(本地存储)

HTML5本地存储Localstorage自从Html5中出现了本地存储的&#xff08;LocalStorage)的概念后&#xff0c;很多人都会想这个东西和我们传统web开发中的Cookie有什么特别之处&#xff0c;当然笔者也是其中之一&#xff0c;也难怪&#xff0c;以前用惯了cookie对于新出现的事物总是…

php mysql 正则_MySQL 正则表达式

MySQL 正则表达式在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配。MySQL 同样也支持其他正则表达式的匹配&#xff0c; MySQL中使用 REGEXP 操作符来进行正则表达式匹配。如果您了解PHP或Perl&#xff0c;那么操作起来就非常简单&#xff0c;因为MySQL的正…

Linux自动人机交互expect

exp_test.sh文件 #!/bin/bash/expect ## exp_test.sh set timeout -1; spawn ssh localhost; expect {"(yes/no)" {send "yes\r";exp_continue;}"password:" {send "hadoop\r";exp_continue;}eof {exit 0;} } 执行&#xff1a;expect …

使用Spring Integration聚合异步结果

嗨&#xff0c;我遇到了一个问题&#xff0c;该问题使用Spring Integration具有非常好的解决方案。 很多时候&#xff0c;我们需要一种将消息分发到未知数量的目的地的方案。 为此&#xff0c;我们使用主题方法。 但是有时&#xff0c;我们还希望从收到消息的所有目的地接收答案…

Html5开发之链接标签nav的用法

HTML(<nav>)元素用来表示一个含有多个超链接的区域&#xff0c;这个区域的连接可以连接到其他页面&#xff0c;也可以连接到本页面内部其他部分。用法说明:并不是所有的链接都必须使用<nav>元素,它只用来将一些热门的链接放入导航栏,例如<footer>元素就常用来…

java response 获得code_Java教程分享使用HttpClient抓取页面内容

Java教程分享使用HttpClient抓取页面内容&#xff0c;使用HttpClient工具来发送Http请求1.简介HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新的版本和…

关于Function原型对象和Object原型对象的一些疑惑

网上有一道美团外卖的面试题是这样的&#xff1a;Function.prototype.a a; Object.prototype.b b; function Person(){}; var p new Person(); console.log(p.a: p.a); // p.a: undefined console.log(p.b: p.b); // p.b: b问为什么&#xff1f;有不少同学第一眼看上去就觉…

HTML5 实现离线数据缓存

1.配置缓存文件 cache manifestMIME TYPE&#xff1a;text/cache-manifest文件名称&#xff1a;name.appcache作用&#xff1a;用于配置需要缓存的文件2.使用方法在服务器上添加MIME TYPE在apache virtual host 中添加[plain] view plaincopyAddType text/cache-manifest .appc…

pytest.7.常见套路

From: http://www.testclass.net/pytest/common_useage/ 在使用pytest的时候&#xff0c;下面这些问题我们可能会经常遇到&#xff0c;这里给出官方的解决方案&#xff0c;按照套路来执行就可以了。 基础用法 把命令行参数传入到用例动态添加命令行参数根据命令行参数来忽略用例…

linux mysql 5.6.23_MySQL 5.6.23升级到MySQL 5.7.9

MySQL 5.6.23升级到MySQL 5.7.9MySQL 5.7.9新特性一、安全性1.1. 用户表 mysql.user 的 plugin字段不允许为空&#xff0c; 默认值是 mysql_native_password&#xff0c;而不是 mysql_old_password&#xff0c;不再支持旧密码格式;1.2. 增加密码过期机制&#xff0c;过期后需要…

Spring Data JPA教程第一部分:配置

Spring Data JPA是一个旨在简化基于JPA的存储库的创建并减少与数据库通信所需的代码量的项目。 在我的工作和个人爱好项目中&#xff0c;我已经使用了一段时间&#xff0c;确实使事情变得更加简单和整洁。 现在是时候与您分享我的知识了。 这是我的Spring Data JPA教程的第一部…

2018-03-02

1、首先我得重新在git设置一下身份的名字和邮箱&#xff08;因为当初都忘了设置啥了&#xff0c;因为遇到坑了&#xff09;进入到需要提交的文件夹底下&#xff08;因为直接打开git Bash&#xff0c;在没有路径的情况下&#xff0c;根本没&#xff01;法&#xff01;改&#xf…

《算法通关村——再次透彻理解动态规划》

《算法通关村——透彻理解动态规划》 91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> "2" ... Z -> "26"要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反…

html5新特性:异步上传文件

<!DOCTYPE html><html><head><meta charset"utf-8"/><title>html5文件上传</title></head><body><input type"file" name"file" id"file" /><br/><input type"s…

查看环境变量有无配置成功等命令操作

查看环境变量有无配置成功 &#xff1a;windowR cmd set&#xff08;回车&#xff09; 现在可以看到配置成功的环境变量NVM_HOME NVM_SYMLINK等环境变量 也可以单独查看某个变量有无配置成功,例如set NVM—HOME. 转载于:https://www.cnblogs.com/JavascriptAndHtml5/p/9469932…

WildFly 8.0.0.Alpha1的发布和一些历史

自从我们发布WildFly 8.0.0.Alpha1版本以来&#xff0c; 已经过去了大约2周。 该下载位于WildFly下载页面上 。 我敢肯定&#xff0c;你们中的许多人可能会想知道WildFly是什么&#xff0c;而其中一些知道它是什么的人可能不会知道已经发布了。 我将尝试回答其中一些问题&#…

mysql中字典值怎么添加_插入Python字典中的值,包括MySQL的键

我有以下字典&#xff1a;{ : [0, 9],3904: [playback_error, 87],3808: [playback_error, 24],3902: [qp_library_failed_to_start, 1],3903: [playback_error, 464],3805: [playback_error, 141],3807: [playback_error, 29],3806: [playback_error, 1],1309: [playback_erro…

Redis是单线程的

Redis是单线程的 学习了&#xff1a; http://blog.csdn.net/liupeng_qwert/article/details/77263187 https://www.cnblogs.com/syyong/p/6231326.html 这个膜拜一下 https://www.cnblogs.com/yuyutianxia/p/6346723.html http://blog.csdn.net/qqqqq1993qqqqq/article/detail…

POJ 1276 Cash Machine

很容易看出来是一个背包问题&#xff0c;开始把每一张钞票都跑了一遍01背包&#xff0c;直接TLE了。 其实就是多重背包模板题。 1 //#include <bits/stdc.h>2 #include <iostream>3 #include <utility>4 #include <vector>5 #include <cstring>6…