मेरे "कोड" में काम करने के लिए सभी () का उपयोग करने के तरीके को समझ नहीं सकते - पायथन, पायथन-2.7

m = range(1, 2000000, 2)
sum1 = 2
for x in xrange(1, 2000000, 2):
for y in m:
if x != y:
if x%y == 0:
m.remove(x)
if all(x%y != 0):
sum1 += x

यही वह है जो मैंने लिखा है।यह एक समस्या है, सभी प्राइम्स को दो मिलियन जोड़ने की कोशिश कर रहा है। मेरी समस्या सभी () कथन में है। मैं क्या करना चाहता हूं यह जांचना है कि x एक प्राइम है या नहीं, यह केवल तभी सही है जब प्रत्येक x% y एक शेष देता है।

अगर मैं एक का उपयोग कर सकता हूं तो मैं लूप को रोकने के लिए एक कथन (ब्रेक?) का उपयोग करता हूं यदि y> x / 3 ऐसा है:

 m = range(1, 2000000, 2)
sum1 = 2
for x in xrange(1, 2000000, 2):
for y in m:
if y > x/3:
break
else:
if x != y:
if x%y == 0:
m.remove(x)
if all(x%y != 0):
sum1 += x

उत्तर:

जवाब के लिए 9 № 1

आपको अनुक्रम या पुनरावर्तनीय पास करना होगा all - यह सिर्फ परीक्षण करता है कि सभी वस्तुओं को पारित किया गया है या नहीं, यह सच है। यहां उपयोग करने का सही तरीका है all:

>>> all([True, True, True])
True
>>> all([True, False, True])
False
>>> all([x > 5 for x in range(10)])
False
>>> all([x > 5 for x in range(6, 10)])
True
>>> all(x > 5 for x in range(6, 10))
True

वह अंतिम सबसे अच्छा है, क्योंकि इसका लाभ उठाता है लघु सर्किटिंग

हालांकि, आपका कॉल करने के लिए all आपके कोड में व्यर्थ है। आपके कोड के पीछे विचार, ऐसा लगता है, सभी मूल्यों के माध्यम से जाना है m और उन लोगों को हटा दें जो 2 और 2000000 के बीच किसी भी संख्या से विभाजित हैं। एक बार जब आप इसे " m केवल प्रमुख संख्याएं होंगी।

बेशक, अगर आप हटाते हैं तो आपका कोड अभी भी काम नहीं करता है all। ऐसा इसलिए है क्योंकि आप वास्तव में परीक्षण कर रहे हैं कि प्रत्येक नंबर में क्या है m संख्याओं से विभाजित है [1, 3, 5, 7...1999999]। (वह अनुक्रम अनुक्रमित है xrange(1, 2000000, 2)। क्योंकि आप शुरू करते हैं 1, और सब कुछ विभाजित है 1, आपका कोड प्राइम के रूप में कुछ भी नहीं गिना जाएगा। और फिर, एक बार जब आप हटा दें 1 उस अनुक्रम से, कुछ भी विभाजित है 2 आपके कोड द्वारा प्राइम के रूप में गिना जाएगा! आपको अधिक सावधानी से सोचना चाहिए कि आपको वास्तव में अपने आंतरिक लूप में कौन सी संख्याओं का परीक्षण करना है।

अंत में, आपको इस कोड को पूरा करने के बारे में सोचना चाहिए। एक बार जब आप यह काम कर लेंगे, तो यह एक ले जाएगा बहुत लंबे समय परिणाम उत्पन्न करने के लिए। आपको इसे पहले छोटी संख्याओं पर परीक्षण करना चाहिए; और फिर, आपको लूप की संख्या को कम करने के बारे में सोचना चाहिए। (तथा -- के बाद ही आपने इसके बारे में सोचा है - पढ़ा इस।)

लेकिन एक बार जब आप यह काम कर लेंगे, तो आपको बस कॉल करना होगा sum प्राइम्स की आपकी सूची पर।


उत्तर № 2 के लिए 1

आपका उपयोग all गलत है, अगर आप देखते हैं प्रलेखन इसके लिए, यह एक पुनरावृत्त लेता है।

आप जो करने की कोशिश कर रहे हैं वह जनरेटर अभिव्यक्ति का उपयोग करता है, कुछ रूप:

sum(x**2 for x in range(10))

जो सूची समझ के समान है

[x**2 for x in range(10)]

हालांकि, का उपयोग करें all इस तरह से जेनरेटर अभिव्यक्ति को अचानक बंद नहीं किया जाएगा, अगर इसे विभाजक पाया जाता है any और के लिए जाँच कर रहा है x == 0 जल्द ही बंद हो जाएगा, लेकिन जैसा कि कोड वर्तमान में स्वरूपित है, कुछ प्रमुख मानने से पहले कई divisors की जांच करेगा।

यह अधिक उपयुक्त होगा:

primes = []
MAX = 2000000

number = 2
while number < MAX:
for prime in primes:
if number % prime == 0:
number += 1
continue

primes.append(number)
number += 1

total = sum(primes)

जवाब के लिए 0 № 3

all() एक तर्क के लिए एक पुनरावृत्ति लेता है। आपकी स्थिति में, आप इसका इस्तेमाल इस तरह करेंगे:

all(x%y for y in m)

कहा पे x%y for y in m जनरेटर अभिव्यक्ति है। अगर मेरे पास एक पुनरावृत्ति है

[item1, item2, item3, item4...]

all(iterable) के बराबर है:

item1 and item2 and item3 and item4..."

संबंधित सवाल
सबसे लोकप्रिय