तो मुझे लूप के भीतर स्टैक्ड किए गए कुछ फ़िल्टरों से कुछ दिलचस्प व्यवहार मिल रहा है। मैं एक प्रदर्शन के साथ शुरू करेंगे:स्टैक्ड फ़िल्टर() कॉल का अजीब व्यवहार
>>> x = range(100)
>>> x = filter(lambda n: n % 2 == 0, x)
>>> x = filter(lambda n: n % 3 == 0, x)
>>> list(x)
[0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96]
यहाँ हम उम्मीद उत्पादन मिलता है। हमारे पास फ़िल्टर के भीतर एक फ़िल्टर के भीतर एक सीमा है, और फिल्टर की स्थिति ढेर हो रही है क्योंकि हम उन्हें चाहते हैं। अब मेरी समस्या आती है।
मैंने किसी संख्या के सापेक्ष प्राइम की गणना करने के लिए एक फ़ंक्शन लिखा है। यह इस तरह दिखता है:
def relative_primes(num):
'''Returns a list of relative primes, relative to the given number.'''
if num == 1:
return []
elif is_prime(num):
return list(range(1, num))
result = range(1, num)
for factor in prime_factors(num):
# Why aren't these filters stacking properly?
result = filter(lambda n: n % factor != 0, result)
return list(result)
जो भी कारण के लिए, फिल्टर केवल() prime_factors से प्राप्त सूची में अंतिम कारक के लिए लागू किया जा रहा है। उदाहरण:
>>> prime_factors(30)
[2, 3, 5]
>>> relative_primes(30)
[1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28, 29]
हम देख सकते हैं कि सूची में 2 या 3 के कोई गुणक हटा दिए गए थे। ये क्यों हो रहा है? उपर्युक्त उदाहरण क्यों काम करता है, लेकिन लूप के लिए फ़िल्टर नहीं करते हैं?
एक और संक्षिप्त विकल्प 'फ़िल्टर (कारक .__ rmod__, परिणाम) 'है, जो स्वीकार्य रूप से कोड को थोड़ा कम पठनीय बनाता है। –