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...