0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python獨一無二的特色是什么?

數(shù)據(jù)分析與開發(fā) ? 來源:Python作業(yè)輔導(dǎo)員 ? 作者:天元浪子 ? 2021-01-18 18:17 ? 次閱讀

究竟是Python的哪些語言特性使得人們普遍認(rèn)為Python具有語法簡潔、簡單易學(xué)、代碼高效、功能強(qiáng)大的特點呢?一起來探討一下吧!

和其他編程語言相比,什么才是Python獨一無二的特色呢?很多程序員會說,縮進(jìn)。的確,縮進(jìn)是Python語言的標(biāo)志性特點,但這只是外在的、形式上的。從語言特性層面講,Python的特點是什么呢?我嘗試著在知乎上搜索了一下,最具代表性的答案分別是語法簡潔、簡單易學(xué)、代碼高效、功能強(qiáng)大等四項。仔細(xì)品味這四項,我還是覺得,這是Python語言表現(xiàn)出來的使用效果或用戶感受,仍然不是語言特性層面的特色。 換個說法,究竟是Python的哪些語言特性使得人們普遍認(rèn)為Python具有語法簡潔、簡單易學(xué)、代碼高效、功能強(qiáng)大的特點呢?我個人認(rèn)為,這要歸功于列表(list)、字典(dict)、元組(tuple)和集合(set)這“四大金剛”。盡管整型(int)、浮點型(float)和字符串(str)也很重要,但這三種對象相對于其他編程語言來說,差異并不像“四大金剛”那樣明顯??梢院敛豢鋸埖卣f,列表、字典、元組和集合代表了Python語言的核心和基礎(chǔ),同時也是Python的精髓所在。學(xué)會使用列表、字典、元組和集合,就意味著掌握了Python這門編程語言。 如果認(rèn)可這個觀點,那么,Python的精髓就從列表、字典、元組和集合等“四大金剛”,演變成由方括號、花括號和圓括號組成的“括號族”。

1. 方括號

方括號幾乎是所有編程語言的第一符號。這里的第一,并不是指使用頻率,而是指這個符號展現(xiàn)出的編程語言的內(nèi)涵和創(chuàng)造力。事實上,就符號的使用頻率而言,方括號也可能排在首位——只是我的直覺,并沒有統(tǒng)計數(shù)據(jù)支持。

1.1 創(chuàng)建列表

對于初學(xué)者來說,創(chuàng)建列表最常用的方法就是用一對方括號。

》》》 a = [] 》》》 a [] 》》》 b = [3.14, False, ‘x’, None] 》》》 b [3.14, False, ‘x’, None]即便是老鳥,也會大量使用方括號創(chuàng)建列表,尤其是使用推導(dǎo)式創(chuàng)建列表的情況下。》》》 c = [i**2 for i in range(5)] 》》》 c [0, 1, 4, 9, 16]但我一直覺得,方括號就像口語或俚語,太過隨便。我更喜歡使用嚴(yán)謹(jǐn)?shù)膌ist()來創(chuàng)建列表。使用list()創(chuàng)建列表,是list類的實例化的標(biāo)準(zhǔn)方法,可以體會list類的構(gòu)造函數(shù)如何適應(yīng)不同類型的參數(shù)?!贰贰?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 列表的索引

方括號可以創(chuàng)建列表,但方括號并不等同于列表,因為方括號還用來索引。

》》》 [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]列表的索引非常靈活,尤其是引入了負(fù)數(shù)索引,用-1表示最后一個元素或逆序,實屬喜大普奔。上面的操作,屬于常用索引方式,如果能讀懂下面的代碼,說明你已經(jīng)具備了足夠深的功力。》》》 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. 花括號

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

》》》 a = {} 》》》 a {} 》》》 b = {‘x’,‘y’,‘z’} 》》》 b {‘y’, ‘z’, ‘x’} 》》》 type(a) 《class ‘dict’》 》》》 type(b) 《class ‘set’》原來,Python用花括號表示字典和集合兩種對象:花括號內(nèi)是空的,或者是鍵值對的,表示字典;花括號內(nèi)是無重復(fù)元素的,表示集合。為了不引起誤會,我習(xí)慣用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(‘a(chǎn)bc’, 0) {‘a(chǎn)’: 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對象曾經(jīng)有has_key()的方法,用來判斷是否包含某個鍵。py3舍棄了這個方法,判斷一個鍵是否存在于字典中,只能使用in這樣的方法了。

》》》 a = dict({‘x’:1, ‘y’:2, ‘z’:3}) 》》》 ‘x’ in a True 》》》 ‘v’ in a False

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

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

》》》 a = dict() 》》》 a[‘name’] = ‘xufive’ 》》》 a {‘name’: ‘xufive’}我不推薦這樣的方式,使用update()才更有儀式感,還可以一次添加或修改多個鍵?!贰贰?a = dict() 》》》 a.update({‘name’:‘xufive’, ‘gender’:‘男’}) 》》》 a {‘name’: ‘xufive’, ‘gender’: ‘男’}

2.3 從字典中獲取一個鍵值

a[‘a(chǎn)ge’]是最常用的方式,但是也還會遇到鍵不存在的異常。下面的方法值得推薦。

》》》 a.get(‘a(chǎn)ge’, 18) 18

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

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

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

2.5 遍歷字典

遍歷字典的時候,很多同學(xué)或?qū)懗杀闅v字典的keys()。其實,不需要這么麻煩,可以像下面這樣直接遍歷。

