python中del()用法-str与repr的区别-eval()用法
del()
del()不同于c的free和c++的delete
python都是引用,而python有GC机制,所以,del()语句作用在变量上而非数据对象上
a=[1,2,3,4,5] print(id(a[0])) c=a[0] del(a) print(id(c)) print(c)
del删除的是a的引用,而不是数据
140737176589344 140737176589344 1
参考https://blog.csdn.net/u012206617/article/details/92798024
str()与repr()区别
在python中要将某一类型的变量或者常量转化为字符串对象通常有两种方法,即str()或者repr()
区别于使用
str()--转化为适于人阅读的形式
repr()--转化为供解释器读取的形式(如果没有等价的语法,则会发生SyntaxError异常),适合开发和调试阶段
number=1234 string='hello python' print(type(str(number))) print(type(repr(number))) print(str(string)) print(repr(string))
str与repr返回的数值类型是相同的值也相同,但将一个字符串分别传给str与repr函数打印到终端时,输出的字符有引号的区别。
<class 'str'> <class 'str'> hello python 'hello python'
造成不同的原因在于,str函数实际上调用对象的str方法,而repr调用的repr方法
string='hello python' print(string.__str__()) print(string.__repr__())
hello python 'hello python'
不同的数值类型的不同处理
某对象没有适用于人阅读的解释形式的话,str会返回与repr相同的值,很多类型,诸如数值、链表、字典这样的结构,针对个函数都有着统一的处理方式
list=[1,2,3] print(list.__str__()) print(list.__repr__())
[1, 2, 3] [1, 2, 3]
结果相同
而字符串和浮点数,处理方式不同
注意:python3版本下str和repr会返回相同的结果,python2下则不会
python3版本下
string='hello python' float=0.5 print(string.__str__()) print(string.__repr__()) print(float.__str__()) print(float.__repr__())
hello python 'hello python' 0.5 0.5
参考https://www.imooc.com/article/50568
eval()用法
语法
简单一点就是,解析,查看变量名,计算,输出
eval(expression,globals,locals)
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。
eval函数也可以被用来执行任意的代码对象(如那些由compile()创建的对象)。在这种情况下,expression参数是一个代码对象而不是一个字符串。如果代码对象已经被‘exec‘编译为模式参数,eavl()的返回值是None。
实例:
#在后两个参数都没有指定时 a1=10 print(eval('a1+1')) #在这种情况下,后两个参数省略了,所以eval中的a是前面的10。对于eval,它会将第一个expression字符串参数的引号去掉,然后对引号中的式子进行解析和计算。 #在globals指定时 a2=10 g={'a2':4} print(eval('a2+1',g)) #类似于初学C时出现的作用域问题,eval将作用域限定在了g这个范围内,a2=10自然而然的不起作用 #在locals指定时 a3=10 b=20 c=30 g={'a3':6,'b':8} t={'b':100,'c':10} print(eval('a3+b+c',g,t)) #locals优先级高于globals,所以g内的b被locals内的覆盖掉。
11 5 116
eval 用于执行一个字符串的表达式,并返回表达式的值
eval(expression, globals=None, locals=None) — 官方文档中的解释是,将字符串str当成有效的表达式来求值并返回计算结果。globals和locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;如果提供了locals参数,那么它可以是任意的map对象。
eval(<字符串>) 能够以Python表达式的方式解析并执行字符串,并将返回结果输出。eval()函数将去掉字符串的两个引号,将其解释为一个变量。单引号,双引号,eval()函数都将其解释为int类型;三引号则解释为str类型。
eval可以轻松实现,将字符串转换成:列表/元组/字典
实例:
a='[[1,2],[2,3],[3,4]]' print(type(a)) b=eval(a) print(b, type(b)) #字符串转列表 cc=[1,2] c='{"aa":[1,2],"bb":[2,3],"ss":[3,4]}' print(type(c)) d=eval(c) print(d, type(d)) #字符串转字典 e='([1,2],[2,3],[3,4])' print(type(e)) f=eval(e) print(f, type(f)) #字符串转元组
<class 'str'> [[1, 2], [2, 3], [3, 4]] <class 'list'> <class 'str'> {'aa': [1, 2], 'bb': [2, 3], 'ss': [3, 4]} <class 'dict'> <class 'str'> ([1, 2], [2, 3], [3, 4]) <class 'tuple'>
不可转化集合
使用场合
在使用时,我们一定要确保第一个参数expression满足表达式的要求,它是可以被解析然后计算的
实例:
s='abcd' print(eval(s))
程序报错:
Traceback (most recent call last): File "C:/Users/24201/Desktop/python学习/test.py", line 2, in <module> print(eval(s)) File "<string>", line 1, in <module> NameError: name 'abcd' is not defined
为什么报错?因为eval在去掉abcd的括号后发现,它不是一个可以被计算的值,然后又判断它是否是一个变量,然而不是,所以报NameError的错误,“该名字未被定义”
s='abcd' print(eval('s'))
这样当eval去掉引号解析后发现s是一个对象名,虽然不可以求值但是可以输出,而没引号,就只能当做变量名进行解析,从而出错,同理上面列表字典的转化也一样。
再一个实例:
s='abs(10)' print(eval(s))
执行结果为:10
对于这个程序,我们举的是一个满足计算的一个表达式,当eval剥去s的引号后,得到abs(10),然后它会对进行解析,这个解析我们前面介绍eval的时候说过,它会使用globals的内建模块builtins进行解析的,在这个内建模块中是有abs这个函数的,所以对abs(10)进行了计算。
关于builtins模块中有哪些东西 ,我们可以这样查看:
print(dir(__builtins__))
执行结果:
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
原文链接:https://blog.csdn.net/daxialeesuper/article/details/84575600
https://www.cnblogs.com/gaoyuxia/p/10214241.html
https://blog.csdn.net/liuchunming033/article/details/87643041
https://www.jb51.net/article/166796.htm