Python自定義函式

2021-10-02 05:00:56 字數 4551 閱讀 8825

可選引數是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)

這個我們稱之為鏈條,顧名思義他是遞迴繼續下去的乙個鏈條

如果我們沒有基例全是鏈條的話那麼我們將無法終止這個遞迴迴圈

相信很多剛學遞迴的同學在尋找遞迴鏈條的時候極其難受,那麼我們如何尋找遞迴鏈條呢?

尋找遞迴鏈條最重要的思想就是找到nn-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"

))

該函式的遞迴鏈條,換句話說就是nn-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 ...