Abfrage Variable

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
mariomueller
User
Beiträge: 11
Registriert: Montag 25. Februar 2019, 14:51

Hallo zusammen,

ich total neu in Python und würde mich daher freuen, wenn ich eine Antwort bekäme.
Ich frage einen Sensor ab und es werden Werte ausgegeben.

Das Programm habe ich kopiert und verstehe daher die folgende Zeile nicht:

Code: Alles auswählen

print('{0:>4}'.format(*values))
Die Werte die ausgegeben werden, varieren zwischen 0 und 500.
Es könnte sich sowohl um einen String als auch ein Int handeln. Das weiß ich aber nicht.
Ich würde den Wert, der aktuell noch auf der Console ausgegeben wird, mit einer if-abfrage prüfen.

Ich hatte daher folgendes eingebaut

Code: Alles auswählen

 if ('{0:>4}'.format(*values)) > 100: 
    print("Wert is greater than 100")
Es wird aber nie "Wert is greater than 100" ausgegeben, auch wenn der Wert größer 100 ist.
Kann es sein, dass ich auf einen String abfrage? Wenn ja, wie erhalte ich aus ('{0:>4}'.format(*values)) einen Int Wert?

Danke, Viele Grüße
Mario
Benutzeravatar
sparrow
User
Beiträge: 4536
Registriert: Freitag 17. April 2009, 10:28

Du prüfst ob das Ergebnis von '{0:>4}'.format(*values)) größer als 100 ist. Aber das Ergebnis ist sicherlich keine Zahl.
Hellsehen können wir nicht, deshalb wissen wir nicht, wie die Zeichenkette hinterher aussieht. Aber welcher Wert steckt denn in values? Vielleicht muss man da gar keinen Zeichenkette umwandeln.
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@mariomueller: Du scheinst Python2 zu verwenden, sonst würde schon der Vergleich zwischen einem String und einer Zahl fehlschlagen. Was willst Du denn mit dem `format` erreichen? Und was ist `values`?
Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Den * finde ich da auch sehr, äh, exotisch. Das sollte man vielleicht normaler schreiben das `values` genau einen Wert enthält und man gerne auf genau diesen einen Wert zugreifen möchte. Das ist so wie es da steht nicht der offensichtliche und damit bevorzugte Weg das zu beschreiben.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
Perlchamp
User
Beiträge: 178
Registriert: Samstag 15. April 2017, 17:58

@mariomueller:

Code: Alles auswählen

print('{0:>4}'.format(*values))
{0:>4} = Platzhalter ({}) für eine Formatierung (:), die besagt, dass für die (ermittelten) Werte 'values' (zeilenweise) rechtsbündig (>) 4 Stellen (4) zur Verfügung gestellt werden.

mit 'type(values)' kannst du den Typ (str, int, float, etc.) von 'values' ermitteln.
Irgendwas ist immer !
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Perlchamp: ``type(values)`` wird so etwas wie `tuple` oder `list` ergeben. Alles was nicht iterierbar ist würde einen `TypeError` auslösen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
Perlchamp
User
Beiträge: 178
Registriert: Samstag 15. April 2017, 17:58

@ _blackjack_:
ja, oder ein dict oder string ....

Code: Alles auswählen

>>> for i in "buchstaben":
	type(i)

<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
EDIT:
@_blackjack_:
du hast aber wahrscheinlich (wieder) Recht, sonst würde (aus meiner Sicht und Wissensstand) '*values' keinen Sinn machen.
Frage: gibt *values immer eine Liste raus ?

Code: Alles auswählen

>>> f, *e = [1, 2, 3, 4]
>>> f
1
>>> e
[2, 3, 4]
>>> a, *values = (1, 2, 3, 4, 5)
>>> a
1
>>> values
[2, 3, 4, 5]
>>> 
Irgendwas ist immer !
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Perlchamp: Du testest da etwas anderes als den Funktionsaufruf:

Code: Alles auswählen

In [193]: def f(*args): print(type(args), args)

In [194]: f(*[42, 23])
<class 'tuple'> (42, 23)
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
Perlchamp
User
Beiträge: 178
Registriert: Samstag 15. April 2017, 17:58

wie macht hier '*values' eigentlich Sinn, was macht es (alle Items 'auswerfen') ?
Irgendwas ist immer !
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Perlchamp: Bei dem `format()` macht es keinen Sinn. Ausser in einem Fall: Man hat tatsächlich nur ein iterierbares Objekt das keine Sequenz ist. Aber selbst das würde ich nicht so schreiben, sondern die `next()`-Funktion verwenden, denn dann versteht man wesentlich leichter was dort passiert und warum.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@Perlchamp: was *values bei format macht, ist nichts anderes, was es immer macht, ein iterierbares Objekt als Positionsargumente an die Funktion zu übergeben.
Kannst Du selbst leicht ausprobieren, und es ist nicht "alle Items 'auswerfen'".
Es ist ein bißchen Geschmacksache, welche Variante man lieber schreibt:

