Probleme beim arbeiten mit Variablen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Virtex
User
Beiträge: 9
Registriert: Freitag 24. Februar 2017, 23:06

Hallo zusammen,

nachdem ich nun vieles gelesen hab und noch immer nicht viel klüger geworden bin hätte ich da mal ein paar Fragen zur Verwertung von Variablen in Python.

ich habe hier ein kleines Skript, das im ersten Step den Mittelwert aus 4 Zahlen berechnen soll. Weitergehend soll dieser dann verglichen werden mit Standardwerten und in Abhängigkeit von Uhrzeiten und Datenbankwerten andere Skripte ausführen.

Die 4 Zahlen werden von Sensoren ausgelesen. Das funktioniert auch soweit schon einmal. Allerdings lassen sich die Werte nicht zusammenrechnen geschweige denn dividieren.

Code: Alles auswählen

humidity1, temperature1 = Adafruit_DHT.read_retry(sensor, gpioS1)
humidity2, temperature2 = Adafruit_DHT.read_retry(sensor, gpioS2)
humidity3, temperature3 = Adafruit_DHT.read_retry(sensor, gpioS3)
humidity4, temperature4 = Adafruit_DHT.read_retry(sensor, gpioS4)

print ("Feuchtigkeit:")
print ("Sensor 1: " + str(humidity1))
print ("Sensor 2: " + str(humidity2))
print ("Sensor 3: " + str(humidity3))
print ("Sensor 4: " + str(humidity4))
print ("Temperatur:")
print ("Sensor 1: " + str(temperature1))
print ("Sensor 2: " + str(temperature2))
print ("Sensor 3: " + str(temperature3))
print ("Sensor 4: " + str(temperature4))

#Mittelwert berechnen:
Hum-werte = humidity1, humidity2, humidity3, humidity4
Hum-mid = sum(Hum-werte) / len(Hum-werte)
Die Ausgabe der Werte funktioniert nachdem ich diese in einen String umgewandelt habe. Anders funktionierte das auch schon nicht.
Das es bei der Berechnung auf Datentypen ankommt ist ja schon irgendwie logisch, warum das bei einer Ausgabe im Terminal ein Rolle spielt ist mir noch nicht so ganz klar. Die Tuts die ich bislang durchgegangen bin haben mir diese Logik auch noch nicht erklären können.

Für ein paar Tips im richtigen Umgang mit Variablen wäre ich sehr dankbar.

Gruß

Virtex
Zuletzt geändert von Anonymous am Sonntag 5. März 2017, 16:23, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn du nicht über die unschöne Konvertierung mittels str() gehen willst, dann hilft String-Formatting oder ganz einfach (bei Python 3):

Code: Alles auswählen

print('Sensor 1:', humidity1)
Übrigens kennt Python Listen. Wenn du deinen Code dementsprechend strukturierst, dann kannst du auch so etwas machen:

Code: Alles auswählen

for number, humidity enumerate(humidities, 1):
    print('Sensor {}: {}'.format(number, humidity))
BlackJack

@Virtex: Bei der Ausgabe im Terminal spielt der Datentyp eine Rolle weil das nur Bytes empfangen kann. Allerdings hast Du beim gezeigten Code ohne das `str()` ja gar kein Problem mit der Ausgabe im Terminal und `print()` wandelt auch von sich aus schon alle Argumente in Zeichenketten um. Bis zur Ausgabe kommt der Code aber gar nicht. Ohne den `str()`-Aufruf ist da ja erst einmal die Addition einer Zeichenkette und einer Zahl und *das* geht aufgrund der Typen nicht. Man kann Zeichenketten zu Zeichenketten ”addieren” und Zahlen zu Zahlen, aber eben nicht gemischt:

Code: Alles auswählen

In [6]: 'a ' + 42
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-74f7c918b8db> in <module>()
----> 1 'a ' + 42

TypeError: cannot concatenate 'str' and 'int' objects

In [7]: 42 + ' b'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-e9229687d464> in <module>()
----> 1 42 + ' b'

TypeError: unsupported operand type(s) for +: 'int' and 'str'

In [8]: 'a ' + 'b'
Out[8]: 'a b'

In [9]: 'a ' + str(42)
Out[9]: 'a 42'

In [10]: 'a {}'.format(42)
Out[10]: 'a 42'
Zahlen sollten sich aber zusammen rechnen und teilen lassen. Da verrätst Du ja jetzt leider nicht wie Du das versuchst (der Code ist syntaktisch falsch) und was dann passiert, das Dich annehmen lässt das ginge nicht.
Virtex
User
Beiträge: 9
Registriert: Freitag 24. Februar 2017, 23:06

Danke ihr beiden für die Tipps.

Leider komm ich da immernoch nicht so ganz mit. Ich benutze derzeit Python 2.7.9.. Weiß leider auch nicht ob ich das problemlos updaten kann, da viele andere Skripte bereits fertig sind.

