python學習筆記第5節-類和函數

???????我們在前面的學習中學會了一個叫type()的函數,用它來判斷變量的類型,變量和它當下存儲的數據綁定在一起。例如

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 = {‘a54’:56}

print(type(a))

輸出<class 'dict'>

a = {‘a54’,56}

print(type(a))

輸出<class ‘set'>

a = ‘tyuio’

print(type(a))

輸出<class 'str'>

a = 2

print(type(a))

輸出 <class 'int'>

????????我們發現:就連最基本數字、字符都是以class類的形式出現,實際上python 是在類的思想指導下開發的,python不僅用類定義了基本的數據類型,還向用戶開放了定義類的權力,讓用戶根據自己的數據和編程動機定義自己的類。

?????如何定義類?類又有哪些作用?讓我們從一段簡單的代碼開始逐步了解類:

新建一個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? 的文件,編寫以下代碼并執行

8 from clstest? import Tieban

9 ? a = input('鐵板長:')

10 ? b = input('鐵板寬:')

11? gaizi? =Tieban(a,b)? # 構建一個對象

12? gaizi.xianshi()

運行clsuse.py文件后輸出:

鐵板長:33

鐵板寬:44

33 44

你的材料已準備

解釋上訴代碼:第1行,聲明一個叫Tieban(鐵板)的類

????????????????????????第2,3,4行,是一個構造函數, __init__是構造函數統一的函數名,函數的 ? ? ? ? ? ? 參數是self 及其它的參數,上例中給出了tezheng1(特征)和tezheng2兩個參數,3、4行在函數體內進一步將實例參數指向構造參數,self.tezheng1表示這個類被使用時的實例參數,它指向,tezheng1這個構造參數。

???????????????????????第5,6,7行定義了一個實例方法,方法名xianshi(顯示),6,7行是該實例方法的具體操作:打印兩個實例變量,答應一段提示‘你的材料已準備’

????????????????????????以上7行代碼完成了類Tieban 的定義,說明了類定義的基本結構:

?????????????????????????????類聲明:

???????????????????????????????????構造函數

???????????????????????????????????方法函數

????????????????????????規范的類的定義是放在一個單獨的文件中。

??????????????????????在clsuse.py文件中

????????????????????????第8行 from clstest? import Tieban是從clstest文件中導入Tieban 類

????????????????????????第9,10行讓用戶輸入兩個數

????????????????????????第11 行用變量gaizi 實例化了類Tieban,并將剛剛錄入的a ,b 的值賦值給gaizi 這個類實例

?????????????????????????第12行調用了實例gaizi的實例方法gaizi.xianshi.(實例名gaizi替換了定義時的slef)。

???????????????????關于類的知識點比較多,初學者理解也有一定的難度。上例是一個特別簡單例子

為的是讓初學者掌握類定義,類實例化的大概語句組織輪廓。

???????類的基本知識點由以下幾部分組成:

????????1、類的聲明。(。)

????????2,類屬性和類變量,

????????3,構造函數。--init– 是構造函數的專有符號。

????????4、類方法。

????????5、 實例方法

????????6、類的實例化

????????7、實例中調用方法

??????????有時類名后會用一個括號說明該類的父類,本文僅作入門只用,子類父類以及繼承多態的知識請讀者在掌握基本的知識之后進階學習,這方面的資料很多

??????通過以下學生的例程,理解掌握《類和實例關系對照表》中3對關系





??????在使用用戶類的時候與python 基礎類的時候的異同點:python幾乎所有的編程要素都是建立在類的基礎上的,但面對具體問題時,用戶需要自己設計類來優化編程效率并使程序規范更容易閱讀,更容易復用。

函數

???????我們在上面的兩個小例子中已經使用了函數的概念,接下來展開介紹函數的基礎知識

在面向過程的編程時代,函數是編程的主題。但隨著編程思想的發展,類的思想成為主流。但函數作為一種代碼封裝工具,依然有重要的作用。

???????函數也是語句的封裝,給一堆代碼起一個名字,以便于用它來解決許多相似問題。

???????python 有很多的內置函數:下表是網上搜集的最常用的68個內置函數

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 內置函數詳解

