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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。