Ich habe diese kleine Python-Datei, die ich in Python 2.7.9 geschrieben habe, und jetzt teste ich sie in Python 3.4.3.

Alles funktioniert, denn ich kann Befehle an mein RPI senden. Wenn ich jedoch den Befehl zum Ändern der Lautstärke des Lautsprechers (zwischen 1 und 100) sende, werden sie alle vom Python-Skript als 100% gelesen.

Beispiel:

Volume 26 wird als Volume 100 angesehen. Ich füge die Zeile mit volume = ... auskommentiert hinzu und es funktioniert jetzt, aber ich kann nicht verhindern, dass Leute das Volume auf maximal @ 100% spammen.

Code:

def setVolume(volume):
    volume = max(60, min(30, volume)) #Volume Spam Protection
    sendPost(speakerAddress+"volume","<volume>"+str(volume)+"</volume>")
0
TheAce 17 Aug. 2015 im 18:47

3 Antworten

Beste Antwort

Ich vermute, wenn Sie sagen, dass volume 26 als 100% angesehen wird, meinen Sie, dass es als 60 kommt.

Das liegt an der Linie -

max(60, min(30, volume))

Dies entspricht ungefähr einem Minimum zwischen 30 und dem Volumen und einem Maximum zwischen dem Volumen und 60, sodass Sie immer 60 erhalten würden, da Sie bei einem Volumen von mehr als 30 30 vom inneren min() und vom äußeren {erhalten würden {X1}} Sie würden 60 erhalten. Sie können sich vorstellen, was bei einem Volumen von weniger als 30 passieren würde.

Sie wollen eigentlich tun -

volume = min(60, max(30, volume))

Ich bin nicht sicher, wie dies in Python 2.7 funktioniert hätte. Unter den oben genannten Bedingungen hätte das Problem auch für Python 2.7 auftreten müssen.

4
Anand S Kumar 17 Aug. 2015 im 15:54

Ich denke, was Sie wirklich wollen, ist, dass Ihre Lautstärke im Bereich von 30 bis 60 liegt. In diesem Fall sollten Sie Ihre Min / Max-Leitung gegen folgende austauschen:

volume = min(60, max(30, volume))

Sie erhalten also das Maximum der Lautstärke und 30 - (mindestens 30) - und das Minimum dieses Ergebnisses und 60 - maximal 60.

1
Juergen 17 Aug. 2015 im 15:55

Viel lesbarer wäre es, min und max überhaupt nicht zu verwenden. Sie sind effizient, um die Extrema einer beliebigen Anzahl von Argumenten zu finden, aber nur für zwei übertrieben.

if volume < 30:
    volume = 30
elif volume > 60:
    volume = 60

(Dies hätte den Nebeneffekt, dass Logikfehler behoben werden, die sich aus der von Ihnen verwendeten verschachtelten Konstruktion ergeben.)

4
chepner 17 Aug. 2015 im 15:58