亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python編程語言的35個與眾不同之處(語言特征和使用技巧)

系統(tǒng) 1766 0

一、Python介紹

  從我開始學習Python時我就決定維護一個經(jīng)常使用的“竅門”列表。不論何時當我看到一段讓我覺得“酷,這樣也行!”的代碼時(在一個例子中、在StackOverflow、在開源碼軟件中,等等),我會嘗試它直到理解它,然后把它添加到列表中。這篇文章是清理過列表的一部分。如果你是一個有經(jīng)驗的Python程序員,盡管你可能已經(jīng)知道一些,但你仍能發(fā)現(xiàn)一些你不知道的。如果你是一個正在學習Python的C、C++或Java程序員,或者剛開始學習編程,那么你會像我一樣發(fā)現(xiàn)它們中的很多非常有用。

每個竅門或語言特性只能通過實例來驗證,無需過多解釋。雖然我已盡力使例子清晰,但它們中的一些仍會看起來有些復雜,這取決于你的熟悉程度。所以如果看過例子后還不清楚的話,標題能夠提供足夠的信息讓你通過Google獲取詳細的內(nèi)容。

二、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 + 1 for i in range(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.拓展分拆 (Python 3下適用)

復制代碼 代碼如下:

>>> 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.zip打包解包列表和倍數(shù)
復制代碼 代碼如下:

>>> 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')]

12.使用zip合并相鄰的列表項
復制代碼 代碼如下:

>>> a = [1, 2, 3, 4, 5, 6]
>>> zip(*([iter(a)] * 2))
[(1, 2), (3, 4), (5, 6)]
?
>>> group_adjacent = lambda a, 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,)]
?
>>> zip(a[::2], a[1::2])
[(1, 2), (3, 4), (5, 6)]
?
>>> zip(a[::3], a[1::3], a[2::3])
[(1, 2, 3), (4, 5, 6)]
?
>>> group_adjacent = lambda a, k: zip(*(a[i::k] for i in range(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,)]

13.使用zip和iterators生成滑動窗口 (n -grams)
復制代碼 代碼如下:

>>> from itertools import islice
>>> def n_grams(a, n):
...???? z = (islice(a, i, None) for i in range(n))
...???? return zip(*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)]

14.使用zip反轉(zhuǎn)字典
復制代碼 代碼如下:

>>> 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'}

15.攤平列表:
復制代碼 代碼如下:

>>> 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]
?
>>> [x for l in a for x in l]
[1, 2, 3, 4, 5, 6]
?
>>> a = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
>>> [x for l1 in a for l2 in l1 for x in l2]
[1, 2, 3, 4, 5, 6, 7, 8]
?
>>> a = [1, 2, [3, 4], [[5, 6], [7, 8]]]
>>> flatten = lambda x: [y for l in x for y in flatten(l)] if type(x) is list else [x]
>>> flatten(a)
[1, 2, 3, 4, 5, 6, 7, 8]
?

注意: 根據(jù)Python的文檔,itertools.chain.from_iterable是首選。

16.生成器表達式

復制代碼 代碼如下:

>>> g = (x ** 2 for x in xrange(10))
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> sum(x ** 3 for x in xrange(10))
2025
>>> sum(x ** 3 for x in xrange(10) if x % 3 == 1)
408

17.迭代字典
復制代碼 代碼如下:

>>> m = {x: x ** 2 for x in range(5)}
>>> m
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
?
>>> m = {x: 'A' + str(x) for x in range(10)}
>>> m
{0: 'A0', 1: 'A1', 2: 'A2', 3: 'A3', 4: 'A4', 5: 'A5', 6: 'A6', 7: 'A7', 8: 'A8', 9: 'A9'}

18.通過迭代字典反轉(zhuǎn)字典
復制代碼 代碼如下:

>>> m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> m
{'d': 4, 'a': 1, 'b': 2, 'c': 3}
>>> {v: k for k, v in m.items()}
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}

19.命名序列 (collections.namedtuple)
復制代碼 代碼如下:

>>> Point = collections.namedtuple('Point', ['x', 'y'])
>>> p = Point(x=1.0, y=2.0)
>>> p
Point(x=1.0, y=2.0)
>>> p.x
1.0
>>> p.y
2.0

20.命名列表的繼承:
復制代碼 代碼如下:

>>> class Point(collections.namedtuple('PointBase', ['x', 'y'])):
...???? __slots__ = ()
...???? def __add__(self, other):
...???????????? return Point(x=self.x + other.x, y=self.y + other.y)
...
>>> p = Point(x=1.0, y=2.0)
>>> q = Point(x=2.0, y=3.0)
>>> p + q
Point(x=3.0, y=5.0)

21.集合及集合操作
復制代碼 代碼如下:

>>> 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

22.多重集及其操作 (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})

23.迭代中最常見的元素 (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)]

