???????我們在前面的學習中學會了一個叫type()的函數(shù),用它來判斷變量的類型,變量和它當下存儲的數(shù)據(jù)綁定在一起。例如
a = [4,5,6,7]
print(type(a))
輸出<class 'list'>
a = range(10,20,2)
print(type(a))
輸出<class 'range'>
a = True?
print(type(a))
輸出<class 'bool'>
a = {‘a(chǎn)54’:56}
print(type(a))
輸出<class 'dict'>
a = {‘a(chǎn)54’,56}
print(type(a))
輸出<class ‘set'>
a = ‘tyuio’
print(type(a))
輸出<class 'str'>
a = 2
print(type(a))
輸出 <class 'int'>
????????我們發(fā)現(xiàn):就連最基本數(shù)字、字符都是以class類的形式出現(xiàn),實際上python 是在類的思想指導下開發(fā)的,python不僅用類定義了基本的數(shù)據(jù)類型,還向用戶開放了定義類的權(quán)力,讓用戶根據(jù)自己的數(shù)據(jù)和編程動機定義自己的類。
?????如何定義類?類又有哪些作用?讓我們從一段簡單的代碼開始逐步了解類:
新建一個clstest.py的文件,編寫以下代碼
1 ? class Tieban: ? ? ? ? ? ? #注意類名的首字母需大寫
2 ? ? ? def __init__(self,tezheng1,tezheng2):
3 ? ? ? ? ? self.tezheng1 = tezheng1? # 第一個屬性
4 ? ? ? ? ? self.tezheng2 = tezheng2? # 第二個屬性
5 ? ? ? def xianshi(self):
6 ? ? ? ? ? print(self.tezheng1,self.tezheng2)
7 ? ? ? ? ? print('你的材料已準備')
新建一個clsuse.py? 的文件,編寫以下代碼并執(zhí)行
8 from clstest? import Tieban
9 ? a = input('鐵板長:')
10 ? b = input('鐵板寬:')
11? gaizi? =Tieban(a,b)? # 構(gòu)建一個對象
12? gaizi.xianshi()
運行clsuse.py文件后輸出:
鐵板長:33
鐵板寬:44
33 44
你的材料已準備
解釋上訴代碼:第1行,聲明一個叫Tieban(鐵板)的類
????????????????????????第2,3,4行,是一個構(gòu)造函數(shù), __init__是構(gòu)造函數(shù)統(tǒng)一的函數(shù)名,函數(shù)的 ? ? ? ? ? ? 參數(shù)是self 及其它的參數(shù),上例中給出了tezheng1(特征)和tezheng2兩個參數(shù),3、4行在函數(shù)體內(nèi)進一步將實例參數(shù)指向構(gòu)造參數(shù),self.tezheng1表示這個類被使用時的實例參數(shù),它指向,tezheng1這個構(gòu)造參數(shù)。
???????????????????????第5,6,7行定義了一個實例方法,方法名xianshi(顯示),6,7行是該實例方法的具體操作:打印兩個實例變量,答應(yīng)一段提示‘你的材料已準備’
????????????????????????以上7行代碼完成了類Tieban 的定義,說明了類定義的基本結(jié)構(gòu):
?????????????????????????????類聲明:
???????????????????????????????????構(gòu)造函數(shù)
???????????????????????????????????方法函數(shù)
????????????????????????規(guī)范的類的定義是放在一個單獨的文件中。
??????????????????????在clsuse.py文件中
????????????????????????第8行 from clstest? import Tieban是從clstest文件中導入Tieban 類
????????????????????????第9,10行讓用戶輸入兩個數(shù)
????????????????????????第11 行用變量gaizi 實例化了類Tieban,并將剛剛錄入的a ,b 的值賦值給gaizi 這個類實例
?????????????????????????第12行調(diào)用了實例gaizi的實例方法gaizi.xianshi.(實例名gaizi替換了定義時的slef)。
???????????????????關(guān)于類的知識點比較多,初學者理解也有一定的難度。上例是一個特別簡單例子
為的是讓初學者掌握類定義,類實例化的大概語句組織輪廓。
???????類的基本知識點由以下幾部分組成:
????????1、類的聲明。(。)
????????2,類屬性和類變量,
????????3,構(gòu)造函數(shù)。--init– 是構(gòu)造函數(shù)的專有符號。
????????4、類方法。
????????5、 實例方法
????????6、類的實例化
????????7、實例中調(diào)用方法
??????????有時類名后會用一個括號說明該類的父類,本文僅作入門只用,子類父類以及繼承多態(tài)的知識請讀者在掌握基本的知識之后進階學習,這方面的資料很多
??????通過以下學生的例程,理解掌握《類和實例關(guān)系對照表》中3對關(guān)系


