Python的括號家族:方括號、花括號和圓括號的用法總結

2021-03-02 湯豆道課

Python獨一無二的特色除了縮進還有哪些特色呢?大多數的回答一定是語法簡潔、簡單易學、代碼高效、功能強大等四項。那究竟是Python的哪些語言特性使得人們普遍認為Python具有語法簡潔、簡單易學、代碼高效、功能強大的特點呢?其實很大程度上,這要歸功於列表(list)、字典(dict)、元組(tuple)和集合(set)這「四大金剛」。儘管整型(int)、浮點型(float)和字符串(str)也很重要,但毫不誇張地說,列表、字典、元組和集合才代表了Python語言的核心和基礎,同時也是Python的精髓所在。學會使用列表、字典、元組和集合,就意味著掌握了Python這門程式語言。

我們來一起回顧一下由列表、字典、元組和集合「四大金剛」,而演變成的由方括號、花括號和圓括號組成的「括號族」。

1. 方括號

方括號幾乎是所有程式語言的第一符號。這裡的第一,並不是指使用頻率,而是指這個符號展現出的程式語言的內涵和創造力。事實上,就符號的使用頻率而言,方括號也可能排在首位——只是我的直覺,並沒有統計數據支持。

1.1 創建列表

對於初學者來說,創建列表最常用的方法就是用一對方括號。

>>> a = []
>>> a
[]
>>> b = [3.14, False, 'x', None]
>>> b
[3.14, False, 'x', None]

即便是老鳥,也會大量使用方括號創建列表,尤其是使用推導式創建列表的情況下。

>>> c = [i**2 for i in range(5)]
>>> c
[0, 1, 4, 9, 16]

但其實方括號就像口語或俚語,太過隨便。大家要習慣使用嚴謹的list()來創建列表。使用list()創建列表,是list類的實例化的標準方法,可以體會list類的構造函數如何適應不同類型的參數。

>>> a = list()
>>> a
[]
>>> b = list((3.14, False, 'x', None))
>>> b
[3.14, False, 'x', None]
>>> c = list({1,2,3})
>>> c
[1, 2, 3]
>>> d = list({'x':1,'y':2,'z':3})
>>> d
['x', 'y', 'z']
>>> e = list(range(5))
>>> e
[0, 1, 2, 3, 4]
>>> f = list('*'*i for i in range(5))
>>> f
['', '*', '**', '***', '****']

1.2 列表的索引

方括號可以創建列表,但方括號並不等同於列表,因為方括號還用來索引。

>>> [3.14, False, 'x', None][2]
'x'
>>> [3.14, False, 'x', None][-2]
'x'
>>> [3.14, False, 'x', None][1:]
[False, 'x', None]
>>> [3.14, False, 'x', None][:-1]
[3.14, False, 'x']
>>> [3.14, False, 'x', None][::2]
[3.14, 'x']
>>> [3.14, False, 'x', None][::-1]
[None, 'x', False, 3.14]

列表的索引非常靈活,尤其是引入了負數索引,用-1表示最後一個元素或逆序,實屬喜大普奔。上面的操作,屬於常用索引方式,如果能讀懂下面的代碼,說明你已經具備了足夠深的功力。

>>> a = [3.14, False, 'x', None]
>>> a[2:2] = [1,2,3]
>>> a
[3.14, False, 1, 2, 3, 'x', None]

1.3 列表的方法

對於列表對象的方法如果能信手拈來,那就是Python高手了。

>>> a = [3.14, False, 'x', None]
>>> a.index('x')
2
>>> a.append([1,2,3])
>>> a
[3.14, False, 'x', None, [1, 2, 3]]
>>> a[-1].insert(1, 'ok')
>>> a
[3.14, False, 'x', None, [1, 'ok', 2, 3]]
>>> a.remove(False)
>>> a
[3.14, 'x', None, [1, 'ok', 2, 3]]
>>> a.pop(1)
'x'
>>> a
[3.14, None, [1, 'ok', 2, 3]]
>>> a.pop()
[1, 'ok', 2, 3]
>>> a
[3.14, None]

2. 花括號

花括號代表字典對象,大多數初學者都這樣認為。然而,這是錯誤的,至少是片面的。下面的代碼中,a和b都是用花括號創造出來的對象,卻一個是字典,一個是集合。

>>> a = {}
>>> a
{}
>>> b = {'x','y','z'}
>>> b
{'y', 'z', 'x'}
>>> type(a)
<class 'dict'>
>>> type(b)
<class 'set'>

原來,Python用花括號表示字典和集合兩種對象:花括號內是空的,或者是鍵值對的,表示字典;花括號內是無重複元素的,表示集合。為了不引起誤會,我習慣用dict()來生成字典,用set()來生成集合。

