[英]Alternatives of repeatedly using elif statements
我試圖根據他們在 python 上得到的結果返回“學生”的成績。 我使用了一堆 elif 語句,但我覺得這不是有效的。 我想知道是否還有其他方法可以將其呈現為? 可能更小。 我嘗試使用 for 循環和字典,但我沒有得到它,也許是因為我不太了解字典,loll
def grade_select(grade):
if grade < 40: return "D-"
elif grade <= 40 and grade < 45: return "D"
elif grade <= 45 and grade < 50: return "D+"
elif grade <= 50 and grade < 55: return "C-"
elif grade <= 55 and grade < 60: return "C"
elif grade <= 60 and grade < 65: return "C+"
elif grade <= 65 and grade < 70: return "B-"
elif grade <= 70 and grade < 75: return "B"
elif grade <= 75 and grade < 80: return "B+"
elif grade <= 80 and grade < 85: return "A-"
elif grade <= 85 and grade < 90: return "A"
elif grade >= 90: return "A+"
由於您在條件匹配時返回,因此您不需要使用elif
just if
。
此外,前面的條件消除了檢查值是否為“介於”之間的需要。
def grade_select(grade):
if grade < 40: return "D-"
if grade < 45: return "D"
if grade < 50: return "D+"
if grade < 55: return "C-"
if grade < 60: return "C"
if grade < 65: return "C+"
if grade < 70: return "B-"
if grade < 75: return "B"
if grade < 80: return "B+"
if grade < 85: return "A-"
if grade < 90: return "A"
return "A+"
另一種方法是聲明一個字典並計算等級適合的位置。
grades = { 40: "D-", 45: "D", 50: "D+", 55: "C-", 60: "C", 65: "C+", 70: "B-", 75: "B", 80: "B+", 85: "A-", 90: "A", 100: "A+" }
def grade_select(grade):
grade = (grade // 5 * 5) + 5
if grade < 40:
grade = 40
elif grade > 90:
grade = 100
return grades[grade]
您可以使用字典來存儲范圍,它是根據等級值:
def grade_select(grade):
dct = {
range(0, 40): "D-",
range(40, 45): "D",
range(45, 50): "D+",
...
range(90, 100 + 1): "A+"
}
dct = {g: m for r, m in dct.items() for g in r}
return dct[grade]
嗯,你的情況有點奇怪,因為
elif grade <= 40 and grade < 50
沒有意義(如果等級<= 40,那么等級<50當然)
但我認為你想寫這樣的東西:
if 40 <= grade < 50:
pass
您可以使用上面的語法,它可以使它更好一點。 另外,您可以查看這篇文章
這是基於等級值計算索引的最快版本。 此方法僅適用於您的成績范圍均為五個寬的情況。
_lettergrades = ['D-', 'D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A', 'A+']
def grade_select(grade):
return _lettergrades[(max(min(grade, 90), 35) - 35) // 5]
如果您的范圍不是始終為五寬,您可以使用bisect.bisect_right
來獲取字母等級的索引。 搜索使用二分法,這應該比線性搜索更快。 (列表_thresholds
和_lettergrades
是全局的,以避免在每次調用grade_select()
時重新創建它們。)
from bisect import bisect_right
_thresholds = [40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90]
_lettergrades = ['D-', 'D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A', 'A+']
def grade_select(grade):
return _lettergrades[bisect_right(_thresholds, grade)]
注意:我懷疑這里的速度和清晰度一樣重要。 為了清楚起見,我最喜歡 Paulo Pereira 的回答。
我想使用字典是最好的方法
def grade_select(grade):
d = {
'D-':range(0,40),
'D':range(45,50),
'D+':range(50,55),
'C-':range(55,60) #, etc.
}
return [k for k,v in d.items() if grade in v]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.