Python 語言有什麼奇技淫巧嗎?

時間 2021-05-05 20:24:31

1樓:然然然

詳細講乙個,很多人都見過,但總是用不出來的技巧。

result=[

xforxin

range(10

)]print

(result

)#輸出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

[ expression-involving-loop-variableforloop-variableinsequence ]

最簡單的應用,比如我們要建立乙個二維的列表,由[1,2,3]和[4,5,6]配對組成。

基礎的寫法是:

result=

foriin[

1,2,

3]:forjin[

4,5,

6]:temp=[

i,j]

result.(

temp

)print

(result

)#輸出:[[1, 4], [1, 5], [1, 6], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6]]

但其實這個可以一行搞定:

result = [[x, y] for x in [1,2,3] for y in [4,5,6]]

print(result)

#輸出:[[1, 4], [1, 5], [1, 6], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6]]

相信很多人和我之前一樣,在Stack Overflow搜的時候,見過這樣的寫法,但可能一直不確定它的語法。

它的語法其實是這樣的:

[ expression-involving-loop-variablesforouter-loop-variableinouter-sequenceforinner-loop-variableininner-sequence ]

也就是先寫帶變數(variable)的表示式(expression),再跟上連續的for in。

還可以在這個基礎上進一步做篩選:

[ expression-involving-loop-variableforloop-variableinsequenceifboolean-expression-involving-loop-variable]

加上 x+y==7:

result=[[

x,y]

forxin[

1,2,

3]foryin[

4,5,

6]ifx

+y==7

]print

(result

)#輸出:[[1, 6], [2, 5], [3, 4]]

2樓:rice0208

我說幾個吧

第乙個是for...else...語句

就是for在執行到一半break了的話,那麼else不執行,如果for執行到底,那麼執行else。

第二個是類似於三元運算的東西

(value a) if (boolean) else (value b)

很神奇的用法,如果boolean成立,上面的東西返回a,否則返回b

這種用法真的很有用(而且節省空間)

比如執行程式只遍歷模7餘2或余6的正整數就可以這樣i=

2while

True

:#or some else condition

# your codei+=

(4ifi

%7==2

else3)

還有列表操作符,這個真的流氓:[i

foriin(

list

)]比如1,2,3,...,1000可以這麼打![(i

+1)foriin

range

(1000

)]所以你見過這種玩法嗎:

>>>[(i

+1)if

i%2==

1else

iforiin

[jifj

%2==0

else

0forjin

range(10

)]][0,

0,2,

0,4,

0,6,

0,8,

0]# 等價於

# [i if i%2 == 0 else 0 for i in range(10)]

# 又等價於

# a = list()

# for i in range(10):

# if i%2 == 0:

# else:

(等價於:將range(10)中所有奇數數值替換成0,不仔細讀讀真看不出來)

用來在Python入門的朋友面前耍花招還是百玩不厭的

但話說回來,這種用法只要不停地化為最簡演算法,真的簡便(雖然可讀性不咋地)

3樓:Kris

1.字串右側對齊,左側補0,如1變成001方法1:

''' str.rjust(width,'0') '''

input

:'1'

.rjust(3

,'0'

)output

:'001'

方法2:

''' str.zfill(width) '''

input: '1'.zfill(3)

output: '001'

方法3:

''' '%07d' % n '''

input: '%03d' % 1

output:'001'

2.神奇的intern機制

>>> s1="hello"

>>> s2="hello"

>>> s1 is s2

True

# 如果有空格,預設不啟用intern機制>>> s1="hell o"

>>> s2="hell o"

>>> s1 is s2

False

# 如果乙個字串長度超過20個字元,不啟動intern機制>>> s1 = "a" * 20

>>> s2 = "a" * 20

>>> s1 is s2

True

>>> s1 = "a" * 21

>>> s2 = "a" * 21

>>> s1 is s2

False

>>> s1 = "ab" * 10

>>> s2 = "ab" * 10

>>> s1 is s2

True

>>> s1 = "ab" * 11

>>> s2 = "ab" * 11

>>> s1 is s2

False

3.字串裡的縫隙