24.雙端隊列 (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])

25.有最大長度的雙端隊列 (collections.deque)
復制代碼 代碼如下:

>>> last_three = collections.deque(maxlen=3)
>>> for i in xrange(10):
...???? last_three.append(i)
...???? print ', '.join(str(x) for x in last_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

26.字典排序 (collections.OrderedDict)
復制代碼 代碼如下:

>>> m = dict((str(x), x) for x in range(10))
>>> print ', '.join(m.keys())
1, 0, 3, 2, 5, 4, 7, 6, 9, 8
>>> m = collections.OrderedDict((str(x), x) for x in range(10))
>>> print ', '.join(m.keys())
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
>>> m = collections.OrderedDict((str(x), x) for x in range(10, 0, -1))
>>> print ', '.join(m.keys())
10, 9, 8, 7, 6, 5, 4, 3, 2, 1

27.缺省字典 (collections.defaultdict)
復制代碼 代碼如下:

>>> m = dict()
>>> m['a']
Traceback (most recent call last):
? File " ", line 1, 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: '[default value]')
>>> m['a']
'[default value]'
>>> m['b']
'[default value]'

28. 用缺省字典表示簡單的樹
復制代碼 代碼如下:

>>> import json
>>> 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();'
>>> print json.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查看詳情)

29.映射對象到唯一的序列數(shù) (collections.defaultdict)

復制代碼 代碼如下:

>>> import itertools, 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

30.最大最小元素 (heapq.nlargest和heapq.nsmallest)
復制代碼 代碼如下:

>>> a = [random.randint(0, 100) for __ in xrange(100)]
>>> heapq.nsmallest(5, a)
[3, 3, 5, 6, 8]
>>> heapq.nlargest(5, a)
[100, 100, 99, 98, 98]

31.笛卡爾乘積 (itertools.product)
復制代碼 代碼如下:

>>> for p in itertools.product([1, 2, 3], [4, 5]):
(1, 4)
(1, 5)
(2, 4)
(2, 5)
(3, 4)
(3, 5)
>>> for p in itertools.product([0, 1], repeat=4):
...???? print ''.join(str(x) for x in p)
...
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

32.組合的組合和置換 (itertools.combinations 和 itertools.combinations_with_replacement)
復制代碼 代碼如下:

>>> for c in itertools.combinations([1, 2, 3, 4, 5], 3):
...???? print ''.join(str(x) for x in c)
...
123
124
125
134
135
145
234
235
245
345
>>> for c in itertools.combinations_with_replacement([1, 2, 3], 2):
...???? print ''.join(str(x) for x in c)
...
11
12
13
22
23
33

33.排序 (itertools.permutations)

復制代碼 代碼如下:

>>> for p in itertools.permutations([1, 2, 3, 4]):
...???? print ''.join(str(x) for x in p)
...
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321

34.鏈接的迭代 (itertools.chain)
復制代碼 代碼如下:

>>> a = [1, 2, 3, 4]
>>> for p in itertools.chain(itertools.combinations(a, 2), itertools.combinations(a, 3)):
...???? print p
...
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
(1, 2, 3)
(1, 2, 4)
(1, 3, 4)
(2, 3, 4)
>>> for subset in itertools.chain.from_iterable(itertools.combinations(a, n) for n in range(len(a) + 1))
...???? print subset
...
()
(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)

35.按給定值分組行 (itertools.groupby)
復制代碼 代碼如下:

