Попробуйте что-то вроде этого, если вам не нравятся циклы:
def classify(value):
endpts = [-0.95, -0.85, -0.75, -0.65, -0.55, -0.45, -0.35, -0.25, -0.15, -0.05, 0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95]
ts_folder = [ r'\-0.9', r'\-0.8', r'\-0.7', r'\-0.6', r'\-0.5', r'\-0.4', r'\-0.3', r'\-0.2', r'\-0.1', r'\0.0', r'\0.1', r'\0.2', r'\0.3', r'\0.4', r'\0.5', r'\0.6', r'\0.7', r'\0.8', r'\0.9']
idx = [value >= end for end in endpts].index(False)
if not idx:
raise ValueError('Value outside of range')
return ts_folder[idx-1]
Конечно, цикл просто "скрыт" в понимании списка.Очевидно, что в этом примере было бы лучше генерировать endpts
и ts_fol
программно, а не записывать их все, но вы указали, что в реальной ситуации конечные точки и значения не так просты.
Это поднимает ValueError
, если value
≥ 0,95 (потому что False
не найдено в понимании списка) или если value
<-0,95 (потому что тогда <code>idx равно 0);в этих случаях исходная версия вызывает UnboundLocalError
.
Вы также можете сохранить три строки и пропустить несколько сравнений, выполнив следующее:
def classify(value):
endpts = [-0.95, -0.85, -0.75, -0.65, -0.55, -0.45, -0.35, -0.25, -0.15, -0.05, 0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95]
ts_fol = [ None, r'\-0.9', r'\-0.8', r'\-0.7', r'\-0.6', r'\-0.5', r'\-0.4', r'\-0.3', r'\-0.2', r'\-0.1', r'\0.0', r'\0.1', r'\0.2', r'\0.3', r'\0.4', r'\0.5', r'\0.6', r'\0.7', r'\0.8', r'\0.9']
return next((ts for ts, end in zip(ts_fol, endpts) if value < end), None)
Эта версия возвращает None
вместоповышение исключений для любого значения за пределами.