學習目標: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 ...