天天看點

【Python】類,變量,函數

目錄

  • ​​類​​
  • ​​類定義​​
  • ​​類方法​​
  • ​​變量​​
  • ​​變量定義​​
  • ​​常量​​
  • ​​常量定義​​
  • ​​函數​​
  • ​​函數定義​​
  • ​​函數參數​​
  • ​​位置傳參​​
  • ​​關鍵字傳參​​
  • ​​動态參數傳參​​
  • ​​函數傳回值​​
  • ​​總結​​

類定義

​類的簡要描述​

  • 類其實就是存放了許多函數的一個集
  • 類中的函數必須執行個體類後才能調用
  • 類與類可以繼承,子類可以使用父類中的函數,如果父類中的函數不能滿足需求,可以對父類中的函數進行重寫​

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

總結