Gewusst wie anwenden von max & min-Grenzen auf einen Wert ohne Verwendung von bedingten Anweisungen
Problem:
Schreiben Sie eine Python-Funktion, clip(lo, x, hi) liefert, dass lo, wenn x ist weniger als lo; hi, wenn x größer ist als hi; und x sonst. Für dieses problem, können Sie davon ausgehen, dass lo < hi.
Verwenden Sie keine bedingten-Anweisungen für dieses problem. Verwenden Sie stattdessen die eingebaute Python-Funktionen min und max. Möchten Sie vielleicht Lesen Sie die Dokumentation auf min und die Dokumentation auf max, und spielen, um mit diesen Funktionen etwas in Ihr Dolmetscher, der vor Beginn dieses problem.
Diese Funktion nimmt drei zahlen und gibt eine einzelne Zahl.
Code:
def clip(lo, x, hi):
'''
Takes in three numbers and returns a value based on the value of x.
Returns:
- lo, when x < lo
- hi, when x > hi
- x, otherwise
'''
Meinen Code Hinzugefügt:
def clip(lo, x, hi):
'''
Takes in three numbers and returns a value based on the value of x.
Returns:
- lo, when x < lo
- hi, when x > hi
- x, otherwise
'''
if min(x, lo, hi) == x:
return lo
elif max(x, lo, hi) == x:
return hi
else:
return x
Hier ist das problem: ich kann nicht mit ALLE Bedingungen. Hilfe!!!
- Nest die Aufrufe von max-und min.
- Was bedeutet das?
- Es bedeutet, rufen Sie voneinander.
- ähnlich wie stackoverflow.com/q/4092528/174728
Du musst angemeldet sein, um einen Kommentar abzugeben.
So haben Sie eine Reihe von Optionen vorgeschlagen, so weit. Noch nicht gebucht ist die verschachtelte ternäre Ausdruck:
Aber da dies nutzt explizite bedingte tests, wahrscheinlich nicht geeignet, da eine Lösung zu der ursprünglichen Frage. Dennoch, angesichts dieser Optionen, dies ist die eine, die tatsächlich die Vorteile eines Kurzschlusses, wenn
x <= lo
(alle anderen Methoden bewerten, Vergleiche und/oder führen Sie eine oder zwei Methodenaufrufe). Mal sehen, wie diese alternativen tatsächlich ausführen, mit timeit (getestet mit Python 3.3, so dass ein Bereich nicht erstellen Sie eine Liste, aber gibt einen iterator):(2 Funktionsaufrufe pro Bewertung, tötet Leistung)
(wertet die tests aus und baut Tupel für jede Bewertung, aber zumindest keine Funktionsaufrufe)
(baut Tupel und sortiert - sorry, Gnibbler, dies ist die langsamste)
(Schnellste, keine Funktionsaufrufe, nur wertet
x >= hi
wennx > lo
)Dieser Kurzschluss gesehen werden kann, wenn Sie den Wert von lo auf, wesentlich höher als in den test-Bereich:
(Wenn Sie möchten, zu reproduzieren diese unter Python 2.x ersetzen Sie
range
mitxrange
.)L=range(100)
im setup, da Sie nicht geändert wird, esL=range(100)
im setup wäre ein problem, da ich mich in Python 3.3, in denenrange
gibt einen iterator, der verbraucht in der erste Testlauf, doch dann leer sein, für alle folgenden Testläufe. Es stellte sich heraus nicht der Fall zu sein, also anscheinend den setup-code genannt wird vor jedem test ausgeführt, nur nicht in der timing-Statistiken (oder ich hätte einfach setupL=list(range(100))
.)Hier ist eine Lösung, unter der Annahme, dass lo < hi.
Wie es funktioniert in jedem Fall:
min(hi, x)
zurückx
undmax(lo, x)
zurücklo
.min(hi, x)
zurückhi
und wenn lo < Hallo,max(lo, hi)
zurückhi
min(hi, x)
zurückx
undmax(lo, x)
zurückx
Ohne die gesamte Lösung - Sie brauchen nicht zu prüfen, "" nichts. Einen Wert begrenzt, um
lo
von unten ist, was Sie von ausgeführtmax(x, lo)
.Auch Wert abgeschnitten, um eine Grenze ist nicht betroffen durch clipping zu der anderen Grenze, so dass Sie können sicher ausführen, das Ergebnis einer Korrektur durch einen anderen.
Andere Lösung:
Lösung:
min? max? Was ist mit:
Wird dies den trick tun ohne bedingte Operatoren.
ist auch hier eine Lösung:
return min(max(x, lo), hi)