python 匿名函式,生成器迭代器

2021-08-13 23:57:30 字數 2942 閱讀 5513

1. 匿名函式

a)  沒有名字,lambda[agr1[,arg2…]]:expression

b)  表示式:sum=lambda agr1,agr2:agr1+agr2;

sum(10,20)

c)  函式可以做引數傳遞,

三個大資料用的函式:

foo=[2,3,2,5,6,5,52]

filter(lambdax:x%3=0,foo)//過濾留下能被三整除的數,

map(lambdax:x*2,foo)//遍歷列表

mylist=map(lambdax:x,mylist)

foriinmylist:

print(i)

reduce(lambdax,y:x+y,foo)//求foo裡面的和

reduce需要匯入模組fromfunctoolsimportreduce
2. sorted列表排序,小到大排序正序倒序

sorted(lisr,reverse=true)倒序排序,

3. 隨機數:

a)  import random

i.     random.choice(range(1-34))隨機取1-33之間的1個隨機數,可能重複

ii.     random.choices(range(1-34),k=6,weight=)隨機取1-33之間的1個隨機數,可能重複

iii.     random.sample(range(1,34),6)

4. sort和sorted排序的區別

a)  sort沒有返回值,原來的列表順序沒了,

b)  sorted 返回乙個新列表

5. 迭代器和生成器:

a)  迭代器是訪問集合內的元素的一種方式,迭代器物件從集合的第乙個元素開始訪問,直到所有的元素都被訪問一遍結束.

b)  迭代器協議:物件需要提供next()方法,它要麼返回下乙個物件,要麼引起乙個

•迭代器是訪問集合內元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素都被訪問一遍後結束。

•可迭代物件:實現了迭代器協議的物件

•for,max,min,sum等使用迭代器協議訪問物件

•構建迭代器的時候,以一種延遲計算(lazy evaluation)方式返回元素,這正是它的優點。比如列表含有中一千萬個整數,

需要佔超過400m的記憶體,而迭代器只需要幾十個位元組的空間。因為它並沒有把所有元素裝載到記憶體中,

而是等到呼叫 next 方法時候才返回該元素(按需呼叫 call by need 的方式,本質上 for 迴圈就是不斷地呼叫迭代器的next方法)

•for迴圈實現 了迭代器

–for  i in [1,2,3,4]:

print i

•檔案物件提供迭代器協議

–with open('e:\\s133\\s131.txt') as f:

for line in f:  #for迴圈使用迭代器協議訪問檔案

print(line)

生成器:

•python使用生成器對延遲操作提供了支援

•所謂延遲操作,是指在需要的時候才產生結果,而不是立即產生結果。這也是生成器的主要好處。

•python有兩種不同的方式提供生成器

–1.生成器函式:常規函式定義,但是,使用yield語句而不是return語句返回結返回乙個結果,在每個結果中間,掛起函式的狀態

,以便下次重它離開的地方繼續執行果。yield語句一次

–2.生成器表示式:類似於列表推導,但是,生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表

•使用生成器返回自然數的平方(注意返回的是多個值):

def gensquares(n):

for i in range(n):

yield i ** 2

for item in gensquares(5):

print item

使用普通函式:

def gensquares(n):

res=

fori inrange(n):

returnres

for item in gensquares(5):

print item

•語法上和函式類似:

–區別:生成器使用yield語句返回乙個值,而常規函式使用return語句返回乙個值

•自動實現迭代器協議:

–對於生成器,python會自動實現迭代器協議,(如for迴圈,sum函式)。由於生成器自動實現了迭代器協議,所以,我們可以呼叫它的next()方法,並且,在沒有值可以返回的時候,生成器自動產生stopiteration異常

•狀態掛起:

–生成器使用yield語句返回乙個值。yield語句掛起該生成器函式的狀態,保留足夠的資訊,以便之後從它離開的地方繼續執行

•生成器的好處是延遲計算,一次返回乙個結果。也就是說,它不會一次生成所有的結果,這對於大資料量處理,將會非常有用

–sum([ifor i inxrange(10000000000)])

–sum(ifor i in xrange(10000000000))

•對於前乙個表示式還沒有看到最終結果電腦就已經卡死,對於後乙個表示式,幾乎沒有什麼記憶體占用。

•**簡潔,易於閱讀

–求一段文字中,每個單詞出現的位置

使用生成器的情況:

def index_words(text):

if text:

yield 0;

for index,letter inenumerate(text,1):

if letter==' ':

yield index,letter

result=index_words('iam rong')

for a in result:

print(a)

python之路 函式迭代,生成器

恢復內容開始 dir 被測物件 如果它含有 iter 那這個物件叫做可迭代物件,遵循可迭代協議。可迭代物件 iterable 可以轉換 迭代器 如何實現 都像內部定義乙個 iter 方法 迭代器 iterator 遵循迭代器協議 1,只含有 iter 方法的資料是課迭代的物件 l 1,2,3,4 p...

Python 函式(迭代器 生成器)

只要能被for迴圈的資料型別,就一定擁有 iter 方法,for迴圈其實就是在使用迭代器 只要是迭代器就一定可以迭代 可迭代物件.iter 迭代器 迭代器中的 next 方法可以乙個乙個的獲取值 迭代器物件可以使用常規for語句進行遍歷 list 1,2,3,4 it iter list 建立迭代器...

python生成器函式 Python 生成器函式

一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...