python高級特性

1、切片(slice)
L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個元素。
如果第一個索引是0,還可以省略: L[:3]
也可以從索引1開始,取出2個元素出來:L[1:3]
前10個數,每兩個取一個:L[:10:2]
所有數,每5個取一個:L[::5]

tuple也是一種list,唯一區別是tuple不可變。因此,tuple也可以用切片操作,只是操作的結果仍是tuple:

字符串'xxx'也可以看成是一種list,每個元素就是一個字符。因此,字符串也可以用切片操作,只是操作結果仍是字符串:

2、迭代(iteration)
在Python中,迭代是通過for ... in來完成的,因為Python的for循環不僅可以用在list或tuple上,還可以作用在其他可迭代對象上。
list這種數據類型雖然有下標,但很多其他數據類型是沒有下標的,但是,只要是可迭代對象,無論有無下標,都可以迭代,比如dict就可以迭代:
d = {'a' : 1, 'b' : 2, 'c' : 3} \#迭代key值 for key in d: print(key) \#迭代value值 for value in d.values(): print(value) \#迭代key value for k,v in d.items(): print(k, v)
結果:
a b c 1 2 3 a 1 b 2 c 3 [Finished in 0.1s]

如何判斷一個對象是可迭代對象呢?方法是通過collections模塊的Iterable類型判斷:
from collections import Iterable s1 = isinstance('abc', Iterable) s2 = isinstance([1,2,3],Iterable) s3 = isinstance(123,Iterable) print(s1, s2, s3)
結果:
True True False [Finished in 0.1s]

如果要對list實現類似Java那樣的下標循環怎么辦?Python內置的enumerate函數可以把一個list變成索引-元素對,這樣就可以在for循環中同時迭代索引和元素本身:
for i, value in enumerate(['a', 'b', 'c']): print(i, value)
結果:
0 a 1 b 2 c [Finished in 0.1s]

3、列表生成式
列表生成式即List Comprehensions,是Python內置的非常簡單卻強大的可以用來創建list的生成式。
但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循環:
\#通過循環生成list L = [] for x in range(1,11): L.append(x*x) print(L) \#通過列表生成式生成list s = [x * x for x in range(1, 11)] print(s)
結果:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
寫列表生成式時,把要生成的元素x* x放到前面,后面跟for循環,就可以把list創建出來,十分有用,多寫幾次,很快就可以熟悉這種語法。
還可以使用兩層循環,可以生成全排列:
x = [m + n for m in 'ABC' for n in 'XYZ'] print(x)
結果:
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

列表生成式也可以使用兩個變量來生成list:
d = {'x' : 'A', 'y' : 'B', 'z' : 'C'} y = [k + '=' + v for k,v in d.items()] print(y)
結果:
['x=A', 'y=B', 'z=C']

4、生成器(generator)
在python中,可以一邊循環一邊計算的機制,稱為生成器:generator。
這樣在創建list的時候,可以節省大量的空間。
創建一個generator有很多種方法,第一種方法,只要把列表生成式的[ ]改為( )就可以:
g = (x * x for x in range(10))\#創建生成器 print(g) g1 = next(g)\#獲取生成器的元素 g2 = next(g) print(g1, g2)
結果:
<generator object <genexpr> at 0x000002702100AA40> 0 1 4 9 16 25 36 49 64 81 [Finished in 0.1s]
創建列表生成式和生成器的區別在于,前者是一個list,后者是一個gengrator。
通過next()方法獲取生成器的元素有點麻煩,可以通過for循環迭代生成器。

比如,著名的斐波拉契數列(Fibonacci),除第一個和第二個數外,任意一個數都可由前兩個數相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
分別用函數打印和生成器生成:
\#這是輸出斐波那契數列的函數 def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a+b n = n+1 return 'done' \#fib(10) \#這是輸出斐波那契數列的生成器 def fib_generaor(max): n, a, b = 0, 0, 1 while n < max: yield b#區別在于這點 a, b = b, a+b n = n +1 return 'done' for x in fib_generaor(10): print(x)
結果:
1 1 2 3 5 8 13 21 34 55 [Finished in 0.1s]
仔細觀察,可以看出,fib函數實際上是定義了斐波拉契數列的推算規則,可以從第一個元素開始,推算出后續任意的元素,這種邏輯其實非常類似generator。
也就是說,上面的函數和generator僅一步之遙。要把fib函數變成generator,只需要把print(b)改為yield b就可了。

5、迭代器
我們已經知道,可以直接作用于for循環的數據類型有以下幾種:
一類是集合數據類型,如list、tuple、dict、set、str等;
一類是generator,包括生成器和帶yield的generator function。
這些可以直接作用于for循環的對象統稱為可迭代對象:Iterable。
可以使用isinstance()判斷一個對象是否是Iterable對象。

可以被next()函數調用并不斷返回下一個值的對象稱為迭代器:Iterator。生成器都是Iterator對象,但list、dict、str雖然是Iterable,卻不是Iterator。把list、dict、str等Iterable變成Iterator可以使用iter()函數。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容

  • #!/usr/bin/python # -*- coding:UTF-8 -*- __author__ = 'wx...
    __Jasmine__閱讀 302評論 0 0
  • 1.切片切片可以取list、tuple、string的元素python語言中把字符串看做一個tuple,因此可以通...
    JEZAU閱讀 444評論 1 2
  • 一、高級特性切片 對這種經常取指定索引范圍的操作,用循環十分繁瑣,因此,Python提供了切片(Slice)操作符...
    zzj丶閱讀 562評論 0 1
  • Python 是一種相當高級的語言,通過 Python 解釋器把符合語法的程序代碼轉換成 CPU 能夠執行的機器碼...
    Python程序媛閱讀 1,932評論 0 3
  • 青天白日里你我都是陌生人 夜深時酒成了我們的朋友 暢所欲言不是目的胡說八道才特別應景 于是我說現在很冷太陽很大...
    我沒有筆名啊閱讀 165評論 0 0