为什么我在一段代码中获得ValueError而在另一段代码中却没有,尽管它们是相同的?

时间:2016-09-20 18:21:42

标签: python

我一直在解决Project Euler问题,这是problem 35的代码:

def sieve_of_Erathosthenes(): 
    sieve = [True] * 10**6
    def mark(sieve, x):
        for i in xrange(x+x, len(sieve), x):        
            sieve[i] = False
    for x in xrange(2, int(len(sieve) ** 0.5) + 1):         
        if sieve[x]:
        mark(sieve, x)
    return list(str(i) for i in range(2, len(sieve)) if sieve[i])


def is_prime(n): 
    from math import sqrt
    if all(n % i != 0 for i in xrange(2,int(sqrt(n))+1)):
        return True

def is_circular_prime(p): 
    if all(is_prime(int(p[i:] + p[:i])) for i in xrange(len(p))):
        return True

primes = sieve_of_Erathosthenes()
number_of_circular_primes = 0

for i in primes: 
    if is_circular_prime(i):
        number_of_circular_primes += 1

print number_of_circular_primes

它按照我的意图工作并输出正确的解决方案。我使用类似的方法来解决problem 37,但我得到:“ValueError:int(无效的文字,基数为10:''。”我尝试了一切,但它仍然没有用。这是我的代码:

def sieve_of_Erathosthenes(): 
    sieve = [True] * 10**5
    def mark(sieve, x):
        for i in xrange(x+x, len(sieve), x):        
            sieve[i] = False
    for x in xrange(2, int(len(sieve) ** 0.5) + 1):         
        if sieve[x]:
        mark(sieve, x)
    return [str(i) for i in range(2, len(sieve)) if sieve[i] and i > 10]

def is_prime(n): 
    from math import sqrt
    if all(n % i != 0 for i in xrange(2,int(sqrt(n))+1)):
        return True

def is_trunctable_from_the_right(n):
    if all(is_prime(int(n[:i])) for i in range(len(n)-1)):
        return True

def is_trunctable_from_the_left(n):
    if all(is_prime(int(n[i:])) for i in range(1,len(n))):
        return True


primes = sieve_of_Erathosthenes()
trunctable_from_both_sides = 0

for i in primes:
    if is_trunctable_from_the_left(str(i)) and is_trunctable_from_the_right(str(i)):
        trunctable_from_both_sides += int(i)

print trunctable_from_both_sides

正如您所看到的,这里的大部分代码都是从上一个问题中复制并粘贴的。这次为什么不起作用?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您没有提到出现错误的行。那会有所帮助。你也知道很多代码的工作原理。所以只关注不同的位:截断。

我怀疑错误出现在int(n[:i])

范围从0开始,因此第一个术语是零长度字符串

ValueError: invalid literal for int() with base 10: ''

无效的文字字符串是空字符串,它无法将其转换为数字。所以修复范围声明:

(isprime(int(n[:i])) for i in range(1,len(n)))

答案 1 :(得分:1)

如果我运行您的代码,您会注意到i为11时发生错误:

>>> primes = sieve_of_Erathosthenes()
>>> 
>>> trunctable_from_both_sides = 0
>>> for i in primes:
...     if is_trunctable_from_the_left(str(i)) and is_trunctable_from_the_right(str(i)):
...         trunctable_from_both_sides += int(i)
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 2, in is_trunctable_from_the_right
  File "<stdin>", line 2, in <genexpr>
ValueError: invalid literal for int() with base 10: ''
>>> i
'11'
>>> 

所以,深入了解Traceback,我们发现你最终会遇到is_trunctable_from_the_right中的情况:

>>> for x in range(len(n)-1):
...   print n[:i]
... 

>>> n
'11'
>>> range(len(n)-1)
[0]

因此,当您截断字符串时,返回一个空字符串,将该空字符串传递给int,这会引发错误。