可選引數是python的乙個特性,顧名思義就是這個引數是可有可沒有的。如果你學過其他的語言,那麼你會很清楚明白他的不同點的。
def
fun(n,m=1)
: s=
1for i in
range(1
,n+1):
s*=i
return s//m
'm就是可選引數,如果在呼叫他的時候不給m就預設為1'
'eg1'fun(10)
>>
>
3628800
'這裡的m預設為1'
'eg2'fun(10,
5)>>
>
725760
'這裡的m為5'
'python還提供了名稱傳遞的功能,必須引數名相同'
'eg2的例子'fun(m=
5,n=10)
>>
>
725760
'名稱傳遞就可以不遵守位置傳遞的要求了,但是名稱必須相同'
可選引數必須寫在所有的必選引數之後
可變引數並不是說這個引數的值可以發生改變,而是說這個引數的數量是不確定的。你可以傳任意個。
python裡用引數名來表示可變引數,如果學過c語言的盆友不要把他當成指標了。
def
fun(n,
*b):
'b是可變引數名'
s=1for i in
range(1
,n+1):
s*=i
for item in b:
s*=item
return s
a=
4deff(
):print
(a) a=5f(
)print
(a)>>
>unboundlocalerror: local variable 'a' referenced before assignment
'a變數未定義'
a=
4deff(
):a=
5print
(a)f(
)print
(a)>>
>
5>>
>
4
4是全域性變數的a,5是區域性變數的a。
怎麼讓f()函式裡的a與外面一致呢?我們需要用到global修飾符
a=
4deff(
):'global a=5這樣的寫法是不允許的'
global a
a=5print
(a)f(
)print
(a)>>
>
5>>
>
5
python的返回值可以返回多個值,返回的值用逗號隔開
事實上python內部會把這些值打包成元組型別,雖然元組型別一旦建立不可修改,但是獲得這些返回值的並不是元組型別,所以能被修改。
def
fun(a,b,c)
:return a,b,c
'return的a,b,c會被打包成元組型別'
y,z=fun(2,
3,20)
'但是x,y,z並不是元組型別,所以可以對x,y,z進行操作'
print
(x,y,z)
>>
>2,
3,20
需要注意的是返回多個值會用元組型別來裝
lambda函式是一種緊湊形式一般不建議使用
f=
lambda x,y:x+y
print
(f(10,15
))>>
>
25y=
lambda
:'我愛pyhon'
print
(y()
)>>
>我愛python
函式遞迴是自定義函式裡不得不說的乙個點
1.基例
2.遞迴鏈條
'基例'
if n==0:
return
1
這就是這個遞迴的基例(基礎樣例?),因為如果每次就是
'遞迴鏈條'
else
:return n*fact(n-
1)
這個我們稱之為鏈條,顧名思義他是遞迴繼續下去的乙個鏈條
如果我們沒有基例全是鏈條的話那麼我們將無法終止這個遞迴迴圈
相信很多剛學遞迴的同學在尋找遞迴鏈條的時候極其難受,那麼我們如何尋找遞迴鏈條呢?
尋找遞迴鏈條最重要的思想就是找到n和n-1的關係
下面放上我個人認為乙個非常棒的例子
'字串逆置'
'''不管是rvs還是anotherrvs函式自然都成功逆置了字串
但是注意他們的遞迴鏈條'''
defrvs
(s):
if s=="":
return s
else
:return rvs(s[1:
])+s[0
]def
anotherrvs
(s):
if s=="":
return s
else
:return s[-1
]+anotherrvs(s[:-
1])print
(rvs(
"hello"))
print
(anotherrvs(
"world"
))
該函式的遞迴鏈條,換句話說就是n與n-1的關係是把n字串[1:]切片然後把字串[0]放到字串末尾來實現的逆置。
我之所以認為這是乙個很好的例子恰恰就是因為他,anotherrvs()函式的遞迴鏈條與rvs()函式的遞迴鏈條恰恰相反,他是通過字串[:-1]切片然後把字串[-1]給放到字串開頭來實現的逆置
迭代與遞迴非常相似我這裡貼乙個我覺得非常棒的一篇文章吧
點這裡(´▽`)ノ (´▽`)ノ (´▽`)ノ 遞迴與迭代的區別
如果覺得麻煩我就稍微講講我從這篇文章中讀到的東西
熟悉遞迴的同學都知道,乙個使用了遞迴思想的自定義函式是層層呼叫,一直呼叫的最後一層也就是基例層,才開始return結果並層層往上回溯,最後得到n層的結果並輸出出來
迭代呢,它更像是乙個環,或者說某種程度上迭代就是遞迴,遞迴就是迭代,但是如果就是遞迴的話,為什麼還要取名叫迭代呢?所以還是有區別的,而區別就是他們的外在表現不同。
上面也說了迭代像乙個環,同樣的問題迭代在自定義函式裡迴圈解決了,這樣說肯定非常抽象,下面放出乙個問題的遞迴和迭代寫法
我們拿上面計算階乘問題來說明吧
'fun1是遞迴'
deffun1
(n):
if n==1:
return
1else
:return n*fun1(n-1)
'fun2是迭代'
deffun2
(n):
consequence=
1for i in
range(1
,n+1):
consequence=consequence*i
return consequence
defmain()
:print
("fun1的結果是"
.format
(fun1(3)
))print
("fun2的結果是"
.format
(fun2(3)
))main()==
====
====
====
====
= restart: c:\users\users\desktop\123.py ==
*****==
====
==fun1的結果是6
fun2的結果是6
>>
>
接下來就是意會時間了ᕙ༼ ͝°益° ༽ᕗ (*^o^)人(^o^*) python自定義函式
在python中有一種自定義函式為匿名函式,可以用lambda關鍵字定義。通過lambda構造的函式可以沒有名稱,最大的特點是在自定義匿名函式時所有 只能在一行內完成,語法如下 lambda parameters function expressionlambda為匿名函式的關鍵起始詞 parame...
Python自定義函式
python中的自定義函式,其理解意思相當於c 中的自定義方法,但是建立的方式不同。說他與c 的方法相同,那麼就自然有 無引數無返回值,有引數無返回值,無引數有返回值,有引數有返回值。函式 建立函式 無引數無返回值 deffunction print 輸出依據 print 呼叫 函式呼叫 funct...
自定義引數 Python自定義函式引數
1.種類 1 位置引數 x就是位置引數 usr bin env python coding utf 8 def power x result x x print result 2 預設引數n就是預設引數 usr bin env python coding utf 8 def power x,n 1 ...