# This program generates prime numbers
# Introduces user
def welcome():
print("""
Welcome to the prime number generator!
This program genarates all prime numbers starting from zero
to an upper limit. You´ll decide the upper limit.
Have fun :)
""")
# User inputs a natural number that will be the upper limit for checking primenumbers
def limit(question):
while True:
try:
limit = int(input(question))
except:
limit = ""
if limit:
return limit
break
# Checks if the number is a prime number. If it is, the number will be returned. If it is not, then None will be returned
def is_it_prime(current_number, prime_number):
y = 0
while True:
ratio = current_number / prime_number[y]
y += 1
if ratio == int(ratio):
break
if y == len(prime_number):
return current_number
# Adds prime number to list
def ad_prime(prime_number, it_is_prime):
a = len(prime_number)
prime_temp = (a+1)*[None]
for i in range(a):
prime_temp[i] = prime_number[i]
if i+1 == a:
prime_temp[i+1] = it_is_prime
return prime_temp
# Main program
upper_limit_question = "Type the upper limit and press enter. It has to be a natural number expressed in digits: "
lower_limit = 2
prime_number = [2]
welcome()
upper_limit = limit(upper_limit_question)
while lower_limit < upper_limit:
lower_limit +=1
it_is_prime = is_it_prime(lower_limit, prime_number)
if it_is_prime != None:
prime_number = ad_prime(prime_number, it_is_prime)
print("\n" +str(prime_number), "\n\nThanks for generating prime numbers :)")发布于 2013-08-05 23:28:52
很容易了解您的代码所做的事情。您在将代码分解为函数方面做得不错。不过,它可以在一些方面提高可读性,主要是通过一种更简单的方法来实现。例如,您的add_prime函数(它将一个数字附加到列表的末尾)可以写在一行中(稍后再讨论)。
我建议阅读Python教程。当你进入第四章的时候,你会发现很多事情你都会有不同的表现。:)
变量名很好,可以很容易地按照您正在做的操作进行操作,但是这两个名称有点让人困惑。特别是,prime_number应该是prime_numbers或简单的primes,因为它是一个数字列表。而且,limit的描述性也不是很强。limit函数和upper_limit变量之间的区别是,一个从用户那里获取值,另一个存储它。limit应该是get_limit或get_limit_from_user。
我喜欢你的评论方式。评论的数量是好的,它们提高了可读性。继续这样评论。不过,我有一个注意事项:当您编写描述整个函数或整个程序的注释时,请使用docstring。这使其他程序员更清楚地了解了您的注释,并使访问代码中的注释成为可能。
下面是代码的改进版本(以##开头的注释是本审查的一部分,不属于程序):
"""Generate prime numbers.""" ## This is a docstring.
WELCOME_TEXT = """Welcome to the prime number generator!
This program generates all prime numbers starting from zero to an upper limit.
You'll decide the upper limit.
Have fun :)
"""
LIMIT_PROMPT = ("Type the upper limit and press enter. It has to be a natural "
"number expressed in digits: ")ALL_CAPS_NAMES是一种惯例,意思是一个值应该被视为常量。通常,您应该在程序开始时设置常量值。在本例中,这还具有不缩进WELCOME_TEXT的优点。
LIMIT_PROMPT中的两个字符串将自动连接。这样,您可以用两行代码编写一行字符串.
def welcome():
"""Introduce user.""" ## Also a docstring. If your function definition starts
print(WELCOME_TEXT) ## with a string, the string will be made a docstring.
def get_limit():
"""Let user input a an upper limit for checking prime numbers.
The input must be a natural number."""
while True:
try:
return int(input(LIMIT_PROMPT))
except ValueError:
pass我对get_limit函数做了一些修改。您应该始终只捕获特定的异常(本例中为ValueError)。另外,我认为最好不要把字符串和数字混入一个变量中。
def is_prime(current_number, prime_numbers):
"""Check whether the number is a prime number.
prime_numbers must contain all prime numbers lower than current_number."""
for prime in prime_numbers:
if current_number % prime == 0: ## (current_number % prime) is the remainder
return False ## when current_number is divided by prime.
return True这样,您可以更容易地遍历列表。让is_prime返回布尔值将使程序的主要部分变得更容易。
def main():
welcome()
upper_limit = get_limit()
prime_numbers = []
for number in range(2, upper_limit+1):
if is_prime(number, prime_numbers):
prime_numbers.append(number) ## This adds number to the end of prime_numbers,
## so you don't need add_prime anymore.
print("\n", prime_numbers, "\n\nThanks for generating prime numbers :)")
main()我将程序的主要部分放入一个main函数中(这是一个有用的约定)。同样,您可以简化循环,这一次使用range函数。对于简单的循环,通常有一种使用非常可读的for循环而不是while循环的方法。我还把lower_limit的名字改成了number,这在我看来更合适。
如果你有任何问题,可以随便问。欢迎来到codereview。:)
https://codereview.stackexchange.com/questions/29412
复制相似问题