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

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-18 16:32
quench@0916:一顿操作猛如虎,一看工资2500
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务