python-函式基礎

程式灬波發表於2018-11-09

函式基礎

函式簡介

  • 定義:就是具有特定功能的一段程式碼

  • 優點:

    • 解決程式碼的重複書寫

    • 可以將功能的實現著和使用者分開,提高開發效率

  • 分類:

    • 庫函式:print、input、abs等

    • 自定義:使用者自己封裝的函式

函式使用

  • 定義函式格式

    def 函式名([引數列表]):
        函式體

     

    []表示可選,引數可以有,也可以沒有,也可以是多個。

  • 函式名:

    • 與變數一樣,只要遵循識別符號的命名規範即可。

  • 函式呼叫:

    • 函式定以後不會執行,需要呼叫才會執行

    • 呼叫格式:函式名([引數])

函式分類(引數與返回值)

  • # 無參無返回值
    def print_hello():
        for i in range(10):
            print(`Hello world!`)
    ​
    # print_hello()
    # 帶引數無返回值
    def print_n_hello(n):
        for i in range(n):
             print(`Hello world!`)  
       
    # print_n_hello(5)
    # 帶參有返回值
    def add(m, n):
        c = m + n
        # 使用return返回需要返回的值,不返回預設為None
        return c   
    ​
    print(add(3, 5))

     

分類的標準是按照有無引數,以及有無返回值。

函式引數

  • 形參:形式引數,就是寫在函式定義出的引數

  • 實參:實際引數,就是在函式呼叫時傳遞的引數

  • 位置引數:也叫必傳引數,沒有預設值的引數

  • 預設引數:定義時有預設值,呼叫時可以不傳,必須寫在最後

  • 關鍵字引數:在函式呼叫時指定引數名字,引數的位置就無所謂。

  • 可變長度引數:函式呼叫時可以傳遞比定義處更多的引數,多出來的引數會儲存在args和kwargs中

    def var_len_args(a, b, name=`goudan`, *args, **kwargs):
        print(a, b)
        print(name)
        # 是一個元組,儲存多傳的位置引數
        print(args)
        # 是一個字典,儲存多傳的關鍵字引數
        print(kwargs)
    ​
    var_len_args(1, 2, 3, 4, age=10)

     

  • *的使用:

    def show(a, b):
        print(a, b)
    ​
    lt = [1, 2]
    # 需要從列表根據下表獲取元素,然後作為引數傳遞
    # show(lt[0], lt[1])
    show(*lt)
    ​
    def show2(aa=11, bb=22):
        print(aa, bb)
       
    d = {`aa`: 123, `bb`: 456}
    # show2(aa=d[`aa`], bb=d[`bb`])
    # 上下等價
    show2(**d)

     

函式進階

  • 函式的定義位置是隨意的?

    • 不是,一定是先定義後呼叫,函式的呼叫一定要放在定義之後。

  • 函式的名字可以相同嗎?

    • 不可以,若出現同名函式,後者會覆蓋前者。

  • 函式內容能否再定義函式?

    • 可以,定義在函式內部的函式叫內部函式,它是很多高階功能實現的基礎。

變數的作用域

  • 塊級作用域

    if True:
        name = `ergou`# 能夠在塊的外部使用,說明沒有塊級作用域
    print(name)

     

  • 區域性作用域

    • 區域性變數:定義在函式內部的變數叫區域性變數,只能在函式內部使用。

    def test():
        a = 10# 不能再函式外部使用,此處會報錯
    print(a)

     

  • 全域性作用域

    • 全域性變數:定義在函式外部的變數叫全域性變數,哪裡都可以使用

    num = 10def show():
        # 宣告使用的時外部的同名變數
        global num
        # 只能使用,不能修改,若想修改協議進行全域性宣告
        num = 20
        print(num)
    ​
    show()
    print(num)

     

    1. 函式內部可以使用外部變數,但是不能修改

    2. 若修改需要使用global進行全域性宣告

    3. 當函式內部與外部出現同名變數,預設使用的時內部變數

  • nonlocal使用

    • 說明:內部函式使用外部函式的區域性變數,需要使用nonlocal進行宣告

    def wai():
        n = 10
        def nei():
            # 宣告使用非本地變數,外部函式的區域性變數
            nonlocal n
            n = 20
            print(n)
        nei()
        print(n)
    ​
    wai()

     

