day12學習筆記(列表推導式 生成器 迭代器

2021-10-10 17:21:40 字數 3817 閱讀 4290

迭代器iterator

列表推導式又稱之為列表解析式,運用列表解析式,可以快速生成list,可以通過乙個list推導出另乙個list,而**卻十分簡潔。

經典語法:

語法結構:每個列表推導式都在 for 之後跟乙個表示式,然後有零到多個 for 或 if 子句。

列表推導式的執行順序:各語句之間是巢狀關係,左邊第二個語句是最外層,依次往右進一層,左邊第一條語句是最後一層。

[ 與變數相關的表示式 for 變數 in 可遍歷的物件]

s = [x for x in range(10)]  

#用迴圈遍歷x去遍歷range(10),並將x放入乙個列表中賦值給s

#等價於

s =

for x in range(10):

[表示式 for 變數 in 舊列表 if 條件]

s = [ x for x in range(10) if x % 3 == 0 ]

#等價於

s =

for x in range(10):

if x % 3 ==0:

goal = [x+y for x in range(20) if x % 3 == 0 for y in range(20) if y % 4 == 0 ]

#等價於

goal =

for x in range(10):

if x % 3 == 0:

for y in range(10):

if y % 5 == 0:

使用列表推導式使字典的鍵值互換。

d2 = 

d =

print(d)

通過列表生成式,我們可以直接建立乙個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。

使用生成器,可以生成乙個值的序列用於迭代,並且這個序列不是一次性生成的,而是使用乙個生成乙個,可以節省大量的記憶體空間。

s = ( i for i in range(10))

print(type(s))

#

def fn():

num = 0

while true:

num += 1

yield num

g = fn()

print(g)

#

s = ( i for i in range(10))

print('第一次呼叫__next__()方法')

print(s.__next__())

print('第二次呼叫__next__()方法')

print('第一次呼叫nex()函式')

print(nexts(s))

print('第二次呼叫next()函式')

print('開始生成')

yield n

print('生成完成')

n+=1

if __name__=='__main__':

for i in fn(6):

print(i)

print('生成器例項化')

a = fn(6)

print('第一次開始生成')

print(fn(6).__next__)

print('第二次開始生成')

使用for迴圈可迭代這個生成器。

生成器的函式,在每次呼叫__next__()方法的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。

迭代是重複反饋過程的活動,其目的通常是為了逼近所需目標或結果。每一次對過程的重複稱為一次「迭代」,而每一次迭代得到的結果會作為下一次迭代的初始值。

檢查乙個物件是否是另外乙個物件的例項。

語法:isinstance(object, classinfo)

object – 例項物件。

classinfo – 可以是直接或間接類名、基本型別或者由它們組成的元組。

print(isinstance(123,int))  #true

print(isinstance('123',str)) #true

print(isinstance(12,(list,int,str))) #true

print(isinstance({},set)) #false

from collections.abc import iterable

print(isinstance('123',iterable)) #true

print(isinstance(123,iterable)) #false

print(isinstance([1,2,3],iterable)) #true

print(isinstance(,iterable)) #ture

迭代器從表面上看是乙個資料流物件或容器,當使用其中的資料時,每次從資料流中取乙個資料,直到資料被取完,而且資料不會被重複使用。

不是,可迭代物件(list,set,dict)可以重複迭代,只能使用for迴圈;迭代器只能迭代一次,可以通過next或for進行迭代。

判斷迭代器 : isinstance(object, iterator)。

判斷可迭代物件: isinstance(object, iterable)

print(isinstance([1,2],iterator)) #false
- 語法:iter(source, sentinel=none)	

- 不修改第二個預設引數,可以將可迭代的物件變成乙個迭代器。

- 修改第二個預設引數,當第乙個引數呼叫返回值等於第二個引數的值,遍歷或迭代停止。

print(type(iter([1,2])))

#

#報錯

for i in iter(l,4):

typeerror: iter(v, w): v must be callable

修改第二個引數後,第乙個引數必須是可呼叫的。

x=0

def used_iter():

global x

x += 2

return x

for i in iter(used_iter,8):

print(i)

#2,4,6

day12 生成器和各種推導式

今天主要學習了 1.生成器 2.生成器函式 3.各種推導式 比較詭異,理解了很簡單,不理解很難 4.生成器表示式 重點 一.生成器 def func print 我叫周潤發 return 林志玲 return在函式中表示返回的意思 set func print set 這裡的set 就是建立了乙個生...

matlab cody學習筆記 day12

input n 5 output a is 3 3 3 3 3 3 2 2 2 3 3 2 1 2 3 3 2 2 2 3 3 3 3 3 3 如何生成乙個靶心矩陣。答 function a bullseye n a ceil sqrt spiral n 2 0.5 spiral n 命令生成n維從...

前端學習Day12

一 定位 1.position static absolute relative 2.position fixed 固定定位 a 參照物 瀏覽器視窗 b 不佔據空間,脫離布局流 3.讓乙個元素在瀏覽器視窗左右上下居中?第一種方法 前提 已知寬和高 position fixed left 50 top...