Python基礎(chǔ)知識(shí)之函數(shù),類,模塊
1、Function 函數(shù)
編程中,需要重復(fù)寫的功能,可以包裝成一個(gè)函數(shù)
1)定義函數(shù)
定義函數(shù)之前,實(shí)現(xiàn)給一個(gè)字符串增加前綴和后綴的操作:
f1 = "f1" f2 = "f2" f1 += ".txt" f1 = "my_" + f1 f2 += ".txt" f2 = "my_" + f2 print(f1, f2) my_f1.txt my_f2.txt
定義函數(shù)之后:
def modify_name(filename):
filename += ".txt"
filename = "my_" + filename
print(filename)
modify_name("f1")
modify_name("f2")
my_f1.txt
my_f2.txt
上述函數(shù)里面用到了參數(shù),調(diào)用的時(shí)候需要進(jìn)進(jìn)行傳參數(shù),但有時(shí)也可以沒(méi)有參數(shù),eg:
def modify_name(): filename = "f1" filename += ".txt" filename = "my_" + filename print(filename) modify_name() my_f1.txt
一個(gè)函數(shù)也可以擁有返回值,將函數(shù)處理后,可以將想要返回的結(jié)果返回
def modify_name(filename):
filename += ".txt"
filename = "my_" + filename
return filename
new_filename = modify_name("f1")
print(new_filename)
my_f1.txt
2)參數(shù)設(shè)置
調(diào)用函數(shù)時(shí),如果函數(shù)有參數(shù),那么需要給函數(shù)傳參,函數(shù)本來(lái)的參數(shù)叫實(shí)參,傳入的參數(shù)叫實(shí)參,參數(shù)傳遞有以下幾種方式:
def f(x, a, b, c): return a*x**2 + b*x + c*1 print(f(2, 1, 1, 0)) # 忽略參數(shù)名,需要按順序一一對(duì)應(yīng) print(f(x=2, a=1, b=1, c=0)) # 寫上參數(shù)名,按名字傳參 print(f(a=1, c=0, x=2, b=1)) # 若用參數(shù)名,可以打亂順序傳參 6 6 6
另外,對(duì)于不是一直變化的參數(shù),可以給參數(shù)設(shè)置一個(gè)默認(rèn)值,如果設(shè)置了默認(rèn)值,傳參時(shí)可以不給改參數(shù)傳值,否則每個(gè)參數(shù)都要傳參成功才能調(diào)用
def f(x, a=1, b=1, c=0): return a*x**2 + b*x + c*1 print(f(2, a=2)) print(f(2)) 10 6
Tip: 設(shè)置了默認(rèn)值的參數(shù)和未設(shè)置默認(rèn)值的參數(shù)要分開放,也就是說(shuō)不可以將未設(shè)置默認(rèn)值的參數(shù)跟在設(shè)置了默認(rèn)值參數(shù)的后面
3)全局和局部變量
- 全局變量(global):函數(shù)里外都能用(公用)
- 局部變量(local):僅在函數(shù)內(nèi)使用(私用)
def modify_name():
filename = "f1.txt" # 這里就是一個(gè)局部變量
print("local filename:", filename)
modify_name()
print("global filename:", filename) # 這里會(huì)報(bào)錯(cuò)
filename = "f1.txt" # 這里便是一個(gè)全局變量
def modify_name():
print("local filename:", filename)
modify_name()
print("global filename:", filename)
- 全局變量和局部變量沖突時(shí),局部變量?jī)?yōu)先?。?!
filename = "f1.txt"
def modify_name():
filename = "f2.txt"
print("local filename:", filename)
modify_name()
print("global filename:", filename)
local filename: f2.txt
global filename: f1.txt
- 特殊情況:允許內(nèi)部來(lái)修改外部的值,必須使用global聲明,相當(dāng)于提出了一個(gè)申請(qǐng)
filename = "f1.txt"
def modify_name():
global filename # 提出申請(qǐng)
filename = "f2.txt"
print("local filename:", filename)
modify_name()
print("global filename:", filename)
local filename: f2.txt
global filename: f2.txt
2、Class類
目的:為了描述一個(gè)或一類具體的物體,eg:貓的特征,動(dòng)作等
1)定義class
使用class File來(lái)創(chuàng)建一個(gè)類,注意通常約定類的名字要首字母大寫。
然后使用my_file = File()來(lái)創(chuàng)建一個(gè)實(shí)例,每個(gè)實(shí)例都繼承了一個(gè)類的基本屬性
class File: def __init__(self): self.name = "f1" self.create_time = "today" my_file = File() print(my_file.name) print(my_file.create_time) f1 today
- 其中 self 是作為類自己的一個(gè)索引,不管你在定義類的時(shí)候,想要獲取這個(gè)類的什么屬性或功能,都可以通過(guò)self來(lái)獲取。
- __init__():創(chuàng)建一個(gè)實(shí)例的時(shí)候,類都會(huì)自動(dòng)進(jìn)行一次初始化,即運(yùn)行一遍__init__()函數(shù)
- 修改屬性的值:(但這樣修改的值,僅對(duì)當(dāng)前實(shí)例有效)
my_file.name = "new_name" print(my_file.name) new_name
2)class的功能
- __init__():也可以對(duì)該函數(shù)進(jìn)行傳參:
class File:
def __init__(self, name, create_time="today"):
self.name = name
self.create_time = create_time
my_file = File("my_file")
print(my_file.name)
print(my_file.create_time)
my_file
today
- 還可以定義更多的功能,比如重命名等
class File:
def __init__(self, name, create_time="today"):
self.name = name
self.create_time = create_time
def change_name(self, new_name):
self.name = new_name
my_file = File("my_file")
my_file.change_name("new_name")
print(my_file.name)
new_name
- 而且類的功能也可以有返回值
class File:
def __init__(self, name, create_time="today"):
self.name = name
self.create_time = create_time
def get_info(self):
return self.name + " is created at " + self.create_time
my_file = File("my_file")
print(my_file.get_info())
my_file is created at today
3)繼承
- 倆個(gè)類分開寫,eg:
class Video: def __init__(self, name, window_size=(1080, 720)): self.name = name self.window_size = window_size self.create_time = "today" class Text: def __init__(self, name, language="zh-cn"): self.name = name self.language = language self.create_time = "today"
可以發(fā)現(xiàn),這倆個(gè)類是有共性的,比如都有name,和create_time
所以,可以編寫一個(gè)底層類,使得這倆個(gè)類繼承底層類,從而減少了類之間的共有屬性/功能的重復(fù)開發(fā)?。?!
一個(gè)類可以繼承另一個(gè)類,從而使得這個(gè)類成為子類,被繼承的類為父類
子類可以繼承父類的功能/功能,而且子類還可以重定義父類的功能
class File:
def __init__(self, name, create_time="today"):
self.name = name
self.create_time = create_time
def get_info(self):
return self.name + " is created at " + self.create_time
class Video(File):
def __init__(self, name, window_size=(1080, 720)):
# 將共有屬性的設(shè)置導(dǎo)入File父類
super().__init__(name=name, create_time="today")
self.window_size = window_size
class Text(File):
def __init__(self, name, language="zh-cn"):
super().__init__(name=name, create_time="today")
self.language = language
# 也可以在子類中復(fù)用父類功能
def get_more_info(self):
return self.get_info() + ", using language of " + self.language
v = Video("my_video")
t = Text("my_text")
print(v.get_info()) # 調(diào)用父類功能
print(t.create_time) # 調(diào)用父類的屬性
print(t.language) # 調(diào)用自己的屬性
print(t.get_more_info()) # 調(diào)用自己復(fù)用父類的功能
my_video is created at today
today
zh-cn
my_text is created at today, using language of zh-cn
4)私有屬性和功能
- 私有:_一個(gè)下劃線開頭,弱隱藏,不想讓別人用,但別人在必要情況下還是可以用的
- 私有:__倆個(gè)下劃線開頭,強(qiáng)隱藏,不讓別人使用
class File: def __init__(self): self.name = "f1" self.__deleted = False # 不讓別人使用這個(gè)變量 self._type = "txt" # 不想別人使用這個(gè)變量 def delete(self): self.__force_delete() def __force_delete(self):# 不讓別人使用這個(gè)功能 self.__deleted = True return True def _soft_delete(self): # 不想讓別人使用這個(gè)功能 self.__force_delete() # 雖然是強(qiáng)隱藏,但是可以在內(nèi)部隨便調(diào)用 return True f = File() print(f._type) # 可以拿到值,但是會(huì)有⚠️ print(f._soft_delete()) # 可以調(diào)用,但是會(huì)有⚠️ print(f.__deleted) # 會(huì)直接報(bào)錯(cuò) print(f.__force_delete) # 會(huì)直接報(bào)錯(cuò)
5)特殊方法
| 定義 | 含義 |
|---|---|
| def __init__() | 初始化實(shí)例 |
| def __repr__() | 字符串的“官方”表現(xiàn)形式 |
| def __str__() | 字符串的“非正式”值 |
| def __iter__() | 遍歷某個(gè)序列 |
| def __next__() | 從迭代器中獲取下一個(gè)值 |
| … | … |
3、Module模塊
Moudel主要是為一個(gè)相對(duì)比較大的工程,涉及到多個(gè)文件之間的互相調(diào)用關(guān)系。
- 對(duì)于一個(gè)項(xiàng)目來(lái)說(shuō),它需要去實(shí)現(xiàn)很多功能,這時(shí)候,如果可以把某一個(gè)或者某一類功能分類寫到了一個(gè)文件之中,在合并的時(shí)候,我不便不需要知道文件中的代碼具體什么,我只需要調(diào)用你給的這個(gè)文件中的功能就可以!也
- 就是說(shuō),作為你所給文件中的功能的使用者,我不關(guān)心你實(shí)現(xiàn)功能的代碼,我只關(guān)系我可以使用函數(shù)調(diào)用到你這個(gè)功能就好
# file.py def create_name(): return "new_file.txt"
eg: 比如上述file.py文件,實(shí)現(xiàn)了create_name的功能,然而作為這個(gè)功能的使用者,我不需要去了解這個(gè)功能所使用的代碼,我只關(guān)心如何調(diào)用使用這個(gè)功能
1)引用module
比如新建了一個(gè)me.py,需要在這個(gè)文件之中引用file.py中的create_name()的功能
# me.py import file print(file.create_name()) new_file.txt
或者也可以這樣調(diào)用
# me.py
import file as f1
print("f1:", f1.create_name())
class File:
def create_name(self):
return "new_file.txt"
f2 = File()
print("f2:", f2.create_name())
f1: new_file.txt
f2: new_file.txt
可以發(fā)現(xiàn),這和類功能調(diào)用有著非常大的相似之處?。?!
還有更多的引用方式:
# me.py from file import create_name print(create_name()) new_file.txt
假設(shè)file.py中還有一個(gè)函數(shù)create_time()
# me.py from file import create_name, create_time print(create_name()) print(create_time()) new_file.txt today
如何file.py中函數(shù)太多,記不清,那么可以如此引用:
# me.py
# 第一種
import file
print("1", file.create_name())
#第二種
from file import *
print("2", create_name())
print("2", create_time())
2)大項(xiàng)目的模塊管理
在正規(guī)的module中,我們常會(huì)看到一個(gè)__init__.py文件,就像class里的def __init__(self),可以在里面寫上如何初始化你的files目錄,也可以設(shè)定目錄中各元素的關(guān)系。

# files/__init__.py from .video import get_video_size
設(shè)置好__init__.py后,就可以直接從files里import get_video_size這個(gè)屬于video.py的功能了
# me.py from files import get_video_size print(get_video_size())
但和video.py同級(jí)的text.py就無(wú)法通過(guò)import方式獲取到text.py中的功能,因?yàn)槲丛趂iles/__init__.py中聲明
# me.py from files import create_name
如果不在files/__init__.py中聲明,但還想調(diào)用,則可以使用:
# me.py import files.text print(files.text.create_name) # 或者 from files import text print(text.create_name)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注本站的更多內(nèi)容!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信