python複習21 24lambda表示式和遞迴

2021-10-18 14:52:14 字數 4612 閱讀 1015

學習目標:lambda表示式和遞迴的方法

lambda表示式與def的區別

lambda表示式是乙個表示式,會建立乙個函式物件,但不會把函式物件賦給乙個識別符號,而def是乙個語句,會把函式物件賦值給乙個變數。

關於lambda表示式的使用:

>>

> g=

lambda x:

2*x+

1>>

> g(5)

11>>

> g=

lambda x:

2*x+

1>>

> f=

[g(x)

for x in

range(10

)]>>

>

print

(f)

syntaxerror: invalid character in identifier

>>

>

print

(f)[1,

3,5,

7,9,

11,13,

15,17,

19]>>

> g=

lambda x,y:x+y

>>

> g(3,

4)7

filter相當於乙個過濾器:

>>

>

list

(filter

(none,[

1,0,

false

,true])

)[1,

true

]>>

>

defodd

(x):

return x%

2>>

> temp =

range(10

)>>

> show =

filter

(odd,temp)

>>

>

list

(show)[1

,3,5

,7,9

]>>

>

list

(filter

(lambda x:x%2,

range(10

)))[

1,3,

5,7,

9]

map表示乙個對映關係

>>

>

list

(map

(lambda x:x%2,

range(10

)))[

0,1,

0,1,

0,1,

0,1,

0,1]

關於def與lambda的聯合使用

>>

>

deff

(n):

return

lambda s:s*n

>>

> d=f(2)

>>

>

print

(d(8))

16>>

>

print

(d('carrot'))

carrotcarrot

zip將兩個數以元祖的形式繫結在一起,下面介紹zip的解壓*zip

>>

> a=[1

,2,5

,6,7

]>>

> b=[2

,3,7

,8,9

]>>

>

list

(zip

(a,b))[

(1,2

),(2

,3),

(5,7

),(6

,8),

(7,9

)]>>

> a1,a2=

zip(

*zip

(a,b)

)>>

>

list

(a1)[1

,2,5

,6,7

]>>

>

list

(a2)[2

,3,7

,8,9

]

如果想以列表的形式打包,可以使用map:

>>

>

list

(map

(lambda x,y:

[x,y],[

1,2,

3,5,

6],[

2,6,

7,8,

9]))

[[1,

2],[

2,6]

,[3,

7],[

5,8]

,[6,

9]]

使用filter函式和lambda表示式求出100以內所有3的倍數:

>>

> a=

list

(filter

(lambda x:

not(x%3)

,range(1

,100))

)>>

> a[3

,6,9

,12,15

,18,21

,24,27

,30,33

,36,39

,42,45

,48,51

,54,57

,60,63

,66,69

,72,75

,78,81

,84,87

,90,93

,96,99

]>>

> a=

list

(filter

(lambda x:x if x%3==

0else

none

,range(1

,100))

)>>

> a[3

,6,9

,12,15

,18,21

,24,27

,30,33

,36,39

,42,45

,48,51

,54,57

,60,63

,66,69

,72,75

,78,81

,84,87

,90,93

,96,99

]

編寫函式f(x,y),計算並返回x的y次冪的值

#常規寫法

>>

>

deff

(x,y)

: result=

1for i in

range

(y):

result*=x

return result

>>

> a=f(2,

4)>>

>

print

(a)16

#遞迴寫法

>>

>

deff

(x,y)

:if y==0:

return

1else

:return x*f(x,y-1)

>>

> a=f(2,

4)>>

>

print

(a)16

遞迴求漢諾塔:將x盤移動到z盤

def

hanoi

(n,x,y,z)

:if n ==1:

print

(x,'--<'

,z)else

: hanoi(n-

1,x,z,y)

##將前n-1個盤子從x移動到y上

print

(x,'--<'

,z)#將最底下的最後乙個盤子從x移動到z

hanoi(n-

1,y,x,z)

#將y上的n-1個盤子移動到z上

#這裡中間的兩個z,x相當於中間變數

n=int

(input

('請輸入漢諾塔的層數:'))

hanoi(n,

'x',

'y',

'z')

改用遞迴方法判斷回文聯:

def

f(words,start,end)

:if start>end:

return

1else

:if words[start]

== words[end]

:return f(words,start+

1,end-1)

else:0

a=input

('請輸入一段文字:'

)end=

len(a)-1

if f(a,

0,end)

:print

('%s是乙個回文聯'

%a)else

:print

('%s不是乙個回文聯'

%a)

Python3學習筆記09 匿名函式lamdba

關鍵字lambda表示匿名函式,冒號前面,面的x表示函式引數。匿名函式有個限制,就是只能由乙個表示式,不用寫return,返回值就是該表示式的結果。匿名函式有個好處,因為函式沒有名字,不必擔心函式名稱衝突。此外,匿名函式也是乙個函式物件,也可以把匿名函式賦值給乙個變數,再利用變數來呼叫該函式 f l...

Python 基礎複習

類和物件 類 使用關鍵字class定義類 在類中能定義類成員變數和成員函式,類成員函式必須帶self引數 self是物件本身的引用,在成員函式中能引用self獲得物件的資訊 建構函式 def init self 通過預設引數實現多種方式構造物件 def init self,name color 析構...

複習python列表

list 1 1 2 3,4,1,2,1,1 count 自己實現乙個 count 函式 如果有返回 object 在list 1 中出現的次數 如果沒有返回 0def count list 1,object count 0for obj in list 1 if object obj count ...