我对它的含义或定义有些困惑。
这不是生成或计算新数据值的代码吗?(泽尔在书中说)
然后我想知道字符串数据类型是否是表达式。
如果是,那么当参数是字符串时,eval()会做什么?
Zelle Sayseval()的书把string作为一个表达式来评价,如果string已经是一个表达式,这到底意味着什么?
如果string不是一个表达式,那么它怎么会出现在print之后呢?
相关(但不是完全重复):表达式和语句之间的区别是什么?
表达式表示一些东西,如数字、字符串或类的实例。任何值都是表达式!
做什么都是声明。对变量或函数调用的任何赋值都是语句。表达式中该语句中包含的任何值。
foo ="hello"是一个将foo赋给表达式"hello"值的语句。由于代码"hello"是一个简单的表达式,意味着它不包含任何操作,因此实际上不计算任何内容,因此foo只是分配给"hello。更复杂的表达式实际上会计算一些东西,比如加数字。使用这个词的表达方式似乎让事情变得更加混乱。表达式只不过是值,除了它们可以有加法或减法之类的操作。
eval计算字符串时,将其视为python表达式。eval不接受表达式作为参数。然而,这并没有什么特别的,因为每个值都是一个表达式。说"eval以一个值作为参数"是完全相同的,但听起来简单多了。D
eval("2+2" )将字符串"2+2"传递给函数。函数计算字符串中包含的表达式,结果为4。
The book by Zelle says eval() evaluates string as an expression, what does that exactly mean if string is already an expression?
任何字符串都是表达式,因为它表示一个值。但是,字符串中的内容对表达式的形式绝对没有影响。如果它是一个值,则它是一个表达式。当它被"eval计算为表达式"时,字符串中的字符将被执行,就像它们是一个python表达式一样。
很好的解释,除了不能使用eval语句:在python 2.x中尝试使用eval("print hello")。
函数调用是Python中的表达式。任何表达式也是一个语句——一个"表达式语句"。另请参阅我上面给出的相关问题的链接。
@为了简单起见,我使用了不同的表达式定义。我认为把信息去掉可以避免额外的复杂性,特别是因为表达式作为语句的使用并不十分广泛。D
实际上,有一个关于Python中表达式是什么的"官方"定义(基本上所有可以由eval()计算的内容)。由于每一个函数调用本身都是一个表达式语句,所以它们被广泛使用。我不明白为什么正确会增加这里的复杂性。
注意,不能在Python中的表达式中执行赋值,这样可以避免if(a=4)vs if(a==4)错误。例如,eval("a=4")是一个语法错误。
tl;dr:表达式是值和运算符的组合,并且始终计算为单个值。陈述是每一条指令。有些语句包含表达式。
表达式是一条将值和运算符组合在一起并始终计算为单个值的指令。
例如,这是一个表达式:
1>>> 2 + 2
2s是整数值,+是数学运算符。此表达式的计算结果为单个整数值4。
从技术上讲,这也是一个表达:
1>>> 4
作为表达式,它的计算结果为单个值4。
当我说值和运算符时,这不仅限于数学问题:
1>>> 'You will be ' + str(int(myAge) + 1) + ' next year.'
myAge变量的计算结果是它内部的值。函数调用int('5')计算函数的返回值5。所有这些字符串值都与+运算符组合在一起(在本例中,它是字符串连接运算符)。不管表达式有多大,它的计算结果都是一个值:在这种情况下,字符串值'You will be 6 next year.'。
这与一条语句形成对比,该语句是一条不计算值的python指令。python语句几乎是所有其他不是表达式的语句。这是一份分配声明:
1>>> spam = 2 + 2
这里有一个if语句:
1>>> if spam == 4:
下面是无限循环的while语句:
1>>> while True:
注意,这两个语句都包含表达式(甚至是True,它的计算结果都是单值True)。但并非所有语句都使用表达式。这里有一个中断声明:
1>>> break
一旦您不去想Python自己的脚本解析器如何工作,"表达式"可能是一个稍微令人困惑的术语。标准文档对表达式和"原子"进行了区分,但我认为这使得它的术语非常严格(5.11的BNF图意味着要成为表达式,必须是lambda形式或条件表达式,我认为。我的BNF生锈了。)
另一方面,原子似乎覆盖了@kynnysmatto所说的"任何有价值的东西"。也许"任何可以用括号括起来的东西,然后从括号的外面看,它和它相应的值是不可区分的"可能是一个更好的原子定义。
当Zelle在eval(foo)等上下文中讨论表达式时,我认为他暗示:
foo是一个标识符,它是一种原子类型
但是foo是某个东西的标识符
这个"某物"是字符串,可能是实际的字符串
在eval()的内部,这个字符串还构成了一个python"表达式"——也就是说,python可以解析和理解的东西。
tl;dr:"表达式"作为术语在代码解析方面可能最容易理解;当您自己编程时,您可能会发现最好用"原子"来思考。
字符串是表达式。表达式是任何具有"值"的东西。比如3,‘hello world’,1+1,math.sqrt(9)等。函数名也是表达式。
eval()将表达式的值作为字符串提供给它。如果你说eval("1+1"),它返回2。所以它返回相同的结果,如果你简单地写:1+1,它会返回相同的结果。
除此之外:返回值的每个方法/函数也作为表达式计数。例如,eval本身就是一个表达式a well。
@戳:这有点误导人。每个方法/函数都返回一个值。如果不显式返回任何内容,它将隐式返回None。(当然,在实践中,一个特定的函数调用可能会引发sys.exit,在无限循环中永远旋转,等等,而不是返回。但这并不能使该函数调用表达式不再是一个表达式,而不仅仅是1/0。
@现在很难说我当时的意思,但我想我的意思是所有这些东西都算作一个表达式,而不仅仅是标准静态的,中间有一些基本的操作符。