04 迭代器 生成式 內建函式

2021-10-08 09:45:56 字數 4755 閱讀 7382

二、自定義迭代器——生成器

三、面向過程程式設計

四、生成式

五、內建函式

迭代器的特點:

不依賴於索引和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...