首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用户输入素数发生器

用户输入素数发生器
EN

Code Review用户
提问于 2013-08-05 21:19:41
回答 1查看 665关注 0票数 4
  1. 你认为这个程序的可读性如何?
  2. 你认为仅仅通过读取变量和函数的名称就可以很容易地理解它们的作用吗?
  3. 你喜欢更多,更少,还是这么多的评论?
  4. 这些评论会让你更容易或更难理解程序吗?
  5. 你喜欢一个程序有评论(一般)吗?
代码语言:javascript
复制
# 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 :)")
EN

回答 1

Code Review用户

回答已采纳

发布于 2013-08-05 23:28:52

很容易了解您的代码所做的事情。您在将代码分解为函数方面做得不错。不过,它可以在一些方面提高可读性,主要是通过一种更简单的方法来实现。例如,您的add_prime函数(它将一个数字附加到列表的末尾)可以写在一行中(稍后再讨论)。

我建议阅读Python教程。当你进入第四章的时候,你会发现很多事情你都会有不同的表现。:)

变量名很好,可以很容易地按照您正在做的操作进行操作,但是这两个名称有点让人困惑。特别是,prime_number应该是prime_numbers或简单的primes,因为它是一个数字列表。而且,limit的描述性也不是很强。limit函数和upper_limit变量之间的区别是,一个从用户那里获取值,另一个存储它。limit应该是get_limitget_limit_from_user

我喜欢你的评论方式。评论的数量是好的,它们提高了可读性。继续这样评论。不过,我有一个注意事项:当您编写描述整个函数或整个程序的注释时,请使用docstring。这使其他程序员更清楚地了解了您的注释,并使访问代码中的注释成为可能。

下面是代码的改进版本(以##开头的注释是本审查的一部分,不属于程序):

代码语言:javascript
复制
"""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中的两个字符串将自动连接。这样,您可以用两行代码编写一行字符串.

代码语言:javascript
复制
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)。另外,我认为最好不要把字符串和数字混入一个变量中。

代码语言:javascript
复制
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返回布尔值将使程序的主要部分变得更容易。

代码语言:javascript
复制
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。:)

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/29412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档