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