Programmieren lernen mit Python, aber spezielle Interessen

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.
Cobalt
User
Beiträge: 32
Registriert: Freitag 4. April 2014, 11:54

Hallo,

nach einem 15 jahre zurückliegenden ersten reinschnuppern in Java möchte ich wieder programmieren lernen.
Python wird als Anfängersprache oft empfohlen weil man damit wohl schnell motivierende Ergebnisse erzielt und die Syntax nicht allzu schwer sei.

Meine besonderen Interessen liegen im Bereich Mustererkennung/neuronale Netze/maschinelles Lernen, weswegen ich mich auch ein wenig in Matlab/Octave einlernen möchte. Ich weiß, extrem komplexes Thema. Aber ich hatte mal beruflich sporadisch mit Software zur Mustererkennung zu tun und die Arbeit damit ohne grundlegendes Verständnis dafür, was da auf Ebene der Algorithmen vor sich geht war sehr unbefriedigend. Daher mein Interesse dafür. Es geht nicht um umfangreiche Programmierprojekte bzw. eine spezielle Idee zu diesem Bereich sondern darum ein grundlegendes Verständnis für dieses komplexe Thema zu erwerben anhand einfacher kleiner Programme mit Modellcharakter.

Zweites Interessengebiet ist Hardwaresteuerung: Steuerung von Sensoren, Meß- und Regeltechnik, Relais, Elektromotoren, einfachen Robotern, etc... auch hier geht es mir (erstmal) nicht darum spezielle Projekte zu verwirklichen sondern ebenfalls ein grundlegendes Verständnis zur Funktionsweise von mikroprozessorgesteuerter Elektronik zu erwerben. Also auch hier zumindest erstmal nur kleine Experimente mit Modellcharakter. Später kommt möglicherweise der Bedarf nach gezielter Umsetzung bestimmter Ideen für Elektronikprojekte. Vorerst will ich erstmal wissen, was die kleinen Käferchen (Chips) in Elektronikprodukten bzw. Embedded Systeme eigentlich genau machen und wie sie per Software mit der Außenwelt (LCD's, Sensoren, Motorsteuerung, etc...) über ihre diversen analogen und digitalen Schnittstellen kommunizieren.

Die allgemeine frage welche Programmiersprache für mich als Einsteiger mit o.g. Interessen geeignet sei (und evtl. auch ein Raspberry Pi oder Arduino) habe ich schon in einem anderen Forum gestellt. Bin allerdings auch hier nach wie vor dankbar für alle Vorschläge, falls ihr meint C++ o.ä. sei bei o.g. Einsatzbereichen auch für mich als Anfänger besser geeignet.
Aber ich möchte hier vor allem ganz explizit fragen, wie es um das Potential von Python bei genannten Hardwaresteuerungsaufgaben steht? Zumal es ja eine Interpretersprache ist. Und wie universell ist das für diese Zwecke bei Python gelernte? D.h. gleichen sich die Methoden denen von bspw. dem hardwarenäherem C++ und liegen die Unterschiede in Syntaxdetails, so daß das unter Python zur Hardwaresteuerung gelernte auch bei einem späteren Lernen von C++ als "Transferwissen" von hohem Nutzen ist? Oder sind diese beiden Sprachen auf der Ebene der Hardware-/Elektroniksteuerung grundsätzlich verschieden?
BlackJack

@Cobalt: Wenn es wirklich auf Mikroprozessoren geht, dann ist Python nicht die passende Sprache. Da braucht man als Umgebung schon ein richtiges Betriebssystem und vor allem Speicher. Also Raspberry Pi ist geeignet für Python, Arduino nicht (solange da nicht >100 MiB RAM drin stecken und ein Linux drauf läuft).

Ich persönlich würde für Mikroprozessoren auch nicht C++ lernen sondern bei C bleiben. In diesen eingeschränkten Umgebungen sehe ich nicht wirklich den Nutzen den man sich durch die Komplexität von C++ erkaufen könnte.
Cobalt
User
Beiträge: 32
Registriert: Freitag 4. April 2014, 11:54

BlackJack hat geschrieben: Ich persönlich würde für Mikroprozessoren auch nicht C++ lernen sondern bei C bleiben. In diesen eingeschränkten Umgebungen sehe ich nicht wirklich den Nutzen den man sich durch die Komplexität von C++ erkaufen könnte.
Also ist C++ komplexer als C? Ich ging von der umgekehrten Annahme aus.

Zum Raspberry Pi: die GPIO-Schnittstelle für Elektronikbasteleien wird dort aber auch über Python angesprochen, oder?
Wie steht es da um so einfache Sachen wie Auslesen externer Sensoren (Infrarot, Ultraschall-Module, etc...) um deren Meßwerte in eine Tabelle zu schreiben oder graphisch darzustellen, evtl. auch durch ein angeschlossenes einfaches LCD-Display. Ist das damit schon wesentlich umständlicher zu programmieren als bspw. mit einem Arduino oder auch mit einem in C programmierten Mikrokontroller?

Mein Dilemma ist wohl, daß ich bei meinen Interessen eigentlich zwei verschiedene Sprachen bräuchte: eine für meinen Wunsch ganz allgemein Programmieren zu lernen und eben für mein erstgenanntes Interesse Mustererkennung/neuronale Netze/selbstlernende Systeme und eine zweite für die hardwarenahe Programmierung von Mikrocontrollern und Kommunikation mit den diversen Schnittstellen zur Ansteuerung externer Elektronikkomponenten und Sensoren. Als Anfänger stehe ich also ein bißchen zwischen den Stühlen.

Vielleicht noch die ganz allgemeine Frage: was sind abgesehen von Webentwicklungen und der verständlichen Syntax die Stärken von Python? Also gibt es weitere spezielle Bereiche in denen es herausragende Stärken besitzt oder ist es eher universell einsetzbar ohne besondere Stärken/Schwächen (abgesehen von Defiziten bei besonders hardwarenahen Aufgaben)?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Machinelles lernen und für alles was so unter scientific computing fällt ist Python eine sehr gute Wahl, da es mit mit numpy, scipy usw. da ein sehr große Anzahl an Bibliotheken gibt, die man so in anderen nicht darauf spezialisierten Programmiersprachen nicht findet. Wie BlackJack allerdings schon gesagt hat wird es bei Hardware nahen Sachen mit Python, naja eigentlich jeder Sprache außer C, problematisch.

Wenn du beide Interessen gleichwertig verfolgen willst und vorallem wenn du beides kombinieren willst z.B. Daten über Sensoren sammeln und auswerten, macht es am meisten Sinn einfach beides zu lernen. Dann hast du für beide Bereiche ein passendes Werkzeug, welche sich auch sehr gut kombinieren lassen.
BlackJack

@Cobalt: Ja, C++ ist deutlich komplexer als C. Die Syntax ist zwar sehr ähnlich und fast jeder C-Quelltext lässt sich auch mit einem C++-Compiler übersetzen, aber es sind im Grunde zwei verschiedene Sprachen. Idiomatische C++-Lösungen sehen in der Regel deutlich anders aus als das selbe Problem in C gelöst, ganz einfach weil man in C++ die Möglichkeiten von Templates und Objektorientierung auch nutzen sollte, denn sonst könnte man ja nur C verwenden.

Für die GPIO-Schnittstelle am Raspi gibt es Python-Module um die anzusprechen und damit ist es im Grunde einfacher, denn alles was so drumherum passiert, muss man dann
nicht in C schreiben. Also zum Beispiel die Messwerte in eine Datebank schreiben oder grafisch aufbereiten geht in Python wesentlich einfacher als in C, was viel hardwarenäher und weniger abstrakt ist.

Sachen wie ein LCD werden in der Regel irgendwie seriell angeschlossen. Da hat man dann RS232 oder I²C, letztendlich bei einem richtigen Betriebssystem also Sachen die man nicht selber programmieren muss, sondern wo man über einen Gerätetreiber mit kommuniziert.

Ein Arduino *ist* ein in C programmierter Mikrocontroller. Zumindest die klassischen, „kleinen” Arduinos. Besonders schwer ist C auf denen IMHO auch nicht, aber das auch hauptsächlich deswesen weil man da so Sachen wie Messwerte in Datenbanken oder Dateien speichern, oder gar grossartig grafisch auswerten, gar nicht erst machen kann, weil das ein Mikroprozessor und ein wenig RAM und Flash-ROM ist, beides deutlich unter einem Megabyte. Kein ”normales” Betriebsystem, kein Dateisystem, nur ein Programm das läuft und die volle Kontrolle über alles hat. Vollständig um die Hardware braucht man sich allerdings auch nicht kümmern, weil es schon ein paar fertige Funktionen als Bibliothek gibt, die sich darum kümmern und auch Unterschiede zwischen einzelnen Arduino-Modellen für den Benutzer abstrahieren können. Wenn man den Arduino durch Hardware wie SD-Karten-Slots erweitert, dann sind da in der Regel auch Bibliotheken dabei um die Hardware einfach über fertige Funktionen nutzen zu können. Damit könnte man Messwerte dann auch in grösseren Mengen aufzeichnen. Eine grafische Auswertung ist aber IMHO nicht die Domäne für so einen Arduino. Das würde man eher an einem „echten” Rechner machen.

Python ist eine universelle Programmiersprache mit der man fast alles machen kann. In den Feldern wo reines Python nicht so geeignet ist, zum Beispiel beim „number crunching” oder besonders hardwarenahen Sachen gibt es in der Regel Erweiterungsmodule die in C oder anderen Sprachen geschrieben sind, um das von Python aus dann doch nutzen zu können. GPIO auf dem Raspberry Pi ist kein Problem von Python aus, das würde ich aber auch nicht als besonders hardwarenah bezeichnen, weil man da sowohl in Python als auch in C nicht direkt mit der Hardware kommuniziert sondern mit dem Betriebsystem und dessen Treibern, welche dann letztendlich die Hardware ansteuern.
Cobalt
User
Beiträge: 32
Registriert: Freitag 4. April 2014, 11:54

Ok, also Python als universelle Einstiegssprache, um alle Elemente einer universellen objektorientierten Hochsprache erstmal kennenzulernen ist dann also sicher gute Wahl. Umso mehr, wenn es gute Bibliotheken für die Bereiche maschinelles Lernen und generell scientific computing gibt. Bin ja selbst Naturwissenschaftler.

Ich könnte es mir dann also so vorstellen mit Python zu beginnen und gleichzeitig oder nach einiger Zeit auch "selektiv" C zu lernen, mich bei letzterem aber auf die Bereiche zu beschränken, die ich mit Python nicht umsetzen kann. Also eben die hardwarenahe Programmierung von Mikrocontrollern und ohne Absicht voll in C einzusteigen.
Oder müsste ich bei C auch sehr viel Ballast mitlernen, um dessen hardwarenahe Funktionen auszunutzen?
Kann eigentlich C-Code, ich sage mal als Laie so in der Art einer selbstgeschriebenen externen Bibliothek in ein Python Programm integriert werden um dort Aufgaben zu übernehmen, die Python selbst nicht bewerkstelligen kann?
Also Beispiel: ich programmiere eine Software, die einen Sensor ausliest, dessen Daten vielleicht irgendwie graphisch aufbereitet werden und zusätzlich bei bestimmten Werten (bspw. bestimmten Temperaturen, Helligkeitswerten oder Abstandswerten eines Ultraschallsensors) bestimmte Befehle an extern angeschlossene Elektronik sendet. Könnte ich dann versuchen soviel wie möglich mit Python zu realisieren und nur für die wirklich hardwarenahen Teilaufgaben, bei denen Python an die Grenzen seiner Möglichkeiten stößt, quasi Mini-Subprogramme in C schreiben und diese dann ähnlich einer eigenen Bibliothek oder eines Gerätetreibers in das Programm integrieren?
Also Mini-C-"Progrämmchen", die nichts anderes tun als Daten vom Sender auszulesen und diese Werte dann an das Python-Hauptprogramm weitergeben. Vielleicht noch jedem Wert einen Zeitstempel aufdrückt sofern dies nicht bereits das Python-Hauptprogramm übernehmen könnte. Letzteres übernimmt dann die grafische Aufbereitung und die Auswahl der je nach Datenresultaten erwünschten Befehle für die weitere externe Elektronik. Diese Befehle werden dann wieder an ein C-Subprogramm (oder wie man es auch nennen soll) übergeben, welches diese dann in einen erforderlichen Spannungswert oder sonstiges umsetzt, um die externe Elektronik zu steuern.

Ließe sich so eine Einbindung fremden Codes unkompliziert realisieren und wären solche Programmkonstrukte praxistauglich?
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Ja, das geht. Einige Python-Module sind sogar in C programmiert, weil Python dafür zu langsam wäre.

Ich hab das zwar noch nicht gemacht, aber schwierig soll es wohl nicht sein.
BlackJack

@Cobalt: Bei C muss man eigentlich nicht viel lernen, denn so viel gibt es da nicht. Das ist eine relativ einfache Sprache, was das Programmieren damit halt umständlich macht, weil die Sprache selbst nur sehr wenig von dem abstrahiert was der Prozessor so macht. Im Grunde ist das so eine Art ”portabler Makroassembler”, also programmieren fast auf der Ebene von Maschinensprache aber mit einer Syntax die nicht mehr vom konkreten Prozessormodell abhängt. Dazu gibt es dann noch eine Standardbibliothek die im Vergleich zu dem was moderne Programmiersprachen mitbringen *sehr* übersichtlich und klein ist. Das komplizierte bei C ist dann eher aus dieser simplen Sprache grössere, komplexere Programme zu basteln, und dabei darauf zu achten dass man keine Fehler macht, denn weder die Sprache noch die Laufzeitumgebung unterstützen einen dabei besonders gut.

Die Standardimplementierung von Python, also die, die man bei www.python.org bekommt, ist in C geschrieben — wird darum auch CPython genannt — und man kann in C auch Module dafür schreiben. Die API dafür ist in der Python-Dokumentation beschrieben.

Man kann auch C-Bibliotheken die nicht explizit für diese API geschrieben sind, mit Hilfe des `ctypes`-Moduls aus der Python-Standardbibliothek ansprechen. Das ist immer mein erster Ansatz wenn ich eine vorhandene Bibliothek einbinden möchte für die es anderweitig noch keine Anbindung an Python gibt.

Eine weitere Möglichkeit ist Cython. Das ist eine Sprache die Python-Syntax um optionale statische Typdeklaration erweitert und das dann zu C-Code übersetzt der die Python-C-API verwendet, damit man das als Erweiterungsmodul für CPython übersetzen kann. Cython nimmt einem viel Arbeit ab, die man hätte wenn man per Hand C-Quelltext für die Python-C-API schreibt.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

BlackJack hat geschrieben:Man kann auch C-Bibliotheken die nicht explizit für diese API geschrieben sind, mit Hilfe des `ctypes`-Moduls aus der Python-Standardbibliothek ansprechen. Das ist immer mein erster Ansatz wenn ich eine vorhandene Bibliothek einbinden möchte für die es anderweitig noch keine Anbindung an Python gibt.
Mit cffi was unter CPython auf ctypes aufbaut, braucht man im Prinzip nur den Header kopieren und bekommt Zugriff auf die entsprechende Bibliothek. Das vereinfacht dass ganze nochmal wesentlich weil man sich dann nicht groß mit der ctypes API beschäftigen muss.
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

BlackJack hat geschrieben:Das komplizierte bei C ist dann eher aus dieser simplen Sprache grössere, komplexere Programme zu basteln, und dabei darauf zu achten dass man keine Fehler macht, denn weder die Sprache noch die Laufzeitumgebung unterstützen einen dabei besonders gut.
Offtopic: Das Problem hatte ich bei meinen ersten Programmiererfahrungen vor einigen Jahren. Ich habe einen C/C++-Kurs besucht, den auch komplett verstanden, aber was sinnvolles damit programmieren konnte ich nicht. Nur mit Arrays herumzuspielen und Texte von der Konsole einlesen fand ich sehr sinnlos. Deswegen habe ich damit auch ziemlich schnell wieder aufgehört.

Mit Python kann man wenigstens schon direkt am Anfang was komplettes machen.

Im Grunde scheint es mir so, als ob man bei einem C-Kurs direkt zu Beginn schon einige sehr nützliche externe Bibliotheken behandeln sollte, damit man wenigstens irgendwelche sinnvollen Anwendungen programmieren kann und die Motivation bleibt.
BlackJack

@Hellstorm: Oder man lernt C im Zusammenhang mit Mikroprozessoren, denn da reicht C alleine schon aus um Erfolgserlebnisse zu haben. Die nützliche, motiviernde Bibliothek ist in dem Fall dann die Hardware. :-)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

