本学习系列介绍:
本学习系列主要针对对编程略有了解或有其他语言基础并要进一步学习Python的同学,通过简易的代码快速入门掌握Python语言。
系列总目录: |
---|
用简易代码快速学习Python(一) |
用简易代码快速学习Python(二) |
用简易代码快速学习Python(三) |
用简易代码快速学习Python(四) |
用简易代码快速学习Python(五) |
用简易代码快速学习Python(六) |
用简易代码快速学习Python(七) |
用简易代码快速学习Python(八) |
用简易代码快速学习Python(九) |
用简易代码快速学习Python(十) |
Day08:
描述符:
描述符就是将某种特殊类型的类的实例指派给另一个类的属性。
目的:用于类中多个相关联属性的共同修改。
例如:摄氏度和华氏度在温度类中的共同修改。
class Myproperty:
def __init__(self, fget=None, fset=None, fdel=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
def __get__(self, instance, owner):
return self.fget(instance)
def __set__(self, instance, value):
self.fset(instance, value)
def __delete__(self, instance):
self.fdel(instance)
class Temperature:
def __init__(self, she=None, hua=None):
self.she = she
self.hua = hua
def getShe(self):
if self.she == None:
return str("温度未设置!")
return '%.1f' % self.she
def getHua(self):
if self.hua == None:
return str("温度未设置!")
return '%.1f' % self.hua
def setShe(self, value):
self.she = value
self.hua = self.she * 1.8 + 32
def setHua(self, value):
self.hua = value
self.she = (self.hua - 32) / 1.8
def delShe(self):
del self.she
del self.hua
self.she = None
self.hua = None
def delHua(self):
self.she = None
self.hua = None
s = Myproperty(getShe, setShe, delShe)
h = Myproperty(getHua, setHua, delHua)
wendu = Temperature()
print(wendu.s) #输出:温度未设置!
wendu.s = 15
print(wendu.s, wendu.h) #输出:15.0 59.0
wendu.h = 152
print(wendu.s, wendu.h) #输出:66.7 152.0
del wendu.h
print(wendu.s) #输出:温度未设置!
容器类型的协议:
如果希望定制的容器是不可变的话,只需要定义__len__()和__getitem__()方法。
如果希望定制的容器时可变的话,除了需要定义__len__()和__getitem__()方法以外,还需要定义__setitem__()和__delitem__()方法。
例如:
class CountList:
def __init__(self, *args):
self.values = [x for x in args]
self.count = {}.fromkeys(range(len(self.values)), 0)
def __getitem__(self, item):
self.count[item] += 1
return self.values[item]
a = CountList(1, 3, 5, 7, 9)
print(a[3]) #输出:7
print(a[1] + a[3]) #输出:10
print(a.count) #输出:{0: 0, 1: 1, 2: 0, 3: 2, 4: 0}
迭代器:
class B(object):
def __next__(self):
raise StopIteration
class A(object):
def __iter__(self):
return B()
Iterable
: 有迭代能力的对象,一个类,实现了__iter__
,那么就认为它有迭代能力,通常此函数必须返回一个实现了__next__
的对象,如果自己实现了,你可以返回self
,当然这个返回值不是必须的;
Iterator
: 迭代器(当然也是Iterable
),同时实现了__iter__
和__next__
的对象,缺少任何一个都不算是Iterator
,比如上面例子中,A()
可以是一个Iterable
,但是A()
和B()
都不能算是和Iterator
,因为A
只实现了__iter__
,而B
只实现了__next__
()。
例如:
class Fibs:
def __init__(self, n):
self.a = 0
self.b = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
temp = self.a
self.a = self.b
self.b = temp + self.b
if self.a > self.n:
raise StopIteration
return self.a
fib = Fibs(15)
for each in fib:
print(each, end=" ") #输出:1 1 2 3 5 8 13
生成器:
生成器:在Python中,一边循环一边计算的机制,称为生成器:generator。
生成器的两种情况:
情况一:把一个列表生成式的[]
改成()
,就创建了一个generator。
a = (x for x in range(10))
print(type(a)) #输出:<class 'generator'>
情况2:如果一个函数中包含yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator。调用函数就是创建了一个生成器(generator)对象。yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。
def g():
print("aaaaaa")
yield 111
print("bbbbbb")
yield 222
b = g()
print(type(b)) #输出:<class 'generator'>
print(next(b))
#输出:
#aaaaaa
#111
print(next(b))
#输出:
#bbbbbb
#222
导包:
import 文件名称
import 文件名称 as 自定义缩略名
from 文件名称 import 函数名
from 文件名称 import *
注意:若自己写的文件,应该将此文件放在sys.path列表所显示的路径目录下(一般为当前文件路径和Python路径),一般会放在python路径中的Lib\site-packages目录下。
注意:若是一组相关的文件,则可以放在文件夹中,称为包(packet),放在sys.path列表所显示的路径目录下(一般为当前文件路径和Python路径),一般会放在python路径中的Lib\site-packages目录下,此时,该包内必须要有名为__init__.py的文件,即使内容为空也应存在,才能将包成功导入。
__init__.py的主要作用是:
1.Python中package的标识,不能删除。
2.定义__all__用来模糊导入。
3.编写Python代码。(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)