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

30個有關Python的小技巧

Dec 15, 2016 pm 03:13 PM

從我開始學習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)
...
-----------
組:硬
年輕    正常                 硬
年輕              遠視                硬
前老花     近視                  是                              是                    正常          近視                  沒有                   與               是                    減少沒有
年輕             遠視            沒有                    遠視             是                   減              沒有減少                沒有
前老花眼                是        前老花眼                                                 是                   減              無  正常                 無
老花眼          無近視                 沒有
老花眼         近視                  沒有        
老花眼         近視                  是                 遠視眼          沒有                    減少                    減少無
老花眼        遠視           是                           近視                  沒有                    遠視                               正常                            正常               軟
前老花眼   為遠視時沒有        
老花遠視           無                     正常          中使用網(www.php.cn)!



本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何解決Linux終端中查看Python版本時遇到的權限問題? 如何解決Linux終端中查看Python版本時遇到的權限問題? Apr 01, 2025 pm 05:09 PM

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到? 如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到? Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

在Python中如何高效地將一個DataFrame的整列複製到另一個結構不同的DataFrame中? 在Python中如何高效地將一個DataFrame的整列複製到另一個結構不同的DataFrame中? Apr 01, 2025 pm 11:15 PM

在使用Python的pandas庫時,如何在兩個結構不同的DataFrame之間進行整列複製是一個常見的問題。假設我們有兩個Dat...

Uvicorn是如何在沒有serve_forever()的情況下持續監聽HTTP請求的? Uvicorn是如何在沒有serve_forever()的情況下持續監聽HTTP請求的? Apr 01, 2025 pm 10:51 PM

Uvicorn是如何持續監聽HTTP請求的? Uvicorn是一個基於ASGI的輕量級Web服務器,其核心功能之一便是監聽HTTP請求並進�...

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎? 如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎? Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

在Linux終端中使用python --version命令時如何解決權限問題? 在Linux終端中使用python --version命令時如何解決權限問題? Apr 02, 2025 am 06:36 AM

Linux終端中使用python...

如何繞過Investing.com的反爬蟲機制獲取新聞數據? 如何繞過Investing.com的反爬蟲機制獲取新聞數據? Apr 02, 2025 am 07:03 AM

攻克Investing.com的反爬蟲策略許多人嘗試爬取Investing.com(https://cn.investing.com/news/latest-news)的新聞數據時,常常�...

See all articles