成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不使用If-Elif 語句,如何優雅地判斷某個數字所屬的等級?

開發 前端
偶然看到了 stackoverflow 上的一個問題,還挺有啟發,故分享一下。題目大意是:有從 A 到 F 的 5 個等級,現要判斷某個數值(從 0 到 1 之間)所屬的等級。舉例,如數值 >= 0.9,則屬于 A;若數值 >= 0.8,則屬于 B;以此類推。

 偶然看到了 stackoverflow 上的一個問題,還挺有啟發,故分享一下。

 

題目大意是:有從 A 到 F 的 5 個等級,現要判斷某個數值(從 0 到 1 之間)所屬的等級。舉例,如數值 >= 0.9,則屬于 A;若數值 >= 0.8,則屬于 B;以此類推。

若使用 if-elif 語句,可能寫成這樣:

 

  1. if scr >= 0.9: 
  2.     print('A'
  3. elif scr >= 0.8: 
  4.     print('B'
  5. elif scr >= 0.7: 
  6.     print('C'
  7. elif scr >= 0.6: 
  8.     print('D'
  9. else
  10.     print('F'

此寫法出現了很多重復的模式,不夠簡潔優雅。有什么更好的寫法,來實現這個目的呢?

該問題下的回答挺多的,實現思路五花八門。我挑幾個可讀性比較好:

方法一:使用bisect模塊(數字可調)

 

方法二:使用 zip() 與 next()

 

方法三:使用字典(僅適用于 Python 3.6 以上的有序字典)

 

還有其它幾個回答,雖然都能實現數字分級的目的,但是其可讀性要差很多,因為它們要么需要你作計算和推理,要么就是引入了額外的變量。

感興趣的話,你可在這個地址查看全部答案:https://stackoverflow.com/questions/61030617/how-can-i-simplify-repetitive-if-elif-statements

縱觀全部答案后,我認為還是使用bisect的方法比較高效優雅,不愧是它獲得了很高的贊同票。

這里簡單分析下它的實現過程。

bisect是 Python 內置的標準庫,實現了二分查找算法。所謂二分查找,也被稱為“折半查找”(Binary Search),其基本思想是把有序排列的 n 個元素平均分成兩半,然后將待查找的 x 與中間元素比較,若 x 小于中間元素,則將左半段二分,再將 x 與其中間元素比對,以此類推。

這是一個簡單的圖示例子:

 

bisect庫中的 bisect() 方法,查找元素 x 在一個升序序列中的插入點 i,使得插入點左側的元素都小于等于 x,插入點右側的元素都大于 x。

對照前面的例子:

 

  1. from bisect import bisect  
  2.  
  3. def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'): 
  4.      i = bisect(breakpoints, score) 
  5.      return grades[i] 

可以化簡成兩部分:

  • bisect([60, 70, 80, 90], score),返回插入點的值。假如 score 是 59,計算得出插入點在 60 的左側,而 Python 列表的索引值是以 0 開始,所以返回插入點的值為 0;假如 score 是 60,計算得出插入點在 60 的右側,即返回索引值為 1。
  • 'FDCBA'[i],返回索引值為 i 的字符。假如 i 是 0,得到“F”;假如 i 是 3,得到“B”……

二分查找算法是效率較高的算法,時間復雜度為 O(logn)。該題目的查找范圍很小,所以時間效率差別不大。但是其寫法稱得上是 Pythonic,值得借鑒。

另外,再看看前面的方法三(使用字典),它的可讀性很強,即順次將 scr 與字典中的值比較(從高往低,即 0.9~0.5),以此得出對應的鍵值。(PS:它多分了一個“E”級,可去掉)

如果 Python 版本低于 3.6,則 grades.items() 會是無序的,將會破壞比較的順序。為了兼容性,可以修改成 sorted(grades.items()):

 

這種寫法沒有引入額外的庫,使用的 items() 與 sorted() 都是基礎知識(相比于方法二的 zip() 與 next()),簡單實用,也非常值得推薦。

不管怎么說,反復使用 if-elif 語句的判斷方式是挺笨拙的,必須改進。文中列出的都是目前比較受認可的回答。

如果有面試官把它作為面試題,我覺得會挺有意思:難度不大,有發揮空間。

責任編輯:華軒 來源: Python貓
相關推薦

2025-07-01 02:18:00

if-elif 鏈通配符代碼

2021-01-28 14:53:19

PHP編碼開發

2018-08-20 10:40:09

Redis位圖操作

2021-03-24 10:20:50

Fonts前端代碼

2022-05-24 06:07:48

JShack用戶代碼

2017-12-14 14:17:08

Windows使用技巧手冊

2022-10-12 15:15:56

數字孿生物聯網

2024-11-13 16:37:00

Java線程池

2023-03-28 08:07:12

2022-06-07 08:59:58

hookuseRequestReact 項目

2020-03-26 11:04:00

Linux命令光標

2021-01-18 13:17:04

鴻蒙HarmonyOSAPP

2021-05-12 22:07:43

并發編排任務

2022-05-13 21:20:23

組件庫樣式選擇器

2024-04-24 12:34:08

Spring事務編程

2020-07-09 10:15:55

空值Bug語言

2020-11-05 18:30:32

接口測試

2022-09-12 23:53:53

JavaScript條件判斷開發

2020-10-22 10:15:33

優化Windows電腦

2021-09-08 08:34:37

Go 文檔Goland
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www国产成人免费观看视频,深夜成人网 | 国产乱码精品一区二区三区五月婷 | 国产精品色一区二区三区 | 不卡一区二区在线观看 | 亚洲精选久久 | 国产精品久久午夜夜伦鲁鲁 | 五月婷婷色| 手机看片1 | 久久久一区二区三区四区 | 精久久 | 国产精品一二三区 | 一级大片免费 | 免费精品| 美女张开腿露出尿口 | 欧洲一级黄 | 免费在线观看黄色av | 久热久| 久久91精品国产一区二区三区 | 日韩在线中文字幕 | 91一区| 中文字幕亚洲一区二区三区 | 亚洲iv一区二区三区 | av电影手机在线看 | 国产激情一区二区三区 | 美女在线视频一区二区三区 | 亚洲综合久久网 | 日本一区二区不卡 | 久久久久91 | 一区二区影院 | 不卡的av在线| 福利影院在线看 | 丁香久久| 国产伊人精品 | 久色视频在线观看 | 国产日韩欧美一区 | 欧美一a一片一级一片 | 国产精品美女久久久久aⅴ国产馆 | 国产一区二区三区在线 | 99精品视频免费观看 | 亚洲综合一区二区三区 | 操操操av|