網(wǎng)站首頁 編程語言 正文
前言
版本:
- windows 10.0
- python 3.8
問題簡述
近期看到這么一個問題,有把值分別賦值給不同的變量,想在比較大小后得到變量的名稱。
a = 34
b = 55
c = 12
d = 55
max(a, b, c) # 期望得到'b'
在該例子中,有過使用python經(jīng)歷的讀者會知道,max處理后的結果只能返回b所指代的值,即55。而如何得到這個字符串'b'呢?
一個想法
想獲取變量名絕非難事,在全局中可以用globals()獲取,局部可以用locals(),在這里的難點可能在于,知道a,b,c三者之間的最大值是55,由于globals()會將所有的變量及對應的值返回,在遍歷匹配中可能會返回沒有參與大小比較的d變量,在實際使用上也不優(yōu)雅。
有一定經(jīng)驗的pythoner會選擇另辟蹊徑,獲取值比獲取變量更優(yōu)雅,也更容易,將當初想設置成的變量,轉換為值,與原值對應,比如字典的鍵值對,列表等。
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值應該為數(shù)字!'
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
定義一個類,并設置大小比較的魔法方法,等于,大于,大于等于,小于,小于等于。當值之間進行比較時,比如使用==,>, ...就會調(diào)用這些魔法方法。
在寫下這篇之前,沒有去探究max函數(shù)的處理邏輯,是通過魔法函數(shù)實現(xiàn)比較,還是其他的方式,對此翻了下官方說明。
看了后好像也不能理解具體用的啥,本人愚鈍,沒有去看c源碼,嘗試直接將幾個類實例傳入到max中,可以看到打印出多個gt,可以大概猜測實現(xiàn)邏輯,通過遍歷傳入的值,逐個比較,如max是多次使用>,調(diào)用__gt__魔法方法。
不難看出,每次都會比較判斷,返回布爾值,通過比較結果來選取哪一個值與下一個值進行比較,回到問題上,如果有多個值需要比較,且部分跟比較的值有相同的value不參與比較,仍然可以返回出對應的值,只要將需要比較的值傳入到max中,當然如果有value相同的值進行比較,不會將兩個值同時返回。使用類來解決,整個結構上更為優(yōu)雅,整個的工作流程也很順暢。
總結
近期的一些認識,為什么要返回變量名,使用變量名的目的是什么,能不能將變量名轉換到值上來,大多時候,定義一個變量也是為了能更好的使用其引用的值,而有時可能讓變量絆了自己的腳,則需要考慮變量與值的關系,以及結構。
原文鏈接:https://juejin.cn/post/7122713797717917704
相關推薦
- 2022-06-12 Android?Flutter利用貝塞爾曲線畫一個小海豚_Android
- 2022-04-12 C++中標準線程庫的基本使用介紹_C 語言
- 2023-01-28 Shell中的單中括號和雙中括號的用法詳解_Linux
- 2022-07-21 VScode設置自定義背景
- 2023-04-02 Python使用conda如何安裝requirement.txt的擴展包_python
- 2022-10-15 使用Pycharm創(chuàng)建一個Django項目的超詳細圖文教程_python
- 2022-04-27 C語言陷阱與缺陷之數(shù)組越界訪問詳解_C 語言
- 2022-09-04 python實現(xiàn)自動生成C++代碼的代碼生成器_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支