Python 3.x Python:NameError:name";“字符串”;未定义,不是通过输入()定义的

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)的前9位是否等于第10个字符(1-9之间的整数或X表示10)

当我为
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"