>>> dict()
{}
>>> dict({'x':1, 'y':2, 'z':3})
{'x': 1, 'y': 2, 'z': 3}
>>> dict((('x',1), ('y',2), ('z',3)))
{'x': 1, 'y': 2, 'z': 3}
>>> dict.fromkeys('xyz')
{'x': None, 'y': None, 'z': None}
>>> dict.fromkeys('abc', 0)
{'a': 0, 'b': 0, 'c': 0}
>>> set((3,4,5))
{3, 4, 5}
>>> set({'x':1, 'y':2, 'z':3})
{'y', 'z', 'x'}
>>> set([3,3,4,4,5,5])
{3, 4, 5}

編碼實踐中,雖然在某些情況下集合是無可替代的,但集合的使用頻率是「四大金剛」中最低的,我們這裡不展開討論,只說說字典的使用技巧。

2.1 判斷一個鍵是否存在於字典中

Py2時代,dict對象曾經有has_key()的方法,用來判斷是否包含某個鍵。py3捨棄了這個方法,判斷一個鍵是否存在於字典中,只能使用in這樣的方法了。

>>> a = dict({'x':1, 'y':2, 'z':3})
>>> 'x' in a
True
>>> 'v' in a
False

2.2 向字典中添加一個新鍵或更新鍵值

很多人喜歡用對字典的一個鍵賦值的方法,實現向字典中添加一個新鍵或更新鍵值。

>>> a = dict()
>>> a['name'] = 'xufive'
>>> a
{'name': 'xufive'}

我不推薦這樣的方式,使用update()才更有儀式感,還可以一次添加或修改多個鍵。

>>> a = dict()
>>> a.update({'name':'xufive', 'gender':'男'})
>>> a
{'name': 'xufive', 'gender': '男'}

2.3 從字典中獲取一個鍵值

a[『age』]是最常用的方式,但是也還會遇到鍵不存在的異常。下面的方法值得推薦。

>>> a.get('age', 18)
18

2.4 獲取字典的全部鍵、全部值、全部鍵值對

dict類提供了keys()、values()和items()等三個方法分別返回字典的全部鍵、全部值和全部鍵值對。需要注意的是,返回結果並非列表,而是迭代器。如果你需要列表形式的返回結果,請使用list()轉換。

>>> a = dict()
>>> a.update({'name':'xufive', 'gender':'男'})
>>> list(a.keys())
['name', 'gender']
>>> list(a.values())
['xufive', '男']
>>> list(a.items())
[('name', 'xufive'), ('gender', '男')]

2.5 遍歷字典

遍歷字典的時候,很多同學或寫成遍歷字典的keys()。其實,不需要這麼麻煩,可以像下面這樣直接遍歷。

>>> a = dict([('name', 'xufive'), ('gender', '男')])
>>> for key in a:
print(key, a[key])

name xufive
gender 男

3. 圓括號

圓括號代表元組對象,這麼說應該沒有問題吧?的確,聽起來沒有問題,但在元組的使用上,我相信每個初學者都會跌進同一個深坑至少一次。

3.1 必入之淺坑

元組不用於列表的最顯著的特點,就是無法更新元素的值。忘記或者忽略這一點,就會入坑。

>>> a = (3, 4)
>>> a[0] = 5
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
a[0] = 5
TypeError: 'tuple' object does not support item assignment

3.2 必入之深坑

我們一起來看一下下面這段代碼bug在哪裡

>>> import threading
>>> def do_something(name):
print('My name is %s.'%name)

>>> th = threading.Thread(target=do_something, args=('xufive'))
>>> th.start()
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Users\xufive\AppData\Local\Programs\Python\Python37\lib\threading.py", line 926, in _bootstrap_inner
self.run()
File "C:\Users\xufive\AppData\Local\Programs\Python\Python37\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
TypeError: do_something() takes 1 positional argument but 6 were given

分明只提供了1個參數,卻提示說給出了6個參數,為什麼呢?
原來,元組初始化時,如果只有單個參數,則必須在單個參數之後增加一個逗號(,),否則,初始化結果僅返回原參數。

>>> a = (5)
>>> a
5
>>> type(a)
<class 'int'>
>>> b = ('xyz')
>>> b
'xyz'
>>> type(b)
<class 'str'>
>>> a, b = (5,), ('xyz',)
>>> a, b
((5,), ('xyz',))
>>> type(a), type(b)
(<class 'tuple'>, <class 'tuple'>)

3.3 單星號解包元組

格式化輸出字符串時,下面也許是很多人的寫法。

>>> args = (95,99,100)
>>> '%s:語文%d分,數學%d分,英語%d分'%('天元浪子', args[0], args[1], args[2])
'天元浪子:語文95分,數學99分,英語100分'

正確固然正確,但不夠精彩。滿分寫法應該是這樣的。

