【问题标题】:Python 3.5 "name 'i' is not defined."Python 3.5“未定义名称'i'。”
【发布时间】:2018-03-11 16:38:37
【问题描述】:

我是编程的绝对初学者。

我遇到的问题是无法将输入发送到“if 语句”开始的模行。

我的目标是,在输入三个输入后,只打印能被 5 整除的输入。 我收到一个错误:NameError: name 'i' is not defined。

我一直无法弄清楚如何解决这个问题,所以我请求帮助。代码如下:

bo=0
xo=0
zo=0
while True:
    bo,xo,zo=[int(i)for i in input('Enter three numbers:  ').split(" ")]
    print([bo,xo,zo])
    if i%5 == 0:
        print([i])
    else:
        print('Sorry')

【问题讨论】:

  • 显而易见的问题:i 仅在列表理解的范围内定义,在其他任何地方都不存在。更深层次的问题:你真正想要完成的是什么?
  • bo=0; xo=0; zo=0 是完全没有意义的陈述,顺便说一句
  • "只打印能被 5 整除的输入"。如果其中不止一个能被 5 整除,会发生什么?如果您正在考虑“它应该打印所有这些”,那么您将i 视为同时是一个值和多个值。如果i 是一个列表,则不能对其进行取模;如果是整数,则只有一个值。
  • 另外,如果您是绝对初学者,请不要使用列表理解。
  • @Makoto 我完全不同意。最好学习和理解基本流程控制、范围等概念等内容,这些内容显然被掩盖了。你永远不需要列表理解,你确实需要那些其他的东西。

标签: python python-3.5


【解决方案1】:

你在你的要求里说

我的目标是,输入三个输入后,只有输入 应该打印能被 5 整除

然而,当某些东西不能被 5 整除时,你会打印一些东西……单词“sorry

无论如何,这是我的答案

[print(i) for i in input('Enter three numbers: ').split() if int(i) % 5 == 0]

如果 i 能被 5 整除,它将打印出来。否则它不会打印任何东西。

需要将其打印为列表吗?

print([int(i) for i in input('Enter three numbers: ').split() if int(i) % 5 == 0])

【讨论】:

  • 请解释为什么将整个代码放在方括号中作为第一个解决方案的原因。解决方案很棒,但我只需要理解您为什么这样做。在第二个解决方案中,“打印”关键字被排除在方括号之外。
  • 您需要使用某种可迭代的语法才能使用列表推导式。您应该已经注意到删除方括号会给您带来语法错误。从技术上讲,它不必是方括号,因为您也可以将() 用于元组。使用 {} 将根据您的使用方式使用字典或集合理解。第一个解决方案是为列表中的每个 i 打印 i。第二种解决方案是在创建列表后打印列表。如果您了解列表理解的概念,它应该是非常不言自明的。
  • 如果第二种解决方案对您来说不是很明显,那么我建议您先返回并学习 for 循环,然后了解如何将短 for 循环轻松转化为一个线性列表理解。
  • 为了更加清楚,第一个解决方案将创建一个无列表,因为 print(i) 总是返回无。因此,如果您要输入 20 30 40 作为输入,则列表将结束为 [None, None, None] 因为 3 个东西已放入列表中。但是,我们不会打印该列表,因此您只会看到 i 的输出
  • 非常感谢您抽出时间回答我的问题。在解决方案 1 中,方括号内的“打印”关键字让我有点困惑,但现在我明白了。非常感谢 xNinjaKittyx。
【解决方案2】:

input('输入三个数字:').split() 采用空格分隔的整数并将它们转换为 ['30','40','2'] 的列表 map 将 int 函数应用于 ['30','40','2'] 列表的所有元素,将其转换为 [30,40,2] 现在我准备好了我的列表,我只需要遍历列表并检查其项目是否可被 5 整除并根据除法后获得的余数打印数字或“对不起”。

items = map(int,input('Enter three numbers:  ').split())
for item in items:
  if item%5 == 0:
    print (item)
  else:
    print ('sorry')

输出:

Enter three numbers:   30 40 2
30
40
sorry

【讨论】:

  • 您可能是对的,但您需要解释您的代码。
  • 三个输入后,选择能被5整除的那个,打印出来。
  • 输入三个数字:30 40 2 - 这里 30,40,2 是用户输入的输入,在下一行 30,40 可以被 5 整除,所以打印出来,2 不能被 5 整除抱歉已打印。
  • 感谢@Makoto 的提示,我正要编辑并编写代码说明。既然我有评论能力,我会写 cmets 而不是写答案。在 stackover 流程​​中获得最初的 50 名声望非常困难。
  • 这是正确的方向,先生,但输出应打印为列表。
猜你喜欢
  • 2016-01-14
  • 1970-01-01
  • 2021-10-18
  • 2016-05-16
  • 2013-01-26
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多