把列表[0,1,2,3,4,5,6,7,8,9]中的每個元素加1
a =
[i+1
for i in
range(10
)]print
(a)結果[1
,2,3
,4,5
,6,7
,8,9
,10]
這樣的寫法就叫做列表生成式
列表是可迭代的,但不是迭代器
l =[1
,2,3
,4,5
,6]for i in l:
# 生成了乙個迭代器
print
(i)if i ==2:
break
for i in l:
# 又生成了乙個迭代器
print
(i)結果12
1234
56
生成器的作用:當列表中的元素個數很多時,甚至大於記憶體容量,檢視列表中元素,如果一次性將所有元素裝入記憶體,顯然不合適。這時可以用生成器來解決這一問題,生成器執行時一次裝入部分元素到記憶體,且具有記憶功能,可以從停止的地方接著往下執行。
def
func()
:for i in
range
(2000000):
yield
'衣服%s'
% if = func(
)f1 = func(
)print
(f.__next__())
print
(f.__next__())
print
(f.__next__())
print
(f1.__next__())
結果衣服0
衣服1衣服2
衣服0
從上面的**中我們可以看到,f 和 f1 是兩個互不干擾的生成器。
yield 類似於 return ,返回乙個生成器,是生成器函式中特有的
f.next()和f.iter()是對結果進行操作的內建函式
def
func()
:# 生成器函式
for i in
range
(2000000):
yield
'衣服%s'
% if = func(
)count =
0for i in f:
# 列印 衣服1-5
print
(i) count +=
1if count>5:
break
print
(f.__next__())
# 列印 衣服6
for i in f:
# 列印 衣服7-11
print
(i) count +=
1if count>10:
break
結果衣服0
衣服1衣服2
衣服3衣服4
衣服5衣服6
衣服7衣服8
衣服9衣服10
衣服11
從以上**中我們可以看出,生成器函式隨用隨停,再用的時候會從斷點繼續往下執行。
示例
def
tail
(filename)
: f =
open
(filename, encoding=
'utf8'
)# 以讀方式開啟,不用刻意寫mode='r'
while
true
:# 保持監聽
line = f.readline(
).strip(
)# readlines()生成列表,不太合適;read()可以但是開銷大
if line:
yield line
g = tail(
'監聽檔案'
)for i in g:
if'python'
in i:
print
('****'
, i)
可以直接作用於for迴圈的資料型別有:
這些可以直接作用於for迴圈的物件統稱為可迭代物件:iterable。
可以使用isinstance()判斷乙個物件是否是iterable物件
而生成器不當可以作用於for迴圈,還可以被next()函式不斷呼叫並返回下乙個值,知道最後丟擲stopiteration錯誤表示無法繼續返回下乙個值了。
iterable可迭代的 ——> _ iter_ #只要含有_iter_方法的都是可迭代的
._ iter_() 迭代器 ——> _ next_ #通過next可以從迭代器中乙個乙個取值
只要含有_iter_方法的都是可迭代的 ——python可迭代協議
迭代器協議:只要同時含有_ iter_和_ next_方法的函式就是迭代器
做乙個測試:
from collections.abc import iterable
from collections.abc import iterator
classa:
def__iter__
(self)
:pass
def__next__
(self)
:pass
a = a(
)print
(isinstance
(a, iterable)
)# 判斷是否可迭代
print
(isinstance
(a, iterator)
)# 判斷是否是乙個迭代器
結果true
true
顯然由因為class a中定義了iter和next方法,所以新建立的物件a是可迭代的,同時也是乙個迭代器。
下面把兩個方法分別注釋一下,我們看一下結果
from collections.abc import iterable
from collections.abc import iterator
classa:
def__iter__
(self)
:pass
#def __next__(self):pass
a = a(
)print
(isinstance
(a, iterable)
)print
(isinstance
(a, iterator)
)結果:
true
# 是可迭代的
false
# 不是迭代器
from collections.abc import iterable
from collections.abc import iterator
classa:
#def __iter__(self):pass
def__next__
(self)
:pass
a = a(
)print
(isinstance
(a, iterable)
)print
(isinstance
(a, iterator)
)結果:
false
# 不可迭代
false
# 不是迭代器
Python全棧開發實戰學習7
import module from module import xx from module.xx.xx import xx as rename from module.xx.xx import 編譯原始碼 python setup.py build 安裝原始碼 python setup.py i...
Python全棧開發實戰學習13
class 類名 屬性 方法 pass現實中先有物件後有類 物件1 李坦克 特徵 學校 oldboy 姓名 李坦克 性別 男 年齡 22 技能 吃飯 學習睡覺 物件2 王大陸 特徵 學校 oldboy 姓名 王大陸 性別 男 年齡 21 技能 吃飯 學習睡覺 物件3 牛深度 特徵 學校 oldboy...
Python全棧開發實戰學習15
軟體重用的重要方式除了繼承之外還有另外一種方式,即組合 組合是指在乙個類中以另外乙個類的物件作為資料屬性,稱為類的組合 class equip 裝備類 deffire self print release fire skill class riven 英雄riven的類,乙個英雄需要有裝備,因而需要...