》》》 a = dict([(‘name’, ‘xufive’), (‘gender’, ‘男’)]) 》》》 for key in a: print(key, a[key]) name xufive gender 男

3. 圓括號

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

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 必入之深坑

使用了多年P(guān)ython之后,我曾經(jīng)寫出的最糟糕的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:UsersxufiveAppDataLocalProgramsPythonPython37lib hreading.py”, line 926, in _bootstrap_inner self.run() File “C:UsersxufiveAppDataLocalProgramsPythonPython37lib hreading.py”, line 870, in run self._target(*self._args, **self._kwargs) TypeError: do_something() takes 1 positional argument but 6 were given我分明只提供了1個參數(shù),卻提示說給出了6個參數(shù),為什么呢?原來,元組初始化時,如果只有單個參數(shù),則必須在單個參數(shù)之后增加一個逗號(,),否則,初始化結(jié)果僅返回原參數(shù)。》》》 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 單星號解包元組

格式化輸出字符串時,C語言風(fēng)格是我的最愛。當(dāng)有多個%需要匹配時,下面也許是最自然而然的寫法。

》》》 args = (95,99,100) 》》》 ‘%s:語文%d分,數(shù)學(xué)%d分,英語%d分’%(‘天元浪子’, args[0], args[1], args[2]) ‘天元浪子:語文95分,數(shù)學(xué)99分,英語100分’正確固然正確,但不夠精彩。滿分寫法應(yīng)該是這樣的?!贰贰?args = (95,99,100) 》》》 ‘%s:語文%d分,數(shù)學(xué)%d分,英語%d分’%(‘天元浪子’, *args) ‘天元浪子:語文95分,數(shù)學(xué)99分,英語100分’

3.4 為什么要使用元組?

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

》》》 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)的。理解這一點并不困難:列表元素可以被動態(tài)改變,所以沒有一個固定不變的哈希值——這與集合要求的元素唯一性沖突;而元組的元素被禁止更新,其哈希值在整個生命周期都不會變化,因此可以成為集合的元素。 顯然,元組和列表有著完全不同的存儲方式。因為不用考慮更新問題,元組的速度性能要遠(yuǎn)優(yōu)于列表。優(yōu)先使用元組,應(yīng)該成為Python程序員遵循的一條基本原則。

原文標(biāo)題:用了十幾年才想明白:Python 的精髓居然是方括號、花括號和圓括號!

文章出處:【微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3565

    瀏覽量

    93536
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4767

    瀏覽量

    84375