>>> args = (95,99,100)
>>> '%s:語文%d分,數學%d分,英語%d分'%('天元浪子', *args)
'天元浪子:語文95分,數學99分,英語100分'

3.4 為什麼要使用元組?

既然元組的元素不可改變,那為什麼還要使用元組呢?使用列表代替元組不是更方便嗎?誠然,在多數情況下,可以使用列表代替元組,但下面的例子卻可以證明,列表無法代替元組。

>>> s = {1,'x',(3,4,5)}
>>> s
{1, (3, 4, 5), 'x'}
>>> s = {1,'x',[3,4,5]}
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
s = {1,'x',[3,4,5]}
TypeError: unhashable type: 'list'

我們可以將元組加到集合中,但列表不行,因為列表是不可哈希(unhashable)的。理解這一點並不困難:列表元素可以被動態改變,所以沒有一個固定不變的哈希值——這與集合要求的元素唯一性衝突;而元組的元素被禁止更新,其哈希值在整個生命周期都不會變化,因此可以成為集合的元素。

所以我們可以得到一個結論,元組和列表有著完全不同的存儲方式。因為不用考慮更新問題,元組的速度性能要遠優於列表。優先使用元組,應該成為Python程式設計師遵循的一條基本原則。

微信號|tangdoutalk

知識星球|Python臨床科研

