流畅的python--学习笔记(一)

写这篇博客的时候我已经看完了前两章了,所以这次是为了温习之前所看的知识。

第一章讲的是Python的魔术方法,所实话我是第一次听到这个名字(我的基础真的很差哈哈哈。)。

学过一点Python的都知道,在编写一个类的时候一般都会有一个__init__(self)这样的初始化函数,这种用函数名前后都用两个下划线组成的函数叫做魔术方法。也叫做dunder method(双下方法)

需要注意的是,魔术方法一般是通过解释器来调用的。

我们可以来看这样的一个类,我会详细的说明魔术方法到底是一个什么东西。

class Array:

	def __init__(self,size=32):
		self._size = size
		self._items = [None] * size

	def __getitem__(self,index):
		return self._items[index]

	def __setitem__(self,index,value):
		self._items[index] = value

	def __len__(self):
		return self._size

	def clear(self,value=None):
		for i in range(len(self._items)):
			self._items[i] = value

	def __iter__(self):
		for item in self._items:
			yield item

这是我自定义的一个抽象数据类型,是一个数组类,我们看到里面的所有的方法除了clear之外全是魔术方法。

当我们输入a = Array()的时候,我们并没有手动调用__init__这个方法,但是解释器会帮我们调用并返回一个初始化的数组对象,

这个数组对象的长度为32,所有的元素均为None

下面的__getitem____setitem__分别是根据下标获得元素给定下标和元素来设定数组中的某个元素

__len__ 是用来检查数组长度的。__iter__是一个迭代器。

下面我们来看怎么去使用这些魔术方法。

流畅的python--学习笔记(一)_第1张图片

一开始我们创建了一个实例a,设定数组长度为10,接下来给数组赋值,我们发现我们的赋值方式是通过a[i] = i,

我们显然没有去调用__setitem__这个方法,这是我们在运行程序的时候解释器帮我们执行了这个魔术方法。

下面的print(a[0])和print(len(a))都是由于解释器帮我们调用了__getitem__和__len__这两个魔术方法。

最后的for value in a可以运行的原因是我们给这个数组类实现了一个迭代器,所以是可以a本质上也算是一个迭代器。

那么以上就是魔术方法的说明。

下面说一下剩余的一些内置的数据类型。

from random import choice

我们可以通过choice(items)来进行随机获取迭代器中的某个元素。

reversed:反向迭代。比如说

      for i in reversed(range(10)):

           print(i)

那么打印的结果将会是从9到0。

还有字典dict(spades=3)相当于dict = {'spades':'3'}

接着是sorted(items,key),key是可选参数,参数可以是方法名。sorted是用于排序用的,但是是临时排序,并不会改变迭代器本身。

 

最后说一下len这个方法,为什么len不是普通方法呢,这个我在学习数据结构的时候也有看到,结合了这本书我觉得算是理解到位了。

python是一个可以被其他语言实现的语言,其中CPython是由C语言实现的python,也是最原汁原味的python。

书上写的是,如果x是一个内置类型的实例,那么len(x)的速度会非常快。

那么假设我们用lst = list(range(10))来新建一个列表,在这个过程中,C解释器里面有一个结构体,C解释器会初始化这个结构体,包括长度也会被初始化,因此当我们使用len(lst)去获取这个列表的长度的时候,系统会直接去这个C结构体里面读取这个列表的长度,而不需要调用任何方法,所以速度会非常的快。

其实还有需要补充的地方,我会放到第二章再说。

你可能感兴趣的:(流畅的python--学习笔记(一))