流畅的python读书笔记
华间一壶酒
这个作者很懒,什么都没留下…
展开
-
具名元组 namedtuple
作用命名元组赋予每个位置一个含义,提供可读性和自文档性。它们可以用于任何普通元组,并添加了通过名字获取值的能力,通过索引值也是可以的。collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)可以用来构建一个带字段名的元组和一个有名字的类。函数返回一个新的元组子类,名为 typename 。这个新的子类用于创建类元组的对象,可以通过字段名来获取属性值,同样也可以通过索引和迭代获取.转载 2020-11-17 21:04:31 · 192 阅读 · 0 评论 -
元组拆包技巧
使用占位符‘_’处理不感兴趣的数据person=('Jack','male')name,_=personprint(name)#'Jack'用‘*’处理剩下的元素a,b,*rest=range(5)a,b,rest#(0,1,[2,3,4])在平行赋值中*args可以出现在任何位置。嵌套元组拆包city=('Tokyo','JP',36.933,(35.689722,139.691667))name, cc, pop, (latitude, longitude)=city参考原创 2020-11-17 20:46:12 · 266 阅读 · 0 评论 -
9. 闭包
9. 闭包9.1 定义:a closure is function with an extended scope that encompasses(包含) non-global variables referenced in the body of function but not defined there. It does not matter whether the function is anonymous or not ,what matter is that it can access no原创 2020-12-03 17:52:16 · 102 阅读 · 0 评论 -
从一个令人意外的例子看变量作用域规则
读者肯定已经很知道了什么是局部变量,什么是全局变量。大概率你也知道如果局部变量和全局变量重名,那么在本地作用域内是优先使用局部变量的。然后进一步的,本地使用全局变量,如果只是使用,不涉及到修改,那么可以直接使用全局变量;如果想在本地修改全局变量,就要在修改前使用global关键字声明。但是这还不够,请看这个例子:>>> b = 6>>> def f2(a):... print(a)... print(b)... b = 9...&g原创 2020-12-02 21:20:03 · 91 阅读 · 0 评论 -
怎样让len()等python原生函数适用于自定义的数据类型
想要让len()等python原生函数适用于自定义的数据类型,就需要在类中实现python的特殊方法。特殊方法是双下划线开头和结尾的方法。看下面的例子:#一摞python风格的扑克牌import collectionsCard=collections.namedtuple('Card', ['rank','suit'])class FrenchDeck: ranks=[str(n) for n in range(2,11)]+list('JQKA') suits='spades d原创 2020-11-16 22:12:27 · 519 阅读 · 0 评论 -
python中使用*来初始化一个由列表组成的列表时要小心
我们经常使用*来初始化一个列表,比如:l=[1,2,3]l*3#[1, 2, 3, 1, 2, 3, 1, 2, 3]如果在 a * n 这个语句中, 序列 a 里的元素是对其他可变对象的引用的话,你就需要格外注意了, 因为这个式子的结果可能会出乎意料。 比如, 你想用my_list = [[]] * 3 来初始化一个由列表组成的列表, 但是你得到的列表里包含的 3 个元素其实是 3 个引用, 而且这 3 个引用指向的都是同一个列表。看2个例子例1:l=[['-']*3 for i in r原创 2020-11-17 21:34:10 · 346 阅读 · 1 评论 -
python 中的双向队列deque
python 中的双向队列dequeclass collections.deque([iterable[, maxlen]])deque是一个线程安全,可以快速在两端操作的数据类型。如果maxlen没有指定,那么deque可以无限增长;反之,deque满了之后,再有新的元素加入时,就会从另一端删除旧元素。常用函数函数说明append(x)appnedleft(x)clear()copy()浅拷贝extend(iterable)extend原创 2020-11-21 11:13:32 · 445 阅读 · 0 评论 -
python 中的二分查找bisect
python 中的二分查找bisect对于排序好的列表(升序,降序的不行),bisect模块可以快速查找、插入,保持升序。二分查找bisect.bisect_left(a, x, lo=0, hi=len(a))bisect.bisect(a, x, lo=0, hi=len(a))二者同样是:在 a 中找到 x 合适的插入点以维持有序,参数 lo 和 hi 可以被用于确定需要考虑的子集。不同点在于:若x已存在于a,那么bisect_lef的插入点会在已存在元素之前(也就是左边),而bisect返原创 2020-11-21 15:52:41 · 619 阅读 · 0 评论 -
sorted()函数的key参数
sorted()函数的key参数sort(*, key=None, reverse=False)key 指定带有一个参数的函数来提取或计算一个值作为比较大小的标准。下面我们自定义一个Person类,可以看到如果不传入key参数,sorted()无法排序。In [57]: class Person: ...: def __init__(self,age,name): ...: self.age=age ...: self.name=nam原创 2020-11-21 20:23:30 · 854 阅读 · 0 评论 -
enumerate可以方便的遍历列表的索引和值
enumerate(iterable, start=0)返回一个枚举对象。iterable 必须是一个序列,或 iterator,或其他支持迭代的对象。 enumerate() 返回的迭代器的`__next__() 方法返回一个元组,里面包含一个计数值(从 start 开始,默认为 0)和通过迭代 iterable 获得的值。start参数不是从列表的第start个元素开始,而是计数值从start开始。In [25]: a='abcef'In [26]: for i,j in enumerate(原创 2020-11-22 22:25:50 · 293 阅读 · 1 评论 -
4. 字典进阶
4. 字典4.1 字典推导式字典推导可以从任何以键值对作为元素的可迭代对象中构造字典。推导式不止for循环,还可以加其他简单条件:In [11]: a='abcdef'In [13]: b=[i for i in range(6)]In [17]: ab=list(zip(a,b))In [18]: abOut[18]: [('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5)]In [19]: d={l:d for l,d原创 2020-11-24 22:04:18 · 145 阅读 · 0 评论 -
7. python风格的策略模式
7. 策略模式7.1 是什么定义一系列算法,把他们封装起来,并且相互可以替换。这样在不同的上下文中就可以采用不同的算法(策略)。7.2 使用场景:如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。一个系统需要动态地在几种算法中选择一种。如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。7.3 案例分析:重构策略模式虽然设计模式与语言无关, 但这并不意味着每一个模式都能在每一门语原创 2020-12-02 20:15:47 · 207 阅读 · 1 评论