1樓:然然然
詳細講乙個,很多人都見過,但總是用不出來的技巧。
result=[
xforxin
range(10
(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
(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
(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. 野山椒雞雜 限定乙個數的的界限,比如在...