python學習筆記第5節(jié)-類和函數(shù)

???????我們在前面的學習中學會了一個叫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 引入別的文件和文件夾時,就可以使用被引入的資源了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容