filterpython
A. python filter過濾器疑問
過濾器第二個參數可以是生成器也可以是列表,只要是iterable就可以,生成器也是一個iterable。
next()得到的是iterable的一個結果值。
過濾器返回的是一個map,map本身也是一個iterable,可以使用next()或者for去迭代它。
filter()在迭代的時候逐個返回值,與生成器類似,都是在每次調取值時才算出一個來。
B. 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 ) )的情況
C. 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
D. 關於Python的第二個函數問題
filter是python的內置函數,作用通過函數過濾列表。
它有兩個參數,第一個函數,返回True或者False,第二個是要過濾的列表。
它會對列表中的所有元素應用第一個函數,如果返回True,就保留,返回False就過濾掉。
print
filter(lambda
x:
x
%
3
==
0,
my_list)
這個語句的作用就是多my_list這個列表進行過濾,返回列表中元素是3的倍數的元素。
如果解決了您的問題請採納!
如果未解決請繼續追問
E. python中的filter函數怎麼用
filter()函數是 Python 內置的另一個有用的高階函數,filter()函數接收一個函數 f 和一個list,這個函數 f 的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
例如,要從一個list [1, 4, 6, 7, 9, 12, 17]中刪除偶數,保留奇數,首先,要編寫一個判斷奇數的函數:
def is_odd(x):
return x % 2 == 1
然後,利用filter()過濾掉偶數:
>>>filter(is_odd, [1, 4, 6, 7, 9, 12, 17])
結果:
[1, 7, 9, 17]
利用filter(),可以完成很多有用的功能,例如,刪除 None 或者空字元串:
def is_not_empty(s):
return s and len(s.strip()) > 0
>>>filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])
結果:
['test', 'str', 'END']
注意: s.strip(rm) 刪除 s 字元串中開頭、結尾處的 rm 序列的字元。
當rm為空時,默認刪除空白符(包括'\n', '\r', '\t', ' '),如下:
>>> a = ' 123'
>>> a.strip()
'123'
>>> a = '\t\t123\r\n'
>>> a.strip()
'123'
練習:
請利用filter()過濾出1~100中平方根是整數的數,即結果應該是:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
方法:
import math
def is_sqr(x):
return math.sqrt(x) % 1 == 0
print filter(is_sqr, range(1, 101))
結果:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
F. 關於Python中filter 和map這兩個方法有區別嗎用法和結果都是一樣的
filter 是過濾器,你提供一個方法判斷,它就把符合這個方法的數據過濾出來;
map 是映射,你提供一種轉換方式,它將遍歷列表或者元祖或者別的什麼數據按照這種轉換方式全部轉換。
G. 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]
H. 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了?
它的實質就是把得到的每個素數從生成器中剔除。
I. 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是映射每一個元素