2016-01-17 13 views
5

Jaki jest najlepszy sposób napisania funkcji ograniczenia? lub czy istnieje już wbudowana funkcja python, która to robi?Pythonowy sposób zapisu funkcji constrain()

Wariant 1:

def constrain(val, min_val, max_val): 

    if val < min_val: return min_val 
    if val > max_val: return max_val 
    return val 

Opcja 2:

def constrain(val, min_val, max_val): 

    if val < min_val: 
     val = min_val 

    elif val > max_val: 
     val = max_val 

    return val 

Odpowiedz

10

Nie wiem, czy jest to bardziej "pythonic", ale można użyć wbudowanej min() i max() podobnie jak:

def constrain(val, min_val, max_val): 
    return min(max_val, max(min_val, val)) 
+0

Proszę wyjaśnić downvote. – Delgan

5

W przypadku, gdy musisz zrobić to dla wielu liczb (tablice pełne), prawdopodobnie powinieneś używać Numpy, która ma wbudowaną funkcję clip. Aby uzyskać proste programy w języku Python, należy skorzystać z wersji answer firmy Delgan.

+0

"Aby uzyskać proste programy w języku Python, przejdź do odpowiedzi Delgana." - Dlaczego nie używać 'clip()' zawsze? –

+2

@Fermiparadox, ponieważ zazwyczaj nie chcesz mieć ogromnej biblioteki Numpy jako zależności dla prostego skryptu, nie jest ona częścią standardowej biblioteki. Również typem zwrotnym będzie skalar Numpy, który normalnie powinien działać zgodnie z oczekiwaniami, ale może nie być to, co chcesz, podczas pracy z ułamkami dziesiętnymi w języku Python. –

0

Jeśli można przetwarzać kilka wartości naraz, możesz spróbować listowych:

a = [1,1,5,1,1] 
b = [7,2,8,5,3] 
c = [3,3,3,3,3] 
[min(y,max(x,z)) for x,y,z in zip(a, b, c)] 

[3, 2, 5, 3, 3] 

lub nawet NumPy:

import numpy as np 

a = np.array(a) 
b = np.array(b) 
c = np.array(c) 

np.minimum(b, np.maximum(a, c)) 
np.minimum(b, np.maximum(a, 3)) # just use 3 if they are all the same 

c.clip(a, b) # or just use NumPy's clip method 
np.clip(c, a, b) 

array([3, 2, 5, 3, 3]) 
array([3, 2, 5, 3, 3]) 
array([3, 2, 5, 3, 3]) 
array([3, 2, 5, 3, 3]) 
+0

Oh @ BasSwinckels dostałem się tam pierwszy! – uhoh

Powiązane problemy