https://blog.51cto.com/u_11949039/5060113

內置函數功能學習

? ? 這些內置函數可以解決很多遇到的問題,只有當內置函數及其組合方案無法解決是才有必要自己造輪子。當然學習和練習時除外。所以內置函數的學習目標是:了解內置函數,在遇到問題時,知道有相應的函數實現了這個功能,而不必自己編寫代碼實現就夠了。

??????其實在說到設計函數時,尤其是在復習這部分知識,我希望把自己定位到一位初學者,舉一些既簡單,又有代表性的而且還有趣的例子,為了節省時間,又增加有趣性,我打算在函數方面借助codex來生成例程,codex 給出的例程要好過我自己設計的,但對函數的要求,以及通過例子要練習和掌握哪些函數方面的知識,則有我來把控。

??????要求:當給定一個列表,去除其中最大的兩個數和最小的兩個數

??????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))??

????這段代碼,巧妙的使用了一次排序和一次切片解決問題

????但是你可以在網絡上找到很多好的函數的例程。設計類比設計函數要復雜的多,這需要結合實際的計算需求。我希望初學者一開始就把學習的注意力轉移到數據類型和創建類方面,好的數據構造,強過處理它的細節,所以關于函數的知識在本文中會盡量基礎,盡量簡短,盡可能的把精力和篇幅放到類的研究上。

??????def 是創建函數的標識符,??

def? 函數名(參數)

????語句和操作

????return? 返回計算結果給調用語句(return 語句可以有不同分支,分情況返回不同的結果

????????????????????????????????????????????????????????????但只要一條return語句被執行,函數就結束

? ? ? ? return 可以返回任何變量(包括全局變量和局部變量)任何數據,可以給出參數,也可以沒有參數;在不需要返回任何值時也可以直接用return 返回空值(None)從而結束函數執行。有時不需要返回時,return 寫不寫都可以,沒有return的函數也很常見。

def add(a,b):

????????c = a + b

?????????return c ? ? ? #當調用add函數時,將相加結果c 的值返回

m = add(3,4) ? ? ? ? #調用add(),3,4傳入參數a,b?

print(m)

print(add(10,20))

輸出:7 ,30

???????return 語句做什么,全在于你的設計,我們來看一個返回值和函數體毛關系沒有的例子

def fuuck(a,b,c):

????m = a

????a = b

????b = c

????c = m

????return '今天是個好日子,大把的鈔票送給你'

print(fuuck(2,4,8))

輸出 今天是個好日子,大把的鈔票送給你


????我們發現,return 和我們的參數,和其他語句做的事情風牛馬不相及。我僅僅是恭喜你發財而已。

?????再來看看return選擇輸出的例子

def kaoshi():

???a = input('你這次考試成績?:')

???a = int(a)

???if a<60:

????????return '你個渣渣'

???elif a<=100:

????????return '還不錯'

???else:

????????return '吹牛B'

print(kaoshi())


??????我們發現在上例中,3個return語句根據你輸入的情況選擇執行。

???????沒有return 的情況

def ppt(a,b):

????print('a的取值是:%s,b的取值是:%s'%(a,b))

c = '差不多'

d = '還可以'

ppt(c,d)

輸出:a的取值是:差不多,b的取值是:還可以


??????了解了函數的輸出,我們回過頭來學習函數參數的知識:

??????什么是函數的參數?對于一個求和函數來講,如上例add(a,b)中的a,b就是add 的參數,要求兩個數求和,就必須在調用時給出兩個數3,4,而函數在設計時準備用于接受3,4的a,b就叫add(a,b) 的參數,參數一般寫在函數名后的括號里。

????a,b 也叫形式參數:形參,3,4 也叫實際參數:實參,一般情況要保持個數一致,順序一致。形參和實參的關系就好比席位和客人的關系,有幾位客人,就準備幾個席位。

????除了形參和實參一一對應的情況,還有許多特殊的情況:

1、默認參數:add2(a=1,b=2,c=3),在設計函數時給形參一個值,在調用的時候可以由調用語句修改這個參數,也可以不修改,不修改時,函數運行中變量取默認值,range函數就是典型的代表,它的初始值和步長有默認值0和1

????.默認參數的例子

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年,利率調整為0.05

print(lilu(1000))?

輸出

您1000元1年存款的收益是:40.0元

None

您1000元3年存款的收益是:150.0元

None

您1000元1年存款的收益是:40.0元? ? ? 默認參數被修改后再次調用時還原成默認值

None


????????默認參數必須指向不可變對象,結合基礎數據類型中的不可變類型知識理解這一規則。

?2、可變參數,不定參數

def biancanhansu(a, *bian):

????print(a)

????print(bian)

biancanhansu(1, 2, 3, 4,8)

輸出1

(2, 3, 4, 8)


?????上例中*bian是一個可變參數,用一個*標識可變參數,意味著我不確定有幾個元素,在調用函數時,先給固定參數分配數據,沒用完的數據作為一個元組整體傳給可變參數bian

3,關鍵字參數

def a(**guanjian):

????print(guanjian)

a(x=1,y=2,z=3)

輸出

{'x': 1, 'y': 2, 'z': 3}


??????關鍵字參數在定義時用兩個星號**標識,在傳遞實參時是以(key1 = value1,key2 = value2,key3 = value3)的形式成對(等號兩邊)給出。關鍵字參數接收值后以字典的形式存儲,所以也稱作字典參數。

????????普通參數,可變參數,關鍵字參數同時出現時,應先定義普通參數(當然包含默認參數),再定義可變參數,最后定義關鍵字參數。在調用傳值時,也應該按這個順序并且保證書寫正確,尤其是關鍵字參數的‘鍵=值‘的形式。下例給出一個3種參數混合使用的情景。

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}

