2016-01-17 12 views
5

Wie schreibt man am besten eine Constrain-Funktion? oder gibt es bereits eine eingebaute Python-Funktion, die das tut?eine pythonische Art, eine constrain() -Funktion zu schreiben

Option 1:

def constrain(val, min_val, max_val): 

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

Option 2:

def constrain(val, min_val, max_val): 

    if val < min_val: 
     val = min_val 

    elif val > max_val: 
     val = max_val 

    return val 

Antwort

10

Ich weiß nicht, ob dies das mehr "pythonic" ist, aber Sie können eingebaute in min() verwenden und max() wie folgt:

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

Bitte, downvote erklären. – Delgan

5

Wenn Sie dies für eine große Anzahl von Zahlen (Arrays voll von ihnen) tun müssen, sollten Sie wahrscheinlich Numpy verwenden, die eine eingebaute Funktion hat. Für einfache Python-Programme gehen Sie mit Delgans answer.

+0

"Für einfache Python-Programme gehen Sie mit Delgans Antwort." - Warum nicht 'clip()' immer verwenden? –

+2

@Fermiparadox Da Sie die riesige Numpy-Bibliothek normalerweise nicht als Abhängigkeit für ein einfaches Skript verwenden möchten, ist sie nicht Teil der Standardbibliothek. Auch der Rückgabetyp wird ein Numpy-Skalar sein, der normalerweise wie erwartet funktionieren sollte, aber dies ist möglicherweise nicht das, was Sie wollen, wenn Sie mit Python-Dezimalzahlen oder Brüchen arbeiten. –

0

Wenn Sie eine Reihe von Werten zu einer Zeit verarbeiten kann, können Sie eine Liste Verständnis versuchen:

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] 

oder sogar 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 kam zuerst! – uhoh

Verwandte Themen