>>> from operator import itemgetter
>>> import itertools
>>> with open('contactlenses.csv', 'r') as infile:
...???? data = [line.strip().split(',') for line in infile]
...
>>> data = data[1:]
>>> def print_data(rows):
...???? print '\n'.join('\t'.join('{: <16}'.format(s) for s in row) for row in rows)
...
?
>>> print_data(data)
young?????????????? myope?????????????????? no????????????????????? reduced???????????????? none
young?????????????? myope?????????????????? no????????????????????? normal????????????????? soft
young?????????????? myope?????????????????? yes???????????????????? reduced???????????????? none
young?????????????? myope?????????????????? yes???????????????????? normal????????????????? hard
young?????????????? hypermetrope??????????? no????????????????????? reduced???????????????? none
young?????????????? hypermetrope??????????? no????????????????????? normal????????????????? soft
young?????????????? hypermetrope??????????? yes???????????????????? reduced???????????????? none
young?????????????? hypermetrope??????????? yes???????????????????? normal????????????????? hard
pre-presbyopic????? myope?????????????????? no????????????????????? reduced???????????????? none
pre-presbyopic????? myope?????????????????? no????????????????????? normal????????????????? soft
pre-presbyopic????? myope?????????????????? yes???????????????????? reduced???????????????? none
pre-presbyopic????? myope?????????????????? yes???????????????????? normal????????????????? hard
pre-presbyopic????? hypermetrope??????????? no????????????????????? reduced???????????????? none
pre-presbyopic????? hypermetrope??????????? no????????????????????? normal????????????????? soft
pre-presbyopic????? hypermetrope??????????? yes???????????????????? reduced???????????????? none
pre-presbyopic????? hypermetrope??????????? yes???????????????????? normal????????????????? none
presbyopic????????? myope?????????????????? no????????????????????? reduced???????????????? none
presbyopic????????? myope?????????????????? no????????????????????? normal????????????????? none
presbyopic????????? myope?????????????????? yes???????????????????? reduced???????????????? none
presbyopic????????? myope?????????????????? yes???????????????????? normal????????????????? hard
presbyopic????????? hypermetrope??????????? no????????????????????? reduced???????????????? none
presbyopic????????? hypermetrope??????????? no????????????????????? normal????????????????? soft
presbyopic????????? hypermetrope??????????? yes???????????????????? reduced???????????????? none
presbyopic????????? hypermetrope??????????? yes???????????????????? normal????????????????? none
?
>>> data.sort(key=itemgetter(-1))
>>> for value, group in itertools.groupby(data, lambda r: r[-1]):
...???? print '-----------'
...???? print 'Group: ' + value
...???? print_data(group)
...
-----------
Group: hard
young?????????????? myope?????????????????? yes???????????????????? normal????????????????? hard
young?????????????? hypermetrope??????????? yes???????????????????? normal????????????????? hard
pre-presbyopic????? myope?????????????????? yes???????????????????? normal????????????????? hard
presbyopic????????? myope?????????????????? yes???????????????????? normal????????????????? hard
-----------
Group: none
young?????????????? myope?????????????????? no????????????????????? reduced???????????????? none
young?????????????? myope?????????????????? yes???????????????????? reduced???????????????? none
young?????????????? hypermetrope??????????? no????????????????????? reduced???????????????? none
young?????????????? hypermetrope??????????? yes???????????????????? reduced???????????????? none
pre-presbyopic????? myope?????????????????? no????????????????????? reduced???????????????? none
pre-presbyopic????? myope?????????????????? yes???????????????????? reduced???????????????? none
pre-presbyopic????? hypermetrope??????????? no????????????????????? reduced???????????????? none
pre-presbyopic????? hypermetrope??????????? yes???????????????????? reduced???????????????? none
pre-presbyopic????? hypermetrope??????????? yes???????????????????? normal????????????????? none
presbyopic????????? myope?????????????????? no????????????????????? reduced???????????????? none
presbyopic????????? myope?????????????????? no????????????????????? normal????????????????? none
presbyopic????????? myope?????????????????? yes???????????????????? reduced???????????????? none
presbyopic????????? hypermetrope??????????? no????????????????????? reduced???????????????? none
presbyopic????????? hypermetrope??????????? yes???????????????????? reduced???????????????? none
presbyopic????????? hypermetrope??????????? yes???????????????????? normal????????????????? none
-----------
Group: soft
young?????????????? myope?????????????????? no????????????????????? normal????????????????? soft
young?????????????? hypermetrope??????????? no????????????????????? normal????????????????? soft
pre-presbyopic????? myope?????????????????? no????????????????????? normal????????????????? soft
pre-presbyopic????? hypermetrope??????????? no????????????????????? normal????????????????? soft
presbyopic????????? hypermetrope??????????? no????????????????????? normal?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 在线观看国产精品日本不卡网 | 色爱b| 国产成人精品亚洲日本在线观看 | 无遮挡又黄又爽又色的视频免费 | 成年人网站免费 | 久久这里只有精品2 | 中文字幕日本精品一区二区三区 | 一级黄色免费网站 | 久久亚洲精品人成综合网 | 天天射天天 | 一级一片免费看 | 天天操天天干天天做 | 国产一级特黄特色aa毛片 | 亚洲精品第四页中文字幕 | 天天看天天爽 | 日韩精美视频 | 国产精品久久久久影院色老大 | 手机看片在线精品观看 | 欧美日本亚洲国产一区二区 | 99热最新在线 | 嘿咻嘿咻免费区在线观看吃奶 | 欧美日韩综合高清一区二区 | 午夜宅男在线观看 | 成人精品视频 | 神马影院我不卡手机版 | 看全色黄大色大片免费久黄久 | 老司机午夜在线视频 | 中文字幕综合在线 | 国产成人久久精品激情 | 老扒夜夜春宵粗大好爽aa毛片 | 色综合视频一区二区观看 | 欧美69p| 最新九九精品 | 精品一区二区三区18 | 亚洲精品二区中文字幕 | 久久国产精品视频一区 | 视频二区 素人 欧美 日韩 | 国产偷国产偷亚洲高清在线 | 在线观看欧美国产 | 久久er热这里只有精品免费 | 99精品久久99久久久久 |