DasIch hat geschrieben:Mit cffi was unter CPython auf ctypes aufbaut (...)
`cffi` baut *nicht* auf `ctypes` auf. Es nutzt `ctypes` lediglich unter gewissen Umständen als Fallback. Siehe dazu die von dir bereits verlinkte Doku:
Download and Installation:
(...)
* or you can directly import and use cffi, but if you don’t compile the _cffi_backend extension module, it will fall back to using internally ctypes (much slower; we recommend not to use it).
Quelle: https://cffi.readthedocs.org/en/release ... and-status
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

BlackJack hat geschrieben:@Hellstorm: Oder man lernt C im Zusammenhang mit Mikroprozessoren, denn da reicht C alleine schon aus um Erfolgserlebnisse zu haben. Die nützliche, motiviernde Bibliothek ist in dem Fall dann die Hardware. :-)
Ja, das stimmt. Da fehlte mir aber das elektronische Know-How zu. Bzw. ich wusste nicht, dass so etwas wie Arduino so einsteigerfreundlich ist.

In meinem Fall war wahrscheinlich das Problem, dass der Kurs eher an Naturwissenschaftler gerichtet war, für die Programmieren eher Mittel zum Zweck ist (Also irgendwelche Berechnungen durchführen). Da reichte das wahrscheinlich.
Cobalt
User
Beiträge: 32
Registriert: Freitag 4. April 2014, 11:54