>>> "aabb".count("a")2>>> "aabb".count("b")2>>> "aabb".

count("ab")1>>> "aabb".count("")5奇怪了吧?不是應該返回0,怎麼是5了呢?

實際上Python看來,兩個字元之間都是乙個空字元,就是所謂的縫隙。因此,對於"aabb"來說是這樣的。

4樓:九四幹

用字典代替其他語言的 switch case比如實現乙個加減乘除函式:

defdemo(a

:int,b

:int

,opt

:str

)->int:tt=

returntt[

opt](a,

b)print

(demo(1

,1,"+"))

5樓:

隨便來乙個好玩的自加物件

>>>add=

type

('_',(

int,),

)>>>

add(1)

1>>>

add(1)(

2)3>>>

add(1)(

2)(3)(

4)(5)

15>>>

再來乙個管道操作

>>>from

functools

import

partial

>>>F=

type

('_',(

partial

,),)

>>>[2

,3]|

F(sum)

5>>>

range(10

)|F(

filter

,lambdax:

x%2)

|F(sum)25

>>>

6樓:程式設計小寶

奇技淫巧之bisect模組的巧妙使用

首先看下bisect模組結構內容.

>>>import bisect

>>> dir(bisect)

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'bisect', 'bisect_left', 'bisect_right', 'insort', 'insort_left', 'insort_right']

# 或者採用這種方式好看一點

>>> import bisect

>>> [print(i) for i in dir(bisect)if i.find('__') == -1]

bisect

bisect_left

bisect_right

insort

insort_left

insort_right

[None, None, None, None, None, None]

>>>1.其實bisect 就是在呼叫 bisect_right

(1)首先直接呼叫bisect.bisect(li, 3)來看看

importbisect li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3] li.sort() print(li) # 此時排序後的li = [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123] print(bisect.bisect(li, 3))

輸出為[1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123] 2

(2)然後呼叫bisect.bisect_right(li, 3)在看

importbisect li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3] li.sort() print(li) # 此時排序後的li = [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123] print(bisect.bisect_right(li, 3))

輸出為[1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123] 2

(3)檢視原始碼bisect_right(a, x, lo=0, hi=None)

——其目的在於查詢該數值將會插入的位置並返回,而不會插入。如果x存在在a中則返回x右邊的位置

defbisect_right(a, x, lo=0, hi=None): # a 原列表 # x 插入的元素 # lo 起始位置預設值為0 # hi 結束位置預設值為len(a) # 如果起始位置小於0 則報錯iflo < 0raiseValueError('lo must be non-negative') # 如果沒有結束位置則預設為列表的長度ifhiisNonehi = len(a) # 二分法whilelo < himid = (lo+hi)//2ifx < a[mid]: hi = midelse:

lo = mid+1 # 僅返回位置returnlo bisect = bisect_right # backward compatibility ☆該注釋存在原始碼中

2.我們再來看bisect_left()

(1)首先我們呼叫bisect.bisect_left(li, 3)

輸出為如果大家在學習中遇到困難,想找乙個python學習交流環境,可以加入我們一起學習

正在跳轉

Mathematica 有什麼奇技淫巧?

Araneida 需要對錶進行具有複雜規則的map操作時,某些情況下可以先轉成字串,然後用正規表示式或者模式匹配規則來插入運算子 甚至函式,這個沒試過 最後再用ToExpression轉換為表示式計算 這個方法的優點在於,很多情況下,正規表示式 模式匹配要靈活許多 francium bobo 對於函...

PHP 有什麼奇技淫巧?

hsldymq phpclassA obj new A function bindTo obj obj 在類作用域外呼叫私有函式.有時候我會用來測試一些重要私有方法.偶爾會有一些比較特殊的臨時邏輯要上,用到了一些不是那麼良好設計的類私有方法 高先森 這樣寫 arr 1,2 list a,b expl...

JavaScript 有什麼奇技淫巧?

追風暖殤 使用void 0或void 0 代替undefined,因為undefined有可能被重新賦值,而void不用擔心這個問題 張可韓 function isInside node,target 用for loop,不用recursion,遍歷node. 野山椒雞雜 限定乙個數的的界限,比如在...