二、自定義迭代器——生成器
三、面向過程程式設計
四、生成式
五、內建函式
迭代器的特點:
不依賴於索引和key取值,是通用的取值方式
惰性計算,節省記憶體
對可迭代物件使用python內建的__iter__ 方法可以得到迭代器
l1 =[1
,2,3
]res = l1.__iter__(
) 就等同於 res =
iter
(l1)
print
(res)
# (迭代器)
a = res.__next__(
)# a=next(res) a=1
b = res.__next__(
)# b=next(res) b=2
c = res.__next__(
)# c=next(res) c=3
d = res.__next__(
)# stopiteration 報錯,l1只有三個值
迭代器取完值以後再呼叫__next__就會報錯
可以使用異常處理:
l1 =[1
,2,3
]l1_iterator = l1.__iter__(
)while
true
:try
: res = l1_iterator.__next__(
)print
(res)
except stopiteration:
break
(1)內建有__iter__方法的型別稱之為可迭代物件/型別
包括字串、列表、元組、字典、集合、檔案物件
其中,檔案物件又是迭代器物件,因為控制代碼操作檔案時,檔案可能會比較大,做成迭代器可以節省記憶體
(2)迭代器物件:內建有__iter__、__next__方法
l1 =[1
,2,3
]l1_iterator = l1.__iter__(
)# l1.iterator就是個迭代器物件
l1.iterator就是個迭代器物件,對其使用__iter__方法依然會得到它自身
for迴圈本質是上就是對迭代器迴圈取值
使用for迴圈可以精簡**:
l1 =[1
,2,3
]for i in l1:
print
(i)
步驟:
① 呼叫in後面物件的__iter__方法,得到對應的迭代器
② k=next(迭代器),然後執行一次迴圈
③ 迴圈往復,直到把迭代器的值取完,丟擲異常,for迴圈會將自動捕捉異常,然後結束迴圈
同乙個迭代器取完值以後,對它再取值就去不了了
l1 =[1
,2,3
]l1_iterator = l1.__iter__(
)while
true
:try
: res = l1_iterator.__next__(
)print
(res)
except stopiteration:
break
while
true
:try
: res = l1_iterator.__next__(
)print
(res)
except stopiteration:
break
優點:① 不依賴索引和key取值
② 惰性計算,可以節省記憶體
缺點:① 不能取指定位置的值,(沒有索引和key取值靈活)
② 不能預估值的個數,無法統計長度
③ 取值是一次性的,不能倒著取值,只能往後取
自定義迭代器,可以達到節省記憶體的效果
使用yield關鍵字自定義的迭代器,就是生成器
但凡函式內出現了yield關鍵字,呼叫函式將不會執行函式體**,會得到乙個返回值,
這個返回值就是生成器
def
my_range
(start_num, end_num, step=1)
:while start_num < end_num:
yield start_num
start_num += step
g = my_range(1,
5,2)
print
(g)#
for i in g:
print
(i)
(1)相同點:
都可以用來返回值
(2)不同點:
return只能返回一次值,函式就立即被結束
yield可以返回多次值,可以掛起函式
程式設計思想就是編寫程式的套路,與具體的技術點無關
面向過程的核心就是過程,過程就是解決問題的步驟
基於過程程式設計就類似於設計一條條環環相扣的流水線
優點:將複雜的問題流程化,進而簡單化
缺點:所有環節耦合到一起,環環相扣,如果要修改某個環境,有可能會牽一髮而動全身,擴充套件性差
l1 =
[i for i in
range(1
,11)if i >6]
print
(l1)
# [7,8,9,10]
res =
print
(res)
#
dic =
':i**
2for i in
range(5
)if i <=2}
print
(dic)
#
res =
(i for i in
range(5
))print
(res,
type
(res)
)# at 0x000002565c5cf3c0>
print
(next
(res)
)# 0
print
(next
(res)
)# 1
print
(next
(res)
)# 2
取絕對值
print
(abs(-
10))# 10
呼叫all函式,括號內應該放入乙個可迭代物件
對於這個可迭代物件:
① 從中取出來的值,全真才是真,一假則為假
② 如果迭代器本身是空的,那結果為true
print
(all([
1,false
,'abc'])
)# false
print
(all([
]))# true
與all一樣,括號內應該放入乙個可迭代物件
① 從中取出來的值,全假才為假,一真則為真
② 如果迭代器本身是空的,那結果為false
print
(any([
1,false
,'abc'])
)# true
print
(any([
]))# false
判斷函式是否可以被呼叫,返回布林值
print
(callable
(len))
# true
chr() 將十進位制數轉換成對應的ascii字元
ord() 將字元轉換成對應的ascii十進位制數
print
(chr
(101))
# eprint
(ord
('a'))
# 65
檢視傳入的值 可以呼叫的內建屬性(『init』, 『init_subclass』, 『iter』, 『le』, 'len』等)
print
(dir
('aaa'
))
傳入除數和被除數,以元組的形式返回商和餘數
res =
divmod(10
,3)print
(res)
# (3, 1)
eval() 函式用來執行乙個字串表示式,並返回表示式的值。
比如:可以用來將檔案中存的字典形式的字串反解成字典
msg =
"print('hello world')"
eval
(msg)
# hello world
dic =
eval(""
)print
(dic)
#
python 迭代器 生成器 內建函式
迭代器是迭代取值的工具,迭代是乙個重複的過程,每一次重複都是基於上一次的結果而來的.為什麼要用迭代器呢?1.可以不依賴索引取值 2.同一時刻在記憶體中只有乙個值,不會過多的占用記憶體 如何用迭代器?可迭代的物件 但凡內建有 iter 方法的物件都是可迭代的物件,列如str,list,dict,tup...
02 迭代器生成器內建函式
day2迭代器生成器內建函式 列表與生成器表示式的區別 把列表解析的換成 得到的就是生成器表示式 列表解析與生成器表示式都是一種便利的程式設計方式,只不過生成器表示式更加節省記憶體空間 python不但使用迭代器協議,讓for迴圈變得更加通用。大部分內建函式,也是使用迭代器協議訪問物件的 可迭代物件...
函式式程式設計 列表生成式 生成器 迭代器
a 1,2,3,4,5,6,7,8 每個元素遞加1 a i 1 for i in a 這就是列表生成公式 print a 優點 簡潔 a1 i for i in range 5 編寫生成器,a1 裡面記錄的是計算公式 print a1 列印公式 generator 就是生成器的意思 print ne...