首頁 > 後端開發 > Python教學 > 30個有關Python的小技巧

30個有關Python的小技巧

黄舟
發布: 2016-12-15 15:13:05
原創
1122 人瀏覽過

從我開始學習python的時候,我就開始自己總結一個python小技巧的集合。後來當我什麼時候在Stack Overflow
或是在某個開源軟體裡看到一段很酷程式碼的時候,我就很驚訝:原來還能這麼做! ,當時我會努力的自己嘗試這段程式碼,直到我懂了它的整體思路以後,我就把這段程式碼加到我的集合裡。這篇部落格其實就是這個集合整理後一部分的公開亮相。如果你已經是個python大牛,那麼基本上你應該知道這裡面的大多數用法了,但我想你應該也能發現一些你不知道的新技巧。而如果你之前是一個c,c++,java的程式設計師,同時在學習python,或者乾脆就是一個剛學習程式設計的新手,那麼你應該會看到很多特別有用能讓你感到驚奇的實用技巧,就像我當初一樣。

每一個技巧和語言用法都會在一個個實例中展示給大家,也不需要有其他的說明。我已經盡力把每個例子弄的通俗易懂,但是因為讀者對python的熟悉程度不同,仍然可能難免有一些晦澀的地方。所以如果這些例子本身無法讓你讀懂,至少這個例子的標題會在你後面去google搜尋的時候幫你。

整個集合大概是依照難易度排序,簡單常見的在前面,比較少見的在最後。

1.1 拆箱

>>> a, b, c = 1, 2, 3
>>> a, b, c
(1, 2, 3)
>>> a, b, c = [11 , 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

  

1.2 拆箱變數交換

 

>>, b a
>>> a, b
(2, 1)

  

1.3 擴充拆箱(只相容於python3)

>>> a, *b, c = [1, 2, 3, 4, 5, 5, ]

>>> a
1
>>> b
[2, 3, 4]
>>> c
5

  

1.4 負數索引

  

1.4 負數索引

2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> a[-1]
10
>>> a[-3]
8

1.5 切割清單

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> a[2:8]

[2, 3, 4, 5, 6, 7]


1.6 負數索引切割清單

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> a[-4:- 2]

[7, 8]


1.7指定步長切割清單

 

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


1.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]


1.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]
>

1.10 命名清單切割方式

> = [0, 1, 2, 3, 4, 5]

>>> LASTTHREE = slice(-3, None)

>>> LASTTHREE

slice(-3, None, None)

>>> a[LASTTHREE]
[3, 4, 5]


1.11 列表以及迭代器的壓縮和解壓縮

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


1.12 列表相鄰元素壓縮器

 

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

1.13 在列表中用壓縮器和迭代器滑動取值視窗

>>>> def n_grams(a , n):
...     z = [iter(a[i:]) 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)]

 

1.14 使用壓縮反器轉字典

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

1.15 列表展開

>>>> a = [[1, 2], [3, 4], [5, 6]]
>>>>列表(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]

 

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

1.17字典推導


>>>>> m = {x: x ** 2 for x in range(5)}
>>>> m = {x: x ** 2 for x in range(5)}
>>>> >米
{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'}

1.18 使用字典推導食品字典

>>>> m = {'a': 1, 'b': 22 , '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'}

1.19 命名元群

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

2.0

 

🎜1.20 🎜🎜🎜 🎜🎜1.20 🎜🎜🎜 🎜🎜1.20 🎜🎜🎜 🎜🎜1.20 🎜 替換元組

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

 

1.21 作業集合

= {1, 2, 3, 3}

>>>> A
set([1, 2, 3])
>>>>> B = {3, 4, 5, 6, 7}
>>> > B
set([3, 4, 5, 6, 7])
>>>>>一個| B
set([1, 2, 3, 4, 5, 6, 7])
>>>> > A & B
套裝([3])
>>> A - B
set([1, 2])
>>>> B - A
集合([4, 5, 6, 7])
> >>>> A ^ B
set([1, 2, 4, 5, 6, 7])
>>>> (A ^ B) == ((A - B) | (B - A))
True

1.22 操作按鈕集合

>>>> A = collections.Counter([1, 2, 2])

>>>> B = collections.Counter([2, 2, 3])
>>>> B = collections.Counter([2, 2, 3])
>>>> A
計數器({2: 2, 1: 1})
>>>> B
計數器({2: 2, 3: 1})
>>一個| B
計數器({2: 2 , 1: 1, 3: 1})
>>>>> A & B
櫃檯({2: 2})
>>>> A + B
計數器({2: 4, 1: 1, 3: 1})
>>>> A - B
計數器({1: 1})
>>>>> B - A
Counter({3: 1})

1.23 統計在可迭代器中最常出現的元素

 

>>>>> A = collections.Counter([1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 6, 7])
>>>> > A
計數器({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)]

1.24 端點都可操作的隊列

1.24 端點都可操作的隊列



1.24 端點都可操作的隊列



1.24 端點都可操作的隊列

 

>>>>> Q = collections.deque()
>>>> Q.append(1)
>>>> Q.appendleft(2)
>>>> Q.extend([3, 4 ])
>>>> Q.extendleft([5, 6])
>>>>> Q
雙端隊列([6, 5, 2, 1, 3, 4])
>>>>> Q. pop()

4

>>>> Q.popleft()

6

>>>> Q

雙端隊列([5, 2, 1, 3])

>>>>> Q.旋轉(3)
>>> Q
雙端隊列([2, 1, 3, 5])
>>>>> Q.旋轉(-3)
>>> Q
deque([5, 2, 1, 3] )




1.25 雙端隊列有最大長度

>>>> last_two = collections.deque(maxlen=3)
>>>> for i in xrange(10):
...  
>>> for i in xrange(10):

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



1.26 可排序

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




 
2
1.預設搜尋

>>> ; m = dict()
>>>> m['a']
回溯(最近一次呼叫):
 檔案“”,第1 行,在
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: '[預設值]')🎜>>>> m['a']🎜'[預設值]'🎜>>>>> m[ 'b']🎜'[預設值]'🎜🎜🎜凡🎜🎜1.28預設字典的簡單樹狀表達式🎜

