新手入門必學之Python 語法
Linux編程
點擊右側關注,免費入門到精通!
作者丨Python農夫
https://www.jianshu.com/p/08aaed579e29
Python 是一門用途廣泛、易讀、而且容易入門的編程語言。
但同時 Python 語法也允許我們做一些很奇怪的事情。
使用 lambda 表達式重寫多行函數
眾所周知 python 的 lambda 表達式不支持多行代碼。但是可以模擬出多行代碼的效果。
def f ()
x =
"string"
if
x.endswith("g"
):x = x[
:-1
]r =
""
for
iin
xrange(len(x)):if
x[i] !="i"
:r += x[i]
return
rf()
->
"strn"
雖然看起來很奇怪,但是上面的函數可以使用下面的 lambda 表達式函數代替:
([x for in "string" "g" and for in -1(lambda:
]]], [r
for
rin
[""
]], [x[i] !="i"
and
[rfor
rin
[r+x[i]]]for
iin
xrange(len(x))], r)[-1])
()
->
"strn"
永遠不要在生產環境寫這樣的代碼
三元運算符
現代的 python 提供了更簡便的語法:
if elseb
也可以通過下面的方式重寫:
a and [b] or [c] [0](
(
b
,c
)[not a]
順便說一下,下面的變體是錯誤的:
and or True and or 1 1 if True else 1a
通過列表推導式移除重複的元素
讓我們來把字元串 x = "tteesstt" 轉換成 "test" 吧。
1.在原字元串中和上一個字元比較:
"" "" if and -1 else for in
2.把前一個字元保存到臨時變數中:
"" "" if else for in 0 for in "" for in "" "" if else 0 for in [[""]] for in
3.在新字元串中和上一個字元比較:
(not r.endswith(i) and [r for r in [r+i -1 ""[
4.通過 reduce 函數和 lambda 表達式:
lambda if elsereduce(
通過列表推導式獲得斐波拉契數列
1.把中間值保存在列表中
-1 -1 -2 0 1 1 19 -1 -1 -2 0 1 1 19[(lambda: (l[
[(l[
2.把中間值保存到字典中:
for in lambda "a" "a" "a" "b" "b" "b" "a" "b" 2 for in "a" 1 "b" 1 for in 10 for in for in "a" "a" "a" "b" "b" "b" "a" "b" 2 for in "a" 1 "b" 1 for in 10 for in[i
[i
3.通過 reduce 函數和 lambda 表達式:
reduce lambda a b a [a[-1] a [-2] xrange [1, 1] reduce lambda a b a .append a [-1] a [-2] or a xrange [1, 1]
4.速度最快的變體:
l.append(l[-1 -2 [1, 1[
使用列表推導式產生死循環
[a.append(b) for a in [[None]] for b in a]
1.複製列表:
l = [1, 2, 3]
m = l[:]
m
-> [1, 2, 3]
2.移除/替換 列表中的任意元素:
l[1:-1] = [4, 5, 6, 7]l = [1, 2, 3]
l
-> [1, 4, 5, 6, 7, 3]
3.在列表的開頭添加元素:
l = [1, 2, 3]
m = l[:]
m
-> [1, 2, 3]
4.在列表的尾部添加元素:
l[-1:] = [l[-1], 4, 5, 6]l = [1, 2, 3]
l
-> [1, 2, 3, 4, 5, 6]
5.反轉列表:
l[:] = l[::-1]l = [1, 2, 3]
替換方法位元組碼
Python 阻止替換類實例中的方法,因為 python 給類實例中的方法賦予了只讀屬性:
class A object
def
x
(
self
):"hello"
a = A()
def
y
(
self
):"world"
a.x.im_func = y
->
TypeError:
readonly attribute但是可以在位元組碼的層面上進行替換:
a.x.im_func.func_code = y.func_code
a.x()
->
"world"
注意! 這不僅對當前的實例有影響,而且對整個類都有影響(準確的說是與這個類綁定的函數)(譯者注:此處應該是筆誤,推測作者原意是:準確的說是與這個函數綁定的所有類),並且所有其他的實例也會受到影響:
new_a = A()
new_a.x()
-> "world"
讓可變元素作為函數參數默認值
把可變對象作為函數參數的默認值是非常危險的一件事,並且在面試中有大量關於這方面棘手的面試問題。但這一點對於緩存機制非常有幫助。
1.階乘函數:
def f (n, c={})
if
nin
c:
return
c[n]if
(n <2
):r =
1
else:
r = n * f(n -
1
)c[n] = r
return
rf(
10
)->
3628800
f.func_defaults
({
1
:1
,2
:2
,3
:6
,4
:24
,5
:120
,6
:720
,7
:5040
,8
:40320
,9
:362880
,10
:3628800
},)2.斐波拉契數列:
def fib (n, c={})
if
nin
c:
return
c[n]if
(n <2
):r =
1
else:
r = fib(n -
2
) + fib(n -1
)c[n] = r
return
rfib(
10
)->
89
fib.func_defaults[
0
].values()-> [
1
,1
,2
,3
,5
,8
,13
,21
,34
,55
,89
]推薦↓↓↓
長
按
關
注
??
【
16個技術公眾號
】都在這裡!
涵蓋:程序員大咖、源碼共讀、程序員共讀、數據結構與演算法、黑客技術和網路安全、大數據科技、編程前端、Java、Python、Web編程開發、Android、iOS開發、Linux、資料庫研發、幽默程序員等。
TAG:Python開發 |