Python 中讓你相見恨晚的 20 個(gè)騷操作
??????關(guān)注我,和老表一起學(xué)Python、云服務(wù)器
大家好,我是老表~
今天和大家分享 20 個(gè) Python 編程中新手必會(huì)的“騷操作”,使用的頻率超高!記得點(diǎn)贊,收藏哦!話不多說,進(jìn)入正題!
1.列表推導(dǎo)式
使用列表推導(dǎo)式創(chuàng)建一個(gè)列表。
>>>?[n*10?for?n?in?range(5)]
[0,?10,?20,?30,?40]
2.交換變量
一行代碼交換兩個(gè)變量的值。
>>>?m,?n?=?1,?2
>>>?m,?n?=?n,?m
>>>?m
2
>>>?n
1
3.連續(xù)比較
鏈?zhǔn)奖容^操作符。
>>>?m,?n?=?3,?'c'
>>>?1?5
True
>>>?'d'?'f'
False
4.序列切片
通過切片快速獲取序列片段。
>>>?lst?=?[1,?2,?3,?4,?5]
>>>?lst[:3]??#?取前三個(gè)數(shù)
[1,?2,?3]
>>>?lst[::-1]??#?逆序
[5,?4,?3,?2,?1]
>>>?lst[::2]??#?步長(zhǎng)為2
[1,?3,?5]
>>>?lst[::-2]??#?逆序步長(zhǎng)為2
[5,?3,?1]
5.切片快速增刪序列
通過切片替換序列片段的值。
>>>?lst?=?[1,?2,?3,?4,?5]
>>>?lst[1:3]?=?[]
>>>?lst
[1,?4,?5]
>>>?lst[1:3]?=?['a',?'b',?'c',?'d']
>>>?lst
[1,?'a',?'b',?'c',?'d']
6.%timeit 計(jì)算運(yùn)行時(shí)間
計(jì)算 10000 次列表推導(dǎo)式創(chuàng)建列表所用時(shí)間。
%timeit?-n?10000?[n?for?n?in?range(5)]
#?2.41?μs?±?511?ns?per?loop?(mean?±?std.?dev.?of?7?runs,?10000?loops?each)
7.三元表達(dá)式
獲取 m,n 中較大的值。
>>>?m?=?4
>>>?n?=?2
>>>?if?m?>?n:
????????print('m')
else:
????????print('n')
m
>>>?'m'?if?m?>?n?else?'n'
'm'
還有一種比較少見的寫法。
>>>?m?=?4
>>>?n?=?2
>>>?("n",?"m")[m?>?n]
'm'
格式:(
8.解包(unpack)
可迭代對(duì)象都支持解包。
>>>?a,?b,?*c?=?[1,?2,?3,?4]
>>>?a
1
>>>?b
2
>>>?c
[3,?4]
>>>?print(*range(3))
0?1?2
9.lambda 匿名函數(shù)
lambda 函數(shù)可以接收任意多個(gè)參數(shù) (包括可選參數(shù)) ,返回單個(gè)表達(dá)式值。 lambda 函數(shù)不能包含命令,只能包含一個(gè)表達(dá)式。
>>>?def?func(x,?y):
?return?x?*?y
>>>?func(2,?3)
6
>>>?func?=?lambda?x,?y:?x?*?y
>>>?func(2,?3)
6
10.map 序列映射
對(duì)序列中每一個(gè)元素調(diào)用指定函數(shù),返回迭代器。
>>>?def?func(x):
???????return?x?**?2
>>>?list(map(func,?[1,2,3]))
[1,?4,?9]
使用 lambda 表達(dá)式。
>>>?list(map(lambda?x:?x?**?2,?[1,?2,?3]))
[1,?4,?9]
11.filter 過濾序列
過濾掉不符合條件的元素,返回迭代器。
>>>?def?func(x):?
???????return?x?%?3?==?0
??
>>>?list(filter(func,?[1,?2?,3]))
[3]
使用 lambda 表達(dá)式。
>>>?list(filter(lambda?x:?x?%?3?==?0,?[1,?2,?3]))
[3]
12.獲取序列組合
獲取兩個(gè)序列每個(gè)元素兩兩組合的結(jié)果。
>>>?list1?=?['a',?'b']
>>>?list2?=?['1',?'2']
>>>?[(m,?n)?for?m?in?list1?for?n?in?list2]
[('a',?'1'),?('a',?'2'),?('b',?'1'),?('b',?'2')]
>>>?from?itertools?import?product
>>>?list(product(list1,?list2))
[('a',?'1'),?('a',?'2'),?('b',?'1'),?('b',?'2')]
13.隨機(jī)選取序列元素
隨機(jī)選取序列中的一個(gè)元素。
>>>?from?random?import?choice
>>>?lst?=?[1,?2,?3,?4]
>>>?choice(lst)
3
隨機(jī)選取序列中的多個(gè)元素(可重復(fù))。k 值指定數(shù)量。
>>>?from?random?import?choices
>>>?lst?=?[1,?2,?3,?4]
>>>?choices(lst,?k=3)
[4,?3,?4]
隨機(jī)選取序列中的多個(gè)元素(不重復(fù))。k 值指定數(shù)量。
>>>?from?random?import?sample
>>>?lst?=?[1,?2,?3,?4]
>>>?sample(lst,?k=3)
[4,?3,?2]
14.序列元素計(jì)數(shù)
統(tǒng)計(jì)序列每個(gè)元素出現(xiàn)的次數(shù)。
>>>?from?collections?import?Counter
>>>?s?=?'python+py'
>>>?counter?=?Counter(s)
>>>?counter
Counter({'p':?2,?'y':?2,?'t':?1,?'h':?1,?'o':?1,?'n':?1,?'+':?1})
返回的結(jié)果類似字典,可以使用字典的相關(guān)方法。
>>>?counter.keys()
dict_keys(['p',?'y',?'t',?'h',?'o',?'n',?'+'])
>>>?counter.values()
dict_values([2,?2,?1,?1,?1,?1,?1])
>>>?counter.items()
dict_items([('p',?2),?('y',?2),?('t',?1),?('h',?1),?('o',?1),?('n',?1),?('+',?1)])
統(tǒng)計(jì)出現(xiàn)次數(shù)最多的兩個(gè)元素。
>>>?counter.most_common(2)
[('p',?2),?('y',?2)]
15.字典排序
字典按照鍵(key)降序排序。
>>>?dic?=?{'d':?2,?'c':?1,?'a':?3,?'b':?4}
>>>?sort_by_key?=?sorted(dic.items(),?key=lambda?x:?x[0],?reverse=False)
>>>?{key:?value?for?key,?value?in?sort_by_key}
{'a':?3,?'b':?4,?'c':?1,?'d':?2}
字典按照值(value)降序排序。
>>>?dic?=?{'d':?2,?'c':?1,?'a':?3,?'b':?4}
>>>?sort_by_value?=?sorted(dic.items(),?key=lambda?x:?x[1],?reverse=False)
>>>?{key:?value?for?key,?value?in?sort_by_value}
{'c':?1,?'d':?2,?'a':?3,?'b':?4}
16.字典合并
>>>?dict1?=?{'name':?'靜香',?'age':?18}
>>>?dict2?=?{'name':?'靜香',?'sex':?'female'}
update()更新字典。
>>>?dict1.update(dict2)
>>>?dict1
{'name':?'靜香',?'age':?18,?'sex':?'female'}
字典推導(dǎo)式
>>>?{k:?v?for?dic?in?[dict1,?dict2]?for?k,?v?in?dic.items()}
{'name':?'靜香',?'age':?18,?'sex':?'female'}
元素拼接
>>>?dict(list(dict1.items())?+?list(dict2.items()))
{'name':?'靜香',?'age':?18,?'sex':?'female'}
chain()可以將序列連接,返回可迭代對(duì)象。
from?itertools?import?chain
>>>?dict(chain(dict1.items(),?dict2.items()))
{'name':?'靜香',?'age':?18,?'sex':?'female'}
collections.ChainMap可以將多個(gè)字典或映射,并將它們合并。
>>>?from?collections?import?ChainMap
>>>?dict(ChainMap(dict2,?dict1))
{'name':?'靜香',?'age':?18,?'sex':?'female'}
在 Python3.5以上的版本中,可以通過字典解包進(jìn)行合并。
>>>?{**dict1,?**dict2}
{'name':?'靜香',?'age':?18,?'sex':?'female'}
17.zip 打包
zip() 將序列中對(duì)應(yīng)的元素打包成一個(gè)個(gè)的元組,然后返回由這些元組組成的迭代器。
如果序列的元素個(gè)數(shù)不一致,則返回列表長(zhǎng)度與最短的對(duì)象相同。
>>>?list1?=?[1,?2,?3]
>>>?list2?=?[4,?5,?6]
>>>?list3?=?['a',?'b',?'c',?'d']
>>>?res?=?zip(list1,?list2)
>>>?res
0x0000013C13F62200>
>>>?list(res)
[(1,?4),?(2,?5),?(3,?6)]
>>>?list(zip(list2,?list3))
[(4,?'a'),?(5,?'b'),?(6,?'c')]
18.enumerate 遍歷
enumerate 函數(shù)可以將可迭代對(duì)象組合成一個(gè)索引序列,這樣遍歷時(shí)就可以同時(shí)獲取索引與對(duì)應(yīng)的值。
>>>?lst?=?['a',?'b',?'c']
>>>?for?index,?char?in?enumerate(lst):
?print(index,?char)
?
0?a
1?b
2?c
19.any() & all()
any(iterable)
對(duì)于迭代過程中的元素 i,只有所有元素 bool(i) 的結(jié)果都為 False, any的結(jié)果才返回 False。如果迭代是空,返回 False。
all(iterable)
對(duì)于迭代過程中的元素 i,如果存在一個(gè) bool(i) 的結(jié)果為 False,則 all結(jié)果返回 False。如果可迭代對(duì)象為空,則返回 True。
>>>?any('')
False
>>>?any([])
False
>>>?any([1,?0,?''])
True
>>>?any([0,?'',?[]])
False
>>>?all([])
True
>>>?all([1,?0,?''])
False
>>>?all([1,?2,?3])
True
20.用 ** 代替 pow
求 x 的 y 次方,使用 ** 速度更快。
%timeit?-n?10000?c?=?pow(2,10)
#?911?ns?±?107?ns?per?loop?(mean?±?std.?dev.?of?7?runs,?10000?loops?each)
%timeit?-n?10000?c?=?2?**?10
#?131?ns?±?46.8?ns?per?loop?(mean?±?std.?dev.?of?7?runs,?10000?loops?each)
這就是今天要分享的內(nèi)容,記得點(diǎn)贊哦~提前感謝?
如何找到我:
