系列文章目录
第二章 2.3 Python语言基础—鸭子类型和迭代器/iter
文章目录
前言
上文提到python语言基础的第一部分,详细学习了缩进、对象、注释、变量、参数、引用、属性等,本次主要集中在鸭子类型和迭代器的学习。原书《利用Python进行数据分析》,每周定期更新读书笔记,记录淑芬(DA)小白Sab学习的过程,欢迎私聊交流讨论~
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
如果一个东西走起路来像鸭子叫起来也像鸭子,那它就是鸭子。
你可以这样理解,一个东西做了什么,有什么样的行为,则可以决定他具体是什么类型的东西。
比如一个东西可以吃竹子,黑白皮,体型肥硕似熊,丰腴富态,头圆尾短,那它就是熊猫。
由此可见,在鸭子类型中,我们更关注对象能做什么,而非关注对象是哪位。
例如,你验证一个对象如果实现了迭代器协议,那它就一定是可以迭代的。
何为迭代器?
先来看看官方手册解释:
总结重点:
- 迭代器就是一个包含一串值的对象;迭代器是实现迭代器协议的对象,该协议由方法__iter__()和__next__()组成;
- 列表,元组,字典和集合都是可迭代的对象。 它们是可迭代的容器,可以从中获得迭代器;
- 可以使用for循环来迭代可迭代对象;
- 创建一个对象/类作为迭代器,要实现__iter__()和__next__()方法;
- 为了防止迭代永远进行,我们可以使用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语言基础鸭子类型和迭代器的学习过程,下一篇将学习对二元运算符/比较运算符/异或/可变对象等其他语言语义内容,有问题欢迎指正交流!