2016-01-17 15 views
5

Qual è il modo migliore di scrivere una funzione di vincolo? o c'è già una funzione python integrata che fa questo?un modo pietonico per scrivere una funzione constrain()

Opzione 1:

def constrain(val, min_val, max_val): 

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

Opzione 2:

def constrain(val, min_val, max_val): 

    if val < min_val: 
     val = min_val 

    elif val > max_val: 
     val = max_val 

    return val 

risposta

10

Non so se questo è il più "divinatorio", ma è possibile utilizzare built-in min() e max() come questo:

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

prega, spiegare downvote. – Delgan

5

Nel caso in cui sia necessario eseguire questa operazione per molti numeri (array completi di essi), è probabile che si stia utilizzando Numpy, che ha una funzione integrata clip. Per semplici programmi Python, vai su Delgan answer.

+0

"Per semplici programmi Python, vai con la risposta di Delgan." - Perché non usare 'clip()' sempre? –

+2

@Fermiparadox perché in genere non si desidera avere l'enorme libreria Numpy come dipendenza per uno script semplice, non fa parte della libreria standard. Anche il tipo di ritorno sarà uno scalare di Numpy, che normalmente dovrebbe funzionare come previsto, ma questo potrebbe non essere quello che vuoi quando lavori con decimali o frazioni di Python. –

0

Se è possibile elaborare una serie di valori in un momento, si potrebbe provare una lista di comprensione:

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] 

o anche 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 è arrivato prima! – uhoh

Problemi correlati