Python之路【第六篇】:Python基础(22)——生成器和迭代器

迭代器

迭 代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们 很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之 后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件。

特点:

  1. 访问者不需要关心迭代器内部的结构,仅需通过__next()__(Python2.x 为next())方法不断去取下一个内容
  2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问,也就是不能像列表一样通过下标等取到任意位置的值,一般多用用于for in 循环进行遍历
  3. 访问到一半时不能往回退
  4. 便于循环比较大的数据集合,节省内存

Python内置函数iter就是一个简单的帮助我们创造一个迭代器的内置函数。

>>> it = iter([1, 2, 3, 4]) # 通过内置函数iter及列表生成了一个迭代器
>>> it
<list_iterator object at 0x7faa075f4ef0>
>>> it.__next__() # 通过__next方法取得一个值

>>> it.__next__()
>>> it.__next__() # 迭代器一个只有4个元素,如果此时再继续使用next方法,就会报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

其实事实上,我们很少会使用__next__()方法一个一个的去取值,多数情况下都是使用for in循环进行遍历

>>> it = iter([1, 2, 3, 4])
>>> for i in it:
...     print(i)
...
2
4

生成器

生成器就是一个函数调用时返回一个迭代器,这个函数就叫做生成器。说白了就是生成器生成迭代器。与普通函数的区别就在于yield关键字

我们用斐波拉契数列来说明生成器和普通函数的区别

普通函数实现

def fib(max):
    n, a, b = 0, 0, 1
    res = []
    while n < max:
        res.append(b)
        a, b = b, a + b
        n = n + 1
    return res
res = fib(6)
print(res)
for i in res:
    print(i)
    执行结果
[1, 1, 2, 3, 5, 8]
1
3
8

生成器

def fib2(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
print(res)
for i in res:
    print(i)
    执行结果
<generator object fib2 at 0x000001EF306570F8> # 可以看出返回的是一个生成器对象,并且生成器内部的东西没有马上执行,而是执行到yield的时候就返回一个迭代器
1
3
8
时间: 2024-12-09 18:48:19

Python之路【第六篇】:Python基础(22)——生成器和迭代器的相关文章

python之路第六篇_面向对象

面向对象介绍 1.世间万物皆对象 2.只要是对象,就肯定属于某种品类 3.只要是对象,就肯定有属性的: 一个类可以事例化多个对象,每个对象都有不同的属性和方法. 面向过程 Vs面向对象 面向过程编程(procedural Programming) Procedural programming uses a list of instructions to tell the computer what to do step-by-step. 面 向过程编程依赖 - 你猜到了- procedures,

python之路——第二块(装饰器、生成器、迭代器)

装饰器 def deco(count): def func(num): if num < 10: count(num) else: exit() return func @deco def count(num): a = 0 for i in range(num): a += i print(a) count(11) 注:deco(count)和下面的count(num)中的count只是一个形参,count可以用任何变量名替换,但是num是一定要有,因此传入的实参是被装饰函数,被装饰函数有nu

Python之路【第二篇】:Python基础(一)

Python之路[第二篇]:Python基础(一) 入门知识拾遗 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1:     name = 'wupeiqi' print  name 下面的结论对吗? 外层变量,可以被内层变量使用 内层变量,无法被外层变量使用 二.三元运算 1 result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为假:result = 值2 三.进制 二进制,01 八进

Python之路【第九篇】:Python基础(26)——socket server

socketserver Python之路[第九篇]:Python基础(25)socket模块是单进程的,只能接受一个客户端的连接和请求,只有当该客户端断开的之后才能再接受来自其他客户端的连接和请求.当然我 们也可以通过python的多线程等模块自己写一个可以同时接收多个客户端连接和请求的socket.但是这完全没有必要,因为python标准库已经为 我们内置了一个多线程的socket模块socketserver,我们直接调用就可以了,完全没有必要重复造轮子. 我们只需简单改造一下之前的sock

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc

第六篇 模块基础

目录 第六篇 模块基础 一 模块的四种形式 二 import和from...import 三 循环导入问题 四 模块的搜索路径 五 python文件的两种用途 六 包 第六篇 模块基础 一 模块的四种形式 啥是模块 模块是一系列功能的集合体,而函数是某一功能的集合体,因此模块可以看成是一堆函数的集合体.一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块.如果这个py文件的文件名为module.py,模块名则是module. 模块的四种形式 2.1 自定义模块:如果你自己写一个P

Python之路番外:PYTHON基本数据类型和小知识点

Python之路番外:PYTHON基本数据类型和小知识点 一.基础小知识点 1.如果一行代码过长,可以用续行符 \换行书写 例子 if (signal == "red") and (car == "moving"): car = "stop" else : pass 等同于 if (signal == "red") and (car == "moving"): car = "stop"

Python之路【第一篇】:Python基础

本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语句 表达式for 循环 break and continue 表达式while 循环 作业需求 一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语

Python之路【第一篇:Python基础】

一:python的使用 1.python的两个版本:python2.0与python3.0.这两个版本的区别在于python3是不向下兼容python2的组件和扩展的,但是在python2.6和2.7的两个版本中将会继续兼容python2.0和3.0两个版本.简单点说就是python2.6与2.7是2.0版本向3.0版本的过渡版本,同时python的2.7版本也将是最后一个2.0版本,之后将全部使用python的3.0版本. Windows中python3.x的安装: 1 1.下载安装包 2 h

Python之路【第一篇】:Python前世今生

Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOBE排行榜,Python赶超PHP占据第五!!! 由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!! Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众