Python 3.x Python:NameError:name";“字符串”;未定义,不是通过输入()定义的
下面的函数检查字符串(n)的前9位是否等于第10个字符(1-9之间的整数或X表示10) 当我为Python 3.x Python:NameError:name";“字符串”;未定义,不是通过输入()定义的,python-3.x,Python 3.x,下面的函数检查字符串(n)的前9位是否等于第10个字符(1-9之间的整数或X表示10) 当我为n='020103803X'运行函数时,我得到一个错误: NameError: name 'X' is not defined 我搜索了这个问题,发现大多数人的问题都是关于input()或raw\u input(),但由于我没有使用input(),我不明白为什么我不能测试一个字符是否是一个特定的字符串。这是我作为Python初学者的第一篇帖子,请告诉我是否违反了规则,或者我应该包括哪些额外的信息。问题
n='020103803X'
运行函数时,我得到一个错误:
NameError: name 'X' is not defined
我搜索了这个问题,发现大多数人的问题都是关于
input()
或raw\u input()
,但由于我没有使用input()
,我不明白为什么我不能测试一个字符是否是一个特定的字符串。这是我作为Python初学者的第一篇帖子,请告诉我是否违反了规则,或者我应该包括哪些额外的信息。问题在于您使用eval
:eval('X')
与使用X
相同(没有引号)。python将其视为变量引用,并且没有名为X
的变量
这里没有理由使用eval。你希望完成什么?也许您应该检查字符是否为数字
if checkSum%11 == n[9].isdigit() or (checkSum%11 == 10 and n[9] == 'X'): return True
你在试图得到对方的回应
eval('X')
这是非法的,因为没有定义符号“X”
如果您切换If检查的顺序,您可以通过合法的ISBN。但是,它仍然无法处理结尾处带有X的无效代码
def isISBN(n):
checkSum = 0
for i in range(9):
checkSum = checkSum + (eval(n[i])*(i+1))
if (checkSum%11 == 10 and n[9] == 'X') or \
checkSum%11 == eval(n[9]):
return True
else:
return False
还请注意,您可以通过简单地返回表达式值来缩短返回的逻辑:
return (checkSum%11 == 10 and n[9] == 'X') or \
checkSum%11 == eval(n[9])
谢谢大家。我不知道我怎么没有想到使用int()。我之所以使用eval()是因为我过去编写的几个程序需要
x = eval(input("Input your equation: "))
不管怎样,这个函数现在可以工作了
def isISBN(n):
checkSum = 0
for i in range(9):
checkSum = checkSum + (int(n[i])*(i+1))
if n[9] == 'X':
if checkSum%11 == 10: return True
else: return False
elif checkSum%11 == int(n[9]): return True
else: return False
Eval不是正确的用法,也不是正确的使用方法。例如,请参见显示该用法的内容。您可能需要使用try:except:pair
try:
int(n[i]
except:
print "this character is not a digit"
对eval的调用有时会被没有经验的程序员使用
各种各样的事情。在大多数情况下,有更多的选择
灵活,不需要解析代码的速度代价
例如,eval有时用于简单的邮件合并功能,
如本PHP示例所示:
$name='johndoe'$greeting='Hello'
$template='“$greeting,
$name!我今天能为您做些什么?”
打印评估(“返回$template;”) 尽管这样做有效,但可能会导致一些安全问题(参见§ 安全风险),并将比其他可能的 解决。一个更快、更安全的解决方案是改变 回显$template的最后一行;以及从 上一行,或使用printf eval有时也用于需要评估数学的应用程序中 表达式,例如电子表格。这比写一篇文章要容易得多 表达式解析器,但查找或编写表达式解析器通常更明智 选择。除了可修复的安全风险之外,使用该语言的 评估功能很可能会更慢,而且不会像 可定制 也许eval的最佳用途是引导一种新语言(如 使用Lisp),并在语言教程程序中[澄清] 允许用户在受控环境中运行自己的程序 环境 对于表达式评估,eval的主要优点是 在大多数编程环境中,过度表达式解析器就是这样 如果支持eval,则表达式可以任意复杂, 并且可能包括对用户编写的函数的调用,这些函数无法 解析器的创建者可能已经预先知道了。这 此功能允许您使用 函数库,您可以根据需要进行增强,而无需 持续维护表达式解析器。但是,如果您没有 由于需要这种最高级别的灵活性,表达式解析器远远不够 效率更高,重量更轻
Python 2还是Python 3?您需要添加另一个标记。python初学者究竟为什么要使用
eval
?您希望eval
对X做什么eval('X')
不是'X'
,就像eval('3')
不是'3'
。如果要获取存储为字符串的数字的整数值,请使用int()
,而不是eval()
。
try:
int(n[i]
except:
print "this character is not a digit"