Noch eine kurze Frage zum Modellcharakter der Python-Syntax. Ich habe grad nur das Beispiel einer einfachen FOR-Schleife mit Deklaration des Indexvariable vor Augen. Da weicht die Python Syntax ja erheblich von C++ ab. Ich hatte gedacht, daß die meisten Sprachen bei so grundlegenden Elementen wie Schleifen und Indexvariablen inkrementieren viel stärker an die C/C++ -Syntax angelehnt wären. Ist das jetzt eher Zufall, daß ich da auf ein Beispiel gestossen bin, wo die Syntaxunterschiede besonders groß sind oder sind solche Unterschiede exemplarisch für den Vergleich Python-C++?

Ich frage nur für den Fall, daß ich irgendwann doch mal auf C++ umsteigen bzw. es als Zweitsprache lernen möchte. Wegen der hohen Verbreitung und der Tatsache, daß sich viele andere Sprachen so stark an dessen Syntax anlehnen grübel ich immer noch ein wenig, ob ich nicht auch mit C++ anfangen könnte. Ich muss allerdings auch klar sagen, wenn ich erstmal ein halbes Jahr einen großen Anteil meiner Freizeit opfern müsste, um in C++ Erfolgserlebnisse in Form praxistauglicher Umsetzung erster kleinerer Projektideen zu erleben, dann wäre es definitiv nichts für mich. Programmieren soll für mich derzeit einfach ein Mittel sein ein tiefgründigeres Verständnis für die beiden im Eingangsfaden genannten Interessengebiete zu erlangen und dafür kleine Projekte mit Modellcharakter zu realisieren die auch irgendwie Spaß machen. Also wenn ich mich ewig lang mit theorielastigen komplexen Details einer Sprache auseinandersetzen und mit Trockenübungen zu sprachlichen Detailaspekten ohne Praxisbezug begnügen müsste, wäre das Risiko sehr groß, daß ich früher oder später das Interesse verliere.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Cobalt: In Python wird vieles anders gemacht als in C++. Falls du eine Sprache suchst, die noch halbwegs C ähnelt, aber (IMHO) einfacher zu erlernen ist als C oder dem noch schwierigeren C++, dann bin ich schon fast geneigt, dir Java zu empfehlen. Die Sprache ist verglichen mit Python nicht besonders elegant, dürfte aber schnell zu ersten Erfolgserlebnissen führen. Andererseits wirst du vieles aus der Java-Welt später trotzdem nicht auf C++ übertragen können. Es sind nun mal unterschiedliche Sprachen. Ich sag mal: Die Syntax ist ähnlich (von einigen Punkten mal abgesehen), aber die Art wie Dinge konkret umgesetzt werden, unterscheidet sich stark.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Cobalt hat geschrieben:Mein Dilemma ist wohl, daß ich bei meinen Interessen eigentlich zwei verschiedene Sprachen bräuchte: eine für meinen Wunsch ganz allgemein Programmieren zu lernen und eben für mein erstgenanntes Interesse Mustererkennung/neuronale Netze/selbstlernende Systeme und eine zweite für die hardwarenahe Programmierung von Mikrocontrollern und Kommunikation mit den diversen Schnittstellen zur Ansteuerung externer Elektronikkomponenten und Sensoren. Als Anfänger stehe ich also ein bißchen zwischen den Stühlen.
Da stimme ich dir vollkommen zu. Zur Bewältigung deiner beiden Interessengebiete ist Python wohl das Mittel der Wahl. Bezüglich des Wunsches, "Oldschool-Programmierung" zu lernen, solltest du IMHO entweder Java oder C lernen.
BlackJack

