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