Seite 1 von 1

Abfrage Variable

Verfasst: Montag 25. Februar 2019, 15:08
von mariomueller
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

Re: Abfrage Variable

Verfasst: Montag 25. Februar 2019, 15:29
von sparrow
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.

Re: Abfrage Variable

Verfasst: Montag 25. Februar 2019, 16:24
von Sirius3
@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`?

Re: Abfrage Variable

Verfasst: Montag 25. Februar 2019, 17:55
von __blackjack__
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.

Re: Abfrage Variable

Verfasst: Montag 25. Februar 2019, 21:17
von Perlchamp
@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.

Re: Abfrage Variable

Verfasst: Montag 25. Februar 2019, 21:30
von __blackjack__
@Perlchamp: ``type(values)`` wird so etwas wie `tuple` oder `list` ergeben. Alles was nicht iterierbar ist würde einen `TypeError` auslösen.

Re: Abfrage Variable

Verfasst: Montag 25. Februar 2019, 21:52
von Perlchamp
@ _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]
>>> 

Re: Abfrage Variable

Verfasst: Montag 25. Februar 2019, 22:40
von __blackjack__
@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)

Re: Abfrage Variable

Verfasst: Montag 25. Februar 2019, 22:54
von Perlchamp
wie macht hier '*values' eigentlich Sinn, was macht es (alle Items 'auswerfen') ?

Re: Abfrage Variable

Verfasst: Montag 25. Februar 2019, 23:57
von __blackjack__
@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.

Re: Abfrage Variable

Verfasst: Dienstag 26. Februar 2019, 08:07
von Sirius3
@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))

Re: Abfrage Variable

Verfasst: Dienstag 26. Februar 2019, 16:46
von Perlchamp
@ _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 !

Re: Abfrage Variable

Verfasst: Dienstag 26. Februar 2019, 17:48
von mariomueller
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)

Re: Abfrage Variable

Verfasst: Dienstag 26. Februar 2019, 17:51
von __deets__

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.

Re: Abfrage Variable

Verfasst: Dienstag 26. Februar 2019, 21:35
von Sirius3
@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.

Re: Abfrage Variable

Verfasst: Mittwoch 27. Februar 2019, 06:06
von mariomueller
@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

Re: Abfrage Variable

Verfasst: Mittwoch 27. Februar 2019, 08:24
von Sirius3
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.

Re: Abfrage Variable

Verfasst: Mittwoch 27. Februar 2019, 08:38
von mariomueller
OK, danke, war mir neu

Re: Abfrage Variable

Verfasst: Mittwoch 27. Februar 2019, 08:48
von __blackjack__
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. :-)