@Cobalt: An der Stelle vergleichst Du Äpfel mit Birnen, denn in C++ hast Du Dir wahrscheinlich eine ``for``-Schleife angeschaut deren Schleifenkopf aus Initialisierung, Test, und Aktualisierung der Schleifenvariable besteht. Diese Art von Schleife gibt es in Python gar nicht. Die müsste man so ganz allgemein mit einer ``while``-Schleife in Python nachbauen. Wenn man sie denn bräuchte, was eher selten der Fall ist.

Die Art der ``for``-Schleife aus Python, also eine „for each”-Schleife, haben mittlerweile so ziemlich alle anderen modernen imperativ/objektorientierten Programmiersprachen, auch die aus der C-ähnlichen Syntaxfamilie. C++ hat sie im neuen C++11-Standard. Aber auch vorher gibt es sie als Makro in einigen Rahmenwerken wie Boost (``BOOST_FOREACH``) oder der Qt-Bibliothek (``foreach``).

Denn meistens möchte man in Schleifen ja über irgendwelche Werte aus einem „Container” iterieren und nicht den Umweg über eine Indexvariable gehen müssen. Das ist eher ein lästiges Implementierungsdetail und eine potentielle Fehlerquelle. Auch in den meisten anderen Sprachen die C++-ähnlich aussehen hat man das erst durch Iteratoren und dann durch eine eigene Syntax für Schleifen im Python-Stil ersetzt. Wobei C++ Nachzügler bei der eigenen Syntax für diese Schleifenart ist.

