情况是这样的:我正在尝试获取某个范围(例如 2 到 100)中的数字列表,但我要查看最大的数字并查看该范围内有多少个素数。我不知道如何让 100 成为可变响应。
这是我的代码:
def is_prime(number):
if isinstance(number,int) == 'False': #stops if the number is not an integer
return
if number <= 1: #we do not need anything less than 1 or 1
return
if number == 2: #we know 2 is prime, so if they want a list of primes for 2, well...
return 2
for factor in range(3, int(number ** 0.5)+1,2):
if number % factor == 0: #if this is true, we do not want it as its not prime
return
else:
if number % 2 == 0: #I was having issues with 4,6,8 showing up, so I had to do this to get rid of those
return
else:
return number #this will be a number, should be prime....
AllNumsInRange = list(range(2,100)) #The 1000 needs to be a variable. One that someone enters in and then the whole thing works. but I do not know how to do that... SQl I do, SPROCs are easy lol. This no idea.
PrimeNumber = list(filter(partial(is_not,None), list(map(is_prime,AllNumsInRange)))) #this cleans up the list, gets rid of the Nones and maps the function to the range.
print(PrimeNumber)
我得到:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
对于硬编码数字来说这是正确的
只要我有硬编码范围,我就能做到这一点。当您必须使用以下提示时,这不起作用。
print(allPrimesUpTo(100))
我尝试了各种方法让
AllNumsInRange
进入函数:
def allPrimesUpTo(number):
if number <= 1:
return
if number == 2:
return 2
for factor in range(3, int(number ** 0.5)+1,2):
if number % factor == 0:
return
else:
if number % 2 == 0:
return
else:
AllNumsInRange = list(range(2,number))
PrimeNumber = list(filter(partial(is_not,None), list(map(is_prime,AllNumsInRange))))
print(PrimeNumber)
print(allPrimesUpTo(100))
但是我得到了
None
作为解决方案。它不是,应该是:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
很明显我做错了什么,我想解决这个问题。这是为了我个人的成长,我很困惑。另外,如果你能告诉我如何用谷歌搜索这个,它也会很有帮助,使用正确的词汇是关键,我在一个函数中尝试了多个列表,以及各种组合,但没有运气。
好吧,你将 100 传递给函数,然后进入这部分:
for factor in range(3, int(number ** 0.5)+1,2):
if number % factor == 0:
return
由于 100 能被 4 整除,所以返回。您可以删除已经放入的所有代码
is_prime
并且它会起作用:
def allPrimesUpTo(number):
AllNumsInRange = list(range(2, number))
PrimeNumber = list(
filter(partial(is_not, None), list(map(is_prime, AllNumsInRange)))
)
return PrimeNumber
现在,有几件事:
如果
is_prime
返回True或False会更有意义,那么你就不需要过滤掉那些None。
您将
isinstance(number, int)
与字符串 "False"
进行比较,而不是布尔值 False
,因此它将始终为 False。
这可能看起来像这样:
def is_prime(number):
if not isinstance(number, int) or number <= 1:
return False
if number != 2 and number % 2 == 0:
return False
for factor in range(3, int(number**0.5) + 1, 2):
if number % factor == 0:
return False
return True
所以这就足够了:
def all_primes_up_to(number):
return list(filter(is_prime, range(2, number)))
这工作得很好,但更 Pythonic 的方法是使用列表理解:
def all_primes_up_to(number):
return [i for i in range(2, number) if is_prime(i)]
我相信你已经快到了,但需要调整你的 while 循环,如下所示:
while True:
inval = input('What number are you looking for? ')
try:
number = int(inval)
break # Break out of the loop when input is integer
except ValueError:
print('This is not an integer')
AllNumsInRange = list(range(2,int(number)))
PrimeNumber = list(filter(partial(is_not,None), list(map(is_prime,AllNumsInRange))))
print(PrimeNumber)
为了给您一些上下文,while 循环将要求用户输入一个数字,这是一个存储为 inval 的 str 值。 try 部分尝试将 inval 转换为存储为 number 的整数值。如果转换成功,代码将跳出 while 循环并继续执行行
AllNumsInRange
。如果转换导致“ValueError”,代码将打印出警告并返回询问数字。
以
AllNumsInRange
开头的行与 While
语句的缩进级别相同
好吧,我已经有了答案,虽然不太优雅。我仍然想尝试做建议的事情。我想做的就是有一个输入。然后检查该输入以确定它是否是整数。如果没有,我们会收到错误或它停止工作。如果它是一个整数,则让函数检查它。最后,打印出输入的数字所具有的质数列表。
这是我上完4个小时的课后得出的结论。请记住,我在为期 4 周的课程中学习了 4 个小时。那么,第一周。我相信我会变得更加优雅。但这正是我所需要的。感谢 itprorh66 的建议。太酷了。
def is_prime(number):
if number <= 1:
return
if number == 2:
return 2
for factor in range(3, int(number ** 0.5)+1,2):
if number % factor == 0:
return
else:
if number % 2 == 0:
return
else:
return number
while True:
inval = input('What is the max range number you would like to use to get all prime numbers? ')
try:
number = int(inval)
break
except ValueError:
print(f'{inval} is not an integer.')
AllNumsInRange = list(range(2,int(number)))
PrimeNumber = list(filter(partial(is_not,None), list(map(is_prime,AllNumsInRange))))
print(PrimeNumber)