- Tip
Tip1: 設(shè)置循環(huán)的最大循環(huán)次數(shù)
sys.setrecursionlimit(1000)
Tip2: 函數(shù)返回多個值,返回的類型為一個元組督惰,包含返回的多個值,接收返回值的時候醉锄,可以定義多個變量來接收元組中的值州既,避免使用元組的下標(biāo)來取返回值。
- 序列解包:元素的個數(shù)要相等
a = 1, 3, 4
print(type(a))
# <class 'tuple'>
a1, a2, a3 = a
函數(shù)的參數(shù)
- 必須參數(shù):
- 必須傳入的參數(shù)
- 默認參數(shù):
- 變化小的參數(shù)可以設(shè)置為默認參數(shù)羔巢,給定默認值望忆,調(diào)用時可以不用傳入默認參數(shù),使用默認值
- 必選參數(shù)在前竿秆,默認參數(shù)在后
- 調(diào)用時启摄,如果不按順序提供默認值的時候,需要把參數(shù)名寫上
enroll('Adam', 'M', city='Tianjin')
- ==默認參數(shù)必須指向不變對象幽钢!==
def add_end(L=[]):
L.append('END')
return L
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']
Python函數(shù)在定義的時候歉备,默認參數(shù)L的值就被計算出來了,即[]匪燕,因為默認參數(shù)L也是一個變量蕾羊,它指向?qū)ο骩],
每次調(diào)用該函數(shù)帽驯,如果改變了L的內(nèi)容龟再,則下次調(diào)用時,默認參數(shù)的內(nèi)容就變了尼变,不再是函數(shù)定義時的[]了利凑。
- 可變參數(shù):==允許傳入0個或多個參數(shù),自動組裝為一個tuple==
- 如果不用可變參數(shù)嫌术,需要將參數(shù)設(shè)置為一個list或者tuple:
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc([1, 2, 3])
14
>>> calc((1, 3, 5, 7))
84
可以簡化成這樣:
>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84
- ==使用可變參數(shù)哀澈,在可變參數(shù)前加*,就成為了可變參數(shù)度气,調(diào)用時也可以簡化傳入==
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc(1, 2)
5
>>> calc()
0
如果已經(jīng)有一個list或者tuple日丹,在list或tuple前面加一個*號,把list或tuple的元素變成可變參數(shù)傳進去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
- 關(guān)鍵字參數(shù):==傳入0個或任意個含參數(shù)名的參數(shù)蚯嫌,函數(shù)內(nèi)部自動組裝為一個dict==
- **kw
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
- 先組裝出一個dict哲虾,然后丙躏,把該dict轉(zhuǎn)換為關(guān)鍵字參數(shù)傳進去:
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
**extra表示把extra這個dict的所有key-value用關(guān)鍵字參數(shù)傳入到函數(shù)的**kw參數(shù),kw將獲得一個dict束凑,
注意kw獲得的dict是extra的一份拷貝晒旅,對kw的改動不會影響到函數(shù)外的extra。
- 命名關(guān)鍵字參數(shù):
- 為了限制關(guān)鍵字參數(shù)只能傳入哪幾個關(guān)鍵字參數(shù)汪诉,用命名關(guān)鍵字參數(shù)废恋。
- 命名關(guān)鍵字參數(shù)需要一個特殊分隔符,后面的參數(shù)被視為命名關(guān)鍵字參數(shù)扒寄。
def person(name, age, *, city, job):
print(name, age, city, job)
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
- 如果中間有可變參數(shù)鱼鼓,則不需要用*來分割了。
- 命名關(guān)鍵字參數(shù)可以給出默認值
def person(name, age, *, city='Beijing', job):
print(name, age, city, job)
參數(shù)定義的順序
==必選參數(shù)==该编、==默認參數(shù)==迄本、==可變參數(shù)==、==命名關(guān)鍵字參數(shù)==课竣、==關(guān)鍵字參數(shù)==
對于任意函數(shù)嘉赎,都可以通過類似func(*args, **kw)的形式調(diào)用它
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}