【问题标题】:Is there anything wrong with syntax of "for" loop in my list comprehension?我的列表理解中的“for”循环的语法有什么问题吗?
【发布时间】:2020-09-11 18:33:47
【问题描述】:

如果这是正确的

v = [22, 13, 45, 50, 98, 69, 43, 44, 1]
[ (x+1 if x >=45 else x+5)  for x in v ]

那么这段代码有什么问题呢?:

def isPrime(num):
is_prime = False
if num > 1:
    for i in range(2, num):
        if (num % i) == 0:
            is_prime = False
            break
    else:
        is_prime = True
else:
    is_prime = False
return is_prime


listTablesOnlyPrimes = [[ (i*num if isPrime(i*num)==True else pass) for i in range(1, 11)] for num in range(1, 11)]
for listTable in listTablesOnlyPrimes:
    print(listTable)

我想知道解释器消息中的SyntaxError 是什么:

listTablesOnlyPrimes = [[ (i*num if isPrime(i*num)==True else pass) for i in range(1, 11)] for num in range(1, 11)]
                                                                  ^
SyntaxError: invalid syntax

【问题讨论】:

  • 三元 if 运算符需要 else

标签: python list for-loop list-comprehension


【解决方案1】:

这使用了https://docs.python.org/3/reference/expressions.html#conditional-expressions形式的条件表达式

(x+1 if x >=45 else x+5)

但这不符合那个语法,因为没有别的:

(i*num if isPrime(i*num)==True)

我认为这是作为列表理解语法的一部分的 if 条件,但它出现在最后,如此处所述 https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries

附录:

不是问题的一部分,但既然您问了,这里有一种方法可以快速将一些单元测试添加到您的代码中。把它放在你的 isPrime 函数之后

if not isPrime(11):
    raise ValueError("isPrime isn't right")

您确实需要进行更多检查,但目前就足够了。我不想进入整个单元测试库。

【讨论】:

  • 其实我也试过了,但还是不行。如果您能分享您的工作代码脚本,我将不胜感激。感谢您的回复先生。
  • 那是语法错误。您的 isPrime 函数总是返回 false,但至少它不是语法错误,这是问题所在。其他数字都是两个整数的乘积,所以它们很有可能不是素数。其中一些实际上应该是素数,例如 1*7,但有用的琐事 - 1 本身不是素数。
  • 关于如何测试一个数是否为素数还有很多其他问题。你可以看看那些。
【解决方案2】:

问题在于嵌套列表中的 if 条件

listTablesOnlyPrimes = [[ (i*num) for i in range(1, 11) if isPrime(i*num)==True] for num in range(1, 11)]

注意:

你的代码总是返回空列表我不明白你为什么要这样做i * num never become prime if i > 1

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多