Die Frage ist ob die C-Schleife, da kommt die ja ursprünglich her, tatsächlich so ein grundlegendes Element ist. Oder ob sie in C nicht nur deswegen grundlegend ist, weil man dort halt nichts besseres zur Verfügung hat.

Das sich viele andere Sprachen an die C-Syntax anlehnen ist IMHO kein Grund ausgerechnet C++ zu lernen. Da könnte man sich auch eine dieser anderen Sprachen ansehen. Wobei auch diese Syntaxanlehnung irgendwo nicht viel aussagt, denn Rust oder JavaScript sehen zwar ähnlich aus was die Syntax angeht, sind aber deutlich andere Sprachen als C++. Und auch Python wäre immer noch eine deutlich andere Sprache als C++ wenn man Blöcke nicht durch Einrückung sondern durch geschweifte Klammern kennzeichnen würde, und wenn es Syntax für eine ``for``-Schleife im C-Stil gäbe.

Syntax macht dabei nicht so viel aus, es ist mehr die Semantik, das Typ- und Objektsystem, Idiome, Speicherverwaltung, Möglichkeiten der Metaprogrammierung, wo die Unterschiede liegen. Python's Syntax ist für mich leichter zu schreiben und zu lesen, aber die Sprache würde sich nicht massiv ändern wenn man jetzt geschweifte Klammern hätte.
Benutzeravatar
__LC__
User
Beiträge: 32
Registriert: Dienstag 1. März 2011, 14:08
Wohnort: 127.0.0.1
Kontaktdaten:

