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 Prime
和 Prime
字符串。但是,如果您改用布尔值,更容易,因此 True
和 False
.
您的第一个函数可以用英语描述为:
- 开始
i
于 2
- 只要
i
小于n
且n % i != 0
为真,则i
加一。
- 如果
i
等于n
,我们就有一个质数!
您也可以为此使用 range()
,然后它变成:
- 从范围 2 取
i
到 n
(不包括 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 true
或 false
early。
例如对于 i
的 all 值不能是除数的情况,您可以使用:
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")
我尝试创建一个更短的算法来猜测一个数字是否是素数
所以有我想做空的算法
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 Prime
和 Prime
字符串。但是,如果您改用布尔值,更容易,因此 True
和 False
.
您的第一个函数可以用英语描述为:
- 开始
i
于 2 - 只要
i
小于n
且n % i != 0
为真,则i
加一。 - 如果
i
等于n
,我们就有一个质数!
您也可以为此使用 range()
,然后它变成:
- 从范围 2 取
i
到n
(不包括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 true
或 false
early。
例如对于 i
的 all 值不能是除数的情况,您可以使用:
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")