python高級特性

1.切片
切片可以取list、tuple、string的元素
python語言中把字符串看做一個tuple,因此可以通過for in 循環取出所有的字符,同樣可以通過切片取出一部分字符
list/tuple/string變量名[a:b:c]
a表示開始取得索引位置,b表示結束的索引位置(不包括在內,因此可以比最后的索引大1,即swift中的endindex)
c表示間隔多少個取值,可以是負數,倒著取值
a、b可以省略,表示取到終點,c可以省略,默認為1
被取得變量是什么類型,取完還是什么類型

2.如1中所述,for循環的對象可以是多種類型,這些類型叫做可迭代對象。
當我們使用for循環時,只要作用于一個可迭代對象,for循環就可以正常運行
如何判斷一個對象是可迭代對象:通過collections模塊的Iterable類型判斷
python內置函數isinstance():判斷一個變量是否是已知的類型,具體見內置函數頁
其中沒有iterable(可迭代類型),需要我們手動導入。
from collections import Iterabl

然后用instance(a,iterable)來判斷是否是可迭代對象(可用if),然后打印:
for 變量(可多個) in 可迭代對象(此時會自動給變量賦值) print(變量)

如果對象中沒有這么多變量,則出現錯誤
ValueError: not enough values to unpack (expected m, got n)

對于dict需要說明的是,其中對象只有一個即key,value需要寫
for i in dict.values()
(這與swift不同,swift中把key與value作為兩個變量)
dict.values實際上也是一個迭代器 迭代的時候不可以少(),此類函數如reversed都是如此,輸出需要()
輸出key與value用到dict.items()
否則提示:
TypeError: 'builtin_function_or_method' object is not iterable該函數或方法不可迭代

3.列表生成式(省略循環步驟生成一個list)

[要生成的式子關于x的函數 for x in range(a, b)]

for循環后面還可以加上if判斷
還可以使用多層循環,如:
>>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

4.生成器generator(為了節省空間不計算只儲值)
在Python中,可以簡單地把列表生成式改成generator,也可以通過函數實現復雜邏輯的generator。
(1)把列表生成式改成generator:把列表生成式[]變為()即可得到
(2)定義函數時將print()改為yield

怎么打印出generator的每一個元素呢?
如果要一個一個打印出來,可以通過next()函數獲得generator的下一個返回值直到出現StopIteration的錯誤
或用循環打印

是generator和函數的執行流程不一樣。函數是順序執行,遇到return語句或者最后一行函數語句就返回。而變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。如果用for、print()執行,實際上也相當于不斷地next()、遇到yield返回、再次next()。(這點在迭代器中會繼續提到)
因此你會發現,如果一直用next()、或者循環調用函數,你無法得到結束語句return中的信息(從執行順序理解)

a = (x for x in range(10)) next(a) 0 next(a) 1 next(a) 2 next(a) 3 next(a) 4

for m in a:\ print(m) 5 6 7 8 9

generator中元素用過后不可以再調用

如何得到return語句:如果想要拿到返回值,必須捕獲StopIteration錯誤,返回值包含在StopIteration的value中:

except StopIteration as e: print('Generator return value:', e.value) break

在except里面用except Exception as e 接受異常,然后把這個e打印出來看

5.迭代器

可以直接作用于for循環的數據類型有以下幾種:
(1)集合數據類型,如list、tuple、dict、set、str等;
(2)generator,包括生成器和帶yield的generator function。
這些可以直接作用于for循環的對象統稱為可迭代對象:Iterable。

Python的for循環本質上就是通過將對象變為一個迭代器再不斷調用next()函數實現的。

而可以被next()函數調用并不斷返回下一個值的對象稱為迭代器:Iterator。
可迭代對象不一定是迭代器。
可以使用isinstance()判斷一個對象是否是Iterator對象
from collections import Iterator isinstance((x for x in range(10)), Iterator) True isinstance([], Iterator) False isinstance({}, Iterator) False isinstance('abc', Iterator) False

生成器都是Iterator對象,但list、dict、str雖然是Iterable,卻不是Iterator。
把list、dict、str等Iterable變成Iterator可以使用iter()函數:

isinstance(iter([]), Iterator) True isinstance(iter('abc'), Iterator) True

why:可以把迭代器這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數實現按需計算下一個數據,所以Iterator的計算是惰性的,只有在需要返回下一個數據時它才會計算。
Iterator甚至可以表示一個無限大的數據流
所以list、tuple、string已知長度,不能看做iterator

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、高級特性切片 對這種經常取指定索引范圍的操作,用循環十分繁瑣,因此,Python提供了切片(Slice)操作符...
    zzj丶閱讀 562評論 0 1
  • 1、切片(slice)L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3...
    bjchenli閱讀 254評論 0 0
  • 掌握了Python的數據類型、語句和函數,基本上就可以編寫出很多有用的程序了。 比如構造一個1, 3, 5, 7,...
    齊天大圣李圣杰閱讀 1,437評論 0 1
  • python高級特性 iteration迭代 對list,tuple的遍歷被稱為迭代。對list實現類似Java那...
    咚咚董dyh閱讀 622評論 0 0
  • 許久,一直在醞釀一個關于老師的題材,卻不知如何提筆…… 直到一日與朋友聊天,說起老師這個職業,朋友漏出一臉的不屑:...
    我是周太太閱讀 1,315評論 17 5