【问题标题】:Please code review my sample Python program [closed]请对我的示例 Python 程序进行代码审查 [关闭]
【发布时间】:2013-03-15 10:05:37
【问题描述】:

我仍在学习 Python,因为我想向 11 岁的孩子教授该语言的基本概念(我是一名教师)。我们在基础方面做了一些工作,因此他们了解编程和将任务分解成块等的要点。随着新课程的推出,Python 是一种将在英国各地教授的语言,我不想教孩子们坏习惯。下面是我编写的一个小程序,是的,我知道它很糟糕,但任何关于改进的建议都将非常感激。

我仍在学习该语言的教程,所以请保持温柔! :o)

# This sets the condition of x for later use
x=0
# This is the main part of the program
def numtest():
    print ("I am the multiplication machine")
    print ("I can do amazing things!")
    c = input ("Give me a number, a really big number!")
    c=float(c)
    print ("The number", int(c), "multiplied by itself equals",(int(c*c)))
    print("I am Python 3. I am really cool at maths!")
    if (c*c)>10000:
        print ("Wow, you really did give me a big number!")
    else:
         print ("The number you gave me was a bit small though. I like bigger stuff than that!")

# This is the part of the program that causes it to run over and over again.
while x==0:
    numtest()
    again=input("Run again? y/n >>>")
    if x=="y":
        print("")
        numtest()
    else:
        print("Goodbye")

【问题讨论】:

  • 你的问题到底是什么?如果您正在寻找代码审查,codereview.stackexchange 可能是一个更好的场所。
  • 你有什么问题?
  • print("Goodbye") 之后,仍然在else 内,我会放置x = 1,这样当用户尝试退出时循环不会重复。还有,其他人回答的,需要查看if again=="y"
  • 避免在函数调用及其后面的括号之间放置空格。您可能(不确定)对 Python 2 有一些歧义,因为 print ("string", 10) 将打印一个元组,但 print("string", 10) 将打印两个值。

标签: python loops while-loop


【解决方案1】:

您似乎不需要变量x

while True:
    numtest()
    again = input("Run again? y/n >>>")
    if again == "y":       # test "again", not "x"
        print("")
    else:
        print("Goodbye")
        break              # This will exit the while loop

【讨论】:

  • 如所写,这将连续调用numtest() 两次,中间不会询问您是否要再次运行它。我认为第一个 if 分支没有添加任何内容。
  • @DSM 很好的发现。它现在只是添加了一个空行
  • 谢谢。在几行代码中,您使用 while true 命令帮助了我,并向我介绍了命令“break”,谢谢。
【解决方案2】:

你必须打破循环

你的时间应该是

又一次 == 'y':

因此

again = 'y'


def numtest():
    print ("I am the multiplication machine")
    print ("I can do amazing things!")
    c = input("Give me a number, a really big number!")
    c = float(c)
    print ("The number", int(c), "multiplied by itself equals", (int(c * c)))
    print("I am Python 3. I am really cool at maths!")
    if (c * c) > 10000:
        print ("Wow, you really did give me a big number!")
    else:
        print ("The number you gave me was a bit small though. I like bigger stuff than that!")

# This is the part of the program that causes it to run over and over again.
while again == 'y':
    numtest()
    again = input("Run again? y/n >>>")
    if again != "y":
        print("Goodbye")

【讨论】:

  • 谢谢你。它真的帮了很多忙。很清楚,很有道理。
【解决方案3】:

一些希望有用的评论:

使用文档字符串而不是注释来描述您的函数

def numtest():
    """Use a docstring. This is the main part of the program. Explain what a function is and why you want to use it. (Because it gives you scope and lets you simplify a complex set of procedures into a single operation.)"""

为您的代码使用一致的样式,并尝试让您的学生也遵循它。

如果您不确定要遵循哪种风格,请使用PEP-8。 (在您的情况下,您在不同行的同一操作中处理空格的方式有所不同。)

print ("The number", int(c), "multiplied by itself equals",(int(c*c)))
print("I am Python 3. I am really cool at maths!")

为什么在这里做一个浮点数,然后再做一个整数?

教计算机如何区别对待浮点运算和整数运算可能会很有用,但这里并没有真正说明。

c = float(c)
print("The number", int(c), "multiplied by itself equals", (int(c*c)))

你在循环中调用了两次numtest

试试这个:

again = "y"
while again == "y":
    numtest()
    again = input("Run again? y/n >>>")
    print("")

# Take this out of the loop.
print("Goodbye")

【讨论】:

  • 感谢您的帮助。我想我在错误的部分发布了这个,应该使用代码审查,哎呀。我已经计划了一些关于 python 如何处理数字的东西,但我知道他们会在浮点数和整数之间感到非常困惑,他们只有 9-11 岁。尽管如此,他们在 7 岁和 8 岁的时候就已经掌握了足够好的基础知识,所以是时候给他们一个推动力了!再次感谢。
  • 可以肯定的是,@KirkRogers,这不仅仅是 Python 处理数字的方式。这就是浮点运算的工作原理,很少有编程语言以这种方式工作。但是,如果不教授一些二进制数学,就很难对这个问题进行很好的处理。
  • 感谢您的建议。我们已经在二进制数学方面做了一些工作,但可能还没有达到您所想的水平。我将面临的最大问题是 Python 如何处理数字。
  • 例如,在 BASIC INT 中意味着只去掉小数点后的所有内容,但在 Python 中,变量可以定义为 int。数字的浮点数将始终为 x.o
  • 我给你举个例子;当我们在 basic 中编写一个程序来检查一个数字的整除性时,我们将除法的整数与除法的原始答案进行了比较。如果两者相同,则该数字是 x 的倍数。 . IE。 10/2 与 10/2 的整数相同,所以 10 是 2 的倍数。不过,在 python 中,这种语言完全不存在。该数字必须转换为浮点数,当您将浮点数与整数进行比较时,您将 5.0 与 5 进行比较显然不一样。你怎么做呢?我差点把头发扯掉了。 :o) 谢谢和问候柯克
【解决方案4】:

既然你想传授良好的风格:

  1. 除非您正在创建图表,否则请勿使用 x 之类的变量名称。有关命名约定和样式,请参阅 PEP008。

  2. 与您的空间保持一致:

    c = input ("Give me a number, a really big number!")
    
    c=float(c)
    

不一致。哪种风格更好?

如果你真的想要一个无限循环,那么:

而真: 数测试() 再次 = input("再次运行?是/否 >>>") 如果再次.lower().startswith("n"): 打印(“再见”) 休息

再一次,有些人认为使用break 是不好的风格,你同意吗?您将如何重写循环以便不使用 break?可以为您的学生做一个练习吗?

【讨论】:

  • +1,因为您在所有 cmets 之后都跟踪了一个问题,从而保持教学要点。
  • 感谢您的建议。我想我在错误的论坛上发帖了,但是嘿嗬!我不知道(目前)如何重写所以不使用 break,除了把它放在最后并希望最好:o) 我和孩子们一起工作的水平非常简单,只是将他们介绍给语言。他们只有九岁!
  • @KirkRogers:因为你的学生“只有”九岁,所以你有更大的责任展示可读、清晰的代码。如果你表现出难以理解的混乱,那么你可能会推迟他们或让他们认为马虎是可以的。在那个年龄学到的教训会伴随你一生,以后很难打破。
猜你喜欢
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多