1. eval定义
eval
(expression, globals=None, locals=None)
expression:该参数是一个字符串,python会使用globals字典和locals字典作为全局和局部的命名空间,将expression当做一个python表达式进行解析和计算。
globals:该参数管控的是一个全局的命名空间,也就是我们在计算表达式的时候可以使用全局的命名空间中的函数,如果这个参数被提供了,并且没有提供自定义的__builtins__,那么会将当前环境中的__builtins__拷贝到自己提供的globals里,然后才会进行计算。关于__builtins__,它是python的内建模块,也就是python自带的模块,不需要我们import就可以使用的,例如我们平时使用的int、str、abs等都在这个模块中。关于它的说明可以参照这篇文章:点击打开链接。如果globals没有被提供,则使用python的全局命名空间。
locals:该参数管控的是一个局部的命名空间,和globals类似,不过当它和globals中有重复的部分时,locals里的定义会覆盖掉globals中的,也就是当globals和locals中有冲突的部分时,locals说了算,它有决定权,以它的为准。如果locals没有被 提供的话,则默认为globals。
实际中添加不同参数的效果,见如下的实例演示:
>>>a, b, c = 1, 2, 3
>>>g = {'a': 5, 'b': 10}
>>>L = {'b': 50, 'c': 100}
>>>eval('a + b + c') #直接将 a,b,c 三个值相加
Out[4]: 6
>>>eval('a + b', g) #当加入参数g后,会覆盖之前变量a,b的值,并将g中的值赋给对应变量
Out[5]: 15
>>>eval('a + b + c', g) #当前参与计算的变量必须都在g中,否则报错
Traceback (most recent call last):
File "<ipython-input-5-100c5d3fb1b4>", line 1, in <module>
eval('a + b + c', g)
File "<string>", line 1, in <module>
NameError: name 'c' is not defined
>>> eval('a + b + c', g, L) #当加入参数L后,会覆盖之前变量和g中变量值,并将L中的值赋给对应变量
Out[7]: 155
2. eval用法
eval(<字符串>) 能够以Python表达式的方式解析并执行字符串,并将返回结果输出。eval()函数将去掉字符串的两个引号,将其解释为一个变量。单引号,双引号,eval()函数都将其解释为int类型;三引号则解释为str类型。
>>>a = eval(10) #非字符串
Traceback (most recent call last):
File "<ipython-input-1-29db9f085529>", line 1, in <module>
a = eval(10)
TypeError: eval() arg 1 must be a string, bytes or code object
>>>a = eval('10') #单引号字符串
>>>a
Out[3]: 10
>>>type(a)
Out[4]: int
>>>b = eval("20") #双引号字符串
>>>b
Out[6]: 20
>>>type(b)
Out[7]: int
>>>c = eval('"30"') #三引号字符串
>>>c
Out[9]: '30'
>>>type(c)
Out[10]: str
3. input用法
在获得用户输入之前,input()函数可以包含一些提示性的文字,标准形式: <变量> = input( " 提示性的文字 " )
无论用户输入的是字符还是数字,input()函数统一按照字符串类型输出。因此input()的输出类型均是str。
在实际操作中,为了获得想要的类型,会采取一定的强制性转换措施,如下:
>>>a = input('请输入:')
请输入:56
>>>type(a)
Out[2]: str
>>>b = int(input('请输入:'))
请输入:64
>>>type(b)
Out[4]: int
>>>c = eval(input('请输入:'))
请输入:72
>>>type(c)
Out[6]: int