對于list,由于她的確非常非常龐雜,在python中應用非常廣泛,所以,雖然已經介紹完畢了基礎內容,這里還要用一講深入一點點,往往越深入越...
## list解析
先看下面的例子,這個例子是想得到1到9的每個整數的平方,并且將結果放在list中打印出來
~~~
>>> power2 = []
>>> for i in range(1,10):
... power2.append(i*i)
...
>>> power2
[1, 4, 9, 16, 25, 36, 49, 64, 81]
~~~
python有一個非常有意思的功能,就是list解析,就是這樣的:
~~~
>>> squares = [x**2 for x in range(1,10)]
>>> squares
[1, 4, 9, 16, 25, 36, 49, 64, 81]
~~~
看到這個結果,看官還不驚嘆嗎?這就是python,追求簡潔優雅的python!
其官方文檔中有這樣一段描述,道出了list解析的真諦:
> List comprehensions provide a concise way to create lists. Common applications are to make new lists where each element is the result of some operations applied to each member of another sequence or iterable, or to create a subsequence of those elements that satisfy a certain condition.
還記得[前面一講](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/118.md)中的那個問題嗎?
> 找出100以內的能夠被3整除的正整數。
我們用的方法是:
~~~
aliquot = []
for n in range(1,100):
if n%3 == 0:
aliquot.append(n)
print aliquot
~~~
好了。現在用list解析重寫,會是這樣的:
~~~
>>> aliquot = [n for n in range(1,100) if n%3==0]
>>> aliquot
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
~~~
震撼了。絕對牛X!
再來一個,是網友[ccbikai](https://github.com/ccbikai)提供的,比牛X還牛X。
~~~
>>> print range(3,100,3)
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
~~~
這就是python有意思的地方,也是計算機高級語言編程有意思的地方,你只要動腦筋,總能找到驚喜的東西。
其實,不僅僅對數字組成的list,所有的都可以如此操作。請在平復了激動的心之后,默默地看下面的代碼,感悟一下list解析的魅力。
~~~
>>> mybag = [' glass',' apple','green leaf '] #有的前面有空格,有的后面有空格
>>> [one.strip() for one in mybag] #去掉元素前后的空格
['glass', 'apple', 'green leaf']
~~~
## enumerate
這是一個有意思的內置函數,本來我們可以通過for i in range(len(list))的方式得到一個list的每個元素編號,然后在用list[i]的方式得到該元素。如果要同時得到元素編號和元素怎么辦?就是這樣了:
~~~
>>> for i in range(len(week)):
... print week[i]+' is '+str(i) #注意,i是int類型,如果和前面的用+連接,必須是str類型
...
monday is 0
sunday is 1
friday is 2
~~~
python中提供了一個內置函數enumerate,能夠實現類似的功能
~~~
>>> for (i,day) in enumerate(week):
... print day+' is '+str(i)
...
monday is 0
sunday is 1
friday is 2
~~~
算是一個有意思的內置函數了,主要是提供一個簡單快捷的方法。
官方文檔是這么說的:
> Return an enumerate object. sequence must be a sequence, an iterator, or some other object which supports iteration. The next() method of the iterator returned by enumerate() returns a tuple containing a count (from start which defaults to 0) and the values obtained from iterating over sequence:
順便抄錄幾個例子,供看官欣賞,最好實驗一下。
~~~
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
~~~
在這里有類似(0,'Spring')這樣的東西,這是另外一種數據類型,待后面詳解。
下面將enumerate函數和list解析聯合起來,同時顯示,在進行list解析的時候,也可以包含進函數(關于函數,可以參考的章節有:[初始強大的函數](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/106.md),[重回函數](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/212.md))。
~~~
>>> def treatment(pos, element):
... return "%d: %s"%(pos,element)
...
>>> seq = ["qiwsir","qiwsir.github.io","python"]
>>> [ treatment(i, ele) for i,ele in enumerate(seq) ]
['0: qiwsir', '1: qiwsir.github.io', '2: python']
~~~
看官也可以用[小話題大函數](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/209.md)中的lambda函數來寫上面的代碼:
~~~
>>> seq = ["qiwsir","qiwsir.github.io","python"]
>>> foo = lambda i,ele:"%d:%s"%(i,ele) #lambda函數,給代碼帶來了簡介
>>> [foo(i,ele) for i,ele in enumerate(seq)]
['0:qiwsir', '1:qiwsir.github.io', '2:python']
~~~
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python