Wenn ich da mit print versucht habe das auszugeben was ich derzeit mit der umwandlung in str() ausgebe kam immer
TypeError: cannot concatenate 'str' and 'float' objects
Von daher bin ich dazu übergegangen das erstmal in einen String zu packen. Die Ausgabe über Print kommt nachher sowieso wieder weg. Das dient eher so als kleine Kontrolle der Variablen. Ähnlich wie die MGSBOX bei VB, nur das ich da nie umwandeln musste und VB einfach das gemacht hat was ich wollte. Nun gut. Seis drum. Jetzt ist Python angesagt und da ist es scheinbar anders. :)

@snafu
Ohne die Konvertierung in str() gefällt mir besser. Hatte vieles versucht aber kein Komma. DANKE!!

@ Blackjack
ich versuche die Berechnung wie folgt:

Code: Alles auswählen

#Mittelwert berechnen:
Hum-werte = (humidity1, humidity2, humidity3, humidity4)
Hum-mid = sum(Hum-werte) / len(Hum-werte)
print ("Mittelwert Humi: " + str(Hum-mid))
Wenn ich das so schreibe kommt allerdings nur die Meldung
_f1.py", line 29
Hum-werte = (humidity1, humidity2, humidity3, humidity4)
SyntaxError: can't assign to operator
Dabei hab ich schon versucht die Werte mit float(humidity1) zu definieren, hab einfache und doppelte Anführungszeichen gesetzt und mit Klammern diverses versucht. Der Sinn dahinter ist, dass ich alle Werte zusammenrechne und dann durch die Anzahl der Werte teile.

Am Ende hab ich dann also eine Variable mit dem Mittelwert der dann weiter verarbeitet wird.

Hast du dazu evtl ne kleine Idee?
Zu berechnende Werte sind wie folgt aufgebaut: (Datentyp float)
Feuchtigkeit:
Sensor 1: 34.2000007629
Sensor 2: 35.7999992371
Sensor 3: 37.5
Sensor 4: 33.5999984741
Temperatur:
Sensor 1: 22.7000007629
Sensor 2: 22.2000007629
Sensor 3: 22.2000007629
Sensor 4: 22.1000003815
Gruß

Virtex
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Virtex: die Fehlermeldung sagt, dass man keinen Wert einer Operation (hier eine Differenz) zuweisen kann: Hum - werte. Variablennamen dürfen nur aus Buchstaben, Zahlen und _ bestehen (das ist bei VB auch nicht anders).
Virtex
User
Beiträge: 9
Registriert: Freitag 24. Februar 2017, 23:06

Und wieder einmal hast du recht Sirius. Vielen Dank.
Hab ich nicht drauf geachtet und auch nicht gesehen. Danke!!
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Virtex hat geschrieben:Ähnlich wie die MGSBOX bei VB, nur das ich da nie umwandeln musste und VB einfach das gemacht hat was ich wollte. Nun gut. Seis drum. Jetzt ist Python angesagt und da ist es scheinbar anders. :)
Bei einem + würde auch VB meckern, wenn man einen String mit einem Nicht-String verbinden möchte. AFAIK kann man dort aber ein & verwenden, um beim Vorhandensein von mindestens einem String beide Operanden als Strings interpretieren zu lassen. Vermutlich meintest du das...?
BlackJack

@Virtex: Wieso der `TypeError` kommt, hatte ich ja bereits mit Beispiel gezeigt. Und zumindest bei VB.NET bekommt man bei folgendem auch einen Laufzeitfehler:
[codebox=vbnet file=Unbenannt.vb]Public Class Test
Public Shared Sub Main()
MsgBox("Antwort: " + 42)
End Sub
End Class[/code]
Allerdings einen der mich überrascht hat: Denn es ist nicht die 42 die Probleme bereitet, sondern es wird versucht "Antwort: " in eine Zahl zu wandeln. ``"23" + 42`` geht problemlos, da kommt 65 bei heraus. :shock:

In QBasic bekommt man bei
[codebox=qbasic file=Unbenannt.txt]PRINT "Antwort: "+42[/code]
einen „type mismatch“. Und auch vom C64-BASIC kenne ich das so:
[codebox=text file=Unbenannt.txt]?"A"+42

?TYPE MISMATCH ERROR
READY.[/code]
Ich verstehe also nicht was da bei Python jetzt so anders sein soll. Man versucht normalerweise auch nicht die Grundlagen von Programmiersprachen zu raten, sondern liest in der Dokumentation nach wie Kontrollstrukturen und Befehle funktionieren.

Bei Python 2 solltest Du die Klammern bei der ``print``-Anweisung weg lassen, denn die sind entweder überflüssig, oder haben eine andere Bedeutung als Du haben möchtest wenn Du nun Kommas benutzt. Denn dann machen die Klammern das zu *einem* Wert, nämlich einem Tupel. Oder Du importierst `print_function` aus dem `__future__`-Modul, dann ist `print()` auch in Python 2.7 eine Funktion wie in Python 3.
karolus
User
Beiträge: 141
Registriert: Samstag 22. August 2009, 22:34

Hallo

Star-Basic ist da extrem smart :oops:
Steht vor dem + ein Text wird verkettet auch wenn dahinter eine Zahl steht.
Steht vor dem+ eine Zahl wird addiert, (wenn der Text dahinter nicht als Zahl interpretiert werden kann wird einfach 0 addiert )
Antworten