python中的filter
⑴ python 中關於filter函數問題求教
看文字的話會很亂,和圖一起看會好一點
首先,it是個生成器(_odd_iter),並使n=3,隨後,it作為一個生成器存在於filter對象中(迭代器),並使it為一個filter對象,經過循環,到達next語句,先計算it _odd_iter(生成器),生成了新的數之後,開始計算filter。第一次循環的時候第18行的代碼相當於 it = filter(_not_divisible(3), it ),等號右面的it還在等待next調用生成值,生成值之後,就將它代入為lambda的x中……第二次循環的時候第18行代碼變成 it = filter(_not_divisible(5), filter(_not_divisible(3), it ) ),同樣等號右面的it仍然在等待next調用生成新的值
我剛看這個教程,不知道對不對。。。
對了我看見有一個人問把代碼第18行改成 it = filter(lambda x: x % n > 0, it)
會失去過濾功能,我覺得,lambda是一個臨時函數,所以覺得像filter(div(5), filter(div(3), it))這種存在多個lambda臨時函數的話是很奇怪的,
在調試時,發現filter只檢測了一個n(最近被賦值的),相當於7%5,9%7這樣,因此失去過濾素數功能。模擬一下,在將要輸出5的時候,it = filter()的那行代碼變為:
it = filter(lambda x : x % n >0 , filter (lambda x : x % n > 0 , it ) ),it將值賦給x,但是,我覺得n被賦值時,會刷新其他lambda中的n,造成類似於 it =filter(lambda x : x % 5 >0 , filter (lambda x : x % 5 > 0 , it ) )的情況
⑵ 在python中,使用filter語句實現
我感覺這個場景不應該用 filter 來實現
因為 filter 做過濾的依據是序列中的元素內容
而這個場景的過濾依據的是元素出現的次序
如果一定要用 filter 也不是不可以,只是非常的別扭……
deffunc(lst):
whilelen(lst)>1:
lst=zip(*filter((lambdai:i[0]%2),enumerate(lst)))[1]
returnlst[0]iflstelseNone
printfunc([0,1,2,3,4,5,6,7,8,9])
#>>7
⑶ python中的filter()函數怎麼用特別是一個函數有多個輸入參數時。
map是把函數調用的結果放在列表裡面返回,它也可以接受多個 iterable,在第n次調用function時,將使用iterable1[n], iterable2[n], ...作為參數。
filter(function, iterable)
這個函數的功能是過濾出iterable中所有以元素自身作為參數調用function時返回True或bool(返回值)為True的元素並以列表返回.
def f_large_than_5(x):
return x > 5
filter(f_large_than_5, range(10))
>>[6,7,8,9]
⑷ python中filter和map的區別
li=[11,22,33,44,55,66]
ret=filter(lambdaa:a>33,li)
print(list(ret))
filter是過濾集合中的部分結果
ret2=map(lambdaa:a+100,li)
print(list(ret2))
map是映射每一個元素
⑸ python filter對象怎麼遍歷
糾正一下你的這句話
其實才是真正的filter的入參,而x指的是filter的另一個入參it。
這里的it是一個生成器對象,而filter每次會得到一個由它生成的值。所以x指的不是it,只是it產生的一個值。
至於怎麼實現將it中的數據遍歷下去,這個很好解釋。
我們知道filter接受兩個參數function和iterable。而filter的功能就等價於(item for item in iterable if function(item)),它就是這么遍歷完的。。。
it裡面到底是啥? 正如你知道的,它就是一個生成器對象。每當一次調用結束後它就會掛起,直到下一次被激活。
while True:
n = next(it)
yield n it = filter(_not_divisible(n), it)#怎麼就實現了循環遍歷 it了?
它的實質就是把得到的每個素數從生成器中剔除。
⑹ python中純數列表開平方結果為整數怎麼表示
用高階函數filter() 判斷一個數的平方根是否是整數?
filter()函數是 Python 內置的一個高階函數,filter()函數接受一個函數function 和一個列表list,這個接收到的函數function的作用是對列表list中每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件(False)的元素,返回由符合條件元素組成的新列表list。
⑺ python中的filter函數怎麼用
filter就是按條件篩選:
filter(bool,['spam','','ni'])
list(filter(bool,[''spam,'','ni']))
輸出的結果為['spam','ni']
#按照bool型篩選,因為中間的『』,為空,不是bool型所以過濾掉。
⑻ 關於Python中filter 和map這兩個方法有區別嗎用法和結果都是一樣的
filter 是過濾器,你提供一個方法判斷,它就把符合這個方法的數據過濾出來;
map 是映射,你提供一種轉換方式,它將遍歷列表或者元祖或者別的什麼數據按照這種轉換方式全部轉換。
⑼ python filter函數
不會死循環,生成器是個虛擬抽象的概念,你可以認為_odd_iter()primes() 裡面運行的時候
python解釋器並不生成實際的List,也就不會耗費內存和時間
真正分配給List內存只在以下過程, primes()這個生成器是逐步分配內存的!!
forninprimes():
ifn<1000:
print(n)
else:
break
另外提醒你下,你的程序只能在Python 3.x版本下正確運行:-)因為你用的是 filter返回生成器對象的用法!!如果你要你的程序在Python 2.x正確運行,需改成如下形式。
根據你最新的追問,「為什麼it=filter(lambda x : x%n>0 ,it)不行??「直接在filter里用Lambda表達式是完全可以的,你的原因是你的Lambda表達式漏輸入了一個n,請看如下形式.
#Python2.x下需導入itertools庫的ifilter才能和python3.x的filter等效
importitertools
def_odd_iter():
n=1
whileTrue:
n=n+2
yieldn
def_not_divisible(n):
returnlambdax:x%n>0
defprimes():
yield2
it=_odd_iter()
whileTrue:
n=next(it)
yieldn
#it=itertools.ifilter(_not_divisible(n),it)
it=itertools.ifilter(lambdax,n=n:x%n>0,it)
forninprimes():
ifn<1000:
print(n)
else:
break
⑽ python3.2 的filter()和map()怎麼用。
filter(function, iterable)
map(function, iterable)
filter將 function依次作用於iterable的每個元素,如果返回值為true, 保留元素,否則從iterable裡面刪除
例如:
def test(x):
return (x > 3)
filter(test, [1, 2, 3, 4, 5]) =====> [4, 5]
map將function作用於iterable,每個元素,將對應輸出結果保存為一個list
例如
def add(x):
return (1 + x)
map(test, [1, 2, 3, 4, 5]) =====> [2, 3, 4, 5, 6]