snafu hat geschrieben:Zur Bewältigung deiner beiden Interessengebiete ist Python wohl das Mittel der Wahl. Bezüglich des Wunsches, "Oldschool-Programmierung" zu lernen, solltest du IMHO entweder Java oder C lernen.
Hallo Cobalt.

Ich hatte vor kurzem einen ähnlichen Interessenkonflikt wie du. Auch mein persönlicher Interessenschwerpunkt liegt, ähnlich wie bei dir, mehr in der Messerfassung, -automatisierung und Steuerung. Bisher war mein Arbeitspferd hierfür LabVIEW, aber gerade in den letzten 1,5 Jahren kam bei mir immer stärker der Wunsch auf, mir auch in eine textbasierte Programmiersprache hierfür anzueignen. Ich muss dazu sagen, dass ich Python schon seit geraumer Zeit nutze, allerdings eher im Rahmen einer Skriptsprache, statt eine Sprache im Rahmen der Anwendungsentwicklung. Und genau in letzteren Bereich möchte ich nun zukünftig gern mehr hinein. So überlegte auch ich vor kurzem, welche Sprache dann nun wirklich besser mein Interessengebiet abdecken könnte. C/C++ oder Python. Mein Ergebnis nach schlaflosen Nächten: Ich werde mich in den kommenden Monaten zunächst mehr Python widmen. Gerade durch den Raspberry Pi, Tinkerforge etc. kann man aus meiner Sicht zumindestens auch mit Python schon mal in die Welt der Elektronik, Steuerung etc. eintauchen. Vielleicht nicht so hoch performant, wie C in Verbindung mit der uC-Programmierung, aber zum Spielen sicherlich völlig ausreichend. Mal sehen vielleicht geht ja auch noch mehr. Auch denke ich, hat man mit Python eine Sprache in der Hand, die es einem erlaubt auch mal schnell ein paar Etagen nach oben, zum Beispiel in die Datenauswertung und -aufbereitung, zu wechseln. Sicherlich ist das auch alles mit C/C++ problemlos möglich, nur werden der Zeitaufwand und die Hürden hierfür wesentlich größer sein als mit Python. Nichts desto trotz beabsichtige ich, sofern mein Plan aufgeht, mich zum Ende des Jahres auch noch mit C auseinanderzusetzen, dann aber voraussichtlich nur im Rahmen der uC-Prgrammierung und nicht im Rahmen der Anwendungsentwicklung. Wie ja auch schon von meinen Vorredner angemerkt, lässt sich Python mit C sehr gut erweitern.
Kurz und knapp: Lerne Python, dann C und die wirst in meinen Augen in deinem Interessengebiet sehr weit kommen.

