python函數的用法解析

給你一個獲取“新冠病毒”每日疫情數據的函數,你想要麼?

 

數據來源丁香醫生,僅供學習參考!

 

首先,瀏覽器打開丁香醫生的疫情地圖鏈接,然後 F12 看看數據是怎麼來的。

 

其次,用 python 實現獲取數據

 

看不懂?沒關係,我來帶你一起復習一下python的函數。

 

先上目錄

1、函數是什麼

2、定義函數

3、空函數

4、多個返回值

5、函數的參數

6、遞歸函數

7、函數的作用域

8、函數式編程

9、函數作爲返回值返回

10、函數的閉包

11、匿名函數 lambda

 

函數是什麼?

定義:函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。

 

作用:函數能提高應用的模塊性,和代碼的重複利用率。

 

函數是 python 的一等公民,函數也是對象。

 

使用函數有兩個步驟:

1、定義函數 def 函數名(): 函數體

2、調用函數 函數名()

 

 

定義函數

用 def 關鍵字來定義對象。

# 無參無返回值
def foo():
    語句
# 有參無返回值
def foo(x, y):
    z = x + y
    
# 無參有返回值
def foo():
    x =1
    return x + 1
# 有參有返回值
def foo(x, y):
    return x + y

 

空函數

暫時還沒有想好怎麼去定義函數,可以用 pass 佔個坑。

def emptyfunc():
    pass

 

多個返回值

return多個值,其實是返回一個元組。

def foo():
    x, y, z = 1, 2, 3
    return x,y,z

# 返回一個元組
tup = foo()

# 元組拆包
x1, y1, z1 = foo()

 

函數的參數

必選參數

def foo(x, y, z):
    pass

 

默認參數

假如不傳 x 參數的話,x 默認是等於 1

def foo(x=1):
    pass

 

可變參數(*)

定義:

def foo(*args):
    pass

調用:

(1)不定長傳參

foo(1,2,3,4,5)

(2)元組和列表的壓包

foo(*(1,2,3,4,5)) 
# or 
foo(*[1,2,3,4,5])

 

關鍵字參數(**)

定義:​​​​​​​

def foo(**kwargs):
    pass

其中kwargs是一個字典。

調用:

(1)傳入鍵值對

foo(k1=v1, k2=v2)

(2)傳入字典變量(d是一個字典變量)

foo(**d)

 

命名關鍵字參數( * )

定義:​​​​​​​

def foo(a, b, *, k1, k2, k3):
    pass 
  • a, b是普通參數,k1, k2, k3 是命名關鍵字參數

  • 命名關鍵字參數需要一個特殊分隔符 *,後面的參數被視爲命名關鍵字參數

  • 如果函數定義中已經有了一個可變參數,後面跟着的命名關鍵字參數就不再需要一個特殊分隔符 * 了

調用:

foo(a, b, k1=v1, k2=v2, k3=v3)

 

參數組合

定義:​​​​​​​

def fun(parameter, *args, keyparameter, **kwargs):
    pass

 

參數定義順序:

 

函數的遞歸​​​​​​​

# 典型案例:斐波那契數列
def fib_recursion(idx):
    if idx <= 2:
        return 1
    else:
        return fib_recursion(idx-1) + fib_recursion(idx-2)

注意:

  1. 必須設置函數終止條件

  2. 使用遞歸優點是邏輯簡單清晰,缺點是過深調用導致棧溢出

 

函數的作用域

  1. 外部不能訪問函數內部變量

  2. 函數內部能夠訪問外部變量

  3. 函數內部不能修改外部變量,強行修改需要加 global 外部變量 = 新值

  4. 函數內部和函數外部變量名可以相同,但需要注意訪問優先級

# 例子一,內部訪問同名變量,不要在內部變量定義之前去訪問
g = 1

def foo():
    print(g)  # 報錯 UnboundLocalError: local variable 'g' referenced before assignment 
    g = 2
    print(g)  # 2

foo()
print(g)  # 1

# -------------------- #

# 例子二,採用global關鍵字,會把內部變量g聲明成全局變量,從而在函數內部可以改變全局變量
g =1

def foo():
    global g
    print(g) # 1
    g =2
    print(g) # 2

foo()
print(g) # 2

 

函數式編程

高階函數

map

用法:map(函數名,列表/元組/集合/字符串)

說明:把傳入的函數依次作用於每個元素,處理完後返回的是生成器類型,需要用list生成數據

li =[1, 2, 3, 4, 5]

def add1(x):
    return x +1

add_li =list(map(add1, li)) # [2, 3, 4, 5, 6]

 

filter

用法:filter(函數名, 列表/元組/集合/字符串)

說明:filter()把傳入的函數依次作用於每個元素,然後根據返回值是 True 還是 False 決定保留還是丟棄該元素,處理完後返回的是生成器類型,需要用list生成數據​​​​​​​​​​​​​​

li =[1, 2, 3, 4, 5, 6]

def ven_num(n):
    if n%2==0:
        return n

even_li =list(filter(even_num, li)) # [2,4,6]

​​​​​​​

reduce()

用法:reduce(函數名,列表/元組/集合/字符串)

說明:reduce() 用於對參數序列中元素進行累積。python3 中,reduce 已經被從全局名字空間裏移除了,它被放置在functools模塊裏

from functools importreduce


li =[1, 2, 3, 4, 5]
m =reduce(lambda x, y : x+y, li)   # m=15

 

返回函數(函數名作爲返回值返回)​​​​​​​

def outer_foo(*args):
    def inner_foo():
        for i in args:
            print(i)
    return inner_foo

​​​​​​​f = outer_foo(1, 2, 3, 4, 5)
f()  # 1 2 3 4 5

 

函數的閉包​​​​​​​

# 典型案例1:
# 外部函數只是返回了函數名的列表,但並沒有調用。等到內部函數被調用的時候,外部函數已經迭代完畢,最終的i變成3,所以f1()、f2()、f3()相當於執行了三次f(),返回3*3=9

​​​​​​​def count():
    fs =[]
    for i inrange(1, 4):
        def f():
            return i*i
        fs.append(f)
    return fs
    
f1, f2, f3 = count()
print(f1())   # 9
print(f2())   # 9
print(f3())   # 9
# 典型案例2:
# 外部函數返回的是內部函數名的調用,所以結果和案例1不相同
def count():
    def f(j):
        def g():
            return j*j
        return g
    fs =[]
    for i inrange(1, 4):
        fs.append(f(i)) # f(i)立刻被執行,因此i的當前值被傳入f()
    return fs

​​​​​​​f1,f2,f3 = count()
print(f1())  # 1
print(f2())  # 4
print(f3())  # 9

 

匿名函數

語法:lambda 形參:含形參的表達式​​​​​​​

f = lambda x:x+1

print(f(1)) # 2

lambda 返回的是函數名(函數地址)

lambda 常常與map、filter、reduce、sorted等聯合使用

 

關於作者

github:https://github.com/GitDzreal93/dev-tester
微信公衆號:測試開發guide

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章