Python 将生成器嵌套在 if else 中嵌套在 return 中可能吗?

Python nested a generator inside a if else nested in a return is possible?

我尝试创建一个更短的算法来猜测一个数字是否是素数

所以有我想做空的算法

def is_premier(n):
    i=2
    while i < n and n%i !=0:
        i+=1
    return i==n

这是我尝试做的事情:

def is_prime_v3(n):
    return ("Non Prime" if n%i==0 else "Prime" for i in range(2,n))

但我不知道这个生成器是否正确,或者有没有办法获取字符串? 我真正感兴趣的不是素数算法,我想弄清楚是否有可能得到一些东西 使用以下结构(return a if condition else b for x in range(n); 并收集答案 a 或 b)

感谢您的回答

你没能正确翻译第一个函数,不。

  • 函数is_premier()return是一个单个布尔值,而is_prime_v3()return是一个生成器字符串。

  • is_prime_v3() 生成器为非质数生成多个 "Prime" 值,例如对于 8,测试 8 % 3 == 0 为假,因此生成 "Prime"

    >>> list(is_prime_v3(8))
    ['Non Prime', 'Prime', 'Non Prime', 'Prime', 'Prime', 'Prime']
    

在这里使用条件表达式是错误的工具。第一个函数 在满足条件时提前停止 ,而你的第二个循环永远不会提前停止,并且每次迭代只产生不同的值。

如果您使用常规循环并且 print() 调用而不是让步,这就是执行的内容:

for i in range(2, n):
    if n % i == 0:
        print("Non Prime")
    else:
        print("Prime")

当找到 n % i == 0 时,该循环也永远不会停止。

现在,可能 是您的目标,生成 Non PrimePrime 字符串。但是,如果您改用布尔值,更容易,因此 TrueFalse.

您的第一个函数可以用英语描述为:

  • 开始 i 于 2
  • 只要i小于nn % i != 0为真,则i加一。
  • 如果i等于n,我们就有一个质数!

您也可以为此使用 range(),然后它变成:

  • 从范围 2 取 in(不包括 n)。
  • 如果 n % i == 0 为真,则这不是质数。
  • 如果我们从未找到 i 的值,其中 n % i == 0,我们有一个质数!

在代码中是:

for i in range(2, n):
    if n % i == 0:
        return false
return true

那种'early exit'如果条件满足或者不满足,都可以使用any() or all()函数。这些最好与生成器一起使用,它们会测试生成的每个值,如果条件不再成立,则 return truefalse early

例如对于 iall 值不能是除数的情况,您可以使用:

def is_prime_generator(n):
    return all(n % i != 0 for i in range(2, n))

最后,您自己的尝试 is_prime_v3() 可以做同样的事情,如果用作效用函数,我们不要求所有 n % i != 0 测试都为真,但是所有字符串都是 'Prime':

>>> all(s == 'Prime' for s in is_prime_v3(8))
False
>>> all(s == 'Prime' for s in is_prime_v3(7))
True

你的方向很好,但是你的表达式 return 是一系列字符串而不是单个值。

查看您的原始代码,它基本上说:如果任何小于 n 的数字除以 n - return False。否则 True.

所以这直接转换为 Python 为:

def is_prime(n):
    return not any(n%i == 0 for i in range(2,n))

也等同于:

def is_prime_v3(n):
    return all(n%i != 0 for i in range(2,n))

如果您想重现相同的逻辑(即 i 前进到 n 在第一个除数处停止),您可以这样表述:

def is_prime(n):
    return "Prime" if next(i for i in range(2,n+1) if n%i == 0) == n else "Non Prime"

或者您可以让 next() 函数 select 字符串:

def is_prime(n):
    return next(("Non Prime" for i in range(2,n) if n%i == 0),"Prime")