一、生成器
a. 可以看成是一個(gè)可以存儲(chǔ)多個(gè)數(shù)據(jù)的容器。一次只能生成一個(gè)數(shù)據(jù)外潜,從前往后原环,不能逆向取,不能跳躍
b. 獲取生成器里面的數(shù)據(jù)处窥,需要使用 _next_( )方法
c. 只要函數(shù)聲明中有 yield 關(guān)鍵字嘱吗,就表明這個(gè)函數(shù)是生成器。
# 1,1,2,3,5,8,13,21.....
def xu_lie(n):
pre_1 = 1
pre_2 = 1
for x in range(1, n+1):
if x == 1 or x == 2:
current = 1
yield current
# print(current)
continue
current = pre_1 + pre_2
pre_1, pre_2 = pre_2, current
# print(current)
yield current
二滔驾、類和對(duì)象
1.定義
-
類:對(duì)擁有相同功能和屬性的對(duì)象的封裝
-
對(duì)象:類的實(shí)例
2.聲明
-
類的聲明:
類的聲明:
class 類名(父類):
屬性
方法
解說(shuō)
class: python中聲明類的關(guān)鍵字
類名: 標(biāo)識(shí)符谒麦,類名的首字母大寫,駝峰式命名
( ): 類要繼承自其它的類哆致,需要寫括號(hào)绕德,括號(hào)里面是父類的名字√В可以省略
屬性: 對(duì)象屬性和類的字段 --- 保存數(shù)據(jù)
方法: 實(shí)質(zhì)就是聲明在類中的函數(shù) --- 實(shí)現(xiàn)功能
實(shí)例:
1.聲明類Person
class Person:
"""類的說(shuō)明:人類"""
# 聲明兩個(gè)對(duì)象方法耻蛇,需要使用對(duì)象來(lái)調(diào)用
"""
對(duì)象方法默認(rèn)都有一個(gè)參數(shù)self,在調(diào)用方法的時(shí)候胞此,這個(gè)參數(shù)不用傳參(系統(tǒng)會(huì)自動(dòng)給self傳參)
誰(shuí)來(lái)調(diào)用這個(gè)方法臣咖,self就是誰(shuí)
"""
def eat(self):
print('self:', self)
print('在吃飯')
def sleep(self):
print('在睡覺(jué)')
-
對(duì)象的聲明
聲明對(duì)象:
通過(guò)類的構(gòu)造方法去創(chuàng)建對(duì)象(名字和類名同名的方法就是構(gòu)造方法,自動(dòng)生成的)
對(duì)象名 = 類名()類對(duì)象可以通過(guò)點(diǎn)語(yǔ)法使用類中聲明的對(duì)象的方法和屬性
對(duì)象.方法名()
對(duì)象.屬性名
實(shí)例
# 1.聲明類Person
class Person:
"""類的說(shuō)明:人類"""
# 聲明兩個(gè)對(duì)象方法漱牵,需要使用對(duì)象來(lái)調(diào)用
"""
對(duì)象方法默認(rèn)都有一個(gè)參數(shù)self夺蛇,在調(diào)用方法的時(shí)候,這個(gè)參數(shù)不用傳參(系統(tǒng)會(huì)自動(dòng)給self傳參)
誰(shuí)來(lái)調(diào)用這個(gè)方法酣胀,self就是誰(shuí)
"""
def eat(self):
print('self:', self)
print('在吃飯')
def sleep(self):
print('在睡覺(jué)')
# 2. 聲明對(duì)象
p1 = Person()
print('p1:',p1)
# 一個(gè)類可以有多個(gè)對(duì)象
p2 = Person()
print('p2:',p2)
# 對(duì)象可以調(diào)用對(duì)象方法
p1.eat()
p2.eat()
p1.sleep()
p2.sleep()
3.對(duì)象屬性的聲明
對(duì)象屬性的聲明
class 類名:
def __init__(self):
self.屬性名 = 初值
self.屬性名2 = 初值2
實(shí)例
class Person:
"""人類"""
"""
1.init方法是系統(tǒng)自帶的一個(gè)方法刁赦,這個(gè)方法不能直接調(diào)用,通過(guò)類創(chuàng)建對(duì)象的時(shí)候系統(tǒng)會(huì)自動(dòng)調(diào)用這個(gè)方法
init方法的作用是對(duì)對(duì)象的屬性進(jìn)行初始化
2.通過(guò)構(gòu)造方法創(chuàng)建對(duì)象的時(shí)候闻镶,一定要保證截型,init方法中除了self以外,其他的每個(gè)參數(shù)都必須有值
"""
def __init__(self, name1='', age1=0, sex='女'):
# 在這個(gè)地方聲明對(duì)象的屬性
# 在init方法中聲明對(duì)象的屬性
"""
name儒溉、age和sex就是Person這個(gè)類的對(duì)象屬性。類的對(duì)象屬性发钝,需要通過(guò)對(duì)象來(lái)使用
"""
self.name = name1
self.age = age1
self.sex = sex
def run(self, n):
print(self.name)
print(n)
# 注意:構(gòu)造方法中的參數(shù)顿涣,實(shí)質(zhì)是傳給init方法的參數(shù)的
p1 = Person('yuting', 18)
p1.run(100)
# 通過(guò)對(duì)象使用對(duì)象屬性
print(p1.name, p1.age, p1.sex)
p2 = Person('女神', 30)
print(p2.sex, p2.name)
"""通過(guò)不同的方式創(chuàng)建對(duì)象"""
# 創(chuàng)建對(duì)象的時(shí)候不給屬性賦值
p3 = Person()
p4 = Person('')
4.增刪改查
class Dog:
"""狗類"""
def __init__(self, age=0, color='yellow'):
self.age = age
self.color = color
dog1 = Dog(3,'white')
# 1.查(獲取屬性)
"""
方法一:對(duì)象.屬性 (如果屬性不存在,會(huì)報(bào)錯(cuò))
方法二:對(duì)象.__getattribute__(屬性名) 和 getattr(對(duì)象, 屬性名, 默認(rèn)值)
"""
print(dog1.age, dog1.color)
print(dog1.__getattribute__('age'))
print(getattr(dog1, 'age'))
# 如果設(shè)置了default的值酝豪,那么當(dāng)屬性不存在的時(shí)候不會(huì)報(bào)錯(cuò)涛碑,并且返回默認(rèn)值
print(getattr(dog1, 'abc', '無(wú)名氏'))
# 2.改(修改屬性的值)
"""
方法一: 對(duì)象.屬性 = 新值
方法二:對(duì)象.__setattr__(屬性名,新值) 和 setattr(對(duì)象,屬性名孵淘,新值)
"""
dog1.age = 4
print(dog1.age)
dog1.__setattr__('color', 'black')
print(dog1.color)
setattr(dog1, 'color', 'blue')
print(dog1.color)
# 3.增加(增加對(duì)象屬性)
"""
對(duì)象.屬性 = 值(屬性不存在)
注意:屬性是添加給對(duì)象的蒲障,而不是類的
"""
dog1.name = '大黃'
print(dog1.name)
dog1.__setattr__('type', '哈士奇')
print(dog1.type)
setattr(dog1,'sex', '公')
print(dog1.sex)
# dog2 = Dog()
# print(dog2.name)
# 4.刪(刪除對(duì)象的屬性)
"""
方法一: del 對(duì)象.屬性
注意:刪除屬性也是刪的具體某個(gè)對(duì)象的屬性。不會(huì)影響這個(gè)類的其他對(duì)象
"""
# del dog1.age
# print(dog1.age) # AttributeError: 'Dog' object has no attribute 'age'
# dog1.__delattr__('age')
# print(dog1.age) # AttributeError: 'Dog' object has no attribute 'age'
delattr(dog1, 'color')
# print(dog1.color) # 'Dog' object has no attribute 'color'
"""
練習(xí):聲明一個(gè)學(xué)生類,擁有屬性:姓名揉阎、性別庄撮、年齡。方法:學(xué)習(xí)
1.聲明學(xué)生類的對(duì)象毙籽,聲明的時(shí)候就給姓名洞斯、性別和年齡賦值
2.通過(guò)三種方式分別獲取姓名、性別和年齡坑赡,并且打印
3.給學(xué)生對(duì)象添加一個(gè)屬性烙如,電話
4.修改學(xué)生的年齡
5.刪除學(xué)生的性別
"""
class Student:
def __init__(self, name='', age=0, sex=''):
self.name = name
self.sex = sex
self.age = age
def study(self):
print('%s學(xué)習(xí)' % self.name)
stu1 = Student('小明', 30, '男')
print(stu1.name)
print(stu1.__getattribute__('age'))
print(getattr(stu1, 'sex'))
stu1.tel = '123333'
stu1.age = 35
del stu1.sex
stu1.study()
5.類中的方法
-
屬性
a.對(duì)象屬性: 屬于對(duì)象的,不同對(duì)象對(duì)應(yīng)的值可能不一樣(對(duì)象屬性毅否,通過(guò)對(duì)象來(lái)使用)
b.類的字段: 聲明在類里面亚铁,函數(shù)外面。類的屬性屬于類(類的字段螟加,通過(guò)類來(lái)使用)
-
方法(對(duì)象方法(方法)徘溢、類方法、靜態(tài)函數(shù))
對(duì)象方法:自帶一個(gè)self參數(shù)仰迁,一般要通過(guò)對(duì)象去調(diào)用
類方法:1.使用@classmethod修飾
2.自帶一個(gè)cls參數(shù)甸昏,并且這個(gè)參數(shù)不用傳參,誰(shuí)來(lái)調(diào)用這個(gè)方法徐许,cls就指向誰(shuí)
3.類方法要通過(guò)類來(lái)調(diào)用
靜態(tài)方法:1.使用@staticmethod修飾
2.沒(méi)有默認(rèn)參數(shù)
3.靜態(tài)方法要通過(guò)類來(lái)調(diào)用
-
如何選擇方法:
怎么選擇用對(duì)象方法施蜜、類方法、靜態(tài)方法雌隅?
i如果實(shí)現(xiàn)函數(shù)的功能需要使用對(duì)象的屬性翻默,就聲明成對(duì)象方法;如果實(shí)現(xiàn)函數(shù)的功能需要使用類的字段或者調(diào)用類的方法恰起,就聲明成類方法
如果實(shí)現(xiàn)函數(shù)功能既不需要對(duì)象的屬性也不需要類的字段修械,就聲明成靜態(tài)方法