目录
前言问题简述一个想法总结前言
版本:
(相关资料图)
windows 10.0python 3.8问题简述
近期看到这么一个问题,有把值分别赋值给不同的变量,想在比较大小后得到变量的名称。
a = 34 b = 55 c = 12 d = 55 max(a, b, c) # 期望得到"b"
在该例子中,有过使用python经历的读者会知道,max处理后的结果只能返回b所指代的值,即55。而如何得到这个字符串"b"呢?
一个想法
想获取变量名绝非难事,在全局中可以用globals()获取,局部可以用locals(),在这里的难点可能在于,知道a,b,c三者之间的最大值是55,由于globals()会将所有的变量及对应的值返回,在遍历匹配中可能会返回没有参与大小比较的d变量,在实际使用上也不优雅。
有一定经验的pythoner会选择另辟蹊径,获取值比获取变量更优雅,也更容易,将当初想设置成的变量,转换为值,与原值对应,比如字典的键值对,列表等。
dict1 = {"a": 34, "b": 55, "c": 12} list1 = [("a", 34), ("b", 55), ("c", 12)]
在这样的思考过程中,是不是可以用类来得到这样的结果,将名称和值作为类的属性,比较大小后返回最大值对应的名称,类的结构如下:
class Int: def __init__(self, name, value): assert isinstance(name, (str, int, float, tuple)), "name值应该为不可变对象!" self.name = name assert isinstance(value, (int, float)), "value值应该为数字!" self.value = value def __eq__(self, other): print("eq") return self.value == other.value def __gt__(self, other): print("gt") return self.value > other.value def __ge__(self, other): print("ge") return self.value >= other.value def __lt__(self, other): print("lt") return self.value < other.value def __le__(self, other): print("le") return self.value <= other.value
定义一个类,并设置大小比较的魔法方法,等于,大于,大于等于,小于,小于等于。当值之间进行比较时,比如使用==,>, ...就会调用这些魔法方法。
在写下这篇之前,没有去探究max函数的处理逻辑,是通过魔法函数实现比较,还是其他的方式,对此翻了下官方说明。
看了后好像也不能理解具体用的啥,本人愚钝,没有去看c源码,尝试直接将几个类实例传入到max中,可以看到打印出多个gt,可以大概猜测实现逻辑,通过遍历传入的值,逐个比较,如max是多次使用>,调用__gt__魔法方法。
不难看出,每次都会比较判断,返回布尔值,通过比较结果来选取哪一个值与下一个值进行比较,回到问题上,如果有多个值需要比较,且部分跟比较的值有相同的value不参与比较,仍然可以返回出对应的值,只要将需要比较的值传入到max中,当然如果有value相同的值进行比较,不会将两个值同时返回。使用类来解决,整个结构上更为优雅,整个的工作流程也很顺畅。
总结
近期的一些认识,为什么要返回变量名,使用变量名的目的是什么,能不能将变量名转换到值上来,大多时候,定义一个变量也是为了能更好的使用其引用的值,而有时可能让变量绊了自己的脚,则需要考虑变量与值的关系,以及结构。
到此这篇关于Python数字比较与类结构的文章就介绍到这了,更多相关Python类结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 1转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 2充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 3好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 4名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 5亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战
- 6京东绿色建材线上平台上线 新增用户70%来自下沉市场
- 7网红淘品牌“七格格”chuu在北京又开一家店 潮人新宠chuu能红多久
- 8市场竞争加剧,有车企因经营不善出现破产、退网、退市
- 9北京市市场监管局为企业纾困减负保护经济韧性
- 10市场监管总局发布限制商品过度包装标准和第1号修改单