流畅的Python笔记
1.合并参数返回元组
from itertools import zip_longest
# zip属于内置函数
#都是用于将多个列表(可迭代对象)合并起来,并且作比较
# zip弊端:
# 当一个迭代对象的值耗尽后,zip会自动停止,并不会抛出异常
# zip_longest
# 和zip有所不同,可以使用fillvalue参数填充缺失的值,知道最长的可迭代对象耗尽
2.可散列对象
可散列对象
需要实现__hash__
和__eq__
方法,并且确保对象是不可变的
3.打印调用
使用pirnt打印一个类对象,调用的是__str__
不是__repr__
4.猴子补丁
利用Python的动态语言特定,在不修改源代码的基础上添加功能
def set_card(deck, position, card):
"""(self, key, value)"""
deck._cards[position] = card
deck = FrenchDeck()
FrenchDeck.__setitem__ = set_card
5.继承
子类化内置对象是:自定义类继承Python内置类型(dict,list, str)
- 继承自dict的
__init__
方法显然忽略了我们覆盖的__setitem__
方法
原生类型的这种行为违背了面向对象编程的一个基本规则:始终应该从实例(self)所属的类开始搜索方法,即使在超类实现的类中调用也是如此
class DoppelDict(Dict):
def __setitem__(self, key, value):
super().__setitem__(self, key, value)
- 改写
__getitem__
方法d是dict的实例,使用ad中的值更新d。最后update方法还是忽略了AnswerDict.__getitem__
。
class AnswerDict(dict):
def __getitem__(self, item):
return 42
ad = AnswerDict(a='foo')
print(ad['a'])
d.update(ad)
print(d) # {'a': 'foo'}
- 解决上述问题使用
import collections
# 使用collections中的UserDict、UserList、UserString
6.重载运算符
- Python不允许自定义运算符,不允许重载的运算符
is
,and
,or
,not
。 - 其中
&
、|
和~
是可以重载的
7.生成器
生成器函数
如果一个类只为了构建生成器而去实现__iter__
方法,那还不如使用生成器函数。毕竟,生成器函数是制造生成器的工厂
def ariprog_gen(begin, step, end=None):
result = type(begin + step)(begin)
forever = end is None
index = 0
while forever or result < end:
yield result
index += 1
result = beging + step * index
V3
import itertools
def aritprog_gen(begin, step, end=None):
first = type(begin + step)(begin)
ap_gen = itertools.count(first, step)
if end is not None:
ap_gen = itertools.takewhile(lamoda n: n < end, ap_gen)
return ap_gen
8.协程
协程是数据的消费者不能和生成器混淆
协程和迭代无关
生成器与迭代器的语义对比
-
接口
Python的迭代器协议定义了两个方法:
__next__
和__iter__
。生成器对象实现了这两个方法,因此从这方面来看,所有生成器都是迭代器。由此得知,内置的enumerate()
函数创建的对象是迭代器 -
实现方式
从这个角度来看,生成器这种Python语言结构可以使用两种方式编写:含有yield关键字的函数,或者生成器表达式。
9.协程
协程是指一个过程,这个过程与调用方写作,产出由调用方提供的值
def simple_coroutine():
print('-> coroutine started')
x = yield
print('-> coroutine receivide:', x)
# 这两种方式都可以激活线程
print(next(my_coro))
my_coro.send(None)
检查协程的状态
使用:inspect.getgeneratorstate()
函数确定,该函数会返回下述字符串中的一个
-
GEN_CREATED
等待开始执行
-
GEN_RUNNING
解释器正在执行
只有在多线程应用中才能看到这个状态。
-
GEN_SUSPENDED
在yield表达式处暂停。
-
GEN_CLOSED
执行结束
关注公众号可以领取书籍
关注爬虫探索者
公众号发送 001,领取 python 学习图书