相關焦點

  • 小括號、中括號、大括號,英文怎麼說?
    作者:小雅和英美友人括號-美國朋友語音示範00:55來自你和寶寶說英語(1) Parentheses 小括號;圓括號(複數)一定要讀一下括號裡的內容。Open / Close parenthesis 小括號;圓括號(單數)Write this down: all new students will need to come to the Conference Hall, open parenthesis, Room 202, close parenthesis
  • 引號和括號的用法
    引號   引號的形式為雙引號「「」」和單引號「『 』」。行文中直接引用的話,用引號標示。例如:  「滿招損,謙受益」這句格言,流傳到今天至少有兩千年了。  現代畫家徐悲鴻筆下的馬,正如有的評論家所說的那樣,「神形兼備」。
  • 括號造句和解釋_括號的例句有哪些-小孩子點讀
    括號(kuò hào)。近義詞有:括弧。 括號參考例句: 1、用括號裡動詞的現在進行時態來填充空格。 2、老師提醒同學考試作答時,要將答案寫在空白的括號內,否則不予計分。 3、她兩條細長的眉毛就像兩個倒下來的小括號。
  • 括號造句和解釋_括號的例句有哪些 - 小孩子點讀
    括號(kuò hào)。近義詞有:括弧。標點符號的一種,即()、〔〕等,主要表示文中的注釋說明部分。即數學中的括弧。括號參考例句:1、用括號裡動詞的現在進行時態來填充空格。2、老師提醒同學考試作答時,要將答案寫在空白的括號內,否則不予計分。3、她兩條細長的眉毛就像兩個倒下來的小括號。
  • 英語中的括號你知道多少
    圓括號是用來在文本或段落中引出信息的標點符號。在字符圖釋的範圍之外,括號總是成對出現。他們可以附上一個單詞,一個短語甚至整個句子。通常,括號內的單詞提供關於句子中其他內容的額外信息。括號「Curators from the American Museum of Natural History (AMNH) have announced a new dinosaur
  • 小學如何學標點符號之括號、破折號
    一、括號括號標明文中注釋的部分。括號裡的注釋是比較寬泛的,沒有具體限制,一般不需要讀出來。按照括號在文中的位置可以分為兩類,一類是句內括號,另一類是句外括號。(高爾基《童年》)句外括號注釋全句,括號應用在全句句末點號之後,括號外的句中、句末點號都照用。
  • 語文標點符號知識點:括號的用法
    括號   括號主要表示括起來的話是注釋或補充說明前邊的詞語或句子。這種注釋或補充說明面比較寬,可以解釋語義,註明時間,也可以交代引出處,列舉具體內容,還可以諷刺、批評、訂正錯誤等。下面是語文標點符號知識點:括號的用法。   使用括號要注意:   (一)括號要緊挨前面被注釋或說明的詞語或句子。
  • 標點符號用法介紹(二):冒號&破折號&括號
    冒號也常用在總括性詞語之前,表示對上文進行總結。冒號放在句內,表示比較大的停頓。用於總說性或提示性詞語(「說」「例如」「證明」)之後,表示提示下文。例:他十分驚訝地說:「啊,原來你在這!」解讀:動詞後引出賓語。例:張華上了大學,李萍進了技校,我當了工人:我們都有美好的前途解讀:概括總結前面三個人的發展前途。
  • Go 泛型的括號選擇:[ ] or ( )?
    常見的計算機鍵盤提供了四對單字符對稱括號,分別是小括號 ( )、方括號 [ ]、花括號 { } 以及尖括號 < >。基於此,他們解釋了目前泛型草案在示例代碼中使用小括號的原因。首先,Go 使用花括號來劃分代碼塊、複合字面量(composite literals)和一些複合類型,因此幾乎不可能在沒有嚴重語法問題的情況下將花括號用於泛型。
  • 如何去掉括號裡的內容和括號?
    本期小編與大家分享如何去除括號裡的信息以及如何保留括號內的信息呢?1、去除括號信息如下圖表格,如何從客戶信息裡去除括號及裡面的內容?可以直接利用查找替換功能:按Ctrl+H組合鍵打開查找和替換對話框,查找內容輸入:(*),替換為空即可。
  • 摘要:php花括號、大括號{}幾種使用方法的分析
    php花括號、大括號{}幾種使用方法的分析第一種:在函數中的使用例如:function ceshi(){}foreach(){}在函數中常用的方法就是保持數據在作用域範圍的執行第二種:對於那種一直在變化的變量的使用例如:<?
  • Go 泛型的括號選擇:「」or ( )?
    他們提到很多人表達了對泛型語法的擔憂,特別是在類型參數聲明和函數實例以及泛型的括號選擇方面。常見的計算機鍵盤提供了四對單字符對稱括號,分別是小括號 ( )、方括號 [ ]、花括號 { } 以及尖括號 < >。基於此,他們解釋了目前泛型草案在示例代碼中使用小括號的原因。
  • 添括號、去括號專項訓練題
    2、關鍵看括號外面。3、加法變成減法,減法變成加法。4、字母例題:①a+(b+c+d)=a+b+c+d因為,括號外是「+」號,所以,括號內不變號。② a-(b+c+d)=a-b-c-d因為,括號外是「-」號,所以,括號內要變號,兩個「+」號變成兩個「-」號。③a-b-c=a-(b+c)因為,括號外是「-」號,所以,括號內要變號。「-」號變成「+」號。
  • 擁抱數學小括號——聽胡老師講數學趣味小故事
    ( )是小括號,又稱為圓括號,是公元17世紀由荷蘭人吉拉特首先使用的。在採用小括號之前,歷史上曾使用過括線「」。小括號的最主要作用是運算順序作用。7×(9+12)÷3=497×(9+12÷3)=49(7×9+12)÷3=49初中小括號的用法更多了,比如區分運算符號與性質符號,為了區分,要把含性質符號的數或式用括號括起來。
  • 有效括號
    有效字符串需滿足:左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。注意空字符串可被認為是有效字符串。= stack.pop()) { return false; } } } return stack.isEmpty();}給定一個只包含三種字符的字符串:(,) 和 *,寫一個函數來檢驗這個字符串是否為有效字符串。有效字符串具有如下規則:任何左括號 ( 必須有相應的右括號 )。
  • 手把手解決三道括號相關的算法題
    假設字符串中只有圓括號,如果想讓括號字符串合法,那麼必須做到:每個右括號)的左邊必須有一個左括號(和它匹配。比如說字符串()))((中,中間的兩個右括號左邊就沒有左括號匹配,所以這個括號組合是不合法的。
  • Linux系統大括號的作用
    上期小編介紹了Linux系統中括號( )和[ ]括號的作用,這期接著來介紹Linux系統中括號{ }的作用1、Linux系統括號{ }的常規用法1)括號{ }拓展對括號{ }中的文件名做擴展。括號內的命令間用分號隔開,最後一個也必須有分號。{ }的第一個命令和左括號之間必須要有一個空格。
  • 初中語文標點符號知識點:括號的用法
    括號   括號主要表示括起來的話是注釋或補充說明前邊的詞語或句子。這種注釋或補充說明面比較寬,可以解釋語義,註明時間,也可以交代引出處,列舉具體內容,還可以諷刺、批評、訂正錯誤等。   使用括號要注意:   (一)括號要緊挨前面被注釋或說明的詞語或句子。
  • 如何輸入六角括號「〔〕」
    在我們工作中,六角括號「〔〕」的輸入是經常遇到的,特別是在寫公文文號的時候,六角括號是必用的。然而很多人卻不知道怎麼輸入,不得不用方括號「【】」或者「[]」代替,而這是及其不規範的。六角括號那麼word文檔中打出六角括號真有那麼難嗎?如何才能既快又好的輸入呢?
  • 每天吃透一考點,初一上《去括號與添括號》高頻易錯題,學霸總結
    一.選擇題(共10小題)【點評】本題主要考查去括號和添括號,熟練掌握添括號和去括號法則是解題的關鍵.【點評】本題考查絕對值的化簡方法和去括號的法則,比較簡單.【點評】本題考查了添括號.解題的關鍵是掌握添括號時,若括號前是「+」,添括號後,括號裡的各項都不改變符號;若括號前是「﹣」,添括號後,括號裡的各項都改變符號.