40个你可能不知道的Python技巧附代码
1、拆箱
>>>a,b,c=1,2,3 >>>a,b,c (1,2,3) >>>a,b,c=[1,2,3] >>>a,b,c (1,2,3) >>>a,b,c=(2*i+1foriinrange(3)) >>>a,b,c (1,3,5) >>>a,(b,c),d=[1,(2,3),4] >>>a 1 >>>b 2 >>>c 3 >>>d 4
2、使用拆箱进行变量交换
>>>a,b=1,2 >>>a,b=b,a >>>a,b (2,1)
3、扩展的拆箱(Python3支持)
>>>a,*b,c=[1,2,3,4,5] >>>a 1 >>>b [2,3,4] >>>c 5
4、负数索引
>>>a=[0,1,2,3,4,5,6,7,8,9,10] >>>a[-1] 10 >>>a[-3] 8
5、列表切片(a[start:end])
>>>a=[0,1,2,3,4,5,6,7,8,9,10] >>>a[2:8] [2,3,4,5,6,7]
6、负数索引的列表切片
>>>a=[0,1,2,3,4,5,6,7,8,9,10] >>>a[-4:-2] [7,8]
7、带步数的列表切片(a[start:end:step])
>>>a=[0,1,2,3,4,5,6,7,8,9,10] >>>a[::2] [0,2,4,6,8,10] >>>a[::3] [0,3,6,9] >>>a[2:8:2] [2,4,6]
8、负数步数的列表切片
>>>a=[0,1,2,3,4,5,6,7,8,9,10] >>>a[::-1] [10,9,8,7,6,5,4,3,2,1,0] >>>a[::-2] [10,8,6,4,2,0]
9、列表切片赋值
>>>a=[1,2,3,4,5] >>>a[2:3]=[0,0] >>>a [1,2,0,0,4,5] >>>a[1:1]=[8,9] >>>a [1,8,9,2,0,0,4,5] >>>a[1:-1]=[] >>>a [1,5]
10、切片命名(slice(start,end,step))
>>>a=[0,1,2,3,4,5] >>>LASTTHREE=slice(-3,None) >>>LASTTHREE slice(-3,None,None) >>>a[LASTTHREE] [3,4,5]
11、遍历列表索引和值(enumerate)
>>>a=["Hello","world","!"] >>>fori,xinenumerate(a): ...print"{}:{}".format(i,x) ... 0:Hello 1:world 2:!
12、遍历字典的KEY和VALUE(dict.iteritems)
>>>m={"a":1,"b":2,"c":3,"d":4} >>>fork,vinm.iteritems(): ...print"{}:{}".format(k,v) ... a:1 c:3 b:2 d:4 #注意:Python3中要使用dict.items
13、压缩&解压列表和可遍历对象
>>>a=[1,2,3] >>>b=["a","b","c"] >>>z=zip(a,b) >>>z [(1,"a"),(2,"b"),(3,"c")] >>>zip(*z) [(1,2,3),("a","b","c")]
14、使用zip分组相邻列表项
>>>a=[1,2,3,4,5,6] >>>#Usingiterators >>>group_adjacent=lambdaa,k:zip(*([iter(a)]*k)) >>>group_adjacent(a,3) [(1,2,3),(4,5,6)] >>>group_adjacent(a,2) [(1,2),(3,4),(5,6)] >>>group_adjacent(a,1) [(1,),(2,),(3,),(4,),(5,),(6,)] >>>#Usingslices >>>fromitertoolsimportislice >>>group_adjacent=lambdaa,k:zip(*(islice(a,i,None,k)foriinrange(k))) >>>group_adjacent(a,3) [(1,2,3),(4,5,6)] >>>group_adjacent(a,2) [(1,2),(3,4),(5,6)] >>>group_adjacent(a,1) [(1,),(2,),(3,),(4,),(5,),(6,)]
15、使用zip&iterators实现推拉窗(n-grams)
>>>fromitertoolsimportislice >>>defn_grams(a,n): ...z=(islice(a,i,None)foriinrange(n)) ...returnzip(*z) ... >>>a=[1,2,3,4,5,6] >>>n_grams(a,3) [(1,2,3),(2,3,4),(3,4,5),(4,5,6)] >>>n_grams(a,2) [(1,2),(2,3),(3,4),(4,5),(5,6)] >>>n_grams(a,4) [(1,2,3,4),(2,3,4,5),(3,4,5,6)]
16、使用zip反相字典对象
>>>m={"a":1,"b":2,"c":3,"d":4} >>>m.items() [("a",1),("c",3),("b",2),("d",4)] >>>zip(m.values(),m.keys()) [(1,"a"),(3,"c"),(2,"b"),(4,"d")] >>>mi=dict(zip(m.values(),m.keys())) >>>mi {1:"a",2:"b",3:"c",4:"d"}
17、合并列表
>>>a=[[1,2],[3,4],[5,6]] >>>list(itertools.chain.from_iterable(a)) [1,2,3,4,5,6] >>>sum(a,[]) [1,2,3,4,5,6] >>>[xforlinaforxinl] [1,2,3,4,5,6] >>>a=[[[1,2],[3,4]],[[5,6],[7,8]]] >>>[xforl1inaforl2inl1forxinl2] [1,2,3,4,5,6,7,8] >>>a=[1,2,[3,4],[[5,6],[7,8]]] >>>flatten=lambdax:[yforlinxforyinflatten(l)]iftype(x)islistelse[x] >>>flatten(a) [1,2,3,4,5,6,7,8] Note:accordingtoPython"sdocumentationonsum,itertools.chain.from_iterableisthepreferredmethodforthis.
18、生成器
>>>g=(x**2forxinxrange(10)) >>>next(g) 0 >>>next(g) 1 >>>next(g) 4 >>>next(g) 9 >>>sum(x**3forxinxrange(10)) 2025 >>>sum(x**3forxinxrange(10)ifx%3==1) 408
19、字典解析
>>>m={x:x**2forxinrange(5)} >>>m {0:0,1:1,2:4,3:9,4:16} >>>m={x:"A"+str(x)forxinrange(10)} >>>m {0:"A0",1:"A1",2:"A2",3:"A3",4:"A4",5:"A5",6:"A6",7:"A7",8:"A8",9:"A9"}
20、使用字典解析反相字典对象
>>>m={"a":1,"b":2,"c":3,"d":4} >>>m {"d":4,"a":1,"b":2,"c":3} >>>{v:kfork,vinm.items()} {1:"a",2:"b",3:"c",4:"d"}
21、命名的tuples(collections.namedtuple)
>>>Point=collections.namedtuple("Point",["x","y"]) >>>p=Point(x=4.0,y=2.0) >>>p Point(x=4.0,y=2.0) >>>p.x 4.0 >>>p.y 2.0
22、继承命名tuples
>>>classPoint(collections.namedtuple("PointBase",["x","y"])): ...__slots__=() ...def__add__(self,other): ...returnPoint(x=self.x+other.x,y=self.y+other.y) ... >>>p=Point(x=4.0,y=2.0) >>>q=Point(x=2.0,y=3.0) >>>p+q Point(x=6.0,y=5.0)
23、Set&Set运算
>>>A={1,2,3,3} >>>A set([1,2,3]) >>>B={3,4,5,6,7} >>>B set([3,4,5,6,7]) >>>A|B set([1,2,3,4,5,6,7]) >>>A&B set([3]) >>>A-B set([1,2]) >>>B-A set([4,5,6,7]) >>>A^B set([1,2,4,5,6,7]) >>>(A^B)==((A-B)|(B-A)) True
24、Multisets运算(collections.Counter)
>>>A=collections.Counter([1,2,2]) >>>B=collections.Counter([2,2,3]) >>>A Counter({2:2,1:1}) >>>B Counter({2:2,3:1}) >>>A|B Counter({2:2,1:1,3:1}) >>>A&B Counter({2:2}) >>>A+B Counter({2:4,1:1,3:1}) >>>A-B Counter({1:1}) >>>B-A Counter({3:1})
25、列表中出现最多的元素(collections.Counter)
>>>A=collections.Counter([1,1,2,2,3,3,3,3,4,5,6,7]) >>>A Counter({3:4,1:2,2:2,4:1,5:1,6:1,7:1}) >>>A.most_common(1) [(3,4)] >>>A.most_common(3) [(3,4),(1,2),(2,2)]
26、双向队列(collections.deque)
>>>Q=collections.deque() >>>Q.append(1) >>>Q.appendleft(2) >>>Q.extend([3,4]) >>>Q.extendleft([5,6]) >>>Q deque([6,5,2,1,3,4]) >>>Q.pop() 4 >>>Q.popleft() 6 >>>Q deque([5,2,1,3]) >>>Q.rotate(3) >>>Q deque([2,1,3,5]) >>>Q.rotate(-3) >>>Q deque([5,2,1,3])
27、限制长度的双向队列(collections.deque)
>>>last_three=collections.deque(maxlen=3) >>>foriinxrange(10): ...last_three.append(i) ...print",".join(str(x)forxinlast_three) ... 0 0,1 0,1,2 1,2,3 2,3,4 3,4,5 4,5,6 5,6,7 6,7,8 7,8,9
28、排序字典(collections.OrderedDict)
>>>m=dict((str(x),x)forxinrange(10)) >>>print",".join(m.keys()) 1,0,3,2,5,4,7,6,9,8 >>>m=collections.OrderedDict((str(x),x)forxinrange(10)) >>>print",".join(m.keys()) 0,1,2,3,4,5,6,7,8,9 >>>m=collections.OrderedDict((str(x),x)forxinrange(10,0,-1)) >>>print",".join(m.keys()) 10,9,8,7,6,5,4,3,2,1
29、默认字典(collections.defaultdict)
>>>m=dict() >>>m["a"] Traceback(mostrecentcalllast): File"",line1,in KeyError:"a" >>> >>>m=collections.defaultdict(int) >>>m["a"] 0 >>>m["b"] 0 >>>m=collections.defaultdict(str) >>>m["a"] "" >>>m["b"]+="a" >>>m["b"] "a" >>>m=collections.defaultdict(lambda:"[defaultvalue]") >>>m["a"] "[defaultvalue]" >>>m["b"] "[defaultvalue]"
30、使用defaultdict代表tree
>>>importjson >>>tree=lambda:collections.defaultdict(tree) >>>root=tree() >>>root["menu"]["id"]="file" >>>root["menu"]["value"]="File" >>>root["menu"]["menuitems"]["new"]["value"]="New" >>>root["menu"]["menuitems"]["new"]["onclick"]="new();" >>>root["menu"]["menuitems"]["open"]["value"]="Open" >>>root["menu"]["menuitems"]["open"]["onclick"]="open();" >>>root["menu"]["menuitems"]["close"]["value"]="Close" >>>root["menu"]["menuitems"]["close"]["onclick"]="close();" >>>printjson.dumps(root,sort_keys=True,indent=4,separators=(",",":")) { "menu":{ "id":"file", "menuitems":{ "close":{ "onclick":"close();", "value":"Close" }, "new":{ "onclick":"new();", "value":"New" }, "open":{ "onclick":"open();", "value":"Open" } }, "value":"File" } } #查看更多:https://gist.github.com/hrldcpr/2012250
31、映射对象到唯一的计数数字(collections.defaultdict)
>>>importitertools,collections >>>value_to_numeric_map=collections.defaultdict(itertools.count().next) >>>value_to_numeric_map["a"] 0 >>>value_to_numeric_map["b"] 1 >>>value_to_numeric_map["c"] 2 >>>value_to_numeric_map["a"] 0 >>>value_to_numeric_map["b"] 1
32、最大&最小元素(heapq.nlargestandheapq.nsmallest)
>>>a=[random.randint(0,100)for__inxrange(100)] >>>heapq.nsmallest(5,a) [3,3,5,6,8] >>>heapq.nlargest(5,a) [100,100,99,98,98]
33、笛卡尔积(itertools.product)
>>>forpinitertools.product([1,2,3],[4,5]): (1,4) (1,5) (2,4) (2,5) (3,4) (3,5) >>>forpinitertools.product([0,1],repeat=4): ...print"".join(str(x)forxinp) ... 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
34、组合(itertools.combinationsanditertools.combinations_with_replacement)
>>>forcinitertools.combinations([1,2,3,4,5],3): ...print"".join(str(x)forxinc) ... 123 124 125 134 135 145 234 235 245 345 >>>forcinitertools.combinations_with_replacement([1,2,3],2): ...print"".join(str(x)forxinc) ... 11 12 13 22 23 33
35、排列(itertools.permutations)
>>>forpinitertools.permutations([1,2,3,4]): ...print"".join(str(x)forxinp) ... 1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321
36、链接可遍历对象(itertools.chain)
>>>a=[1,2,3,4] >>>forpinitertools.chain(itertools.combinations(a,2),itertools.combinations(a,3)): ...printp ... (1,2) (1,3) (1,4) (2,3) (2,4) (3,4) (1,2,3) (1,2,4) (1,3,4) (2,3,4) >>>forsubsetinitertools.chain.from_iterable(itertools.combinations(a,n)forninrange(len(a)+1)) ...printsubset ... () (1,) (2,) (3,) (4,) (1,2) (1,3) (1,4) (2,3) (2,4) (3,4) (1,2,3) (1,2,4) (1,3,4) (2,3,4) (1,2,3,4)
37、根据给定的KEY分组(itertools.groupby)
>>>fromoperatorimportitemgetter >>>importitertools >>>withopen("contactlenses.csv","r")asinfile: ...data=[line.strip().split(",")forlineininfile] ... >>>data=data[1:] >>>defprint_data(rows): ...print"".join("".join("{:<16}".format(s)forsinrow)forrowinrows) ... >>>print_data(data) youngmyopenoreducednone youngmyopenonormalsoft youngmyopeyesreducednone youngmyopeyesnormalhard younghypermetropenoreducednone younghypermetropenonormalsoft younghypermetropeyesreducednone younghypermetropeyesnormalhard pre-presbyopicmyopenoreducednone pre-presbyopicmyopenonormalsoft pre-presbyopicmyopeyesreducednone pre-presbyopicmyopeyesnormalhard pre-presbyopichypermetropenoreducednone pre-presbyopichypermetropenonormalsoft pre-presbyopichypermetropeyesreducednone pre-presbyopichypermetropeyesnormalnone presbyopicmyopenoreducednone presbyopicmyopenonormalnone presbyopicmyopeyesreducednone presbyopicmyopeyesnormalhard presbyopichypermetropenoreducednone presbyopichypermetropenonormalsoft presbyopichypermetropeyesreducednone presbyopichypermetropeyesnormalnone >>>data.sort(key=itemgetter(-1)) >>>forvalue,groupinitertools.groupby(data,lambdar:r[-1]): ...print"-----------" ...print"Group:"+value ...print_data(group) ... ----------- Group:hard youngmyopeyesnormalhard younghypermetropeyesnormalhard pre-presbyopicmyopeyesnormalhard presbyopicmyopeyesnormalhard ----------- Group:none youngmyopenoreducednone youngmyopeyesreducednone younghypermetropenoreducednone younghypermetropeyesreducednone pre-presbyopicmyopenoreducednone pre-presbyopicmyopeyesreducednone pre-presbyopichypermetropenoreducednone pre-presbyopichypermetropeyesreducednone pre-presbyopichypermetropeyesnormalnone presbyopicmyopenoreducednone presbyopicmyopenonormalnone presbyopicmyopeyesreducednone presbyopichypermetropenoreducednone presbyopichypermetropeyesreducednone presbyopichypermetropeyesnormalnone ----------- Group:soft youngmyopenonormalsoft younghypermetropenonormalsoft pre-presbyopicmyopenonormalsoft pre-presbyopichypermetropenonormalsoft presbyopichypermetropenonormalsoft
38、在任意目录启动HTTP服务
python-mSimpleHTTPServer5000
ServingHTTPon0.0.0.0port5000...
39、Python之禅
>>>importthis
TheZenofPython,byTimPeters
Beautifulisbetterthanugly.
Explicitisbetterthanimplicit.
Simpleisbetterthancomplex.
Complexisbetterthancomplicated.
Flatisbetterthannested.
Sparseisbetterthandense.
Readabilitycounts.
Specialcasesaren"tspecialenoughtobreaktherules.
Althoughpracticalitybeatspurity.
Errorsshouldneverpasssilently.
Unlessexplicitlysilenced.
Inthefaceofambiguity,refusethetemptationtoguess.
Thereshouldbeone--andpreferablyonlyone--obviouswaytodoit.
Althoughthatwaymaynotbeobviousatfirstunlessyou"reDutch.
Nowisbetterthannever.
Althoughneverisoftenbetterthan*right*now.
Iftheimplementationishardtoexplain,it"sabadidea.
Iftheimplementationiseasytoexplain,itmaybeagoodidea.
Namespacesareonehonkinggreatidea--let"sdomoreofthose!
40、使用C风格的大括号代替Python缩进来表示作用域
>>>from__future__importbraces
这篇文章就介绍到这了,更多内容请查看相关文章。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。