Python 有什麼奇技淫巧?

時間 2021-05-05 21:21:11

1樓:jannchie見齊

Python字串格式化:

資料:data =

目標:輸出「我是見齊,是個程式設計師。「

字串拼接:

'我是'

+data

['name']+

',是個'

+data

['job']+

'。'使用格式化方案:

'我是{}

, 是個

{}。'

.format

(data

['name'

],data

['job'

])較簡單的格式化方案方案:'我是%s

, 是個

%s。'%(

data

['name'

],data

['job'

])更好的格式化方案:

'我是, 是個。'.

format

(name

=data

['name'

],job

=data

['job'

])更簡潔的格式化方案:

f'我是

, 是個

。'也很棒的格式化方案:

'我是, 是個。'.

format(**

data)

2樓:奇怪麵包

2行Python實現四則運算

利用 Python 強大的元程式設計能力,巧妙地實現四則運算(手動狗頭

3樓:SleepyBag

最近在做乙個「leetcode in one line」的專案,想要把 leetcode 上面的簡單題的都用 python 一行解決。

SleepyBag/leetcode-python-in-one-line

目前寫到 100 多題,遇到了很多困難。不過通過各種奇技淫巧,最終還是解決了。所以我覺得我可以來回答一下這個問題。下面列舉一下我用到的奇技淫巧:

lambda 函式大家應該都知道。只要用下面的語句

lambdax:

x+x就可以定義乙個返回兩個 x 的和的「用後即扔」的匿名函式。對於我的任務來說,這是乙個非常有用的特性:如果用 def 定義函式,那定義函式就要兩行。

而用 lambda 函式,我就可以在一行內定義+呼叫:

# 這個表示式的結果是乙個 list: [1, 2, 3, 1, 2, 3]

(lambda x: x + x)([1, 2, 3])

但是只能定義函式,那還遠遠不夠。更重要的問題是:lambda 函式如何遞迴呼叫自身呢?比如說對於這個問題:

力扣求二叉樹的最大深度。我們都知道定義如下的遞迴函式來解決:

def depth(node):

if node is Nonereturn 0

return max(depth(node.left), depth(node.right)) + 1

通過 if .. else 操作符,可以把函式體壓縮成一行:

def depth(node):

return 0 if node is None else max(depth(node.left), depth(node.right)) + 1

現在我們還要更短,壓成一行,就得把這個 depth 函式寫成 lambda 匿名函式。但是問題來了:

lambda 函式是沒有名字的,那在 lambda 函式裡,如何指定遞迴呼叫這個 lambda 函式呢?

當然 python 的語法是支援給 lambda 函式命名的:

square = lambda x: x * x

但是這樣的命名方式,命名在函式定義之後,想要遞迴呼叫,也已經晚了。

那怎麼辦呢?我們一步一步來:lambda 函式不能遞迴的原因是不知道自己的名字。那我們能不能把它的名字通過參數列給它呢?就像這樣:

lambda func, arg: func(func, arg)

lambda 函式本來只需要乙個引數 arg,現在我們再給它乙個引數 func,func 就是它自己的名字。那麼它就可以通過 func 這個名字遞迴呼叫自己了。呼叫的時候需要給兩個引數,第乙個還是自己的名字 func,第二個是它本來需要的引數 arg。

所以呼叫語句是 func(func, arg)。

然後我們就可以在定義 lambda 函式後給它乙個名字,然後再在呼叫的時候把它的名字給它自己:

func = lambda func, arg: func(func, arg)

ans = func(func, arg)

這樣,如何遞迴的問題就解決了。我們再來把它壓縮成一行。我們想在命名 func 的同時在同一行連續使用兩次 func。

這個問題和上面的求兩個 x 的和沒有本質的區別,定義乙個新的 lambda 函式並呼叫它就可以解決:

(lambda func, arg: func(func, arg))(lambda func, arg: func(func, arg), arg)

遞迴呼叫 lambda 函式,完美。

C / C++ 的語法支援這樣的表示式:

int a;

// a 與 b 都會被賦值為 3

int b = (a = 3);

而在 python 裡面,因為賦值表示式沒有值,所以這樣的表示式是非法的:

b = (a = 3)

而 python 3.8 引入了類似 C / C++ 的賦值操作符 :=,使得 python 裡這樣的操作成為可能:

b = (a := 3)

這個技巧對於壓縮行數非常有效。比如我們經常要先求乙個值,判斷它是否滿足條件,再決定是否返回它:

ans = solve()

if ans > 0:

return ans

else:

return -1

它可以壓縮成這樣:

ans = solve()

return ans if ans > 0 else -1

而如果要壓縮成一行,可能有人會這樣寫:

return solve() if solve() > 0 else -1

但是這樣寫是非常低效的,因為這樣要重複呼叫 solve 函式兩遍。而如果使用 := 操作符,就可以值呼叫一遍 solve 函式:

return ans if (ans := solve()) > 0 else -1

十分優雅(hun luan)。

上面說的 lambda 函式遞迴也可以用這個新特性改寫成下面的形式:

(func := lambda func, arg: func(func, arg))(func, arg)

這次確實是優雅了一點。

另外還有一些常見的 python 程式壓縮技巧,比如列表生成式之類的。不過我覺得比較常見,就不貼出來了。如果以後用到什麼新的「奇技淫巧」,我會在這裡更新的。

4樓:

實際上屬於正常操作

map和filter配合lambda,對習慣matlab的人來說簡直不要更順手,而且效率相比於迴圈來說可以說是天上地下

5樓:facert

functools.partial

import

socket

import

functoolss=

socket

.socket

(socket

.AF_INET

,socket

.SOCK_STREAM

)conn=s

.connect

(('localhost',80

))msgs=

# 普通寫法

while

True

:msg

=coon

.recv

(1024)if

msg:

msgs.(

msg)

else

:break

# iter and functools.partial 的寫法formsg

initer

(functools

.partial

(conn

.recv

,1024),b

''):

msgs.(

msg)

6樓:曠修

乙個小技巧,將乙個 list 中的多個 list 合併為乙個 list。有點繞,其實就是將類似如下形式的 list:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

轉化為:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

很多人第一時間肯定會想到用迭代器

[j for i in l for j in i]

但是,我猜應該有很多人不知道,Python 的內建函式 sum 同樣可以用來幹這樣一件事:

sum(l, )

sum 有兩個引數,第二個引數可以用來指定乙個初始值:

sum(sequence[, start]) -> value

Return the sum of a sequence of numbers (NOT strings) plus the value

of parameter 'start' (which defaults to 0). When the sequence is

empty, return start.

這裡的原理其實是:

+ [1, 2, 3] + [4, 5, 6] + [7, 8, 9]

比較了一下用迭代器和sum函式所花的時間,發現 sum 略快:

7樓:豬豬專業戶

iter

(lambda

:object

()>object

(),object

())# toggle iterator in Python 2

8樓:jb jb

乙個key:vlaue pair, key是可變的(間接可變):

首先: unhashable 的字典是不可以作key的:

>>> kv_pair = : }

