1. 程式人生 > >python3 列表解析與generator生成器

python3 列表解析與generator生成器

t = [1,2,3,4]
print(t)
t = [x+10 for x in t]
print(t)

t = [x+10 for x in range(10)]
print(t)

輸出為:

如程式碼所示的兩種列表解析的情況:

第一種,先建立了一個list物件[],在in後面接這個list物件

第二種,直接在in後面接一個range物件

共同點,in後面的,都是可以迭代的物件。

總結,列表解析的格式為(不考慮列表解析外部的函式或者符號):

關於x的式子(一般就是x自身)      for      x        in        可迭代物件

還可以在後面加if判斷:

關於x的式子(一般就是x自身)      for      x        in        可迭代物件         if          布林表示式


形如:

根據,列表解析,外部的函式或符號來判斷返回的型別:

1.如果外部是(),即小括號。那麼返回生成器generator(注意,此物件也是可以迭代的物件)



2.如果外部是list(),或者[],即中括號。那麼返回list列表。



3.如果外部是tuple(),那麼返回的是tuple元祖。


4.如果外部是set(),或者是{},其沒有使用冒號,那麼返回的是set集合。



5.如果外部是dict{},那麼返回的是dict字典。


列表解析用於檔案

1.第一種:使用生成器,再使用next方法

g=(x for x in open('test.txt',encoding='utf-8'))
next(g)


當然,你可以用for迴圈來使用這個生成器:

g=(x for x in open('test.txt',encoding='utf-8'))
for line in g:
    print(line)

這樣,你就不用擔心出現stopiteration的錯誤了。輸出為:


因為每個line最後面是\n,所以輸出結果之間有空行。

2.第二種,使用list列表

g=[x for x in open('test.txt',encoding='utf-8')]
print(g)

因為list已經一次性把文字的內容,按行存起來了,所以可以直接列印。而上一種情況,則需要手動迭代,或者用for迴圈來迭代。而直接print生成器是沒有意義的。