遞迴函式(瞭解)

  • 定義:函式內部呼叫函式本身的函式叫遞迴函式。

  • 組成:

    • 函式內部呼叫自己

    • 終止條件(停止呼叫自己的條件)

    • 核心演算法(具體功能)

  • 特點:

    • 程式碼簡潔

    • 可讀性差(不易理解)

    • 瞬間佔用記憶體較大,沒有終止條件立即崩潰

    • 有些領域是禁止使用的(安全領域:汽車電子)

    • 只有在不得不使用的時候才使用(遍歷目錄)

  • 練習:

    • 求n的階乘

    • 斐波那契數列的第n項

      • 前兩項都為1,從第三項開始,每一項都等於前兩項的和

      • 如:1,1,2,3,5,8,13,21,...

常用函式

  • 內建函式(無需匯入)

    print:列印,輸出
    input:輸入
    abs:求絕對值
    type:獲取變數的型別
    chr:將ASCII數值轉換為字元
    ord:將字元轉換為對應的ASCII
    id:獲取變數地址
    len:統計元素個數
    range:產生連續整數的可迭代物件
    enumerate:列舉可迭代物件
    ​
    強制型別轉換:
    int
    float
    str
    list
    tuple
    set
    dict
    ​
    max:求多個引數的最大值,或可迭代物件中的最大元素
    min:最小值
    sum:求和,可迭代物件元素求和
    pow:求冪,pow(2, 3)等價於2 ** 3
    round:四捨五入,可以指定保留位數
    ​
    hex:16進位制
    oct:8進位制
    bin:2進位制

     

  • 模組函式(需要匯入)

    time:
        sleep:休眠指定的秒數,可以是小數
    math:
        e:自然對數
        pi:圓周率
        ceil:向上取整
        floor:向下取整
        sqrt:開方(請平方根)
        degrees:弧度轉換為度
        radians:度轉換為弧度
    sys:
        argv:執行程式時所有的命令列引數列表,第一個是程式檔名

     


    練習:完成一個計算器,支援加、減、乘、除運算

練習:

  • 前面練習全部以函式形式進行封裝

  • 終端計算器

  • 刪除列表中的重複元素

  • 統計一個字串中字母、數字及其他字元的個數,返回一個元組即可

  • 返回一個列表中第二大的數

  • 完整列表的排序函式(sort),支援逆序

  • 號碼歸屬地查詢:

    ```5582|1860101|010|北京市|北京聯通GSM卡
    5583|1860100|010|北京市|北京聯通GSM卡
    5584|1368141|010|北京市|北京移動神州行卡
    5585|1860111|010|北京市|北京聯通GSM卡
    5586|1358198|010|北京市|北京移動動感地帶卡
    5587|1361139|010|北京市|北京移動預付費卡
    5588|1361138|010|北京市|北京移動神州行卡
    5591|1360110|010|北京市|北京移動全球通卡
    5748|1364110|010|北京市|北京移動神州行卡
    10186|1581584|020|廣東省廣州市|廣東移動全球通卡
    15046|1391897|021|上海市|上海移動全球通卡
    17250|1502207|022|天津市|天津移動全球通卡
    21137|1345272|023|重慶市萬州|重慶移動大眾卡
    22700|1347812|024|遼寧省瀋陽市|遼寧移動大眾卡
    24256|1377065|025|江蘇省南京市|江蘇移動全球通卡
    26360|1898606|027|湖北省武漢市|湖北電信CDMA卡
    28709|1860802|028|四川省成都市|四川聯通GSM卡
    30641|1552961|029|陝西省西安市|陝西聯通GSM卡
    31700|1563007|0310|河北省邯鄲市|河北聯通GSM卡
    33360|1583396|0311|河北省石家莊市|河北移動全球通卡
    34825|1508122|0312|河北省保定市|河北移動全球通卡
    35363|1551235|0313|河北省張家口|河北聯通GSM卡
    37700|1331326|0316|河北省廊坊市|河北電信CDMA卡
    43500|1350358|0358|山西省呂梁市|山西移動全球通卡
    43908|1553625|0359|山西省運城市|山西聯通GSM卡
    44521|1335360|0370|河南省商丘市|河南電信CDMA卡
    50078|1509369|0378|河南省開封市|河南移動全球通卡
    53603|1583981|0398|河南省三門峽|河南移動全球通卡
    53916|1335897|0410|遼寧省鐵嶺市|遼寧電信CDMA卡
    55248|1554254|0411|遼寧省大連市|遼寧聯通GSM卡
    58618|1374272|0427|遼寧省盤錦市|遼寧移動全球通卡
    58932|1554183|0429|遼寧省葫蘆島|遼寧聯通GSM卡
    60268|1340475|0431|吉林省長春市|吉林移動大眾卡```

     

相關文章