【问题标题】:Error in Modular Arithmetic calculation in PythonPython中的模算术计算错误
【发布时间】:2017-07-22 11:40:11
【问题描述】:

我有以下代码,其中一个特定的条目组合出现了一个神秘的错误:

除了输入“Friday”和“1000”之外,它*似乎“可以正常工作,它会引发变量错误。

完整代码清单: https://repl.it/Jd6a/0

代码

#Use of Modulo Arithmetic

def main():
  DAY="Monday"
  print("Here's a little modulo magic for ya...")
  dayofweek=input("Enter day of week (e.g. Monday, Tuesday, Wednesday, etc:")
  numberofdays=input("Enter number of days from that day of the week you would like to calculate:")

  if dayofweek=="Monday":
    dow=1 
  elif dayofweek=="Tuesday":
    dow=2 
  elif dayofweek=="Wednesday":
    dow=3 
  elif dayofweek=="Thursday":
    dow=4 
  elif dayofweek=="Friday":
    dow=5 
  elif dayofweek=="Saturday":
    dow=6 
  elif dayofweek=="Sunday":
    dow=7 

  modanswer=int(numberofdays)%7
  answer=modanswer+dow

  if answer==1:
    finalanswer="Monday"
  elif answer==2:
    finalanswer="Tuesday"
  elif answer==3:
    finalanswer="Wednesday"
  elif answer==4:
    finalanswer="Thursday"
  elif answer==5:
    finalanswer="Friday"
  elif answer==6:
    finalanswer="Saturday"
  elif answer==7:
    finalanswer="Sunday"

  print(numberofdays,"days from -",dayofweek,"-will be-",finalanswer)

main()

测试(正确)和错误如下所示

Here's a little modulo magic for ya...
Enter day of week (e.g. Monday, Tuesday, Wednesday, etc: Monday
Enter number of days from that day of the week you would like to calculate: 1000000
1000000 days from - Monday -will be- Tuesday
   main()
Here's a little modulo magic for ya...
Enter day of week (e.g. Monday, Tuesday, Wednesday, etc: Friday
Enter number of days from that day of the week you would like to calculate: 1000
Traceback (most recent call last):
  File "python", line 1, in <module>
  File "python", line 42, in main
UnboundLocalError: local variable 'finalanswer' referenced before assignment

我在寻找什么:

我对 a) 对问题进行解释的解决方案感兴趣 b) 更优雅的方法,通过验证来解决问题(也许使用更简单的构造)

【问题讨论】:

    标签: python csv newline


    【解决方案1】:
     modanswer=int(numberofdays)%7
     answer=modanswer+dow
    

    modanwer 介于 0 和 6(含)之间,dow 介于 1 和 7(含)之间,因此 answer 介于 0 和 13(含)之间。您应该在加法后应用模运算。这可能有效:

    answer = (int(numberofdays) + dow - 1) % 7 +1
    

    -1+1 是必需的,因为您的 answer 介于 1 和 7 之间,但取模返回一个介于 0 和 6 之间的数字。

    您可以简单地使用列表、0-index day_number 和模数:

    days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
    
    day_number = days.index('Friday') # 4
    offset = 1000
    print(days[(day_number + offset) % 7])
    # Thursday
    

    【讨论】:

    • 谢谢!但是在添加后应用模运算会导致错误: answer=modanswer+dow modanswer=int(numberofdays)%7 错误 UnboundLocalError: local variable 'modanswer' referenced before assignment
    • @MissComputing 查看更新。您不能使用稍后在 Python 中定义的变量。
    • 会看的。这不会简单地工作: modanswer=0 answer=modanswer+dow modanswer=int(numberofdays)%7 print(answer) ..它似乎! (如下由 Compoot 建议)
    • @MissComputing 我认为这没有意义。 answer 只是 dow 而你不要在 modanswer 中使用它。
    • 知道了!作品。谢谢。正如 Compoot 指出的实际问题,我想我会接受答案(并且首先完成了)。不过,我还是要感谢您,并为您所有有用的 cmets 投票!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 2015-02-05
    相关资源
    最近更新 更多