Python数字比较与类结构

作者:??宿者朽命??? 时间:2023-07-29 13:33:51 

前言

版本:

  • windows 10.0

  • python 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函数的处理逻辑,是通过魔法函数实现比较,还是其他的方式,对此翻了下官方说明。

Python数字比较与类结构

看了后好像也不能理解具体用的啥,本人愚钝,没有去看c源码,尝试直接将几个类实例传入到max中,可以看到打印出多个gt,可以大概猜测实现逻辑,通过遍历传入的值,逐个比较,如max是多次使用>,调用__gt__魔法方法。

Python数字比较与类结构

不难看出,每次都会比较判断,返回布尔值,通过比较结果来选取哪一个值与下一个值进行比较,回到问题上,如果有多个值需要比较,且部分跟比较的值有相同的value不参与比较,仍然可以返回出对应的值,只要将需要比较的值传入到max中,当然如果有value相同的值进行比较,不会将两个值同时返回。使用类来解决,整个结构上更为优雅,整个的工作流程也很顺畅。

来源:https://juejin.cn/post/7122713797717917704

标签:Python,数字,比较,类结构
0
投稿

猜你喜欢

  • asp之自动闭合HTML/ubb标签函数+简单注释

    2008-09-29 12:21:00
  • Python判断一个三位数是否为水仙花数的示例

    2021-11-06 06:14:13
  • Python语音合成之第三方库gTTs/pyttsx3/speech横评(内附使用方法)

    2022-03-23 08:31:22
  • 如何利用Fabric自动化你的任务

    2023-02-25 12:37:04
  • Bootstrap4如何定制自己的颜色和风格

    2024-05-13 09:19:09
  • 一些 T-SQL 技巧

    2024-01-26 00:21:16
  • python实现简易名片管理系统

    2022-12-23 13:14:53
  • Python Django框架模板渲染功能示例

    2023-03-12 17:39:03
  • Python datatime库语法使用详解

    2022-01-30 03:16:17
  • python定时器使用示例分享

    2023-04-06 15:03:57
  • JavaScript中你不知道的Object.entries用法

    2024-04-19 11:01:40
  • python PIL模块的基本使用

    2022-08-28 16:35:19
  • IE与Firefox的CSS兼容大全

    2008-01-31 15:36:00
  • setTimeout与setInterval的区别浅析

    2024-04-22 13:25:25
  • 理解MySQL查询优化处理过程

    2024-01-21 18:30:46
  • MySQL 行转列详情

    2024-01-22 18:19:58
  • PHP实现的注册,登录及查询用户资料功能API接口示例

    2024-04-30 08:50:18
  • 深入解析JavaScript的闭包机制

    2024-04-18 10:32:45
  • python argparse传入布尔参数false不生效的解决

    2023-07-03 16:12:20
  • 破解空间实现域名绑定到子目录方法

    2010-03-14 11:29:00
  • asp之家 网络编程 m.aspxhome.com