Я собираюсь записать этот псевдокод в Python:

if (i < .1):
   doX()
elif (i < .3):
   doY()
elif (i < .5):
    doZ()
.
.
else:
    doW()

Диапазон чисел может быть 20, и каждое число с плавающей запятой, которое формирует ограничения, считывается из списка. Для приведенного выше примера (более короткая версия) это список:

[0.1, 0.3, 0.5, 1]

Есть ли какой-нибудь питонический способ или функция, которая может выполнять разные функции для разных связанных диапазонов?

0
Hadij 22 Фев 2018 в 23:57

4 ответа

Лучший ответ
from bisect import *
a=[0.1, 0.3, 0.5, 1]
b=["a","b","c","d"]
print b[bisect_left(a,0.2)]
3
Ohad Rubin 23 Фев 2018 в 12:11

Вот ответ, который вы не должны использовать:

doX = lambda x: x + 1
doY = lambda x: x + 10
doZ = lambda x: x + 100
ranges    = [0.1, 0.3, 0.5, 1]
functions = [doX, doY, doZ]
answer = lambda x: [func(x) for (low, high), func in zip(zip(ranges[:-1],ranges[1:]), function) if low <= x < high][0]

Дело в том, что привыкнуть к нему становится нечитаемым. If..elif..else - это "один - и предпочтительно только один - очевидный способ сделать это." .

1
VoNWooDSoN 22 Фев 2018 в 21:17

Я предлагаю вам создать следующий словарь с числами в качестве ключей и функциями в качестве значений:

d = {0.1:doX, 0.3:doY, 0.5:doZ, 1:doW}

Затем используйте следующий код:

for n,(k,f) in enumerate(sorted(d.items())):
    if (i < k) or (n == (len(d) - 1)):
        f()
        break
1
Laurent H. 22 Фев 2018 в 21:23
def a():
    print('a returned')

def b():
    print('b returned')

def c():
    print('c returned')

funcs = [a, b, c]

def sample_func(x, funcs=None):
    if x < 0:
        return None    
    thresholds = [.40, .60]

    for i, threshold in enumerate(thresholds):
        if x <= threshold:
            return funcs[i]()
    return funcs[len(thresholds)]()

sample_func(.1, funcs)

Возвращает

a returned

sample_func(.65, funcs)

Возвращает

c returned
1
ivan7707 22 Фев 2018 в 21:21