Python 深入淺出 - 函數

函數

函數:定義函數,把參數的名字和位置確定下來,函數的接口定義就完成了,對於函數的調用者來說,只需要知道如何傳遞正確的參數,函數的內部細節被封裝起來,調用者無需關心。

定義函數

Python 中,使用 def 語句定義一個函數。依次是 函數名,括號,括號中的參數和冒號,然後,在縮進塊中編寫函數體,函數的返回值使用 return 語句返回.

注意:函數一旦執行到 return 時,函數就執行完畢,並將結果返回;如果沒有 return 語句,函數執行完畢後也會返回結果,只是結果爲 None.

例如:

(1) 有 return 語句:

def add(a,b):
    return a + b

print(add(1,2))   

輸出結果: 3

(2) 沒有 return 語句:

def add_no_return(a,b):
    a+b

print(add_no_return(1,2))

輸出結果:None

空函數

空函數什麼事都不做,使用 pass 語句。

def nofunc():
    pass

返回多個值

Python 中函數可以返回多個值。

def getValue(x,y):
    return x,y
print(getValue(3,6))

輸出結果:(3, 6) ,是 tuple 數據類型

默認參數:

def power(x,n = 2):
    s =1
    while(n>0) :
        n = n-1
        s = s*x
    return s

上例中,參數 n 即是默認參數,當調用該函數時,沒有傳遞第二個參數時,n 默認就等於 2。

def power(x,n = 2):
    res = 1
    while(n>0):
        res = res * x
        n = n-1
    return res

print(power(3))
print(power(3,2))

輸出結果:輸出結果一樣,都是 9

注意:

  • 必選參數在前,默認參數在後,否則會報錯。
  • 當函數有多個參數時,把變化大的參數放在前面,變化小的參數放在後面。變化小的參數就可以作爲默認參數。

可變參數

可變參數:就是傳入的參數個數是可變的,可以是 1 個,2 個,或任意個。

如何定義:定義可變參數和定義一個 list 或 tuple 參數類似,僅僅是在參數前面多加一個 * 號,在函數內部,其實是接收一個 tuple,所以可以傳遞任意個參數。

def calc(* numbers):
    sum = 0
    for num in numbers:
        sum = sum + num
    return sum

print(calc(1,2,3))
print(calc())

輸出結果:

6

3

可變參數優勢:可變參數和 list 或 tuple 參數相比,優勢在於在調用函數時,不用事先構造一個 list,tuple 傳遞進去。

如果已經有一個 list 或 tuple,要調用一個可變參數怎麼辦?

Python 允許在 list 或 tuple 前面加一個 * 號,把 list 或 tuple的元素變成可變參數傳進去。

nums=[2,3,4]
print(calc(*nums))

關鍵字參數

可變參數允許傳入任意個參數,這些可編程參數在函數調用時自動組裝爲一個 tuple,而關鍵字參數允許你傳入 0 個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個 dict.


函數高級特性

切片

取出 list 或 tuple 中部分元素,Python 提供了非常方便的方法。

常規方法 - while 循環:

arr=["java",True,11,22.11]
res = []
n = 3;
for i in range(n):
    res.append(arr[i])

print(res)

Python 提供的切片操作符:

print(arr[0:3])

arrp[0:3] 表示,從索引 0 開始取,直到索引 3 爲止,但不包括索引 3,即索引 0,1,2.一共 3 個元素(如果第一個索引是 0 ,則可以省略)。

當然,也可以是任意索引位置開始。

print(arr[1:2])

倒數切片:
倒數第一個元素的索引是 -1,取出後 2 個元素。

print(arr[-3:-1])

什麼都不寫,只寫 [:] 就可以原樣複製一個 list:

print(arr[:])

字符串切片
字符串 ‘abcdef’ 也可以看成是一種 list,每一個元素就是一個字符,因此,字符串也可以使用切片操作。操作的結果仍是字符串。

print("abcdef"[:3])

迭代

Python 中的迭代比 C,Java 中的迭代更加強大,即使迭代的數據類型沒有下標的,只要是可迭代對象,都可以迭代。

例如:迭代出 dict 中的 key,value 值(dict 不是按照 list 的方式順序排列,所以,迭代出來的結果順序可能不一樣):

迭代 dict :
op_map = {"Android":"Google","iOS":"Apple"}
for op_key in op_map:
    print(op_key)

輸出結果:

Android

iOS

默認情況下,迭代 dict,迭代的是 key 值,要想迭代出 value 值,需要使用 for value in dict.values()

op_map = {"Android":"Google","iOS":"Apple"}
for op_value in op_map.values():
    print(op_value)

輸出結果:

Google

Apple

同時迭代 key ,value

op_map = {"Android":"Google","iOS":"Apple"}
for op_key,op_value in op_map.items():
    print("key = " + op_key + ",value = " + op_value)

輸出結果:

key = Android,value = Google

key = iOS,value = Apple

迭代字符串 :
for ch in "abc":
    print(ch)

通過 collections 模塊的 Iterable 類型判斷,是否是可迭代類型

from collections import Iterable
print(isinstance("abc",Iterable))  # True
print(isinstance(123,Iterable))  # False
print(isinstance([1,2,3],Iterable)) # True

list 下表循環:

for i,ch in enumerate(["a","b","c"]):
    print(i,ch)

輸出結果:

0 a

1 b

2 c

列表生成式

li = list(range(1,10))
print(li)

輸出結果:
[1, 2, 3, 4, 5, 6, 7, 8, 9],可以看出,range(a,b) 是不包括 b的,

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