python基础教程(六)

1.构造函数

class init:
	def __init__(self):
		self.first=19

>>> i=init()
>>> i.first
19

class init:
	def __init__(self,value=20):
		self.first=value

>>> i=init()
>>> i.first
20
>>> j=init('21')
>>> j.first
'21'

2.析构函数

3.在python中,协议通常指的是规范行为的规则。

4.一个带访问计数器的列表

class CounterList(list):
	def __init__(self,*args):
		super().__init__(*args)
		self.counter=0
	def __getitem__(self,index):
		self.counter+=1
		return super(CounterList,self).__getitem__(index)

>>> c=CounterList(range(10))
>>> c
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> c[4]
4
>>> c[2]
2
>>> c.counter
2
>>> c[2]+c[4]
6
>>> c.counter
4

5.存取方法

class Rectangle:
	def __init__(self):
		self.width=0
		self.height=0
	def set_size(self,size):
		(self.width,self.height)=size
        #或者不用加括号也是可以的,但是我还是喜欢加括号,便于理解。
	def get_size(self):
		return self.width,self.height

>>> r=Rectangle()
>>> r.set_size((50,25))
>>> r.get_size()
(50, 25)

6.通过存取方法定义的属性通常称为特性(property)

class Rectangle:
	def __init__(self):
		self.width=0
		self.height=0
	def set_size(self,size):
		(self.width,self.height)=size
        #或者不用加括号也是可以的,但是我还是喜欢加括号,便于理解。
	def get_size(self):
		return self.width,self.height
	size=property(get_size,set_size)

>>> r=Rectangle()
>>> r.width=20
>>> r.height=15
>>> r.size
(20, 15)
>>> r.size=(30,20)
>>> r.width
30

7.迭代(iterate)意味着多次重复。__iter__是迭代器协议的基础。

class Fib:
	def __init__(self):
		self.a=0
		self.b=1
	def __next__(self):
		(self.a,self.b)=(self.b,self.a+self.b)
		return self.a
	def __iter__(self):
		return self
	def pri(self):
		for s in self:
			if s<10000:
				print(s,end=' ')

>>> f=Fib()
>>> f.pri()
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
#输出小于10000的Fibonacci数

8.通过对可迭代对象调用内置函数iter,可获得一个迭代器。

>>> it=iter(range(10))
>>> next(it)
0
>>> next(it)
1
...

9.包含yield语句的生成函数都被称为生成器

nested=[[1,2],[3,4],[5]]
def flatten(nested):
	for sublist in nested:
		for element in sublist:
			yield element

>>> list(flatten(nested))
[1, 2, 3, 4, 5]
#这个函数理解的不是很明白
#处理了两层的嵌套列表,使用两个for循环来实现的
nested=[[[1],2],[3,4],[5]]
def flatten(nested):
	for sublist in nested:
		for element in sublist:
			yield element

>>> list(flatten(nested))
[[1], 2, 3, 4, 5]
nested=[[[1],2],[3,4],[5]]
def flatten(nested):
	try:
		for sublist in nested:
			for element in flatten(sublist):
				yield element
	except TypeError:
		yield nested

>>> list(flatten(nested))
[1, 2, 3, 4, 5]

10.调用flatten时,有两种可能性:基线条件和递归条件。

11.在基线条件下,要求这个函数展开单个元素,在这种情况下for循环将引发TypeError异常,因为你试图迭代一个数,而这个生成器只生成一个元素。

12.生成器的方法:

外部世界:外部世界可访问生成器的方法send,需要接受一个参数。

生成器:在挂起的生成器内部,yield可能用作表达式而不是语句。当生成器重新运行时,yield返回一个值——通过send从外部世界发送的值。如果用的是next,yield将返回None。

throw:用于在生成器中引发异常,调用时可提供一个异常类型、一个ke'x可选值和一个trace back对象。

close:用于停止生成器,调用时无需提供任何参数。

猜你喜欢

转载自blog.csdn.net/Ritannn/article/details/81235633