repr与eval函数使用,其实eval还真的蛮不错的。

还是上基础,__str__与__repr__其实我有非常长的时间一直搞不清楚,他们具体有什么用。

今天回头看了下高手老师以前的教学视频,结合《深入了解Python特性》的书中知识。给自己备注下。

 

反着说,首先说比较少用的repr与eval这么简单的两个函数我以前尽然很长时间不理解。

eval简单来说可以还原任何repr返回的对象。

a = 123
a_repr = repr(a)
b = eval(a_repr)
print(a == b)

 返回的是true

以前我一直不理解,repr与str的关系,感觉就是repr就是在上面有套了一层引号,还是字符串,为什么还要设计一个repr做什么。

其实repr一般与eval配对使用,一个任何的Python对象对可以使用repr函数(方法),通俗的理解我觉的可以说是用字符串的形式保存了下来,但可以用eval还原出来。

class Car:
    def __init__(self, color, mileage):
        self.color = color
        self.mileage = mileage

 

car = Car('red', 123)
cat_repr = repr(car)
car_2 = eval(cat_repr)
print(car_2.color)

 实例也可以通过repr保存,然后通过eval返回对象。repr是Python里面应该最厉害的多态形式表达的一种,因为任何一个对象都拥有该方法,但每个方法的执行输出都不一样。

eval对象里面如果是一些逻辑运算,还能算出里面的值,很早的时候,我就用eval给孩子做了心算表格。

eval('1+2')
3
eval('1.2+2')
3.2

 在一些外国教材或者小学生教材中,用eval('具体数字')我觉的比用int或float是合适多了,eval其实是最原始的还原对象初始的状态,以前还教孩子最好用int或者float感觉有所误导他。

 

最后说一个format格式化输出中的!r用法

在字符串的格式话中如果想格式化输入一个对象的repr状态,简单的格式化输入会有误解。

a = '[1,2,3]'
b = [1,2,3]
f'a is {a}, b is {b}'
'a is [1,2,3], b is [1, 2, 3]'

 在上面的代码中,从输出来看,根本无法看出来,原始状态喜爱,a与b的初始状态。

a = '[1,2,3]'
b = [1,2,3]
f'a is {a}, b is {b}'
'a is [1,2,3], b is [1, 2, 3]'
f'a is {a !r}, b is {b !r}'
"a is '[1,2,3]', b is [1, 2, 3]"

 但在!r输出中,可以明显的看出a与b的区别,a在repr之后,外面有一层小括号,说明以前该对象是列表,而b就明显以前是列表。

 

__str__与__repr__的区别下一篇开始讲。

 

posted @ 2019-11-24 15:38  就是想学习  阅读(878)  评论(0编辑  收藏  举报