recode
1.迭代器和生成器
迭代器,獲取數(shù)據(jù):next(迭代器),for循環(huán)遍歷;數(shù)據(jù)來(lái)源:轉(zhuǎn)換,生成器
生成器:就是迭代器,
"""
def 函數(shù)名():
yield 值
生成式:
(表達(dá)式 for 變量 in 序列 if 條件語(yǔ)句)
"""
# 補(bǔ)充:三目運(yùn)算符
"""
C語(yǔ)言中的三目運(yùn)算符:表達(dá)式?值1:zhi2 -- 判斷表達(dá)式的值是否為真,如果是整個(gè)運(yùn)算的結(jié)果是值1,否則是值2
python的三目運(yùn)算操作:值1 if 表達(dá)式 else 值2
"""
num = 10
result = '偶數(shù)' if num % 2 == 0 else '奇數(shù)'
print(result)
2.模塊
- 模塊就是py文件
- import 模塊名
- 倒入模塊中所有的內(nèi)容
from math import *
if __name__ == '__main__':
pass
`
包/庫(kù)就是文件夾
# 3.異常處理
```python
"""
try:
需要捕獲的異常的代碼段
except:
出現(xiàn)異常后對(duì)異常的處理代碼段
finally:
不管try后的代碼是否異常,異常是否被捕獲第都執(zhí)行代碼
"""
類(lèi)和對(duì)象
1.什么是類(lèi),什么是對(duì)象
"""
1)官方定義:類(lèi)就是擁有相同功能和相同屬性的對(duì)象的集合 -- 抽象
對(duì)象就是類(lèi)的實(shí)例 -- 具體
2)生活角度看類(lèi)和對(duì)象
如果人是類(lèi),余婷就是對(duì)象,駱昊也是對(duì)象
如果電腦是類(lèi),對(duì)象就是具體到一臺(tái)電腦,比如我桌子上的電腦
"""
2.類(lèi)的聲明
"""
1)語(yǔ)法
class 類(lèi)名:
類(lèi)的內(nèi)容
2)說(shuō)明
class - 固定寫(xiě)法聲明類(lèi)的關(guān)鍵字
類(lèi)名 - 標(biāo)識(shí)符,不能是關(guān)鍵字,
見(jiàn)名知意,才用駝峰式命名(通過(guò)單詞首字母大寫(xiě)的方式來(lái)區(qū)分不同的單詞),首字母大寫(xiě)
: - 固定寫(xiě)法
類(lèi)的內(nèi)容 - 主要包含:類(lèi)的說(shuō)明文檔,類(lèi)的屬性(普通的變量),類(lèi)的功能(函數(shù):寫(xiě)在類(lèi)里面也叫方法)
"""
3.對(duì)象怎么聲明
"""
對(duì)象 = 類(lèi)() - 創(chuàng)建指定的類(lèi)對(duì)應(yīng)的對(duì)象
"""
4.類(lèi)中的方法
"""
1)什么是方法:聲明在類(lèi)中的函數(shù)就叫方法
2)類(lèi)中的方法有三種:對(duì)象方法,類(lèi)方法,靜態(tài)方法
a.對(duì)象方法:直接聲明在類(lèi)中的函數(shù)
有默認(rèn)參數(shù)self,通過(guò)對(duì)象調(diào)用的時(shí)候這個(gè)參數(shù)不用傳參,因?yàn)橄到y(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳遞給self
(self,當(dāng)前對(duì)象 - 誰(shuí)調(diào)用self就指向誰(shuí),當(dāng)前類(lèi)的對(duì)象嫩做的事情self都能做)
通過(guò)類(lèi)的對(duì)象來(lái)調(diào)用: 對(duì)象.對(duì)象方法()
b.類(lèi)方法: 聲明函數(shù)前加@classmethod
有默認(rèn)參數(shù)cls,通過(guò)類(lèi)調(diào)用的時(shí)候這個(gè)參數(shù)不用傳參
(cls,當(dāng)前類(lèi) - 誰(shuí)調(diào)用就指向誰(shuí))
通過(guò)類(lèi)來(lái)調(diào)用:類(lèi).類(lèi)方法
c.靜態(tài)方法: 聲明函數(shù)前加@staticmethod
沒(méi)有默認(rèn)參數(shù)
通過(guò)類(lèi)來(lái)調(diào)用:類(lèi).靜態(tài)方法
"""
# 聲明一個(gè)Person類(lèi)
class Person:
"""說(shuō)明文檔"""
# =======屬性=======
# =======方法=======
def eat(self, food):
# self = p1 food = '串串'
print(p1, self) # 打印 p1 和 self 的 內(nèi)存地址
print('吃'+food)
self.study('python')
def study(self, type1):
print('學(xué)習(xí)', type1)
# ==============類(lèi)方法============
@classmethod
def destroy(cls):
tp = cls
print('人類(lèi)破壞環(huán)境')
print('cls:', cls)
print('tp:', tp)
# ==============靜態(tài)方法============
@staticmethod
def beat_animal():
print('喜歡貓')
# 創(chuàng)建Person類(lèi)的對(duì)象p1
p1 = Person()
p1.eat('串串')
p1.study('數(shù)學(xué)')
Person.destroy()
print(Person)
Person.beat_animal()
常識(shí):
1.什么是init方法
init是類(lèi)名默認(rèn)繼承的一個(gè)魔法方法,用來(lái)初始化類(lèi); 本質(zhì)是對(duì)象方法,但是會(huì)不需要程序員自己調(diào)用,會(huì)被自動(dòng)調(diào)用
通過(guò)類(lèi)創(chuàng)建對(duì)象的時(shí)候(通過(guò)構(gòu)造方法創(chuàng)建對(duì)象),系統(tǒng)會(huì)自動(dòng)調(diào)用類(lèi)中的init方法,并且構(gòu)造方法中單實(shí)參會(huì)全部傳給init方法
創(chuàng)建對(duì)象的時(shí)候需不需要參數(shù),需要幾個(gè)參數(shù),看這個(gè)類(lèi)的init方法
(了解)聲明類(lèi)的時(shí)候系統(tǒng)會(huì)自動(dòng)給我們創(chuàng)建一個(gè)函數(shù),這個(gè)函數(shù)的函數(shù)名和聲明的類(lèi)的類(lèi)名一樣,這個(gè)函數(shù)叫構(gòu)造方法.
函數(shù)中會(huì)先在內(nèi)存中開(kāi)辟空間創(chuàng)建對(duì)象,然后用創(chuàng)建的對(duì)象去調(diào)用類(lèi)的init方法,最后才將對(duì)象返回
class Person:
def __init__(self):
print('init方法')
p1 = Person() # 開(kāi)辟
類(lèi)的屬性
1.屬性
"""
類(lèi)中的屬性分為:對(duì)象屬性和字段
1) 字段 : 直接聲明在類(lèi)中的變量就是字段 ; 字段要通過(guò)'類(lèi).字段'的方式來(lái)使用;
當(dāng)屬性的值不會(huì)因?yàn)閷?duì)象不同而不同,這種屬性就可以聲明成類(lèi)的字段
2)對(duì)象屬性 : 必須聲明在__init__方法中以'self.屬性 = 值'的形式聲明;
通過(guò)對(duì)象要通過(guò)'對(duì)象.屬性'的方式來(lái)使用
當(dāng)屬性的值會(huì)因?yàn)閷?duì)象不同而不同,使用對(duì)象屬性
"""
class Dog:
"""狗"""
# =========字段=========
numbers = 10
# =======對(duì)象屬性=======
def __init__(self, name1, color1='黑色', gender1='公'):
self.name = name1
self.color = color1
self.gender = gender1
self.age = 0
print(Dog.numbers)
dog1 = Dog('黃狗')
print(dog1.age, dog1.color, dog1.gender)
# 寫(xiě)一個(gè)矩形類(lèi),有屬性:長(zhǎng)和寬 方法:求面積,求周長(zhǎng)
class Rectangle:
def __init__(self, long: int, width: int):
self.long = long
self.width = width
def rect(self):
s = self.long*self.width
l = (self.long+self.width)*2
return s, l
p2 = Rectangle(2, 2)
print(p2.rect())
# 聲明一個(gè)學(xué)生類(lèi),擁有屬性:名字,電話.年齡,學(xué)號(hào).擁有功能:學(xué)習(xí)(打印XX在學(xué)XX),打游戲
class Student:
def __init__(self, names, telephone, ages, numbers):
self.name = names
self.tpl =telephone
self.age = ages
self.num = numbers
def study(self, subject='英語(yǔ)'):
print(self.name+'在學(xué)'+subject)
p1 = Student('王子', 123, 12, '001')
p1.study('數(shù)學(xué)')
2.聲明類(lèi)的時(shí)候方法的選擇
"""
1.對(duì)象方法:實(shí)現(xiàn)函數(shù)功能需要用到對(duì)象屬性的時(shí)候,就使用對(duì)用方法
2.類(lèi)方法:實(shí)現(xiàn)函數(shù)功能不需要對(duì)象屬性,但是需要類(lèi)的相關(guān)的操作,就使用類(lèi)方法
3.靜態(tài)方法:實(shí)現(xiàn)函數(shù)的功能既不需要對(duì)象屬性,也不需要類(lèi)相關(guān)的操作,就使用靜態(tài)方法
"""
對(duì)象屬性相關(guān)
python中的對(duì)象屬性支持增,刪,改,查
!!!注意:對(duì)象屬性的增刪改查只針對(duì)單個(gè)對(duì)象
class Dog:
def __init__(self, name):
self.name = name
self.age = 0
dog1 = Dog('大黃')
dog2 = Dog('才才')
1.查
"""
a.對(duì)象.屬性 - 獲取指定屬性對(duì)應(yīng)的值,如果屬性不存在會(huì)報(bào)錯(cuò)
b.getattr(對(duì)象, 屬性名, 默認(rèn)值) - 獲取指定對(duì)象指定屬性對(duì)應(yīng)的值;
當(dāng)屬性不存在有默認(rèn)值的時(shí)候不報(bào)錯(cuò),返回默認(rèn)值.沒(méi)有默認(rèn)值的時(shí)候報(bào)錯(cuò)
"""
print(dog1.name)
print(getattr(dog1, 'name2', 100))
2.增,改
"""
a.對(duì)象.屬性 = 值 - 當(dāng)屬性不存在就添加屬性,當(dāng)屬性存在修改屬性的值
b.setattr(對(duì)象,屬性名,值) - 當(dāng)屬性不存在就添加屬性,當(dāng)屬性存在修改屬性的值
"""
# a.
dog1.gender = '公'
print(dog1.gender)
dog1.name = '貝貝'
print(dog1.name)
# b.
setattr(dog1, 'category', '二哈')
a_name = 'color'
setattr(dog1, a_name, '白色')
print(dog1.category, dog1.color)
3.刪除
"""
a.del 對(duì)象.屬性
b.delattr(對(duì)象,屬性名)
"""
del dog1.name
# print(dog1.name) #AttributeError:
delattr(dog1, 'age')
# print(dog1.'age') #AttributeError:
Day14_recode
1.類(lèi)的聲明
類(lèi)是擁有相同屬性和相同功能的對(duì)象的集合
"""
class 類(lèi)名:
類(lèi)的內(nèi)容
"""
2.創(chuàng)建對(duì)象
對(duì)象 = 類(lèi)()
3.(重點(diǎn)!)類(lèi)中的內(nèi)容:對(duì)象方法.類(lèi)方法,靜態(tài)方法;字段,對(duì)象屬性
"""
1)方法 - 怎么聲明,特點(diǎn),怎么調(diào)用,什么時(shí)候用
對(duì)象方法:直接聲明在類(lèi)中的函數(shù);
有默認(rèn)參數(shù)self;
通過(guò)對(duì)象調(diào)用;
實(shí)現(xiàn)功能需要用到對(duì)象屬性的時(shí)候
類(lèi)方法:聲明前加@classmethod;
有默認(rèn)參數(shù)cls;
通過(guò)類(lèi)調(diào)用;
實(shí)現(xiàn)函數(shù)功能在不需要對(duì)象屬性,需要類(lèi)相關(guān)操作的時(shí)候
靜態(tài)方法:聲明前加@staticmethod,
沒(méi)有默認(rèn)參數(shù),和普通函數(shù)差不多;
通過(guò)類(lèi)調(diào)用;
既不需要對(duì)象屬性,也不需要對(duì)象操作
2)屬性 - 怎么聲明,怎么使用,什么時(shí)候用
字段:聲明在類(lèi)里面,函數(shù)外面;
通過(guò)類(lèi)來(lái)使用
不會(huì)因?yàn)閷?duì)象不同而不同的屬性聲明成字段
對(duì)象屬性:以'self.屬性 = 值'的形式聲明在__init__方法中;
通過(guò)對(duì)象使用
會(huì)因?yàn)閷?duì)象不同而不同的屬性聲明成字段
"""
4.對(duì)象屬性的增刪改查
"""
1)查
對(duì)象.屬性 - 沒(méi)對(duì)應(yīng)屬性會(huì)報(bào)錯(cuò)
getattr(對(duì)象,屬性,默認(rèn)值) - 當(dāng)沒(méi)有對(duì)應(yīng)屬性的時(shí)候返回默認(rèn)值
2)增改
對(duì)象.屬性 = 值
setattr(對(duì)象,屬性,值)
3)刪
del 對(duì)象.屬性
delattr(對(duì)象,屬性)
"""
內(nèi)置類(lèi)屬性
1.內(nèi)置類(lèi)屬性
創(chuàng)建類(lèi)的時(shí)候,系統(tǒng)默認(rèn)為我們添加的類(lèi)的屬性
class Person:
"""人類(lèi)"""
# 類(lèi)的字段
number = 61
# 對(duì)象屬性
def __init__(self, name, age=0, gender='女'):
self.name = name
self.age = age
self.gender = gender
def object_func(self):
print('對(duì)象方法:'+self.name)
@classmethod
def class_func(cls):
print('類(lèi)方法:', cls.number)
@staticmethod
def static_func():
print('靜態(tài)方法:')
# 系統(tǒng)自帶的魔法方法,可以定制當(dāng)前類(lèi)的對(duì)象的打印內(nèi)容.實(shí)現(xiàn)這個(gè)函數(shù)的時(shí)候要求有一個(gè)字符串類(lèi)型的返回值
# 影響單獨(dú)打印對(duì)象的效果
def __str__(self):
# return str(self.__dict__)[1:-1]
return 'abc'
# 對(duì)象作為元素的時(shí)候的打印效果
def __repr__(self):
return str(self.__dict__)
# return '132'
p1 = Person('小明', 18, '男')
p2 = Person('小花', 19, '女')
# 1.__name__ 字段
"""
類(lèi).__name__ - 獲取類(lèi)的名字
"""
print(Person)
print(Person.__name__, type(Person.__name__))
# 2.__doc__ 字段
"""
類(lèi).__doc__ - 獲取類(lèi)的說(shuō)明文檔
"""
print(Person.__doc__)
# 3.__class__ 對(duì)象屬性
"""
對(duì)象.__class__ - 獲取對(duì)象對(duì)應(yīng)的類(lèi)(你這個(gè)對(duì)象是那個(gè)類(lèi)的對(duì)象)
"""
print(p1.__class__)
# 4.__dict__ 字段和對(duì)象屬性都可以
"""
類(lèi).__dict__ - 獲取類(lèi)中所有的字段和對(duì)應(yīng)的值以字典返回
對(duì)象.__dict__ - 獲取對(duì)象中所有的對(duì)象屬性和對(duì)應(yīng)的值以字典返回
"""
print(Person.__dict__)
print(p1.__dict__)
# 5.__module__ 字段
"""
類(lèi).__module__ - 獲取指定類(lèi)聲明在那個(gè)模塊中,返回模塊名(獲取所在模塊的__name__的屬性的值)
"""
print(Person.__module__)
# 6.__bases__ 字段
"""
lei.__bases__ - 返回當(dāng)前類(lèi)所有的父類(lèi)
"""
print(Person.__bases__)
print('p1', p1)
print([p1, p2, Person('小紅')])
2.slots魔法
**與dict沖突使用時(shí)注意
"""
可以通過(guò)給__slots__字段賦值約束當(dāng)前類(lèi)有那些對(duì)象屬性,只約束增加不約束刪除
當(dāng)在類(lèi)中給__slots__賦值后,當(dāng)前類(lèi)的對(duì)象的__dict__屬性無(wú)效
"""
class Dog:
__slots__ = ('name', 'age')
def __init__(self, name, age=0):
self.name = name
self.age = age
dog = Dog('大黃')
# dog.name1 = '小白'
# print(dog.__dict__)
屬性保護(hù)和私有化
"""
1.高級(jí)語(yǔ)言
在很多的高級(jí)面對(duì)對(duì)象語(yǔ)音中,會(huì)將屬性和方法分為
a.公開(kāi)的(在類(lèi)的外部可以使用),
b.私有的(只能在類(lèi)的內(nèi)部使用,不能被繼承),
c.受保護(hù)(只能在類(lèi)的內(nèi)部使用,可以被繼承)
2.python
python中類(lèi)的內(nèi)容本質(zhì)上全部都是公開(kāi)的.私有和公開(kāi)都只是約到
1)私有化 - a.內(nèi)容只能在類(lèi)的內(nèi)部使用,不能在外面使用.(效果)
b.在類(lèi)中的方法名或者屬性名前加'__'那么對(duì)于的屬性和方法就會(huì)變成私有的(怎么私有化)
c.當(dāng)聲明類(lèi)的時(shí)候在名字前加'__',內(nèi)部會(huì)在這個(gè)基礎(chǔ)上下再加'_類(lèi)名' (私有化的本質(zhì))
2)屬性保護(hù) - 可通過(guò)在對(duì)象屬性名前'_',吧這個(gè)屬性標(biāo)記成受保護(hù)類(lèi)型;為了告訴別人這個(gè)屬性在使用的時(shí)候,
不要直接用,而是通過(guò)getter和setter來(lái)使用 (怎么保護(hù))
a.getter - 獲取對(duì)象屬性值之前想要干點(diǎn)別的事情,那么就給這個(gè)屬性添加getter
第一步:在對(duì)應(yīng)的屬性名前加'_'
第二步:在@property聲明一個(gè)函數(shù),這個(gè)函數(shù)沒(méi)有參數(shù),有一個(gè)返回值,并且函數(shù)名是屬性名去掉'_'
第三步:獲取屬性值的時(shí)候,通過(guò)對(duì)象.屬性名去掉下劃線去獲取屬性的值
b.setter - 給屬性賦值前干點(diǎn)別的事情,就給這個(gè)屬性添加setter.(想要添加setter必須先有g(shù)etter)
第一步:在對(duì)應(yīng)的屬性名前加'_'
第二步:在@getter名.setter后面聲明一個(gè)函數(shù),這個(gè)函數(shù)需要一個(gè)參數(shù),沒(méi)有返回值,并且函數(shù)名是屬性去掉'_'
第三步:給屬性賦值的時(shí)候,,通過(guò)'對(duì)象.屬性名去掉下劃線 = 值'去賦值
3.拋出異常:
a.語(yǔ)法
raise 異常類(lèi)型
b.說(shuō)明:
raise - 關(guān)鍵字
異常類(lèi)型 - 可以是系統(tǒng)提供的異常類(lèi)型,也可以是自定義的異常類(lèi)型(必須繼承Exception)
4.自定義異常類(lèi)型:寫(xiě)一個(gè)類(lèi)繼承Exception,然后重寫(xiě)str方法來(lái)自定義錯(cuò)誤信息.
"""
class WeekValueError(Exception):
def __str__(self):
return '星期的值只能是1-7的整數(shù)'
class AgeError(Exception):
def __str__(self):
return '年齡要求是整數(shù)并且只能在0-150之間'
# raise WeekValueError
# =============保護(hù)=============
class Person1:
def __init__(self):
self._age = 0
self._week = 6
@property
def week(self):
weeks = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
return weeks[self._week-1]
@week.setter
def week(self, x):
if not isinstance(x, int):
raise ValueError
elif not 1 <= x <= 7:
raise ValueError
self._week = x
@property
def age(self):
if self._age < 18:
return str(self._age)+'歲', '未成年'
else:
return str(self._age)+'歲', '成年'
@age.setter
def age(self, x):
if not isinstance(x, int):
raise AgeError
elif not 150 >= x >= 0:
raise AgeError
self._age = x
p1 = Person1()
p1.age = 16
print(p1.age)
# p1.age = 'abc'
print(p1.week)
p1.week = 4 # 本質(zhì)是在調(diào)用setter
print(p1.week) # 本質(zhì)實(shí)在調(diào)用getter
# 練習(xí):給age屬性添加getter和 setter,獲取年齡的時(shí)候拿到年齡值,和這個(gè)年齡對(duì)應(yīng)的階段;
# 給age賦值的時(shí)候,必須是整數(shù),并且范圍在0-150.如果不滿女主要求求報(bào)錯(cuò)AgeError,并且定義提示信息
# =============私有化===========
class Person:
def __init__(self, name, age=0):
self.name = name
self.__age = age
def message(self):
print(self.__age)
p = Person('小明')
print(p.name)
# print(p.__age)
p.message()
繼承
1.什么是繼承:讓子類(lèi)直接擁有父類(lèi)的所有的屬性和方法
父類(lèi) - 被繼承中,子類(lèi) - 繼承者
python所有的類(lèi)都是直接或者間接繼承object
2.怎么繼承
"""
class 子類(lèi)(父類(lèi)列表):
類(lèi)的內(nèi)容
"""
3.子類(lèi)添加內(nèi)容
1)字段和方法,直接添加
2)對(duì)象屬性的添加