课时48:魔法方法:迭代器

目录:

  一、迭代器

  二、课时48课后习题及答案

*************

一、迭代器

*************

迭代的意思类似于循环,每一次重复的过程被称为一次迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。提供迭代方法的容器称为迭代器,通常接触的迭代器有序列(列表、元组、字符串)还有字典也是迭代器,都支持迭代的此操作。

举个例子,通常使用for语句来进行迭代:

>>> for i in "FishC":
    print(i)

F
i
s
h
C

字符串就是一个容器,同时也是一个迭代器,for语句的作用就是触发这个迭代器的迭代功能,每次从容器里依次拿出一个数据,这就是迭代操作。

字典和文件也是支持迭代操作的:

>>> links = {‘1‘:‘111111‘,         ‘2‘:‘222222‘,         ‘3‘:‘333333‘,         ‘4‘:‘444444‘}
>>> for each in links:
    print(‘%s->%s‘%(each,links[each]))

1->111111
2->222222
3->333333
4->444444

关于迭代,Python提供了两个BIF:

  • iter()
  • next()

对于一个容器对象调用iter()就得到它的迭代器,调用next()迭代器就会返回下一个值,然后怎么结束呢?如果迭代器没有值可以返回了,Python会抛出一个StopIteration的异常:

>>> string = "FishC"
>>> it = iter(string)
>>> next(it)
‘F‘
>>> next(it)
‘i‘
>>> next(it)
‘s‘
>>> next(it)
‘h‘
>>> next(it)
‘C‘
>>> next(it)
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    next(it)
StopIteration

所以利用这两个BIF,可以分析出for语句其实是这样工作的:

>>> string = "FishC"
>>> it = iter(string)
>>> while True:
    try:
        each = next(it)
    except StopIteration:
        break
    print(each)

F
i
s
h
C

那么关于实现迭代器的魔法方法有两个:

  • __iter__()
  • __next__()

一个容器如果是迭代器,那就必须实现__iter__()魔法方法,这个方法实际上就是返回迭代器本身。接下来重点是要实现的是__next__()魔法方法,因为它决定了迭代的规则。简单举个例子:

class Fibs:
    def __init__(self):
    self.a = 0
    self.b = 1
    def __iter__(self):
    return self
    def __next__(self):
    self.a, self.b = self.b, self.a + self.b
    return self.a
>>> fibs = Fibs()
>>> for each in fibs:
    if each < 20:
        print(each)
    else:
        break

1
1
2
3
5
8
13

好了,这个迭代器的唯一亮点就是没有终点,所以如果没有跳出循环,它会不断迭代下去。那可不可以加一个参数,用于控制迭代的范围呢?

>>> fibs = Fibs()
>>> for each in fibs:
    print(each)

1
1
2
3
5
8
13
>>> fibs = Fibs(10)
>>> for each in fibs:
    print(each)

1
1
2
3
5
8

是不是很容易呢?就是那么回事的啦。

*******************************

二、课时48课后习题及答案

*******************************

原文地址:https://www.cnblogs.com/DC0307/p/9538168.html

时间: 2024-12-09 18:08:22

课时48:魔法方法:迭代器的相关文章

课时49:魔法方法:生成器

目录: 一.生成器 二.课时49课后习题及答案 ********************* 一.生成器 ********************** 生成器的学习并不涉及魔法方法,甚至它巧妙地避开了类和对象,仅通过普通地函数就可以实现了. 生成器其实是迭代器的一种实现. 生成器的发明一方面是为了使得Python更为简洁,因为,迭代器需要我们自己去定义一个类和实现相关的方法,而生成器则只需要在普通的函数中加上一个yield语句即可. 另一方面,生成器的发明,使得Python模仿协同程序的概念得以实

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

《Python基础教程(第二版)》学习笔记 -&gt; 第九章 魔法方法、属性和迭代器

准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here 在这两个类中,NewStyle是新式的类,OldStyle是旧式的类,如果文件以__metaclass__ = type 开始,那么两个类都是新式类. 构造方法 构造方法,当一个对象被创建后,会立即调用构造方法.Python中创建一个构造方法,只要把init方法的名字从简单的init修改成__init__

python基础教程_学习笔记11:魔法方法、属性和迭代器

魔法方法.属性和迭代器 在python中,有的名称会在前面和后面各加上两个下划线,这种写法很特别.它表示名字有特殊含义,所以绝不要在自己的程序中使用这种名字.在python中,由这些名字组成的集合所包含的方法叫做魔法(或称特殊)方法.如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下被python调用,而几乎没有直接调用它们的必要. 准备工作 为了确保类是新型的,应该把赋值语句__metaclass__=type放在你的模块的最开始,或者(直接或间接)子类化内建类(实际上是类型)ob

Python3 魔法方法:迭代器

0.什么是迭代器 迭代器不是容器,而是实现了__next__方法的对象(用于遍历容器中的数据) 在python原生支持的数据结构中set(集合)是仅支持迭代器访问的,不支持下标(index)访问 1.相关的BIF iter() 将一个可迭代对象转换成一个迭代器 next() 访问迭代器中的下一个变量,如果迭代器没有变量了,则返回StopIteration异常 2.魔法方法 __iter__(self) 返回迭代器本身 __next__(self) 决定迭代的方法 3.例题: 用while语句实现

课时44:魔法方法:简单定制

目录: 一.简单定制 二.课时44课后习题及答案 **************** 一.简单定制 **************** 基本要求:1>> 定制一个计时器的类2>> start和stop方法代表启动计时和停止计时3>> 假设计时器对象t1,print(t1)和直接调用t1均显示结果4>> 当计时器未启动或已经停止计时,调用stop方法会给予温馨的提示5>> 两个计时器对象可以进行相加:t1 + t26>> 只能使用提供的有限

课时46:魔法方法:描述符(property的原理)

目录: 一.描述符(property的原理) 二.课时46课后习题及答案 ********************************** 一.描述符(property的原理) ********************************** 本节要讲的内容叫作描述符,用一句话解释,描述符就是将某种特殊类型的类的实例指派给另一个类的属性.那什么是特殊类型的类呢?就是至少要在这个类里边定义__get__().__set__()或__delete__()三个特殊方法中的任意一个. 下表列举了

python魔法方法、构造函数、序列与映射、迭代器、生成器

在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法. 构造函数 构造函数不同于普通方法,将在对象创建后自动调用它们.也就是在对象创建完成后,自动会调用__init__方法来初始化. 创建一个构造方法 构造方法传参 >>> class FooBar: def __init__(self,value=42): #默认参数 self.somevar = value >>&g