Code: Alles auswählen

length = (17, 'cm')
print("Das Brett ist {} {} lang".format(*length))
print("Das Brett ist {} {} lang".format(length[0], length[1]))
print("Das Brett ist {0[0]} {0[1]} lang".format(length))
Benutzeravatar
Perlchamp
User
Beiträge: 178
Registriert: Samstag 15. April 2017, 17:58

@ _blckjack_:
Auf next() wäre ich jetzt nicht gekommen ... next() aber sagt mir 'dunkel' etwas. Ganz spontan fallen mir da jetzt Generatoren oder Generatorfunktionen und iter() [hat ja mit Iteration etwas zu tun ...] ein. Muß ich auch nochmal ein Tut drüber lesen, danke dir !

EDIT:
@Sirius3:
danke, Code-Beispiele sind für mich (noch) immer am besten zu verstehen, super. Danke dir !
Irgendwas ist immer !
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
mariomueller
User
Beiträge: 11
Registriert: Montag 25. Februar 2019, 14:51

Hallo zusammen,

das urpsüngliche Coding ist von Adafruit. Ich habe einen MCP3008 verbaut, um analog Signale einzulesen/abzufragen.

Hier ist das Originalcoding, bei dem "quasi parallel" 8 Eingänge gelesen werden.
Für mich stellt sich die Frage, wie ich den einen Wert, der aktuell nur auf der console ausgegeben wird, mit einer if-Abfrage abfragen kann
Danke, Viele Grüße
Mario

Code: Alles auswählen

  GNU nano 2.7.4                                                                                             Datei: simpletestmm04.py                                                                                                         

# Simple example of reading the MCP3008 analog input channels and printing
# them all out.
# Author: Tony DiCola
# License: Public Domain
import time

# Import SPI library (for hardware SPI) and MCP3008 library.
import Adafruit_GPIO.SPI as SPI
import Adafruit_MCP3008


# Software SPI configuration:
CLK  = 18
MISO = 23
MOSI = 24
CS   = 25
mcp = Adafruit_MCP3008.MCP3008(clk=CLK, cs=CS, miso=MISO, mosi=MOSI)

# Hardware SPI configuration:
# SPI_PORT   = 0
# SPI_DEVICE = 0
# mcp = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE))


print('Reading MCP3008 values, press Ctrl-C to quit...')
# Print nice channel column headers.
#print('| {0:>4} | {1:>4} | {2:>4} | {3:>4} | {4:>4} | {5:>4} | {6:>4} | {7:>4} |'.format(*range(8)))
#print('-' * 57)
# Main program loop.
while True:
    # Read all the ADC channel values in a list.
    values = [0]*8
    for i in range(1):
        # The read_adc function will get the value of the specified channel (0-7).
        values[i] = mcp.read_adc(i)
    # Print the ADC values.
    print('{0:>4}'.format(*values))
    if ('{0:>4}'.format(*values)) > 100: 
    print("Wert is greater than 100")


    # Pause for half a second.
    time.sleep(0.2)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Code: Alles auswählen

if values[0] > 123404320394:
      # ... tu was
Wobei du wenn du eh nur einen Wert haben willst auch keine Liste anlegen musst. Sondern einfach direkt

Code: Alles auswählen

relative_mondfeuchte = mcp.read_adc(0)
if relative_mondfeuchte > 23:
       print("wir werden alle sterben!")
machen kannst, und dir alles was values erwaehnt halt sparst.
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@mariomueller: erst eine Liste mit 0-en zu erzeugen um sie danach mit Werten zu füllen, ist so ziemlich das letzte, was man mit Python macht. Üblich wäre eine List-Comprehension:

Code: Alles auswählen

values = [mcp.read_adc(i) for i in range(8)]
Aber wenn Du ja sowieso nur einen Wert brauchst, gilt das, was __deets__ schrieb.
mariomueller
User
Beiträge: 11
Registriert: Montag 25. Februar 2019, 14:51

@Sirius: Vielen Dank.

Das ist nicht nur das letzte, was man in Python macht; das gilt generell für alle Programmiersprachen :-)
Wie ich geschrieben habe, muss ich erst mal die Syntax verstehen. Die Logik kann ich dann noch anpassen, wenn ich es verstanden habe.

:-)
Grüße
Mario
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Das stimmt nicht, in allen Programmiersprachen mit statischen Array-Typen (also BASIC, C, C++, Java, etc.) erzeugt man ein Array mit 8 Einträgen und bei allen einigermaßen "sicheren" Sprachen wird solch ein Array automatisch mit 0 initialisiert.
mariomueller
User
Beiträge: 11
Registriert: Montag 25. Februar 2019, 14:51

OK, danke, war mir neu
Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei einem Java- und C++-Programmierer an der Stelle von einem Array vielleicht abraten würden, beziehungsweise bei C++ es schon wieder geht seit dem es die `Array`-Klasse gibt. :-)
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten