for- schleifen

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
Bee
User
Beiträge: 5
Registriert: Montag 12. Mai 2014, 12:16

Hallo,

ich bin neu in der Welt von Python 3 und bei meinem Projekt auf eine, für euch wahrscheinlichh ganz primitive, Frage gestoßen.
Ich verwende eine for-Schleife um meine erstelte Liste byte-by-byte mit 8 bytes zu füllen und diese dann aus zu lesen. Da ich aber nicht nur 8 bytes sondern weit aus mehr hab möchte ich die for-Schleife dem endsprechend wiederholen. Und genau hier liegt meine Frage.
Gibt es die Möglichkeit die for-Schleife so oft wie man will zu wiederholen, ohne sie dafür immer wieder eintippen zumüssen?

Danke schonmal für euere Antworten :)
Bee
BlackJack

@Bee: Ja klar, wenn man etwas wiederholen möchte dann schreibt man eine Schleife die das enthält was man wiederholen möchte.
Bee
User
Beiträge: 5
Registriert: Montag 12. Mai 2014, 12:16

des is in meinem Fall genau die For Schleife

Code: Alles auswählen

# Opening serial port 
import serial

ser = serial.Serial(6, 9600)	#opern 7th serial port
print(ser.name)			#check which port was really used

li1 = [] # int 
li2 = [] # str
for i in range(8):
	#mein ASCII code wird byte by byte in die Liste gelesen
	p = ser.read(size = 1)
	x = int.from_bytes(p, byteorder = 'big')
	y = str(x)
	li1.append(x)
	li2.append(y)

print(li1)
print(li2)
ser.close()

des is der Code den ich zz hab..
von meinem mC kommen 94 ASCii Zeichen rein, die möcht ich in je 8byte Listen abspeichern.
BlackJack

@Bee: Ja, dann brauchst Du noch eine Liste in der Du die Listen speicherst und eben eine Schleife um das einlesen von den 8 Bytes. Wobei sich 94 nicht durch 8 teilen lässt, also kannst Du nicht in jeder Liste 8 Zahlen haben.

Die Listen sollten auch bessere Namen als `li1` und `li2` bekommen. Namen sollen dem Leser verraten was die Werte für welche die Namen stehen im Kontext des Programms bedeuten. Und nicht irgendwas sinnfreies, durchnummeriertes. Konkrete Typen sollte man auch nicht in den Namen schreiben. Und in der Regel ist ein aussagekräftiger Name länger als ein Zeichen. Man bräuchte auch weniger Namen wenn man nicht jedes Zwischenergebnis an einen eigenen Namen binden würde. Solange ein Ausdruck nicht zu unübersichtlich und gross wird, würde ich Zwischenergebnisse nur an Namen binden wenn sie an mehr als einer Stelle benötigt werden.

Die `byteorder` ist bei einzelnen Bytes egal. Das mit dem `int.from_bytes()` ist aber bei Einzelbytes sowieso unnötig, denn der `read()`-Aufruf liefert ein `bytes`-Objekt zurück und an die Zahlwerte der einzelnen Bytes kommt man per Indexzugriff. An der Stelle stellt sich auch die Frage warum 8 Bytes in eine Liste lesen, wenn man einfach mit *einem* `read()`-Aufruf die 8 Bytes lesen kann. Die muss man dann ja auch nicht unbedingt in eine Liste verfrachten, sondern kann sie im `bytes`-Objekt belassen.

Einrücktiefe ist per Konvention übrigens vier Leerzeichen pro Ebene. Das, und noch einiges andere, kann man im Style Guide for Python Code nachlesen.

Edit: Der bisherige Code in einfacher und mit ordentlichen Namen und mit dem Hauptprogramm in einer Funktion (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import print_function
import serial
from contextlib import closing

COM_PORT_NUMBER = 6
BAUD_RATE = 9600


def main():
    with closing(serial.Serial(COM_PORT_NUMBER, BAUD_RATE)) as connection:
        print(connection.name)
        byte_values = list(connection.read(8))
        print(byte_values)


if __name__ == '__main__':
    main()
Und auch ohne die zweite, redundante Liste mit den Zeichenketten.
Bee
User
Beiträge: 5
Registriert: Montag 12. Mai 2014, 12:16

Danke für die Info.

zz arbeite ich nur mit einem Testprogram (ASCII), welches nur da is um zuschauen ob alles funktioniert.
Der grund warum ich Byte weise einlesen will und sich des dann auch alles durch 8 teilen lässt ist volgender.

In meinem Projekt werden von einem 3 axis accelerometer daten aus 6 registern (xL/xH, yL/yH, zL/zH) mit je 8 bytes versendet.
Und ich möchte mit hilfe von Python 3 eine application schreiben die mir diese Daten ausgibt.

Ich werd Deine Information versuchen in meinen Code einzuarbeiten auch wenn ich es noch nicht ganz verstanden hab ;)
hab ich jetz aba schon mal eine zweite For-Schleife die funktioniert aba nioch nicht ganz des Richtige ausgiebt.

DANKE!!! :)
Antworten