>>>>導入json
>>>>樹= lambda: collections.defaultdict(tree)
>>>> root = 樹()
>>> root['menu']['id'] = '文件'
>>>> root['menu']['value'] = '檔案'
>>>> root['menu']['menuitems']['new']['value'] = '新'
>>>> root['menu']['menuitems']['new']['onclick'] = 'new();'
>>>> root['menu']['menuitems'] ['open']['value'] = '打開'
>>>> root['menu']['menuitems']['open']['onclick'] = 'open();'
>> >> root['menu']['menuitems']['close']['value'] = '關閉'
>>>> root['menu']['menuitems']['close'][' onclick'] = 'close();'
>>>> print json.dumps(root, sort_keys=True, indent=4,分隔符號=(',', ': '))
{
  「選單」: {
       “id”: “文件”,
       “menuitems”: {
             “close”:{🠎
               「value」:「關閉」
             },
            },
      {
               “onclick”:「new();”,
               「值 「開」: {
               「onclick」: “open();”,
              「value」: 「開啟」
           }
       },
       「值」:「檔案」
   }的映射

 

>>>>導入itertools、集合

>>>> value_to_numeric_map = collections.defaultdict(itertools.count().next)

>>>> value_to_numeric_map['a']

0

>>>>> value_to_numeric_map['b']

1

>> valueue']>[ovalue.

2

>>>> value_to_numeric_map['a']

0

>>>> value_to_numeric_map['b']
1




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

1.31 兩個列表的笛卡爾積

1.31 兩個列表的笛卡爾積


> , 3], [4, 5]) 中的p:
(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)

...

00000

0001

0010
0011
0100
0101
0110
0111
1000
1001
1010
1011



1和.32列表組合元素列表替代組合

 

>> 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.ools.combinations_with_replacement([1, 2, 3], 2):hi . ) for x in c)

...

11

12

13
22
23
33




1.33 列表元素排列組合

>>>>> for p in itertools.permutations([1, 2, 3, 4]):
...     print ''.join(str(x) for x in p)
...
1234
1243
1324
1342
14233143323413332321333232323323323323323323323333323333333 2341
2413
2431
3124
3142
3214

3241

3412

3421

4123214 13213413321341333213333333333333333333333333人



1.34可連結迭代器

 

>>>>> 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)
>>>>對於itertools.chain.from_iterable(itertools.combinations(a, nfor) 中的子集n in range(len(a) + 1))
...     印子集
...
()
(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)

  

1.35 依檔案指定列類聚

 

>>>>導入itertools
>>>> with open('contactlenses.csv', 'r') as infile:
...     data = [line.strip().split(',') for line infile ]
...
>>> ;資料= 資料[1:]
>>>> def print_data(rows):
...     print 'n'.join('t'.join('{: ...

>>>> print_data(data)
年輕              近視                  沒有                    減少                無
年輕              近視                 沒有                     正常                軟
年輕            近視                  是                    減少               沒有
年輕              近視                  是                     遠視          沒有                    減           沒有                      正常                 軟
保護             減少                無
年輕              遠  老花眼                否                    化            無                     正常                軟性
前老花眼  減少               無
前老花眼                是                  正常                 硬
前老花眼     遠視眼            否                    減少                無
前老花眼    遠視           無                        正常                   柔和
前老花眼           是                  減少              無
前老花眼     遠視眼           是                   正常                 沒有
老花眼         近視                沒有                      減少                  無
老花眼                      沒有                    下使用                 是                 減少                                    正常                硬
老花眼  減少                無
老花眼         遠視                   軟
老花眼         遠視眼           是                 遠視眼           是                    正常             .sort(key=lambda r: r[-1])
>>>>對於值,在itertools.groupby(data, lambda r: r[-1]):
...     print '----- ------'
...     print 'Group: ' + value
...     print_data(group)
...
-----------
組:硬
年輕    正常                 硬
年輕              遠視                硬
前老花     近視                  是                              是                    正常          近視                  沒有                   與               是                    減少沒有
年輕             遠視            沒有                    遠視             是                   減              沒有減少                沒有
前老花眼                是        前老花眼                                                 是                   減              無  正常                 無
老花眼          無近視                 沒有
老花眼         近視                  沒有        
老花眼         近視                  是                 遠視眼          沒有                    減少                    減少無
老花眼        遠視           是                           近視                  沒有                    遠視                               正常                            正常               軟
前老花眼   為遠視時沒有        
老花遠視           無                     正常          中使用網(m.sbmmt.com)!



相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板