1.迭代器和生成器
生成器:a.可以看成是一個可以存儲多個數(shù)據(jù)的容器董瞻。需要里面的數(shù)據(jù)的時候,就生成一個田巴,里面的數(shù)據(jù)只能從前往后钠糊,一個一個的生成,
不能跳躍壹哺,也不能從后往前抄伍。生成的數(shù)據(jù),不能再生成了
b.獲取生成器里面的數(shù)據(jù)管宵,需要使用next()方法
c.只要函數(shù)聲明中有yield關(guān)鍵字截珍,函數(shù)就不再是一個單純的函數(shù),而是一個生成器
和列表比較:列表存數(shù)據(jù)箩朴,數(shù)據(jù)必須是實實在在存在的數(shù)據(jù)岗喉,一個數(shù)據(jù)會占一定的內(nèi)容空間。
生成器存數(shù)據(jù)炸庞,存的是產(chǎn)生數(shù)據(jù)的算法钱床,沒有數(shù)據(jù)去占用內(nèi)存空間
實例:
# 斐波拉切數(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
continue
current = pre_1 + pre_2
pre_1, pre_2 = pre_2, current
# print(current)
yield current
xulie = xu_lie(10)
print(xulie.__next__())
print(xulie.__next__())
print(xulie.__next__())
if __name__ == '__main__':
x = (i for i in range(10))
# x 就是一個生成器,用來產(chǎn)生數(shù)據(jù)
print(x)
print(x.__next__())
print(x.__next__())
2.認識面向?qū)ο?/h1>
1.什么是類:對擁有相同屬性和方法的對象的封裝
類是抽象的
類中相同的屬性的值是不能確定的
2.什么是對象:對象就是類的實例
對象是具體的
對象的屬性是確定的
如果說人是一個類燕雁,那么余婷就是一個對象
如果說電腦是一個類,我桌上的這臺mac就是一個對象
3.面向?qū)ο缶幊?br>
面向過程編程:一步一步的寫代碼實現(xiàn)功能 --> 工具:邏輯和算法
函數(shù)式編程:面對問題考慮有沒有擁有某種功能的函數(shù) --> 工具:函數(shù)
面向?qū)ο缶幊蹋好鎸栴}考慮有沒有相應(yīng)的對象來解決這個問題 --> 工具:類和對象
3.類的聲明
class 類名(父類):
??? ?屬性
??? ?方法
class:Python中聲明類的關(guān)鍵字
類名:標(biāo)識符鲸拥,類名首字母大寫拐格,駝峰式命名
():類要繼承自其它的類,需要寫括號刑赶,括號里面是父類名
屬性:對象屬性和類的字段 --- 保存數(shù)據(jù)
方法:實質(zhì)就是聲明在類中的函數(shù) --- 實現(xiàn)功能
3.1.聲明一個類Person
class Person:
"""
類的說明:人類
"""
# 聲明對象方法捏浊,需要使用對象來調(diào)用
# 對象方法默認都有一個參數(shù)self,在調(diào)用方法的時候撞叨,不用傳參(系統(tǒng)會自動給self傳參)
# 誰來調(diào)用這個方法金踪,self就是誰
def eat(self):
print('在吃飯')
def sleep(self):
print('在睡覺浊洞,(|3[▓▓] 晚安')
3.2.聲明對象
通過類的構(gòu)造方法去創(chuàng)建對象(名字和類名同名的方法就是構(gòu)造方法,自動生成)
對象名 = 類名()
類的對象可以通過點語法使用類中聲明的對象方法和屬性
對象.方法名()
對象.屬性名
per1 = Person()
print(per1)
per1.sleep()
per1.eat()
# 一個類可以有多個對象
per2 = Person()
print(per2)
per2.eat()
4.對象的屬性
4.1對象屬性的聲明
class 類名:
??? ?def init(self):
??? ???? ?self.屬性名 = 初值
?? ???? ? self.屬性名2 = 初值2
class Person:
"""人類"""
"""
a.init方法是系統(tǒng)自帶的一個方法胡岔,這個方法不能直接調(diào)用法希,通過類創(chuàng)建對象的時候,系統(tǒng)會自動調(diào)用這個方法
init方法的作用是對對象屬性進行初始化
b.通過構(gòu)造方法創(chuàng)建對象的時候靶瘸,一定要保證苫亦,init方法中除了self外,其它的參數(shù)都必須有值
"""
def __init__(self, name1='', age1=0, sex1='男'):
# 在這個地方聲明對象的屬性
# print(name1)
# print('====')
# 在init方法中聲明對象的屬性
"""
name怨咪、age和sex就是Person這個類的對象屬性屋剑。類的對象屬性,需要通過對象來使用
"""
self.name = name1
self.age = age1
self.sex = sex1
if __name__ == '__main__':
# 注意:構(gòu)造方法中的參數(shù)诗眨,實質(zhì)是傳給init方法的參數(shù)
p1 = Person('xxx', 18)
# 通過對象使用對象屬性
print(p1.name, p1.age, p1.sex)
p2 = Person('駱浩', 33, '男')
print(p2.name, p2.age, p2.sex)
# 創(chuàng)建對象的時候可以不給屬性賦值
p3 = Person()
p4 = Person(sex1='女')
5.對象屬性的增刪改查
class Dog:
"""狗類"""
def __init__(self, age1=0, color1='yellow'):
self.age = age1
self.color = color1
5.1.查(獲取屬性)
"""
方法一:對象.屬性(如果屬性不存在唉匾,會報錯)
方法二:對象.__getattribute__(屬性名) 和 getattr(對象名, 屬性)
"""
print(dog1.age, dog1.color)
print(dog1.__getattribute__('age'))
print(getattr(dog1, 'age'))
# 如果設(shè)置了default的值,那么當(dāng)屬性不存在的時候不會報錯匠楚,并且返回默認值
print(getattr(dog1, 'abc', None))
5.2.改(修改屬性的值)
"""
方法一:對象.屬性 = 新值
方法二:對象.__setattr__(屬性名, 新值)和setattr(對象名, 屬性名, 新值)
"""
dog1.age = 4
print(dog1.age)
dog1.__setattr__('color', 'black')
print(dog1.color)
setattr(dog1, 'color', 'blue')
print(dog1.color)
5.3.增
"""
方法一:對象.屬性 = 值(屬性不存在巍膘,就是天津)
注意:屬性是添加給對象的,而不是類的
"""
dog1.name = '大黃'
print(dog1.name)
# dog2 = Dog()
# print(dog2.name)
dog1.__setattr__('type', '哈士奇')
print(dog1.type)
setattr(dog1, 'sex', '公')
print(dog1.sex)
5.4刪(刪除對象屬性)
"""
方法一:del 對象.屬性
方法二:__delattr__(屬性名)和delattr(對象名, 屬性名)
注意:只是刪除對象的屬性油啤,不會影響到類的其它對象
"""
del dog1.age
# print(dog1.age) # AttributeError: 'Dog' object has no attribute 'age'
dog1.__delattr__('sex')
# print(dog1.sex)
delattr(dog1, 'type')
# print(dog1.type)
練習(xí)
"""
練習(xí):聲明一個學(xué)生類典徘,擁有屬性:姓名、性別益咬、年齡逮诲。方法:學(xué)習(xí)
1.聲明學(xué)生類的對象,聲明的時候就給姓名幽告、性別和年齡賦值
2.通過三種方式分別獲取姓名梅鹦、性別和年齡,并且打印
3.給學(xué)生對象添加一個屬性冗锁,電話
4.修改學(xué)生的年齡
5.刪除學(xué)生的性別
"""
class Student():
def __init__(self, name='', sex='', age=0):
self.name = name
self.sex = sex
self.age = age
def study(self):
print('%s在學(xué)習(xí)中' % self.name)
stu1 = Student('xxx', '男', 18)
stu1.study()
print(stu1.name)
print(stu1.__getattribute__('sex'))
print(getattr(stu1, 'age'))
stu1.tel = '123'
print(getattr(stu1, 'tel'))
setattr(stu1, 'id', '111')
print(stu1.id)
stu1.age = 22
print(stu1.age)
setattr(stu1, 'id', '222')
print(stu1.id)
del stu1.sex
# delattr(stu1, 'sex')
6.slots魔法
功能:就是約束類中的對象屬性
class Person:
"""人類"""
# __slots__的功能:就是約束類中的對象屬性
__slots__ = ('name', 'age', 'sex', 'id')
def __init__(self, name='', age=0):
self.name = name
self.age = age
# self.tel = 123 # AttributeError: 'Person' object has no attribute 'tel'
# 自定義對象的打印格式
def __str__(self):
return 'name:%s age:%d address:0x%x' % (self.name, self.age, id(self))
if __name__ == '__main__':
p1 = Person('xx', 20)
# p1.names = 'aa' # AttributeError: 'Person' object has no attribute 'names'
# p1.sex = '男'
print(p1)
7.類中的方法
屬性:對象的屬性齐唆、類的屬性(字段)
對象屬性:屬于對象的,不同對象對應(yīng)的值可能不一樣(對象屬性通過對象來使用)
類的字段:聲明在類里面冻河,函數(shù)外面箍邮。類的屬性屬于類(類的字段,通過類來使用)
方法:對象的方法叨叙、類方法锭弊、靜態(tài)函數(shù)
對象方法:自帶一個self參數(shù),一般要通過對象去調(diào)用
類方法:1.使用@classmethod修飾
2.自帶一個cls參數(shù)擂错,并且這個參數(shù)不用傳參味滞,誰來調(diào)用cls就指向誰
3.類方法要通過類來調(diào)用
靜態(tài)函數(shù):1.使用@staticmethod修飾
2.沒有默認參數(shù)
3.靜態(tài)方法要通過類來調(diào)用
怎么選擇用對象方法、類方法、靜態(tài)方法剑鞍?
對象方法:如果實現(xiàn)函數(shù)的功能需要使用對象的屬性昨凡,就聲明成對象方法
類方法:如果實現(xiàn)函數(shù)的功能需要使用類的字段,或者調(diào)用類的方法蚁署,就聲明成類方法
靜態(tài)方法:如果實現(xiàn)函數(shù)功能即不需要對象屬性便脊,也不需要類的字段,就聲明成靜態(tài)方法
補充:ctr + r --> 查找替換
ctr + f --> 查找
class MyPerson:
"""人類"""
# number是類字段(人類的數(shù)量)
number = 0
def __init__(self, name='', age=0):
self.name = name
self.age = age
# eat方法是對象方法
def eat(self, food):
print('%s在吃%s' % (self.name, food))
@classmethod
def hurt_earth(cls):
# cls指向的是調(diào)用這個方法的類形用,使用cls可以當(dāng)成類來使用
pt = cls('張三') # 可以使用cls創(chuàng)建對象
print(pt.name)
print(pt.number) # 可以通過cls使用類的字段
print('人類破壞環(huán)境')
#protect_earth是一個靜態(tài)方法
@staticmethod
def protect_earth():
pt = MyPerson()
print(pt.number)
print('人類保護地球')
if __name__ == '__main__':
# 1.類的字段要用類來使用
print(MyPerson.number)
# 2.對象的屬性通過對象來使用
p1 = MyPerson('xxx', 18)
print(p1.name)
# 3.對象方法用對象調(diào)用
p1.eat('面條')
p2 = MyPerson('aaa')
p2.eat('火鍋')
# 4.類方法通過類來調(diào)用
MyPerson.hurt_earth()
# 5.靜態(tài)方法通過類來調(diào)用
MyPerson.protect_earth()