前言
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理,
Python爬蟲、資料分析、網站開發等案例教程視頻免費在線觀看
https://space.bilibili.com/523606542
和其他編程語言相比,什么才是Python獨一無二的特色呢?很多程式員會說,縮進,的確,縮進是Python語言的標志性特點,但這只是外在的、形式上的,從語言特性層面講,Python的特點是什么呢?我嘗試著在知乎上搜索了一下,最具代表性的答案分別是語法簡潔、簡單易學、代碼高效、功能強大等四項,仔細品味這四項,我還是覺得,這是Python語言表現出來的使用效果或用戶感受,仍然不是語言特性層面的特色,
換個說法,究竟是Python的哪些語言特性使得人們普遍認為Python具有語法簡潔、簡單易學、代碼高效、功能強大的特點呢?我個人認為,這要歸功于串列(list)、字典(dict)、元組(tuple)和集合(set)這“四大金剛”,盡管整型(int)、浮點型(float)和字串(str)也很重要,但這三種物件相對于其他編程語言來說,差異并不像“四大金剛”那樣明顯,可以毫不夸張地說,串列、字典、元組和集合代表了Python語言的核心和基礎,同時也是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 "", line 1, in a[0] = 5 TypeError: 'tuple' object does not support item assignment
3.2 必入之深坑
使用了多年Python之后,我曾經寫出的最糟糕的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) ('tuple'>, 'tuple'>)
3.3 單星號解包元組
格式化輸出字串時,C語言風格是我的最愛,當有多個%需要匹配時,下面也許是最自然而然的寫法,
>>> 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 "", line 1, in
s = {1,'x',[3,4,5]}
TypeError: unhashable type: 'list'
我們可以將元組加到集合中,但串列不行,因為串列是不可哈希(unhashable)的,理解這一點并不困難:串列元素可以被動態改變,所以沒有一個固定不變的哈希值——這與集合要求的元素唯一性沖突;而元組的元素被禁止更新,其哈希值在整個生命周期都不會變化,因此可以成為集合的元素,
顯然,元組和串列有著完全不同的存盤方式,因為不用考慮更新問題,元組的速度性能要遠優于串列,優先使用元組,應該成為Python程式員遵循的一潭訓本原則,
作者:天元浪子
來源:Python作業輔導員
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/246735.html
標籤:Python