原文標(biāo)題:用了十幾年才想明白:Python 的精髓居然是方括號、花括號和圓括號!

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    ubuntu下(python ver 2.7.6)運行python demo_server.py后反應(yīng)怎么解決?

    python ver 2.7.6)運行python demo_server.py后反應(yīng) 請問該如何正確運行此腳本?
    發(fā)表于 07-22 08:20

    蜂窩物聯(lián)云平臺:站式服務(wù),智能生活從此開始!

    獨一無二的用戶體驗。 數(shù)據(jù)集中看板將所有關(guān)鍵數(shù)據(jù)整合于個界面,實現(xiàn)快速瀏覽與決策。實時數(shù)據(jù)、視頻、地圖定位等應(yīng)俱全。 、功能模塊亮點 實時數(shù)據(jù)監(jiān)測實時追蹤傳感器數(shù)據(jù),提供詳盡的歷
    的頭像 發(fā)表于 07-19 15:52 ?142次閱讀
    蜂窩物聯(lián)云平臺:<b class='flag-5'>一</b>站式服務(wù),智能生活從此開始!

    opencv-python和opencv樣嗎

    樣。OpenCV(Open Source Computer Vision Library)是個開源的計算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,它提供了大量的圖像和視頻處理功能。OpenCV-Python
    的頭像 發(fā)表于 07-16 10:38 ?880次閱讀

    RFID芯片摜蛋牌:高科技與傳統(tǒng)玩法結(jié)合,游戲體驗煥然新。

    “RFID芯片摜蛋牌”是將RFID芯片嵌入傳統(tǒng)摜蛋牌中,利用了無線射頻識別技術(shù),將數(shù)字化與傳統(tǒng)紙牌完美結(jié)合。它賦予每張撲克牌獨一無二的身份標(biāo)識,并能實時傳輸信息至相關(guān)系統(tǒng)或設(shè)備。
    的頭像 發(fā)表于 05-28 11:34 ?497次閱讀

    新思科技收購Intrinsic ID,提升芯片知識產(chǎn)權(quán)保護(hù)力度

     此舉通過將生產(chǎn)過程驗證過的PUF IP融入新思科技的半導(dǎo)體IP系列產(chǎn)品中,幫助SoC設(shè)計師借助每顆芯片特有的特征創(chuàng)建獨一無二的標(biāo)識符,確保芯片的知識產(chǎn)權(quán)得到保護(hù)。
    的頭像 發(fā)表于 03-25 09:34 ?284次閱讀

    什么是域名?什么是DNS?DNS域名原理你知道嗎?

    域名(Domain Name),簡稱域名、網(wǎng)域,是由串用點分隔的名字組成的Internet上某臺計算機(jī)或計算機(jī)組的名稱,用于在數(shù)據(jù)傳輸時標(biāo)識計算機(jī)的電子方位。具有獨一無二,不可重復(fù)的特性。
    的頭像 發(fā)表于 03-11 17:01 ?5067次閱讀

    晶振為什么是獨一無二的存在呢?晶振有哪些獨特性?

    晶振(Crystal Oscillator)之所以被描述為獨一無二,主要是因為其工作原理和特性使得它在某種程度上可以被看作是獨特的存在。
    的頭像 發(fā)表于 01-12 17:38 ?385次閱讀

    淺談服務(wù)機(jī)器人主要市場及驅(qū)動來源

    當(dāng)提高生產(chǎn)率和降低成本成為服務(wù)機(jī)器人的共同特征時,針對市場特定問題或需求,人們希望每個服務(wù)機(jī)器人系統(tǒng)能提供獨一無二的、有競爭力的解決方案。
    發(fā)表于 12-25 09:45 ?200次閱讀
    淺談服務(wù)機(jī)器人主要市場及驅(qū)動來源

    分享獨一無二的放大器—FUTEK IAA105

    IAA105是獨一無二的放大器,在傳感器電子領(lǐng)域開辟了新天地。
    的頭像 發(fā)表于 12-13 09:14 ?406次閱讀

    自制個簡單易用的針孔相機(jī)

    膠片針孔相機(jī)相比透鏡相機(jī)來說,具有無限的景深,并且不會產(chǎn)生色差等畸變,可是拍攝時需要很長的曝光時間,且購買和沖洗膠卷使成本大大提升。但使用數(shù)字傳感器或許可以解決這兩個問題,讓我們起來看看如何用些“小技巧”自制一臺獨一無二的針
    的頭像 發(fā)表于 12-11 16:24 ?1536次閱讀
    自制<b class='flag-5'>一</b>個簡單易用的針孔相機(jī)

    維數(shù)組轉(zhuǎn)為python

    維數(shù)組轉(zhuǎn)為維數(shù)組是個常見的問題,特別是在處理數(shù)據(jù)時。維數(shù)組是由個連續(xù)的數(shù)據(jù)塊組成,而
    的頭像 發(fā)表于 11-23 14:54 ?4975次閱讀

    python輸出list的每個元素

    Python種簡單易學(xué)的編程語言,廣泛應(yīng)用于各個領(lǐng)域中。而處理列表(list)是Python中非常常見的操作之。在Python中,列表
    的頭像 發(fā)表于 11-21 16:16 ?1430次閱讀

    python怎么創(chuàng)建維數(shù)組

    如何創(chuàng)建維數(shù)組在Python中是個常見的問題。在Python中,我們可以使用嵌套的列表(list of lists)或者使用NumPy庫來創(chuàng)建
    的頭像 發(fā)表于 11-21 15:10 ?3571次閱讀

    在語音時代,聲音深度假音如何分辨?

    聲音深度假音的創(chuàng)造植根于復(fù)雜的人工智能系統(tǒng),尤其是自動編碼器,它可以捕捉和復(fù)制人類語言的微妙之處。這些系統(tǒng)不只是克隆聲音;他們分析和重現(xiàn)情感變化和特定的語調(diào),使每個聲音都獨一無二。
    的頭像 發(fā)表于 11-14 16:04 ?664次閱讀

    python如何定義個函數(shù)

    、Python3 函數(shù) 函數(shù)是組織好的,可重復(fù)使用的,用來實現(xiàn)單,或相關(guān)聯(lián)功能的代碼段。 函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道Python提供了許多內(nèi)建函數(shù),比如
    的頭像 發(fā)表于 11-14 11:26 ?671次閱讀