python学习笔记之鸭子类型与迭代器/iter()(《利用Python进行数据分析》Python语言基础part2)

系列文章目录

第二章 2.3 Python语言基础—鸭子类型和迭代器/iter



前言

上文提到python语言基础的第一部分,详细学习了缩进、对象、注释、变量、参数、引用、属性等,本次主要集中在鸭子类型和迭代器的学习。原书《利用Python进行数据分析》,每周定期更新读书笔记,记录淑芬(DA)小白Sab学习的过程,欢迎私聊交流讨论~


python语言基础思维导图

2.3.1.8 鸭子类型duck typing与iter迭代

何为鸭子类型?

“If it walks like a duck and quacks like a duck, it must be a duck.”
—James Whitcomb Riley

如果一个东西走起路来像鸭子叫起来也像鸭子,那它就是鸭子。
你可以这样理解,一个东西做了什么,有什么样的行为,则可以决定他具体是什么类型的东西。
比如一个东西可以吃竹子,黑白皮,体型肥硕似熊,丰腴富态,头圆尾短,那它就是熊猫。
由此可见,在鸭子类型中,我们更关注对象能做什么,而非关注对象是哪位。

例如,你验证一个对象如果实现了迭代器协议,那它就一定是可以迭代的。

何为迭代器?

先来看看官方手册解释:
来自官方手册--iterator
来自官方手册--iter

总结重点:

  1. 迭代器就是一个包含一串值的对象;迭代器是实现迭代器协议的对象,该协议由方法__iter__()和__next__()组成;
  2. 列表,元组,字典和集合都是可迭代的对象。 它们是可迭代的容器,可以从中获得迭代器;
  3. 可以使用for循环来迭代可迭代对象;
  4. 创建一个对象/类作为迭代器,要实现__iter__()和__next__()方法;
  5. 为了防止迭代永远进行,我们可以使用StopIteration语句。

具体看看:

1. 迭代器就是一个包含一串值的对象;迭代器是实现迭代器协议的对象,该协议由方法__iter__()和__next__()组成

代码如下(示例):

#1.迭代器就是一个包含一串值的对象
my_sweeties = ("Sabrina", "Casey", "you")

for x in my_sweeties:
    print(x)
    
Out:Sabrina
Casey
you

2. 大部分类型都是可迭代的对象

代码如下(示例):

def isinterable(obj):
    try:
        iter(obj)
        return True
    except TypeError: #不可遍历
        return False
    
    
print(isinterable('a string'))
Out:True
print(isinterable([1,2,3]))
Out:True
print(isinterable(5))
Out:False
#可以先检查是否能迭代,接着如果不能直接将它转为列表
if not isinstance(x,list) and isiterable(x):
    x=list(x)
    

3. 可以使用for循环来迭代可迭代对象

此时for可以理解为next的用法
在第一点中已经使用过for循环来迭代元组,除此之外也可以迭代字符串的字符:

代码如下(示例):

my_name = "Sabrina"

for x in my_name:
    print(x)
Out:S
a
b
r
i
n
a

4. iter()和__next__()方法

定义迭代器,创建一个对象/类作为迭代器,实现__iter__()和__next__()方法
iter():始终返回迭代器对象本身
next():返回序列中的下一项
引用一个很经典的例子:魔法方法-----先定义一个从1开始的迭代器,然后每返回一个+1

代码如下(示例):

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))
Out:
1
2
3
4
5

5. StopIteration语句

为了防止迭代永远进行,我们可以使用StopIteration语句来破坏掉:

代码如下(示例):


example = iter([1,2,3,4,5])
print(example)


while True:
    try:
        next1 = next(example)
        print(next1)
    except StopIteration:
        # StopIteration阻止循环继续
        break

Out:
1
2
3
4
5

总结

本文记录了《利用Python进行数据分析》2.3 python语言基础鸭子类型和迭代器的学习过程,下一篇将学习对二元运算符/比较运算符/异或/可变对象等其他语言语义内容,有问题欢迎指正交流!

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值