我对它的含义或定义有些困惑。
是不是某些代码产生或计算新的数据值? (泽勒在他的书中说)
然后我想知道字符串数据类型是否是表达式。
如果是,那么eval()
在其参数为字符串时会做什么?
Zelle的书说eval(<string>)
评估string
作为表达式,如果string
已经是表达式,这究竟意味着什么?
如果string
不是表达式,那么print
之后怎么会出现?
答案 0 :(得分:22)
表达式表示某些内容,例如数字,字符串或类的实例。任何值都是表达式!
任何做某事都是一种陈述。对变量或函数调用的任何赋值都是一个语句。表达式中该语句中包含的任何值。
foo = "hello"
是一个将foo赋给表达式“hello”的值的语句。由于代码"hello"
是一个简单的表达式,意味着它不包含任何操作,因此实际上没有评估任何内容,所以foo只被分配给"hello
“。更复杂的表达式实际上会评估事物,比如添加数字。单词表达似乎让事情变得更加混乱。表达式只不过是值,除了它们可以有加法或减法等操作。
eval
计算字符串,好像它是一个python表达式。 Eval确实将表达式作为参数。但是,由于每个值都是表达式,所以没有什么特别之处。说“eval以一个值作为一个参数”说的完全相同,但听起来更简单。 :d
eval( "2+2" )
将字符串"2+2"
传递给函数。该函数计算字符串中包含的表达式,该表达式为4。
Zelle的书说
eval(<string>)
评估字符串作为表达式,如果字符串已经是表达式,这究竟意味着什么?
任何字符串都是表达式,因为它表示一个值。但是,字符串中的内容绝对没有影响它作为表达式。如果是一个值,它就是一个表达式。当它“被评估为eval的表达式”时,字符串内的字符就像它们是python表达式一样被执行。
答案 1 :(得分:3)
TL; DR:表达式是值和运算符的组合,总是评估为单个值。每个其他指令都有一个声明。一些语句包含表达式。
表达式是组合值和运算符的指令,总是评估为单个值。
例如,这是一个表达式:
>>> 2 + 2
2是整数值,+是数学运算符。此表达式计算为单个整数值4。
从技术上讲,这也是一个表达式:
>>> 4
作为表达式,它评估为单值4。
当我说价值观和操作符时,这并不仅限于数学问题:
>>> 'You will be ' + str(int(myAge) + 1) + ' next year.'
myAge
变量的计算结果为其中的值。函数调用int('5')
计算函数的返回值5
。所有这些字符串值都与+
运算符组合在一起(在这种情况下,它是字符串连接运算符)。无论表达式有多大,它都会评估为单个值:在这种情况下,字符串值'You will be 6 next year.'
将此与语句进行对比,后者是一条不会评估为值的Python指令。 Python语句几乎是其他不是表达式的语句。这是分配声明:
>>> spam = 2 + 2
这是一个if语句:
>>> if spam == 4:
这是一个无限循环的while语句:
>>> while True:
请注意,这两个语句都包含表达式(偶数True
,它可以计算单值True
)。但并非所有语句都使用表达式。这是一个休息声明:
>>> break
答案 2 :(得分:2)
一旦你开始思考Python自己的脚本解析器是如何工作的,那么“表达式”可能是一个有点令人困惑的术语。 standard documentation区分表达式和“原子”,但我认为这使得它的术语非常具有限制性(5.11中的BNF图表意味着表达式必须是lambda的表达式我认为,形式或条件表达。我的BNF生锈了。)
另一方面,Atom似乎涵盖了@kynnysmatto所说的'任何具有“价值”的东西。也许“任何可以括号,然后从括号外面与其相应的值无法区分”的东西可能是对原子更好的定义。当Zelle在例如上下文中讨论表达时eval(foo),我认为他暗示:
tl; dr:“表达式”作为术语可能在代码解析方面得到最好的理解;当你自己编程时,你可能会发现用“原子”来思考它会更好。
答案 3 :(得分:1)
string是一个表达式。表达式是具有“值”的任何东西。像3,'Hello world',1 + 1,math.sqrt(9)等。函数名也是表达式。
eval()为您提供以字符串形式提供给它的表达式的值。如果你说eval('1 + 1')它返回2.所以如果你只是写1 + 1那么它返回相同的返回值。