生成器(generator)和迭代器(iterator):
生成器: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ù)會戰(zhàn)一定的內(nèi)存空間储矩。
生成器存數(shù)據(jù)感耙,存的是產(chǎn)生數(shù)據(jù)的算法,沒有數(shù)據(jù)去占內(nèi)存空間
def fio(n):
pre_1 = 1
pre_2 = 1
for x in range(1, n):
if x == 1 or x == 2:
current = 1
yield current
continue
current = pre_1 + pre_2
pre_1, pre_2 = pre_2, current
yield current
fio = fio(10)
print(fio)
print(fio.__next__())
print(fio.__next__())
print(fio.__next__())
print(fio.__next__())
print(fio.__next__())
print(fio.__next__())
print(fio.__next__())
print(fio.__next__())
類和對象
1.什么是類:對擁有相同熟悉的方法的對象的封裝
2.什么是對象:對象就是類的實例
類的聲明:
class 類名(父類):
屬性
方法
class:python中聲明類的關(guān)鍵字
類名:駝峰式命名
():類要繼承的其他的類持隧,需要寫括號即硼,里面的內(nèi)容是父類的名字÷挪Γ可以省略
屬性:對象屬性和類的字段 -- 保存數(shù)據(jù)
方法:是指就是聲明在類中的函數(shù) -- 實現(xiàn)功能
對象屬性的增刪改查:
1.增:
對象.屬性 = 值(屬性不存在)
2.刪:
方法Ⅰ:del 對象.屬性
方法Ⅱ:對象.delattr('屬性名')
3.改:
方法Ⅰ:對象.屬性 = 新值
方法Ⅱ:對象.setattr(屬性名, 新值) 和 setattr(對象, 屬性名, 新值)
4.查:
方法Ⅰ:對象.屬性(如果屬性不存在只酥,會報錯)
print(p1.age)
方法Ⅱ:對象.getattribute('屬性名') 和 getattr(對象, 屬性名, 默認(rèn)值)
print(p1.getattribute('age'))
print(getattr(p1, 'age', '無名'))
slots魔法:
屬性:對象的屬性(屬性)、類的屬性(類的字段)
對象屬性:屬于對象的呀狼,不同對象對應(yīng)的值可能不一樣
類的字段:聲明在類里面裂允,函數(shù)外面。類的屬性屬于類(類的字段哥艇,通過類來使用)
方法:對象方法(方法)绝编、類方法、靜態(tài)函數(shù)
對象方法:自帶一個self參數(shù)貌踏,一般通過對象去調(diào)用
類方法:1.使用@classmethod來修飾
2.自帶一個cls參數(shù)十饥,并且這個參數(shù)不用傳參,誰來調(diào)用這個方法祖乳,cls就指向誰
3.類方法要通過類來調(diào)用
靜態(tài)方法:1.使用@staticmethod
2.沒有默認(rèn)參數(shù)
3.靜態(tài)方法通過類來調(diào)用
怎么選擇用對象方法逗堵、類方法、靜態(tài)方法
if 如果實現(xiàn)函數(shù)需要使用對象的屬性眷昆,就聲明成對象方法
elif 如果實現(xiàn)函數(shù)的功能需要使用類的字段或者調(diào)用類的方法蜒秤,就聲明成類方法
else 如果實現(xiàn)函數(shù)功能不需要使用對象的屬性也不需要類的字段汁咏,就聲明成靜態(tài)方法
class Person:
# number 是類的字段
number = 0
# 約束類中的對象的屬性即屬性只能在__slots__中選,可少不可多
__slots__ = ('name', 'age', 'sex')
"""
對象屬性的聲明:
class 類名:
def __init__(self):
self.屬性1 = 初值
self.屬性2 = 初值
init方法是系統(tǒng)自帶的一個方法作媚,這個方法不能直接調(diào)用梆暖,通過類創(chuàng)建對象的時候系統(tǒng)會自動調(diào)用這個方法
init方法的作用是對對象的屬性進(jìn)行初始化
通過構(gòu)造方法創(chuàng)建對象的時候,一定要保證掂骏,init方法除了self以外,其他的參數(shù)都必須有值
"""
def __init__(self, name, age):
# 在這個地方聲明對象的屬性
print('======')
print(name)
# 在init方法聲明對象的屬性
"""
name厚掷、age弟灼、sex就是Person這個類的對象屬性。類的對象屬性冒黑,徐婭通過對象來使用
"""
self.name = name
self.age = age
self.sex = 'Female'
# 自定義對象的打印格式
def __str__(self):
return self.name + ',' + str(self.age)
"""
對象方法默認(rèn)都有一個參數(shù)self田绑,在調(diào)用方法的時候,這個參數(shù)不用傳參(系統(tǒng)會自動給self傳參)
誰來調(diào)用這個方法抡爹,self就是誰
"""
# 聲明兩個對象方法掩驱,需要使用對象來調(diào)用
def eat(self):
print('Eating')
def sleep(self):
print('Sleeping, ??')
class Student:
def __init__(self, name='Rocky', sex='Female', age=18):
self.name = name
self.sex = sex
self.age = age
def study(self, subject):
print('I need to study ' + subject + ' to improve myself !')
@classmethod
def for_future(cls):
# cls指向的是調(diào)用這個方法的類,cls可以當(dāng)成類來使用
s = cls('張三')
print(s.sex)
print('good good study day day up')
@staticmethod
def for_a_better_life():
pass
class Class:
def __init__(self, name='', students=[]):
self.name = name
self.students = students
def add_student(self):
name = input('name:')
age = input('age:')
stu = Student(name, int(age))
self.students.append(stu)
class MathOperation:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def sub(a, b):
return a - b
@staticmethod
def mul(a, b):
return a * b
@staticmethod
def dev(a, b):
return a / b
if __name__ == '__main__':
# print(Person.number)
# # # 構(gòu)造方法中的參數(shù)實質(zhì)是傳給init方法的參數(shù)
# p1 = Person('Ye Hao', 18)
# print(p1)
# # print('======')
#
# Student.for_future()
# s1 = Student()
# # 獲取姓名冬竟、性別欧穴、年齡
# print('方式1:')
# print(s1.name, s1.sex, s1.age)
# print('方式2:')
# print(s1.__getattribute__('name'), s1.__getattribute__('sex'), s1.__getattribute__('age'))
# print(getattr(s1, 'name'), getattr(s1, 'sex'), getattr(s1, 'age'))
# # 添加屬性
# s1.__setattr__('tel', '13245678910')
# print(s1.tel)
# # 修改學(xué)生年齡
# s1.age = 22
# print(s1.age)
# # 刪除學(xué)生性別
# del s1.sex
# # print(s1.sex)
# s1.study('math')
pass