Schöne Grüße
LC
Cobalt
User
Beiträge: 32
Registriert: Freitag 4. April 2014, 11:54

Das Thema Geschwindigkeit hatte ich noch gar nicht angesprochen. Wie sieht es mit der Performance von Python im Vergleich zu Java oder C++ aus? Nehmen wir mal als Beispiel mal einige sehr anspruchsvolle Projekte für die von mir geschilderten zwei Einsatzbereiche:

Mustererkennung, evtl. in Echtzeit an laufend eingelesenen Bildern einer Kamera. Bspw. Aufnahmen eines Mikroskops der Sorte, die mit motorisiertem Objektträgertisch ausgestattet sind, wo eine ganze Serie aneinander aufgereihter Präparate automatisiert in hoher Auflösung vom Mikroskop mit angeschlossener Kamera nach vorab durch Klassifikatoren definierten Objekten/Mustern abgescannt werden soll. Es werden also in hoher Geschwindigkeit Bilder eingelesen, die dann mit möglichst ebenfalls hoher Geschwindigkeit nach den gesuchten Mustern durchsucht werden sollen. Evtl. kommen auch Steuerungsaufgaben für den motorisierten Objektträgertisch und die Kamera hinzu.

Weiteres Beispiel mit Mustererkennung: eine motorgesteuerte Kamera, die definierte Objekte suchen und ihnen evtl. folgen soll.

