zoukankan      html  css  js  c++  java
  • 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__的区别下一篇开始讲。

  • 相关阅读:
    iOS 语录
    接口的理解
    android中src和background区别
    onItemClick 参数解释
    工作空间项目不存在,eclipse中项目删不掉
    [转载] IIS来搭建一个只能实现基本功能的FTP服务器
    [转]C# FTP操作类
    [转] VS2017 打包安装程序
    笔记本睿频的关闭与开启 [转载]
    C# 线程:定时器的使用
  • 原文地址:https://www.cnblogs.com/sidianok/p/11922648.html
Copyright © 2011-2022 走看看