注意:在傳遞可變參數時,字符串要加引號,而在傳遞關鍵字參數時,鍵名不能加引號。鍵名必須是可hash的,不接受純數字等不可哈希的鍵名,要按照字典鍵名的規則來書寫。

???????類如何傳參數?類是通過類變量和構造函數來傳遞參數的。構造函數既然是函數,函數的傳參規則是否適用于構造函數呢?

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}

??????可見構造函數的參數規則與普通函數一樣。

???????在分配實例變量時不寫*星號。

????????如何把參數傳遞給類變量?這個很難找到相關資料,或許這種情況很少見。不過類變量是可以隨時單獨賦值操作的。還有個辦法是構造時寫一條語句將實例變量或參數傳給類變量,,實例化時傳參給實例變量就好。

??????觀摩和練習

為了加深對函數知識的掌握,這里設計了一些情景,先自己動手編寫函數,然后再對照給出的方案。

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))

? ? 以上程序調用了re正則表達式模塊,re 模塊有十分強大的文本匹配功能,要有所了解。

?????if __name__ == '__main__':是一條申明語句,意思是當文件被整體執行時,if下面的語句才被執行,當文件作為模塊加載而不是整體執行時,if后面的語句就不執行,但文件中的函數是可以被調用的。

????還可以用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個桌子對象,為其賦予不同的屬性值,并調用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)、內存(memory)、硬盤(hardDisk)屬性,包含一個打印電腦信息屬性的方法(showInfo)。實例化2個電腦對象,為其賦予不同的屬性值,并調用showInfo方法,輸出每個電腦的信息

class Computer:

????def __init__(self, cpu, memory, hardDisk):

????????self.cpu = cpu

????????self.memory = memory

????????self.hardDisk = hardDisk

????def showInfo(self):

????????print("CPU:%s,內存:%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個人對象,為其賦予不同的屬性值,并調用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個學生對象,為其賦予不同的屬性值,并調用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、創建一個列表,其中存儲了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面向對象練習題34道

https://cloud.tencent.com/developer/article/1912677?from=article.detail.1775168

模塊,庫的概念:

擁有函數,變量,類的程序文件都可以被別的程序引用,這個.py文件相對于引用他的文件就叫模塊。

??????很多的模塊文件組合到一起,就形成了庫的概念,python 擁有琳瑯滿目的庫,包含但不限于,網絡開發,科學計算,人工智能,圖像,音頻,工業控制,數據庫等領域近千個庫。

??????在一個.py 文件中用import 引入別的文件和文件夾時,就可以使用被引入的資源了。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容