Oder eine fix montierte Kamera, die einfach nur bestimmte Objekte zählen soll. z.Bsp. auf einen Himmelsabschnitt gerichtet die Anzahl von Sternschnuppen in einer Nacht zählen und deren Bilder (also nur die interessanten Bilder) abspeichern soll. Ok, winzige Sternschnuppen zu identifizieren würde erhebliche Anforderungen an die Kamera stellen. Es soll in diesen Beispielen nur grob um die Anwendungsideen gehen. Gerade das erste Beispiel aus der Mikroskopie wäre ein Mammutprojekt, daß ich wohl nie angehen werde. Ich hatte aber mal in einem Labor mit so einem Mikroskopiesystem zu tun. Daher mein Interesse für Aufbau und Funktionsweise so eines Programms und den zugrundeliegenden Algorithmen.
Bei diesen Beispielen zur Mustererkennung ist natürlich das Potential für extrem umfangreiche numerische und statistische Berechnungen gefragt. Ist hier mit gravierenden Performanceschwächen zu rechnen oder ist dieser Bereich vielleicht sogar eine der Stärken von Python?

Oder als einfacheres Beispiel ein Programm, welches umfangreiche Meßdaten von Sensoren einliest und mittels mittels vielleicht aufwändigerer mathematischer Operationen weiterverarbeitet und grafisch aufbereitet.
Alle Programme sollten mit einer ansprechenden GUI ausgestattet sein. Nichts grafisch überladenes. Es sollte halt nur nicht wie provisorisch zusammengeschustert wirken. Fokus der GUI auf maximale Funktionalität und Ergonomie für den Bediener.
BlackJack

@Cobalt: Die Ausführungsgeschwindigkeit von CPython ist deutlich schlechter als die von Java, oder gar C++. Man würde also die rechenintensiven Sachen bei der Mustererkennung nicht in reinem Python schreiben. Für so etwas gibt es aber Bibliotheken wie OpenCV die eine Python-Anbindung haben.
Antworten