Traceback (most recent call last):

File "", line 1, in

TypeError: unhashable type: 'dict'

然後:class key_class():

def __init__(selfself.mm ={}key = key_class()

value =

kv_pair =

>>> kv_pair

}>>> for each in kv_pairprint(each.mmgt;>> id(kv_pair)

139957307056456

key.mm =

>>> for each in kv_pairprint(each.mm)

...>>> id(kv_pair)

139957307056456

9樓:李巨集杰

最近在看書,寫點學到的新東西:

print('some string', file=open('filename', 'w'))

#神奇之處在於所見即所得, 外加所有str mrthod, 再加乙個format, 真是強大到不行.

Pok mon GO 有什麼奇技淫巧?

Lu Jia 最近剛剛發現的。每個寵物進化時除了要注意測算他的IV值之外,就是身材.攻擊 防守和體力,還要注意它的特殊攻擊的型別。同型別的攻擊會有50 傷害加成。下圖同樣兩個暴鯉龍.乙個特殊攻擊是 dragon 乙個是 water 後者要明顯好於前者。同樣的例子,寶石海星居然是rock特殊攻擊。廢物...

MATLAB 有什麼奇技淫巧?

鮑里斯 運算的加速 bsxfun cellfun 可以將for迴圈速度提高幾個數量級。如果實在懶得寫,可以寫個mex介面呼叫c c 來執行迴圈。只不過在處理影象時,matlab和opencv影象矩陣的index不同。劃重點 從我能熟練運用matlab開始到現在大概四年時間,我發現我用到的幾乎所有的功...

Java 有什麼奇技淫巧?

rainoftime 選自 名詞王國裡的死刑 For the lack of a nail,throw new HorseshoeNailNotFoundException no nails For the lack of a horseshoe,EquestrianDoctor.getLocalI...