鮮為人知的 Python 語法

2021-08-25 11:09:46 字數 3777 閱讀 7259

所有人(好吧,不是所有人)都知道 python 是一門用途廣泛、易讀、而且容易入門的程式語言。

但同時 python 語法也允許我們做一些很奇怪的事情。

眾所周知 python 的 lambda 表示式不支援多行**。但是可以模擬出多行**的效果。

def f():

x = 'string'

if x.endswith('g'):

x = x[:-1]

r = ''

for i in xrange(len(x)):

if x[i] != 'i':

r += x[i]

return r

f()-> 'strn'

雖然看起來很奇怪,但是上面的函式可以使用下面的lambda表示式函式代替:

(lambda: ([x for x in ['string']], x.endswith('g') and [x for x in [x[:-1]]], [r for r in ['']], [x[i] != 'i' and [r for rin [r+x[i]]] for i in xrange(len(x))], r)[-1])()

-> 'strn'

永遠不要在生產環境寫這樣的** :)

現代的 python 提供了更簡便的語法:

b if a else c

也可以通過下面的方式重寫:

(a and [b] or [c])[0]

(b, c)[not a]

順便說一下,下面的變體是錯誤的:

a and b or c

true and  or [1] -> [1], but:  if true else [1] -> 

讓我們來把字串x = 'tteesstt'轉換成'test'吧。

''.join(['' if i and j == x[i-1] else j for i,j in enumerate(x)]

2.把前乙個字元儲存到臨時變數中:

''.join([('' if i == a else i, [a for a in [i]])[0] for a in [''] for i in x])

[(not r.endswith(i) and [r for r in [r+i]], r)[-1] for r in [''] for i in x][-1]

4.通過 reduce 函式和 lambda 表示式:

reduce(lambda a, b: a if a.endswith(b) else a + b, x)

1.把中間值儲存在列表中

2.把中間值儲存到字典中:

[i for x in [(lambda: (l['a'], l.update(), l['b'], l.update())[::2])() for l in  for x in xrange(10)] for i in x]

[i for x in [(l['a'], l.update(), l['b'], l.update())[::2] for l in for x in xrange(10)] for i in x]

3.通過 reduce 函式和 lambda 表示式:

reduce(lambda a, b: a + [a[-1] + a[-2]], xrange(10), [1, 1])

4.速度最快的變體:

1.複製列表:

l = [1, 2, 3]

m = l[:]

m-> [1, 2, 3]

2.移除/替換 列表中的任意元素:

l = [1, 2, 3]

l[1:-1] = [4, 5, 6, 7]

l-> [1, 4, 5, 6, 7, 3]

3.在列表的開頭新增元素:

l = [1, 2, 3]

l[:0] = [4, 5, 6]

l-> [4, 5, 6, 1, 2, 3]

4.在列表的尾部新增元素:

l = [1, 2, 3]

l[-1:] = [l[-1], 4, 5, 6]

l-> [1, 2, 3, 4, 5, 6]

5.反轉列表:

l = [1, 2, 3]

l[:] = l[::-1]

python 阻止替換類例項中的方法,因為 python 給類例項中的方法賦予了唯讀屬性:

class a(object):

def x(self):

print "hello"

a = a()

def y(self):

print "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 n in c:

return c[n]

if (n < 2):

r = 1

else:

r = n * f(n - 1)

c[n] = r

return r

f(10)

-> 3628800

f.func_defaults

(,)

2.斐波拉契數列:

def fib(n, c={}):

if n in c:

return c[n]

if (n < 2):

r = 1

else:

r = fib(n - 2) + fib(n - 1)

c[n] = r

return r

fib(10)

-> 89

fib.func_defaults[0].values()

-> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

C 鮮為人知的符號

目錄 1 1.引言 1 2.少為人知的符號表1 1 2.1.符號表 1 2.2.示例 2 3.少為人知的符號表2 2 3.1.符號表 2 3.2.示例 3 這些鮮為人知的c 符號,可直接在 中使用,但實踐中不推薦這麼做,可作為茶餘飯後的樂趣了解c 的另一面。雖然它們鮮為人知,但卻不是gnu g 獨有...

parseInt鮮為人知的用法

var float num 3.14 float num parseint float num console.log float num var str num 3.14string str num parseint str num console.log str num 注意 parseint轉...

鮮為人知的C 特性

翻譯至 小括號的寫法 以下寫法等價 ptr 3 ptr 3 3 ptr 3 ptr most vexing parse 這個問題,可以通過加小括號規避 運算子 字母和符號 the tokens and,and eq,bitand,bitor,compl,not,not eq,or,or eq,xor...