??????在使用用戶類的時候與python 基礎(chǔ)類的時候的異同點:python幾乎所有的編程要素都是建立在類的基礎(chǔ)上的,但面對具體問題時,用戶需要自己設(shè)計類來優(yōu)化編程效率并使程序規(guī)范更容易閱讀,更容易復用。
函數(shù)
???????我們在上面的兩個小例子中已經(jīng)使用了函數(shù)的概念,接下來展開介紹函數(shù)的基礎(chǔ)知識
在面向過程的編程時代,函數(shù)是編程的主題。但隨著編程思想的發(fā)展,類的思想成為主流。但函數(shù)作為一種代碼封裝工具,依然有重要的作用。
???????函數(shù)也是語句的封裝,給一堆代碼起一個名字,以便于用它來解決許多相似問題。
???????python 有很多的內(nèi)置函數(shù):下表是網(wǎng)上搜集的最常用的68個內(nèi)置函數(shù)
abs() ? ? ? ? ? dict()? ? ? ? help() ? ? ? ? min() ? ? ? ? setattr()
all() ? ? ? ? ? dir() ? ? ? ? hex()? ? ? ? ? next()? ? ? ? slice()?
any() ? ? ? ? ? divmod()? ? ? id() ? ? ? ? ? object()? ? ? sorted()?
ascii() ? ? ? ? enumerate() ? input()? ? ? ? oct() ? ? ? ? staticmethod()?
bin() ? ? ? ? ? eval()? ? ? ? int()? ? ? ? ? open()? ? ? ? str()?
bool()? ? ? ? ? exec()? ? ? ? isinstance() ? ord() ? ? ? ? sum()?
bytearray() ? ? ?lter() ? ? ? issubclass() ? pow() ? ? ? ? super()?
bytes() ? ? ? ? ?oat()? ? ? ? iter() ? ? ? ? print() ? ? ? tuple()?
callable()? ? ? format()? ? ? len()? ? ? ? ? property()? ? type()?
chr() ? ? ? ? ? frozenset() ? list() ? ? ? ? range() ? ? ? vars()?
classmethod() ? getattr() ? ? locals() ? ? ? repr()? ? ? ? zip()?
compile() ? ? ? globals() ? ? map()? ? ? ? ? reversed()? ? __import__()?
complex() ? ? ? hasattr() ? ? max()? ? ? ? ? round()?
delattr() ? ? ? hash()? ? ? ? memoryview() ? set() reduce()
-----------------------------------
68 個 Python 內(nèi)置函數(shù)詳解
https://blog.51cto.com/u_11949039/5060113
內(nèi)置函數(shù)功能學習
? ? 這些內(nèi)置函數(shù)可以解決很多遇到的問題,只有當內(nèi)置函數(shù)及其組合方案無法解決是才有必要自己造輪子。當然學習和練習時除外。所以內(nèi)置函數(shù)的學習目標是:了解內(nèi)置函數(shù),在遇到問題時,知道有相應(yīng)的函數(shù)實現(xiàn)了這個功能,而不必自己編寫代碼實現(xiàn)就夠了。
??????其實在說到設(shè)計函數(shù)時,尤其是在復習這部分知識,我希望把自己定位到一位初學者,舉一些既簡單,又有代表性的而且還有趣的例子,為了節(jié)省時間,又增加有趣性,我打算在函數(shù)方面借助codex來生成例程,codex 給出的例程要好過我自己設(shè)計的,但對函數(shù)的要求,以及通過例子要練習和掌握哪些函數(shù)方面的知識,則有我來把控。
??????要求:當給定一個列表,去除其中最大的兩個數(shù)和最小的兩個數(shù)
??????codex:
def remove_ends(lst):
????lst.sort()
????return lst[2:-2]
a = [1,2,3,4,5,6,7,8,9,]
print(remove_ends(a))??
????這段代碼,巧妙的使用了一次排序和一次切片解決問題
????但是你可以在網(wǎng)絡(luò)上找到很多好的函數(shù)的例程。設(shè)計類比設(shè)計函數(shù)要復雜的多,這需要結(jié)合實際的計算需求。我希望初學者一開始就把學習的注意力轉(zhuǎn)移到數(shù)據(jù)類型和創(chuàng)建類方面,好的數(shù)據(jù)構(gòu)造,強過處理它的細節(jié),所以關(guān)于函數(shù)的知識在本文中會盡量基礎(chǔ),盡量簡短,盡可能的把精力和篇幅放到類的研究上。
??????def 是創(chuàng)建函數(shù)的標識符,??
def? 函數(shù)名(參數(shù))
????語句和操作
????return? 返回計算結(jié)果給調(diào)用語句(return 語句可以有不同分支,分情況返回不同的結(jié)果
????????????????????????????????????????????????????????????但只要一條return語句被執(zhí)行,函數(shù)就結(jié)束
? ? ? ? return 可以返回任何變量(包括全局變量和局部變量)任何數(shù)據(jù),可以給出參數(shù),也可以沒有參數(shù);在不需要返回任何值時也可以直接用return 返回空值(None)從而結(jié)束函數(shù)執(zhí)行。有時不需要返回時,return 寫不寫都可以,沒有return的函數(shù)也很常見。
def add(a,b):
????????c = a + b
?????????return c ? ? ? #當調(diào)用add函數(shù)時,將相加結(jié)果c 的值返回
m = add(3,4) ? ? ? ? #調(diào)用add(),3,4傳入?yún)?shù)a,b?
print(m)
print(add(10,20))
輸出:7 ,30
???????return 語句做什么,全在于你的設(shè)計,我們來看一個返回值和函數(shù)體毛關(guān)系沒有的例子
def fuuck(a,b,c):
????m = a
????a = b
????b = c
????c = m
????return '今天是個好日子,大把的鈔票送給你'
print(fuuck(2,4,8))
輸出 今天是個好日子,大把的鈔票送給你
????我們發(fā)現(xiàn),return 和我們的參數(shù),和其他語句做的事情風牛馬不相及。我僅僅是恭喜你發(fā)財而已。
?????再來看看return選擇輸出的例子
def kaoshi():
???a = input('你這次考試成績?:')
???a = int(a)
???if a<60:
????????return '你個渣渣'
???elif a<=100:
????????return '還不錯'
???else:
????????return '吹牛B'
print(kaoshi())
??????我們發(fā)現(xiàn)在上例中,3個return語句根據(jù)你輸入的情況選擇執(zhí)行。
???????沒有return 的情況
def ppt(a,b):
????print('a的取值是:%s,b的取值是:%s'%(a,b))
c = '差不多'
d = '還可以'
ppt(c,d)
輸出:a的取值是:差不多,b的取值是:還可以
??????了解了函數(shù)的輸出,我們回過頭來學習函數(shù)參數(shù)的知識:
??????什么是函數(shù)的參數(shù)?對于一個求和函數(shù)來講,如上例add(a,b)中的a,b就是add 的參數(shù),要求兩個數(shù)求和,就必須在調(diào)用時給出兩個數(shù)3,4,而函數(shù)在設(shè)計時準備用于接受3,4的a,b就叫add(a,b) 的參數(shù),參數(shù)一般寫在函數(shù)名后的括號里。
????a,b 也叫形式參數(shù):形參,3,4 也叫實際參數(shù):實參,一般情況要保持個數(shù)一致,順序一致。形參和實參的關(guān)系就好比席位和客人的關(guān)系,有幾位客人,就準備幾個席位。
????除了形參和實參一一對應(yīng)的情況,還有許多特殊的情況:
1、默認參數(shù):add2(a=1,b=2,c=3),在設(shè)計函數(shù)時給形參一個值,在調(diào)用的時候可以由調(diào)用語句修改這個參數(shù),也可以不修改,不修改時,函數(shù)運行中變量取默認值,range函數(shù)就是典型的代表,它的初始值和步長有默認值0和1
????.默認參數(shù)的例子
def lilu(a,n=1,l=0.04):
????shouyi = a*n*l
????print('您%s元%s年存款的收益是:%s元'%(a,n,shouyi))
print(lilu(1000)) ? ? ? ? ? ? ? ? ? ? ? #這時使年限和利率l保持默認值
print(lilu(1000,3,0.05))? ? ? ? ? ? #這時修改為3年,利率調(diào)整為0.05
print(lilu(1000))?
輸出
您1000元1年存款的收益是:40.0元
None
您1000元3年存款的收益是:150.0元
None
您1000元1年存款的收益是:40.0元? ? ? 默認參數(shù)被修改后再次調(diào)用時還原成默認值
None
????????默認參數(shù)必須指向不可變對象,結(jié)合基礎(chǔ)數(shù)據(jù)類型中的不可變類型知識理解這一規(guī)則。
?2、可變參數(shù),不定參數(shù)
def biancanhansu(a, *bian):
????print(a)
????print(bian)
biancanhansu(1, 2, 3, 4,8)
輸出1
(2, 3, 4, 8)
?????上例中*bian是一個可變參數(shù),用一個*標識可變參數(shù),意味著我不確定有幾個元素,在調(diào)用函數(shù)時,先給固定參數(shù)分配數(shù)據(jù),沒用完的數(shù)據(jù)作為一個元組整體傳給可變參數(shù)bian
3,關(guān)鍵字參數(shù)
def a(**guanjian):
????print(guanjian)
a(x=1,y=2,z=3)
輸出
{'x': 1, 'y': 2, 'z': 3}
??????關(guān)鍵字參數(shù)在定義時用兩個星號**標識,在傳遞實參時是以(key1 = value1,key2 = value2,key3 = value3)的形式成對(等號兩邊)給出。關(guān)鍵字參數(shù)接收值后以字典的形式存儲,所以也稱作字典參數(shù)。
????????普通參數(shù),可變參數(shù),關(guān)鍵字參數(shù)同時出現(xiàn)時,應(yīng)先定義普通參數(shù)(當然包含默認參數(shù)),再定義可變參數(shù),最后定義關(guān)鍵字參數(shù)。在調(diào)用傳值時,也應(yīng)該按這個順序并且保證書寫正確,尤其是關(guān)鍵字參數(shù)的‘鍵=值‘的形式。下例給出一個3種參數(shù)混合使用的情景。
def a(b,c=10,*tt,**guanjian):
????print(b)
????print(c)
????print(tt)
????print(guanjian)
a(45,11,'ju',54,87,'ji',x=1,y=2,z=3)
輸出
45
11
('ju', 54, 87, 'ji')
{'x': 1, 'y': 2, 'z': 3}
注意:在傳遞可變參數(shù)時,字符串要加引號,而在傳遞關(guān)鍵字參數(shù)時,鍵名不能加引號。鍵名必須是可hash的,不接受純數(shù)字等不可哈希的鍵名,要按照字典鍵名的規(guī)則來書寫。
???????類如何傳參數(shù)?類是通過類變量和構(gòu)造函數(shù)來傳遞參數(shù)的。構(gòu)造函數(shù)既然是函數(shù),函數(shù)的傳參規(guī)則是否適用于構(gòu)造函數(shù)呢?
class Qwqw:
????def __init__(self,b,c=10,*tt,**guanjian):
????????self.b = b
????????self.c = c
????????self.tt = tt
????????self.guanjian = guanjian
????????print(self.b)
????????print(self.c)
????????print(self.tt)
????????print(self.guanjian)
li1 = Qwqw(45,11,'ju',54,87,'ji',x=1,y=2,z=3)
輸出
45
11
('ju', 54, 87, 'ji')
{'x': 1, 'y': 2, 'z': 3}
??????可見構(gòu)造函數(shù)的參數(shù)規(guī)則與普通函數(shù)一樣。
???????在分配實例變量時不寫*星號。
????????如何把參數(shù)傳遞給類變量?這個很難找到相關(guān)資料,或許這種情況很少見。不過類變量是可以隨時單獨賦值操作的。還有個辦法是構(gòu)造時寫一條語句將實例變量或參數(shù)傳給類變量,,實例化時傳參給實例變量就好。
??????觀摩和練習
為了加深對函數(shù)知識的掌握,這里設(shè)計了一些情景,先自己動手編寫函數(shù),然后再對照給出的方案。
1、? ? str1 = '小燕子,往南飛'
?????????str2 ='白燕子,往北飛'
?????????str3 = '黑燕子坐飛機'
?????????str4 = '紅燕子裝暖氣'
?????????????????請找出往北飛的燕子
import re
def find_string(str):
????pattern = re.compile(r'北')
????match = pattern.search(str)
????if match:
????????print(match.group())
????????return True
????else:
????????print('Not found')
????????return False
if __name__ == '__main__':
????str1 = '小燕子,往南飛'
????str2 ='白燕子,往北飛'
????str3 = '黑燕子坐飛機'
????str4 = '紅燕子裝暖氣'
????find_string(str1)
????find_string(str2)
????find_string(str3)
????find_string(str4)
????print(find_string(str1))
????print(find_string(str2))
? ? 以上程序調(diào)用了re正則表達式模塊,re 模塊有十分強大的文本匹配功能,要有所了解。
?????if __name__ == '__main__':是一條申明語句,意思是當文件被整體執(zhí)行時,if下面的語句才被執(zhí)行,當文件作為模塊加載而不是整體執(zhí)行時,if后面的語句就不執(zhí)行,但文件中的函數(shù)是可以被調(diào)用的。
????還可以用in | not in成員運算符來判斷
def find_string(str):
??#list = [one for one in str]
??if '北' in str:
????print(****'有北*****:‘,str)
????return True
??else:
????print(' 不含‘北’字')
????return False
str1 = '小燕子,往南飛'
str2 ='白燕子,往北飛'
str3 = '黑燕子坐飛機'
str4 = '紅燕子裝暖氣'
find_string(str1)
find_string(str2)
find_string(str3)
find_string(str4)
print(find_string(str1))
print(find_string(str2))
輸出:不含‘北’字
******有北******:? '白燕子,往北飛
?不含‘北’字
?不含‘北’字
?不含‘北’字
False
有北
True
2、.定義一個桌子類(Desk),包含長(length)、寬(width)、高(height)屬性,包含一個打印桌子信息屬性的方法(showInfo)。實例化2個桌子對象,為其賦予不同的屬性值,并調(diào)用showInfo方法,輸出每個桌子的信息
class Desk:
????def __init__(self, length, width, height):
????????self.length = length
????????self.width = width
????????self.height = height
????def showInfo(self):
????????print("長:%d,寬:%d,高:%d" % (self.length, self.width, self.height))
desk1 = Desk(1, 2, 3)
desk2 = Desk(4, 5, 6)
desk1.showInfo()
desk2.showInfo()
# 2.定義一個電腦類(Computer),包含CPU(cpu)、內(nèi)存(memory)、硬盤(hardDisk)屬性,包含一個打印電腦信息屬性的方法(showInfo)。實例化2個電腦對象,為其賦予不同的屬性值,并調(diào)用showInfo方法,輸出每個電腦的信息
class Computer:
????def __init__(self, cpu, memory, hardDisk):
????????self.cpu = cpu
????????self.memory = memory
????????self.hardDisk = hardDisk
????def showInfo(self):
????????print("CPU:%s,內(nèi)存:%s,硬盤:%s" % (self.cpu, self.memory, self.hardDisk))
computer1 = Computer("i7", "16G", "1T")
computer2 = Computer("i5", "8G", "500G")
computer1.showInfo()
computer2.showInfo()
# 3.定義一個人類(Person),包含姓名(name)、年齡(age)、性別(sex)屬性,包含一個打印人信息屬性的方法(showInfo)。實例化2個人對象,為其賦予不同的屬性值,并調(diào)用showInfo方法,輸出每個人的信息
class Person:
????def __init__(self, name, age, sex):
????????self.name = name
????????self.age = age
????????self.sex = sex
????def showInfo(self):
????????print("姓名:%s,年齡:%d,性別:%s" % (self.name, self.age, self.sex))
person1 = Person("張三", 18, "男")
person2 = Person("李四", 20, "女")
person1.showInfo()
person2.showInfo()
# 4.定義一個學生類(Student),繼承自人類,包含學號(id)、班級(class)屬性,包含一個打印學生信息屬性的方法(showInfo)。實例化2個學生對象,為其賦予不同的屬性值,并調(diào)用showInfo方法,輸出每個學生的信息
class Student(Person):
????def __init__(self, name, age, sex, id, className):
????????super().__init__(name, age, sex)
????????self.id = id
????????self.className = className
????def showInfo(self):
????????print("姓名:%s,年齡:%d,性別:%s,學號:%d,班級:%s" % (self.name, self.age, self.sex, self.id, self.className))
student1 = Student("張三", 18, "男", 1, "一班")
student2 =
(以上代碼由codex 生成)
5定義一個用戶類(User),用戶名(username)和密碼(password)是這個類的屬性。
(1)實例化兩個用戶,分別有不同的用戶名和密碼。
class User:
????def __init__(self, username, password):
????????self.username = username
????????self.password = password
????def change_password(self, new_password):
????????self.password = new_password
????def verify_password(self, password):
????????return self.password == password
????def verify_username(self, username):
????????return self.username == username
????def print_user_info(self):
????????print("username: %s, password: %s" % (self.username, self.password))
if __name__ == "__main__":
????user1 = User("user1", "123456")
????user2 = User("user2", "123456")
????user1.print_user_info()
????user2.print_user_info()
????user1.change_password("654321")
????user1.print_user_info()
????print(user1.verify_password("654321"))
????print(user1.verify_username("user1"))
5、創(chuàng)建一個列表,其中存儲了3個Point對象。每個點(Point)都在與x,y軸夾角為45度的直線上(意思是x和y的值相同)。打印輸出這些點的坐標。例如:
>x坐標:1,y坐標:1
>x坐標:2,y坐標:2
>x坐標:3,y坐標:3
class Point:
????def __init__(self, x, y):
????????self.x = x
????????self.y = y
p1 = Point(1, 1)
p2 = Point(2, 2)
p3 = Point(3, 3)
points = [p1, p2, p3]
for point in points:
????print('x坐標:{}, y坐標:{}'.format(point.x, point.y))
Scala面向?qū)ο缶毩曨}34道
https://cloud.tencent.com/developer/article/1912677?from=article.detail.1775168
模塊,庫的概念:
擁有函數(shù),變量,類的程序文件都可以被別的程序引用,這個.py文件相對于引用他的文件就叫模塊。
??????很多的模塊文件組合到一起,就形成了庫的概念,python 擁有琳瑯滿目的庫,包含但不限于,網(wǎng)絡(luò)開發(fā),科學計算,人工智能,圖像,音頻,工業(yè)控制,數(shù)據(jù)庫等領(lǐng)域近千個庫。
??????在一個.py 文件中用import 引入別的文件和文件夾時,就可以使用被引入的資源了。