目錄
- 類
- 類定義
- 類方法
- 變量
- 變量定義
- 常量
- 常量定義
- 函數
- 函數定義
- 函數參數
- 位置傳參
- 關鍵字傳參
- 動态參數傳參
- 函數傳回值
- 總結
類
類定義
類的簡要描述
- 類其實就是存放了許多函數的一個集
- 類中的函數必須執行個體類後才能調用
- 類與類可以繼承,子類可以使用父類中的函數,如果父類中的函數不能滿足需求,可以對父類中的函數進行重寫
(
override
)
不是重載
類的命名規範
- 不要使用其他特殊符号,包括下劃線_
- 使用大駝峰命名(每個單詞首字母大寫)例:Person,RequestsHelper,ConfigurationFileTool
例:
# 預設類,繼承object。python3以後object寫不寫都可以,不寫預設就繼承的object
class 類名:
# 這是構造函數,當建立類的(執行個體)對象時,會自動調用,進而實作對類進行初始化操作,
# self類似其他語言裡的this,代表對象自己。
# 在類中的方法(函數)裡,self永遠是第一個參數
# 必須要有一個self參數
def __init__(self, parameter1, parameter2):
"""
構造函數
建立執行個體,必須要傳入parameter1和parameter2,在類的方法中調用參數,隻需要self.parameter1就可以擷取目前類參數值
"""
self.parameter1 = parameter1
self.parameter2 = parameter2
# 這裡寫類方法(函數)
# 繼承父類
class 類名(父類):
類方法(函數)
# 繼承python根類(object)
class 類名(object):
# 類方法(函數)
類方法
Python類中常用三種類方法
- 普通方法,第一個參數通常使用self,表示一個具體的執行個體本身
- 類方法(@classmethod),第一個參數通常使用cls,表示這個類本身,可以類執行個體調用或直接類.方法名調用
- 靜态方法(@staticmethod),類中不需要執行個體的函數,無self,可以類執行個體調用或直接類.方法名調用
- 私有方法,Python中私有方法并不需要什麼關鍵字,而是直接在方法前加上
,隻能在類内部調用__
各方法調用示例:
-
普通方法
class A(object):
def method_a(self):
print('我是普通方法,我第一個參數是self,我需要類執行個體調用')
# 執行個體調用
a = A()
a.method_a
-
類方法
class A(object):
@classmethod
def method_b(cls):
print('我是類方法,我第一個參數是cls,我可以類執行個體調用也可以類直接調用')
# 執行個體調用
a = A()
a.method_b
# 類調用
A.method_b
-
靜态方法
class A(object):
@staticmethod
def method_c():
print('我是靜态方法,我不需要self和cls,我可以類執行個體調用也可以類直接調用')
# 執行個體調用
a = A()
a.method_c
# 類調用
A.method_c
-
私有方法
class A(object):
def __method_e(self):
print('我是私有方法')
# 外部調用不到方法
a = A()
a.__method_e
變量
變量定義
變量指在代碼中為某一資料取的名稱,在程式設計過程中使用該名稱相當于使用其背後的資料。簡而言之,我們可以将變量視為代碼中用來儲存資料的臨時容器。
- 局部變量:就是在函數内部定義的變量,其作用範圍是這個函數内部,即隻能在這個函數中使用,在函數的外部無法使用
- 全局變量:在函數外邊定義的變量,其作用範圍能夠在所有的函數中進行通路
聲明變量:
- 格式:變量名=值
- 必須為變量指派,可以賦None值
- 不需要關鍵字,也可以不用指定變量類型
變量的命名規範:
局部變量
全局變量
- 由字母,數字,下劃線組成,不能以數字開頭,不能與關鍵字重名
- 區分大小寫,盡量每個單詞使用小寫,例:name,age,sex
- 如果多個單詞,單詞與單詞之間用英文下劃線_連接配接,例:account_info,request_data
-
采用gl_或g_加變量名,例:gl_url/g_url,gl_user/g_user
常量
常量定義
常量一般指不變的資料,我們就可以把它定義為常量,比如:
Π
,但其實在Python中,定義的常量本質上也是變量,是可以修改的,隻是我們經常習慣用大寫區分,告訴别人這是常量,不應該修改。
常量命名規範
-
全部單詞大寫,單詞與單詞之間用英文下劃線_連接配接,例:ACCESS_TOKEN,PI,APP_KEY
函數
函數定義
函數是可重複使用的,一般用來實作單一或強相關聯功能的代碼段。函數能提高應用的子產品性,和代碼的重複使用率。Python中有很多預設函數,比如
print()
,
input()
。我們自己寫的函數稱為自定義函數。
定義
- 以def關鍵字開頭,後接定義函數的名稱和英文括号(),以冒号:結尾
- 括号中可為空,也可以傳入參數
- 定義函數的内容,需要與def保持縮進
- 調用函數基本格式:函數名稱(),無參數括号中則不填内容,有參數則填寫對應的函數參數
- 函數中return結束函數,調用函數會傳回對應值,沒有return則調用函數傳回None
函數的命名規範
- 函數名盡量簡潔易懂
- 每個單詞小寫,單詞與單詞之間使用英文下劃線_連接配接,例:save_userinfo,delete_user
- 使用小駝峰命名(第一個單詞首字母小寫,後面單詞首字母大寫),例:saveUserinfo,deleteUser
其實很多時候命名也是一種能力,要讓别人閱讀代碼容易看懂,知道這是幹嘛的,甚至好的命名可以替代注釋的,這在所有語言中都是一樣的;
具體什麼操作,就以這個函數具體執行的操作的單詞開始,這樣别人閱讀代碼的時候,看函數名就大緻知道這個函數是幹什麼的,盡可能一個函數隻做一件事情,這樣可以降低代碼耦合度,後期維護也更省心;
例如:
-
擷取檔案内容:get_file_content;
-
根據id擷取使用者資訊:get_userinfo_by_id;
-
發送郵件:send_email;
-
批量發送電子郵件:batch_send_email
- …
函數參數
函數中定義的參數成為形式參數,簡稱:形參
# p1 p2 p3稱為形參;p4稱為預設參數,可以傳可以不傳,注意:預設參數必須放在參數後,字典**kwargs前;後面有介紹到**kwargs
def fun1(p1, p2, p3, p4="4"):
print(p1 + p2 + p3)
調用函數中定義的參數成為實際參數,簡稱:實參
# "1" "2" "3"稱為實參
fun1("1", "2", "3")
位置傳參
# 按照傳遞的先後順序
fun2("我是參數1", "我是參數2", "我是參數3")
# 結果:我是參數1我是參數2我是參數3
# 按照傳遞的先後順序
fun2("我是參數2", "我是參數1", "我是參數3")
# 結果:我是參數2我是參數1我是參數3
關鍵字傳參
關鍵字傳參和先後順序沒有關系,可以和位置傳參共用,需要注意:位置傳參必須在關鍵字傳參前;如果一個實參使用關鍵字傳參,則後面所有實參必須使用關鍵字傳參
# 根據關鍵字傳參,
fun3(p1="我是參數1", p3="我是參數3", p2="我是參數2")
# 結果:我是參數1我是參數2我是參數3
# 第一個實參用位置傳參,第二個參數用關鍵字傳參,第三個實參用位置傳參
fun3("我是參數1", p3="我是參數3", p2="我是參數2")
# 結果:我是參數1我是參數2我是參數3
# 第一個實參用位置傳參,第二個實參用關鍵字傳參,第三個實參用位置傳參
fun3("我是參數1", "我是參數2", p2="我是參數3")
# 結果:運作報錯,TypeError: fun1() got multiple values for argument 'p2',指定了多個p2實參
# 第一個實參用關鍵字傳參,後面實參沒有指定關鍵字
fun3(p1="我是參數1", "我是參數2", "我是參數3")
# 結果:編譯報錯
# 第一個實參用位置傳參,第二個實參用關鍵字傳參,第三個實參用位置傳參
fun3("我是參數1", p2="我是參數2", "我是參數3")
# 結果:編譯報錯
動态參數傳參
*args
:
隻能按照位置傳參,()元組類型
# 該函數隻能按照位置傳參
def fun4(*args):
print(args)
# 例:調用函數fun4("1", "2", 3),args[1]結果:2,取元組中值用索引擷取,從0開始
# 如果沒有傳參,結果報錯:tuple index out of range,元組索引超出範圍
print(args[1]) # 取元組中值
# 可以不傳參
fun4()
# 結果:()
# 可以傳1個參數
fun4("1")
# 結果:('1',)
# 可以傳2個參數
fun4("1", "2")
# 結果:("1","2")
# 可以傳不同類型
fun4("1", "2", 3)
# 結果:('1', '2', 3)
**kwargs
:
隻能按照關鍵字傳參,{}字典類型
# 該函數隻能按照關鍵字傳參
def fun5(**kwargs):
print(kwargs)
# 例:調用函數fun5(a="1", b="2", c=3),kwargs["a"]結果:1,取字典中值用關鍵字擷取
# 如果字典中找不到對應鍵,結果報錯:KeyError: 'd'
print(kwargs["a"]) # 取字典中值
# 可以不傳參
fun5()
# 結果:{}
# 可以傳1個參數
fun5(a="1")
# 結果:{'a': '1'}
# 可以傳2個參數
fun5(a="1", b="2")
# 結果:{'a': '1', 'b': '2'}
# 可以傳不同類型
fun5(a="1", b="2", c=3)
# 結果:{'a': '1', 'b': '2', 'c': 3}
*args
,
**kwargs
:
可以用位置傳參,可以用關鍵字傳參,(){}元組加字典,注意:函數中元組和字典不能切換位置,*args必須在**kwargs前;
# 該函數既可以用位置傳參,也可以用關鍵字傳參,注意
def fun6(*args, **kwargs):
print(args)
print(kwargs)
# 可以不傳參
fun6()
# 結果:(){}
# 可以傳1個參數,元組
fun6("1")
# 結果:('1',)
# 可以傳1個參數,字典
fun6(a="1")
# 結果:{'a': '1'}
# 可以傳2個參數,元組
fun6("1", "2")
# 結果:('1', '2'){},字典為空
# 可以傳2個參數,字典
fun6(a="1", b="2")
# 結果:(){'a': '1', 'b': '2'},元組為空
# 可以傳2個參數,元組+字典
fun6("1", b="2")
# 結果:('1',){'b': '2'},元組和字典都有值
# 可以傳2個參數,字典+元組
fun6(a="1", "2")
# 結果:編譯報錯,第一個必須為元組參數
參數和動态參數一起使用時,動态參數必須放在參數後
def fun6(p1, p2, *args, **kwargs):
預設參數和動态參數混用,預設參數必須放在字典參數**kwargs前
def fun6(p1, p2="2", *args, p3="3", p4, **kwargs):
函數傳回值
傳回值可以是任意類型,如果函數中沒有return,則預設傳回None
# 定義函數列印兩個值相加
def fun7(num1, num2):
# 結果:2
print(num1 + num2)
# 結果:None,函數沒有傳回值
print(fun7(1, 1))
# 定義函數列印兩個值相加,并且傳回結果
def fun8(num1, num2):
# 結果:2
print(num1 + num2)
# 傳回結果
return num1 + num2
# 結果:2
print(fun8(1, 1))
return傳回值後帶有逗号,預設轉換為元組類型傳回
# 定義函數,傳回兩個數相加和相減
def fun9(num1, num2):
return num1 + num2,num1 - num2
# 結果:(2, 0),傳回元組類型結果
print(fun9(1, 1))
# 定義函數,傳回兩個數相加和相減
def fun10(num1, num2):
print(num1 + num2)
return num1 + num2
print(num1 - num2)
return num1 - num2
# 結果:2,傳回第一個return的結果
print(fun10(1, 1))