Wikibooks dewikibooks https://de.wikibooks.org/wiki/Hauptseite MediaWiki 1.46.0-wmf.22 first-letter Medium Spezial Diskussion Benutzer Benutzer Diskussion Wikibooks Wikibooks Diskussion Datei Datei Diskussion MediaWiki MediaWiki Diskussion Vorlage Vorlage Diskussion Hilfe Hilfe Diskussion Kategorie Kategorie Diskussion Regal Regal Diskussion TimedText TimedText talk Modul Modul Diskussion Veranstaltung Veranstaltung Diskussion Gitarre: Inhaltsübersicht 0 5657 1082870 1075481 2026-04-07T07:13:58Z Mjchael 2222 /* 20px Rockdiplom {{:Gitarre: Rockdiplom/ Status}} */ 1082870 wikitext text/x-wiki <noinclude>{{:Regal:Musik/ Navi wichtige Buecher}}</noinclude> {{:Gitarre/ Navi Bände}} {{Hauptautor wünscht Mitarbeit}} {{Korrekturlesen}} {{Buchsuche|Gitarre}} {{Wikipedia|Gitarre}} <noinclude>{{TOCright}}</noinclude> * [[Gitarre|'''Titelbild''']]'''&nbsp;– Zur Eingangsseite''' * [[Gitarre: Projektseite|'''Projektseite''']] '''Zielsetzung, Planung, Konzepte, Konventionen''' * '''Status des Buches'''&nbsp;– {{status|5}} * {{todolink|Gitarre|Todo-Liste des Buches Gitarre}} = Buchpatenschaft = Das Buch "Gitarre" wurde 2005 von [[Benutzer:Red Rooster|Red Rooster]] ins Leben gerufen, und wird seit ca. 2006 federführend von [[Benutzer:Mjchael|Mjchael]] weitergeführt. Wer auch immer Fragen oder Anregungen oder auch selbst Beiträge zu diesem Buch hat, der kann seine Fragen auf der [[Diskussion:Gitarre: Inhalts%C3%BCbersicht|Diskussionsseite von dieser Inhaltsangabe]] und auch direkt auf [[Benutzer Diskussion:Mjchael|Mjchaels Diskussionsseiten]] stellen. ---- = Gitarrenkurse = == Basiswissen == [[Image:P Guitar.png|left|80px]]Dieses Buch ist eine durchgehende Gitarrenschule, welche dir die Grundlagen der Liedbegleitung vermittelt. Das Buch ist in einzelne "Diplome" aufgeteilt (Lagerfeuerdiplom, Folkdiplom, Rockdiplom, Balladendiplom, u. a.). Der Begriff "Lagerfeuerdiplom" lehnt sich an das "Bauerndiplom" (nebst Turmdiplom und Königsdiplom) des [[w:Deutscher Schachbund|Deutschen Schachbundes]] an, mit dem man Anfängern bekundet, dass sie nun ein bestimmtes Level erreicht haben. Jedes Diplom ist als eine in sich abgeschlossener Band zu betrachten, welches bestimmte Spiel- und Wissens-Grundlagen mit einem gut abgesteckten Lerninhalt vermittelt. Die Gitarrenschule richtet sich in erster Linie an Hobbygitarristen, sowie an Leiter von Kinder und Jugendgruppen sowie Personen im pädagogischen Bereich, bei denen Gitarre und Gesang als begleitendes Nebenfach erwünscht ist. Wer höher hinaus möchte, wird später nicht drumherum kommen, sich durch weitere Gitarrenlehrbücher oder, was noch besser wäre, durch einen guten Gitarrenlehrer weiterzubilden. Diese sind auch nicht auf gemeinfreie Lieder (ohne Copyright) begrenzt, und können aktuellere Lieder verwenden. Es wurde darauf geachtet, dass die Lektionen so ausführlich beschrieben wurden, dass man es gut im Selbststudium erlernen kann. === Wie gebraucht man das Gitarrenbuch === Als völliger Anfänger klickst du am besten mal auf das [[Gitarre: Lagerfeuerdiplom|Lagerfeuerdiplom]] und machst dich mit der Navigationsleiste ganz oben vertraut. Auf der Startseite jedes Diploms findest du ganz oben eine Navigationsleiste, die dich zu allen weiteren Bänden dieses Gitarrenkurses führt, und noch zu ein paar anderen Wikibooks, die für Gitarristen interessant sind. {{:Gitarre/ Navi Bände}} Auf jeder Seite des Gitarrenlehrgangs findest du eine Navigationsleiste: Die ersten beiden Links führen dich zurück zu dieser Inhaltsseite oder zurück zur Inhaltsseite des Lagerfeuerdiploms. Von dort aus gelangst du auch zu den anderen Bänden. <div style="float:left;"> {{:Gitarre/ Navi|Lagerfeuerdiplom| {{:Gitarre: Lagerfeuerdiplom/ Navi}}| {{:Gitarre: Lagerfeuerdiplom/ Navi Lektionen}}| img=Lagerfeuer.gif }} </div> {{clear}} In der zweiten Zeile wirst du durch die 5 Hauptabschnitte des Buches geführt. Bei jedem Hauptkapitel ändert sich die unterste Zeile der Navigationsleiste. *Die Einleitung kannst du überfliegen und bei Gelegenheit mal genauer unter die Lupe nehmen. *Das wichtigste werden für dich die [[Gitarre: Grundsätzliches zum Greifen der Akkorde|Lektionen]] sein. Die Lektionen sind durchnummeriert. Zwei bis drei Seiten bilden eine Unterrichtseinheit, die jeweils für eine Gitarrenstunde in der Woche gedacht ist. *Lasse dich durch die Menge an Text nicht abschrecken. Bedenke, dass es deutlich umständlicher ist, alles schriftlich zu erklären, als es jemandem mal eben zu zeigen, dem man direkt gegenüber sitzt. * Das Kapitel "Repertoire" gibt dir Tipps zum Singen, zum Zusammenstellen eines Repertoires, und wie man Lieder am besten übt. ** Bei den Liedbeispielen findest du nochmal alle Übungsvorschläge aus dem Lagerfeuerdiplom, die alle aus dem Copyright-freien Bereich kommen. Die gleichen Vorschläge findest du noch mal einzeln in jeder Lektion aufgeführt. Du kannst dir zu jeder Lektion ein oder mehrere Lieder zum Üben raussuchen. ** Weiterhin findest du einige Lieder mit Akkorden, jedoch ohne Texte als Link zur Youtube-Suche, die du ebenfalls mit deinem neu erworbenen Wissen begleiten kannst. * Im Anhang findest du noch weitere interessante Kapitel, die den Kurs ergänzen und die du dir irgendwann mal in einer stillen Stunde zu Gemüte führen kannst. == Die Bände bzw. Diplome im Gitarrenbuch == Einige Bände sind schon fast vollständig. Andere weisen noch kleinere bis deutliche Lücken auf. Von daher lohnt es sich weitere Quellen wie andere Lehrbücher, Liederbücher, Lehrvideos oder, was noch besser wäre, einen persönlichen Lehrer gleichzeitig mit zu nutzen. === [[Bild:Wikibooks-Einzelbuch.png|20px]] [[Gitarre: Lagerfeuerdiplom|Lagerfeuerdiplom]] {{:Gitarre: Lagerfeuerdiplom/ Status}} === ; Level 1 <!-- Lagerfeuerdiplom --> <score> << \new ChordNames { \chordmode { a1 d g c e:m a:m }} \new FretBoards { \override FretBoards.FretBoard.size = #'2 \override FretBoard.fret-diagram-details.finger-code = #'in-dot \override FretBoard.fret-diagram-details.dot-color = #'white \override FretBoard.fret-diagram-details.orientation = #'landscape < a, e-1 a-2 cis'-3 e' > % A < a, d a-1 d'-3 fis'-2 > % D < g,-3 b,-2 d g b g'-4> % G < c-3 e-2 g c'-1 e' > % C < e, b,-2 e-3 g b e' > % Em < a, e-2 a-3 c'-1 e' > % Am } >> </score> Mit 6 Akkorden (D A G C Em Am) und 4-5 Schlagmuster lernst du elementare Grundlagen der Liedbegleitung. === [[Bild:Wikibooks-Einzelbuch.png|20px]] [[Gitarre: Folkdiplom|Folkdiplom]] {{:Gitarre: Folkdiplom/ Status}} === ; Level 2 <!-- Folkdiplom --> <score> << \new ChordNames { \chordmode { f1 d:m e b:7 a g:7 d:7 }} \new FretBoards { \override FretBoards.FretBoard.size = #'2 \override FretBoard.fret-diagram-details.finger-code = #'in-dot \override FretBoard.fret-diagram-details.dot-color = #'white \override FretBoard.fret-diagram-details.orientation = #'landscape < a, f-3 a-2 c'-1 f'-1 > % F < a, d a-2 d'-3 f'-1 > % Dm < e, b,-2 e-3 gis-1 b e' > % E < b,-2 dis-1 a-3 b fis'-4 > % B7 < a, e-2 a-3 cis'-4 e' > % A MRK < g,-3 b,-2 d g b f'-1> % G7 < a, d a-2 c'-1 fis'-3 > % Dm } >> </score> Mit 6 weiteren Akkorden (F Dm E H7 G7 D7 ), einer [[Bild:Wikibooks-Buchseite.png|20px]][[Gitarre: Einführung ins Zupfen|Einführung ins Zupfen]] sowie [[Bild:Wikibooks-Buchseite.png|20px]][[Gitarre: Folkdiplom - Technik|elementare Begleittechniken]] (Hammering, Slide, Basslauf u.a.m.) kannst du die meisten Lieder begleiten, die keine Barré-Akkorde benötigen. Ob du hiernach lieber zuerst mit dem Balladen- oder dem Rockdiplom weitermachen willst, bleibt dir überlassen. === [[Bild:Wikibooks-Einzelbuch.png|20px]] [[Gitarre: Balladendiplom|Balladendiplom]] {{:Gitarre: Balladendiplom/ Status}} === ; Level 3 oder 4 <!-- Balladendiplom --> <score> << \new ChordNames { \chordmode { a1:sus4 d:sus2 g:9 c:maj7 e:7 a:m7 }} \new FretBoards { \override FretBoards.FretBoard.size = #'2 \override FretBoard.fret-diagram-details.finger-code = #'in-dot \override FretBoard.fret-diagram-details.dot-color = #'white \override FretBoard.fret-diagram-details.orientation = #'landscape < a, e-1 a-2 d'-3 e' > % Asus4 < a, d a-1 d'-3 e' > % D < g,-3 d a-2 b g'-4> % G < c-3 e-2 g b e' > % Cj7 < e, b,-2 d gis-1 b e' > % E7 < a, e-2 g-1 c'-1 e' > % Am7 } >> </score> Hier lernst du [[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: vier Siebener auf einen Streich|erweiterte Akkorde]] (sus add 7...),[[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: C-Dur-Tonleiter Workshop|die C-Dur_Tonleiter]] in den ersten Bünden, [[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: C F und G mit Quinte im Bass|Akkordfolgen]] (heraushören, erweitern, einfache Akkordvarianten,...) kennen und bekommst eine [[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: Einführung in das 3-Finger-Picking|Einführung in das 3-Finger-Picking]]. === [[Bild:Wikibooks-Einzelbuch.png|20px]] [[Gitarre: Rockdiplom|Rockdiplom]] {{:Gitarre: Rockdiplom/ Status}} === ; Level 4 oder 3 (je nachdem mit welchem man anfängt.) <!-- Rockdiplom --> <score> << \new ChordNames { \chordmode { b:m fis:m cis:m gis:m fis gis }} \new FretBoards { % \override FretBoards.FretBoard.size = #'1.5 \override FretBoard.fret-diagram-details.finger-code = #'in-dot \override FretBoard.fret-diagram-details.dot-color = #'white \override FretBoard.fret-diagram-details.orientation = #'landscape < b,-1\5 fis-3\4 b-4\3 d'-2\2 fis'-1\1 > % bm < fis,-1 cis-3 fis-4 a-1 cis'-1 fis'-1 > % F#m < cis-1\5 gis-3\4 cis'-4\3 e'-2\2 gis'-1\1 > % C#m < gis,-1 dis-3 gis-4 b-1 dis'-1 gis'-1 > % G#m < fis,-1 cis-3 fis-4 ais-2 cis'-1 fis'-1 > % F# < gis,-1 dis-3 gis-4 bis-2 dis'-1 gis'-1 > % G#m } >> </score> Der Schwerpunkt liegt hier auf [[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre:_Erste_Barree-Akkorde|Barré-Akkorde]]. Von denen leiten wir uns die [[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: Powerchord-Workshop|Powerchords]] ab ([[Image:P game.svg|30px]]mit Rätsel) {{:Gitarre: Powerchord-Workshop/ Status}}. Wir lernen es [[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: Schlagmuster erarbeiten|Schlagmuster zu erarbeiten]] und einzelne Noten auf dem Griffbrett zu finden [[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre:_Note-Location_Workshop|(Note-Location-Workshop)]]. ; Level 4 hat man erreicht, wenn man sowohl das Rockdiplom als auch das Balladendiplom hat. Egal in welcher Reihenfolge. === [[Bild:Wikibooks-Einzelbuch.png|20px]] [[Gitarre: Rockballadendiplom|Rockballadendiplom]] {{:Gitarre: Rockballadendiplom/ Status}} === ; Level 5 <!-- Rockballadendiplom --> Das Rockballadendiplom kombiniert die Barré-Akkorde aus dem Rockdiplom mit weiteren Optionen (sus4, j7, add9...) aus dem Balladendiplom. Wir machen einen kleinen [[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: Jazzworkshop|Jazzworkshop]] {{:Gitarre: Jazzworkshop/ Status}} (incl. erweiterte Barré-Akkorde - Zupfen mit Barré-Akkorden - B-Tonarten) und beschäftigen uns mit [[Bild:Wikibooks-Buchseite.png|20px]][[Gitarre:_Akkordprogressionen|Standard-Akkordfolgen]]. Das wäre in etwa das Basiswissen der Liedbegleitung. Hiernach geht es mehr in die einzelnen Genre. === [[Bild:Wikibooks-Einzelbuch.png|20px]] [[Gitarre: Einführung in das Melodiepicking|"Einführung in das Melodiepicking"]] {{:Gitarre: Einführung in das Melodiepicking/ Status}} === <!-- Einführung in das Melodiepicking **[[Bild:Wikibooks-Buchseite.png|20px]] [[|]] --> Der Kurs legt Grundlagen, um Melodie und Begleitung gleichzeitig auf Gitarre spielen zu können (Fingerstyle). === [[Bild:Wikibooks-Einzelbuch.png|20px]] [[Gitarre: Einführung in die Sologitarre | Einführung in die Sologitarre]] {{:Gitarre: Einführung in die Sologitarre/ Status}} === <!-- Einführung in die Sologitarre --> Hier geht es um Skalen, Improvisation und Spieltechniken für die E-Gitarre. **[[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: Entstehung der Tonleitern|Entstehung der Tonleitern]] **[[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: Techniken für die E-Gitarre|Spieltechniken]] **[[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: Blues und RnR|Blues- und Rock'n'Roll]]{{:Gitarre: Blues- und Rock'n'Roll-Workshop/ Status}} - **[[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: Pentatonik und Bluesworkshop|Pentatonik und Bluesworkshop]] {{:Gitarre: Pentatonik und Bluesworkshop/ Status}} **[[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: Einführung in das Improvisieren|Erste Improvisationen mit einfachen Akkorden]] **[[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre:_Aufbau_der_Skalenformen|Aufbau von Dur- und nat. Moll-Skalen]] (gemäß CAGED-System) **[[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: Pentatonik Zusammenfassungen 1|Pentatonik (Zusammenfassung)]] **[[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: 3-Notes-Per-String Skalen|Modale 3-Notes-Per-String Skalen]] **[[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre: Tonart mittels Skalen bestimmen|Tonart mittels Skalen bestimmen]] === [[Bild:Wikibooks-Einzelbuch.png|20px]] [[Gitarre: Notenlesen| Notenlesen für Gitarre]] {{:Gitarre: Notenlesen/ Status}} === <!-- Notenlesen --> Du lernst, Noten direkt vom Blatt zu spielen. === [[Bild:Wikibooks-Buchseite.png|20px]] [[Gitarre:_Formen-Systematik|Systematik]] (CAGED - AST) === Diese Ergänzung fügt einen Großteil der Lerninhalte systematisch zusammen. == Lieder und Übungen == Diese Lieder sind ein kleiner Vorgeschmack darauf, was man alles mit dem erworbenen Wissen spielen kann. Die Reihenfolge der Liedvorschläge orientiert sich an den Diplomen. *[[Gitarre: Liedervorschläge |{{grün|Liedervorschläge}}]] (Texte nur bei Copyright-freien Liedern! Andere nur als YouTube Link) *[[Gitarre: Auswahl einiger Lieder mit Akkorden|Auswahl einiger Lieder mit Akkorden (Linkliste)]] *[[:Kategorie:Liederbuch| Übungsbeispiele aus dem "Liederbuch" nach Kategorien sortiert]] *[[:Kategorie:Liederbuch/ Tabulatur|Tabulatur (eine Unterkategorie des Liederbuches)]] =Spieltechnik und Konstruktion der Gitarre= Es gibt sicher eine Menge über das Instrument Gitarre zu sagen. Um einen ersten Einblick zu erhalten, lohnt es sich immer, noch einmal bei Wikipedia nachzuschlagen. Damit nicht alles doppelt geschrieben werden muss, wurde hier nur ein Link angebracht, mit dessen Hilfe man zum entsprechenden Artikel weitergeleitet wird. ==Gitarrentypen== Man kann fast jeden Musikstil mit jeder Gitarre spielen. Dennoch gibt es Gitarren, die für bestimmte Arten von Musik besser oder weniger gut geeignet sind. Es kommt dabei vor allem auf zwei Aspekte an: zum einen den Einsatzzweck und zum anderen die Bespielbarkeit der Gitarre. Man kann Gitarren grundsätzlich in drei Gruppen unterteilen. Man unterscheidet zwischen [[Gitarre: Bevor wir beginnen|Konzertgitarren]], die im Lagerfeuerdiplom näher besprochen wird. Die [[Gitarre: Die Westerngitarre|Westerngitarren]] im Folkdiplom, und die [[Gitarre: Die elektrische Gitarre|elektrischen Gitarren]] im Band Sologitarre. In jeder Gruppe gibt es noch viele weitere Untergruppen. ==Kleine Gitarren== Für jeden Gitarrentyp gibt es auch kleinere Gitarren oder Kindergitarren. Diese sind in ihrer Größe auf kleinere Personen bzw Kinder abgestimmt. Diese Gitarren werden entsprechend der Länge der Saiten z.B. mit 3/4 (für Kinder ab 7) oder 1/2 (für die ganz Kleinen) bezeichnet. Diese Angabe gibt das Verhältnis des Griffbrettes (der Mensur) einer Erwachsenengitarre wieder. Eine normale Gitarre hat also die Länge von 4/4. Es gibt übrigens keine speziellen "Kindersaiten". Wichtig ist noch die Breite des Griffbretts (Sattelbreite). Von der Breite hängt es ab, ob alle Saiten gut mit den kleinen Händen erreichbar sind. Letztlich sollte man eine Gitarre in einem Musikgeschäft ausprobieren. Eine Kindergitarre wird ansonsten ganz wie eine große Gitarre bedient (z.B. [[Gitarre: Saiten aufziehen|Saiten aufziehen]] und [[Gitarre: Stimmen|Stimmen]]) #[[Gitarre: Gitarrentypen|Gitarrentypen]] #[[Gitarre: Die Konzertgitarre|Die Konzertgitarre]] #[[Gitarre: Die Westerngitarre|Die Westerngitarre]] #[[Gitarre: Die elektrische Gitarre|Die elektrische Gitarre]] ==Wartung des Instruments== #[[Gitarre: Saiten aufziehen|Saiten aufziehen]] #[[Gitarre: Stimmen|Stimmen (Übersicht)]] ##[[Gitarre: Stimmen nach Stimmtönen#top|Stimmen nach Stimmtönen]] ##[[Gitarre: Stimmen mit Bünden|Stimmen mit Bünden]] ##[[Gitarre: Stimmen mit Flageolett|Stimmen mit Flageolett]] #[[Gitarre: Pflege|Pflege]] #[[Gitarre: Lagerung|Lagerung]] ==Zubehör== #[[Gitarre: Zubehör für eine Akustik-Gitarre|Zubehör für eine Akustik-Gitarre (Überblick)]]<br />Gitarrentasche, Tragegurt, Ersatzsaiten, Plektrum, Lehrbuch (mit CD / DVD), Stimmgabel, Kapodaster, Stimmgerät, Buchstütze / Notenständer, Gitarrenständer, Schreibzeug, Liederbücher, Notenheft, Saitenkurbel, Gitarrenpolitur und Putztuch, Metronom, Bottleneck, Gitarrenkoffer (statt Tasche), Fußbank, Gitarrenstütze, Gitarrenbefeuchter, Sonstiges #[[Gitarre: Effekte|Effekte (Überblick)]]<br />Effektpedale, Multi-, Rack-Effektgeräte, Hallfedern, Hall und Echo, Chorus und Flanger, Arpeggiator, Oktaver, Tremolo, Pitch-Shifter, WahWah, E-Bow #[[Gitarre: Plektrum|Plektrum]] #[[Gitarre: Saiten|Saiten]] #[[Gitarre: Stimmen|Stimmhilfen]] #[[Gitarre: Kapodaster|Kapodaster]] #[[Gitarre: Verstärker|Verstärker]] #[[Gitarre: Kabel|Kabel]] =Spielpraxis= Hier dreht es sich um das Spielen des Instruments selbst. An dieser Stelle stehen alle eigenständigen Kapitel, welche auf allgemeingültige Spielpraxen eingehen. ==Grundsätzliches== #[[Gitarre: Grundhaltung der Gitarre|Grundhaltung der Gitarre]] #[[Gitarre: Lesen von Diagrammen, Tabulaturen und Noten|Lesen von Diagrammen, Tabulaturen und Noten]] #[[Gitarre: Intelligent und sinnvoll üben]] ==Rhythmusgitarre== ===Akkorde und Griffe=== #[[Gitarre: Grifftabelle einfach|einfache Grifftabelle]] für die häufigst gebrauchten Akkorde #[[Gitarre: offene Akkorde|offene Akkorde]] #[[Gitarre: verschiebbare Akkorde|verschiebbare Akkorde]] #[[Gitarre: Barrégriffe|Barrégriffe]] #[[Gitarre: Akkordformen|Akkordformen]] (Systematik) #[[Gitarre: Aufbau von Akkorderweiterungen | Aufbau von Akkorderweiterungen]] #[[Gitarre: Modale Akkorde | Modale Akkorde]] #[[Gitarre: verminderte (diminished-) Akkorde | verminderte (diminished-) Akkorde]] #[[Gitarre: erweiterte (augmented-) Akkorde | erweiterte (augmented-) Akkorde]] ===Umgang mit Akkorden und Akkordfolgen=== Eine Sammlung sehr umfangreicher Workshops und Tutorials #[[Gitarre: Akkorde heraushören|Akkorde heraushören]] ## [[Gitarre: Akkordprogressionen|Standard-Akkordprogressionen]] ## [[Gitarre: Tonart mittels Skalen bestimmen|Tonart mittels Skalen bestimmen]] #[[Gitarre: Tonleiter-fremde Akkorde|Typische Tonleiter-fremde Akkorde]] #[[Gitarre: Akkordfolgen erweitern|Akkordfolgen erweitern]] ===Schlag-, Zupf- und Melodietechniken=== ;Folkdiplom *[[Gitarre: Folkdiplom - Rhythmus-Variationen| Einfache Schlagmuster und Variationen]] *[[Gitarre: Einführung ins Zupfen|Einführung ins Zupfen]] *[[Gitarre: Nagelpflege| Nagelpflege]] *[[Gitarre: Folkdiplom - Hammer-On | Hammer-On]] *[[Gitarre: Folkdiplom - Pull-Off | Pull-Off]] ;Balladendiplom *[[Gitarre: Einführung in das 3-Finger-Picking| Einführung in das 3-Finger-Picking]] ;Rockdiplom *[[Gitarre: Schlagmuster erarbeiten|Schlagmuster erarbeiten]] ;Rockballadendiplom *[[Gitarre: Diatonischer Quintfall in Am mit Samba-Rhythmen| Samba-Rhythmen]] ;Sologitarre *[[Gitarre: Plektrum-Picking | Plektrum-Picking]] *[[Gitarre: Flat-Picking | Flat-Picking]] *[[Gitarre: Alternate Picking | Alternate-Picking]] *[[Gitarre: Palm Mute | Palm Mute]] *[[Gitarre: Tappingtechnik | Tapping]] *[[Gitarre: Künstliche Obertöne (artificial Harmonics) | Künstliche Obertöne (artificial Harmonics)]] *[[Gitarre: Saitenziehen (Bending) | Saitenziehen (Bending)]] *[[Gitarre: Vibrato | Vibrato]] *[[Gitarre: Tremolo | Tremolo]] *[[Gitarre: Glissando (Sliding) | Glissando (Sliding)]] *[[Gitarre: Staccato- und Legatospiel | Staccato- und Legatospiel]] *[[Gitarre: Repeating-Patterns | Repeating-Patterns]] *[[Gitarre: Whammy Bar Techniken| Whammy Bar Techniken]] *[[Gitarre: Pedalton Licks | Pedalton Licks]] *[[Gitarre: Economic-Picking und Sweeping | Economic-Picking und Sweeping]] *[[Gitarre: String-Skipping | String-Skipping]] ;in Vorbereitung *[[Gitarre: Akkordprogressionen|Akkordprogressionen]](Lektion im Rockballadendiplom) ==Melodiegitarre== ===Skalen und Patterns=== {| {{Prettytable-R}} | {{PDF-Version|Dur-Tonleitern Theorie Gitarre..pdf|Dur-Tonleitern (Theorie - Übungsblatt)}} |- | {{PDF-Version|Moll-Tonleitern Theorie Gitarre.pdf|Moll-Tonleitern (Theorie - Übungsblatt)}} |- | {{PDF-Version|Gitarre Haupt-Skalen-Akkkorde-Pentatoniken.pdf|ein Spicker: die wichtigsten Skalen auf einen Blick}} |} #[[Gitarre: C-Dur-Tonleiter Workshop | C-Dur-Tonleiter in den ersten drei Bünden]] (Grundlegendes incl. PDFs) # [[Gitarre: Einführung in das Improvisieren|Erste Einführung in die Improvisation]] (bevor es mit der Sologitarre richtig los geht.) #[[Gitarre: Barré-Akkorde Positionen merken|Die ersten Positionen für Barré-Akkorde]] (Grundlegendes) #[[Gitarre: Note-Location Workshop|Note-Location Workshop]] (Weiterführendes) #[[Gitarre: Formen-Systematik|Formen-Systematik]] (Konventionen im Gitarrenbuch) #[[Gitarre: Aufbau der Skalenformen| die 5 Hauptskalenformen]](Lektionen) #Pentatonik ##[[Gitarre: Pentatonik Zusammenfassungen 1|Pentatonik Zusammenfassung]] (Gesamtübersicht) ##[[Gitarre: Die Dur-Pentatonik | Die Dur-Pentatonik]] (Übersicht) ##[[Gitarre: Die Moll-Pentatonik | Die Moll-Pentatonik]] (Übersicht) ##[[Gitarre: Die Pentatonik im Blues | Die Pentatonik im Blues]] (Übersicht) ##[[Gitarre: Pentatonik und Bluesworkshop | Pentatonik und Bluesworkshop]] (Lehrgang) {{:Gitarre: Pentatonik und Bluesworkshop/ Status}} ##[[Gitarre: Pentatonik Skalen verbinden|Pentatonik Skalen verbinden]] (sog. Longform) #Dur- und Moll-Skalen / Arpeggios ##[[Gitarre: Aufbau der Skalenformen|Aufbau der Skalenformen]] (Grundlegendes incl. PDF) ##[[Gitarre: Die Major-Patterns | Die Major-Patterns]] ##[[Gitarre: Harmonisch Moll | Harmonisch Moll]] ##[[Gitarre: Melodisch Moll | Melodisch Moll]] ##[[Gitarre: 3-Notes-Per-String Skalen | 3-Notes-Per-String Skalen]] (Mods / Kirchentonleitern) ##[[Gitarre: Arpeggios | Arpeggios]] #Besondere Skalen ##[[Gitarre: verminderte (diminished-) Tonleitern | verminderte (diminished-) Tonleitern]] ##[[Gitarre: erweiterte (augmented-) Tonleitern | erweiterte (augmented-) Tonleitern]] ##[[Gitarre: chromatische Tonleiter | chromatische Tonleiter]] ##[[Gitarre: Ganzton-Leiter | Ganzton-Leiter]] =Theoretische Grundlagen= Die Gitarre ist ein Instrument, das man auch mit sehr wenig Kenntnis über Harmonielehre gut erlernen kann. Trotzdem ist es an manchen Stellen wichtig, etwas über die Zusammenhänge der Noten zu wissen. Durch das Erlernen simpler Regeln kann man den Übungs- und Lernaufwand oftmals mehr als halbieren, denn die Theorie ist nichts anderes als formulierte Erfahrungen vorangegangener Musiker. Warum sollte man sich also weigern, von anderen zu lernen? Wenn man die Theorie auf ein sinnvolles Maß reduziert, dann sind die Lektionen sehr einfach erlernbar und von unschätzbarem Wert. Man darf allerdings niemals Theorie vor Praxis setzen, denn in der Musik gilt: ''"Was immer sich richtig anhört, ist auch richtig"''. Die Regeln erleichtern das Finden von Noten und die Geläufigkeit auf dem Griff, sie ersetzen niemals das Experimentieren mit ihnen! ==Allgemeines== Die weitaus meisten Regeln gelten für alle Instrumente, deshalb befinden sich einige theoretische Grundlagen der Musik im Buch Musiklehre. *[[Bild:Wikibooks-Einzelbuch.png|20px]] [[Musiklehre]] =Anhang= ==Tabellen&nbsp;– Bibliothek== #[[Gitarre: Formen-Systematik|Formen-Systematik]] (Typisierung und Katalogisierung) #[[Gitarre: Akkordformen | Akkordformen]] #[[Gitarre: Zupf- und Schlagmuster - Bibliothek | Zupf- und Schlagmuster&nbsp;– Bibliothek]] == Tipps und Tricks == {| {{Prettytable-R}} | {{PDF-Version|Noten lesen lernen mit Tricks.pdf|Noten lesen lernen mit vielen Eselsbrücken}} |} #[[Gitarre: Akkorde anzeigen| Akkorde anzeigen]] <br clear="all" /> == Linkliste == *[[Gitarre: Linkliste| Linkliste für Gitarristen]] **[[Gitarre: Linkliste#Grifftabellen| incl. Grifftabellen für Gitarristen]] *[[Gitarre: Freeware für Gitarristen | Freeware für Gitarristen]] ==Leserreaktionen== *[[Gitarre: Erfahrungsbericht Lagerfeuerdiplom|Erfahrungsbericht Lagerfeuerdiplom]] *[[Gitarre: Erfahrungsbericht Folkdiplom|Erfahrungsbericht Folkdiplom]] == [[Gitarre: Rumpelkammer |<span style="color:orange;"> Rumpelkammer</span> ]] == ;fertig ausarbeiten # [[Gitarre: Der erweiterte Quintenzirkel | Der erweiterte Quintenzirkel]]&nbsp;– Wie verhält sich der Quintenzirkel bei den Kirchentonarten? [[Image:2von10.png|20%]] # [[Gitarre: Transponier-Tool|Transponier-Tool]] # [[Gitarre: Transponiertabelle|Transponiertabelle]] # [[Gitarre: Glossar]] ;Spicker #[[Image:Gitarre Haupt-Skalen-Akkkorde-Pentatoniken.pdf|PDF-Spicker aller Hauptskalen / Akkordformen / Pentatoniken in Dur und Moll]] ; Ausschlachten... ...und in vorhandene Seiten integrieren. Artikel, die noch verschoben oder integriert werden müssen: # [[Gitarre: Textfragmente]](für alle Textbausteine, die nicht verloren gehen sollen) # [[Gitarre: Sologitarre für Fortgeschrittene | Sologitarre für Fortgeschrittene]] # [[Gitarre: Rhythmusbeispiele 1]] ; Quellen für Autoren # [[:Kategorie:Liederbuch/ Lieder]] # [[:Kategorie:Liederbuch/ Tabulatur]] ; Hilfe für Autoren # [[Gitarre: Schnellformate|Schnellformate]] # [[Liederbuch/ Lieder in Word oder HTML formatieren]] (für Autoren) # [[Gitarre: Anhang Farbkodierung der Intervalle|Farbkodierung der Intervalle]] # [[Liederbuch/ Zeichenvorlage Takt Module|Taktmodule zum Selberbauen]] (für Autoren) # {{PDF-Version|Powertab-Tutorial.pdf| für potentielle Wikibook-Autoren ist hier eine Einführung in das Freeware-Tabulaturprogramm "Powertab"}} ---- {{Regal|ort=Musik}} [[be:Гітара]] [[bn:গিটার]] [[en:Guitar]] [[fi:Kitarakirja]] [[fr:Apprendre la guitare]] [[he:גיטרה]] [[it:Chitarra]] [[nl:Gitaar/Inleiding & inhoud]] [[pa:Guitar]] [[pl:Nauka gry na gitarze]] [[pt:Guitarra]] [[pt:Violão]] [[ru:Самоучитель игры на гитаре]] [[uk:Гітара]] [[zh:吉他]] peg7q370qncqmooaqcmewryjs56t5qk Computerhardware: HDD: Part-ID 0 17235 1082877 437769 2026-04-07T11:36:04Z Y2kbug 3461 Alle Partitionstypen aus gptfdisk-1.0.10.tar.gz: gptfdisk-1.0.10/parttypes.cc (siehe https://sourceforge.net/projects/gptfdisk/files/gptfdisk/1.0.10/) 1082877 wikitext text/x-wiki Diese hexadezimalen Werte werden in der Partitionstabelle verwendet, um den Typ einer Partition zu kennzeichnen. {|border="1" cellspacing="0" cellpadding="2" |valign="middle" align="center"| '''00''' |''unbenutzt'', ''leer'' |- |valign="middle" align="center"| '''01''' |DOS FAT12 |- |valign="middle" align="center"| '''02, 03''' |XENIX |- |valign="middle" align="center"| '''04''' |DOS FAT16 <&nbsp;32&nbsp;MByte |- |valign="middle" align="center"| '''05''' |DOS Extended Partition |- |valign="middle" align="center"| '''06''' |DOS („Big DOS“) FAT16 >&nbsp;32&nbsp;MByte und <&nbsp;2&nbsp;GB |- |valign="middle" align="center"| '''07''' |Unix, {{w|High Performance File System|HPFS}}, {{w|NTFS}, ArcaOS Typ&nbsp;1 |- |valign="middle" align="center"| '''08''' |OS/2, AIX, DELL |- |valign="middle" align="center"| '''09''' |AIX, Coherent |- |valign="middle" align="center"| '''0A''' |OS/2 BootManager |- |valign="middle" align="center"| '''0B''' |FAT32 mit {{w|CHS-Adressierung}} |- |valign="middle" align="center"| '''0C''' |FAT32 mit {{w|Logical Block Addressing|LBA}} |- |valign="middle" align="center"| '''0E''' |FAT16 mit {{w|Logical Block Addressing|LBA}} |- |valign="middle" align="center"| '''0F''' |FAT32 Erweiterte Partition mit {{w|Logical Block Addressing|LBA}} |- |valign="middle" align="center"| '''10''' |OPUS |- |valign="middle" align="center"| '''11''' |FAT12 versteckt; u.&nbsp;a. verwendet von OS/2 |- |valign="middle" align="center"| '''12''' |Compaq |- |valign="middle" align="center"| '''14''' |FAT16 (<&nbsp;32&nbsp;MB) versteckt (u.&nbsp;a. OS/2) |- |valign="middle" align="center"| '''16''' |FAT16 „Big DOS“ versteckt (u.&nbsp;a. OS/2) |- |valign="middle" align="center"| '''17''' |{{w|NTFS}} versteckt, {{w|High Performance File System|HPFS}} versteckt (u.&nbsp;a. OS/2) |- |valign="middle" align="center"| '''18''' |AST |- |valign="middle" align="center"| '''1B''' |FAT32 versteckt ({{w|CHS-Adressierung|CHS}}) |- |valign="middle" align="center"| '''1C''' |FAT32 versteckt ({{w|Logical Block Addressing|LBA}}) |- |valign="middle" align="center"| '''1E''' |FAT16 versteckt ({{w|Logical Block Addressing|LBA}}) |- |valign="middle" align="center"| '''24''' |NEC MS-DOS 3.x |- |valign="middle" align="center"| '''27''' |{{w|Windows-Wiederherstellungsumgebung|Windows RE}} {{w|Wiederherstellungsvolume|Wiederherstellungspartition}} |- |valign="middle" align="center"| '''30''' |Open Network Install Environment (ONIE) |- |valign="middle" align="center"| '''39''' |{{w|Plan 9 (Betriebssystem)|Plan 9}} |- |valign="middle" align="center"| '''3C''' |PowerQuest |- |valign="middle" align="center"| '''41''' |Personal RISC, PowerPC Reference Platform (PReP) boot |- |valign="middle" align="center"| '''42''' |SFS, Windows Logical Disk Manager (LDM) „dynamische Datenträger“ |- |valign="middle" align="center"| '''50''' |OnTrack |- |valign="middle" align="center"| '''51''' |OnTrack, Novell |- |valign="middle" align="center"| '''52''' |CP/M, Microport |- |valign="middle" align="center"| '''53, 54''' |OnTrack |- |valign="middle" align="center"| '''56''' |GoldenBow |- |valign="middle" align="center"| '''61''' |SpeedStor |- |valign="middle" align="center"| '''63''' |Unix, Mach, GNU HURD |- |valign="middle" align="center"| '''64''' |Novell NetWare 2 |- |valign="middle" align="center"| '''65''' |Novell NetWare 3 |- |valign="middle" align="center"| '''67, 68, 69''' |Novell |- |valign="middle" align="center"| '''70''' |DiskSecure |- |valign="middle" align="center"| '''75''' |{{w|PC/IX}}, {{w|IBM General Parallel File System|GPFS}} |- |valign="middle" align="center"| '''7F''' |{{w|ChromeOS}} |- |valign="middle" align="center"| '''80''' |Minix |- |valign="middle" align="center"| '''81''' |Minix, Linux |- |valign="middle" align="center"| '''82''' |Linux {{w|Swapping|Swap}}, Prime |- |valign="middle" align="center"| '''83''' |{{w|Linux}} |- |valign="middle" align="center"| '''84''' |OS/2, ''Intel Rapid Start'', Intel ''SPDX'' |- |valign="middle" align="center"| '''85''' |Linux Extended, {{w|Core&nbsp;OS}} bzw. Container Linux |- |valign="middle" align="center"| '''87''' |HPFS |- |valign="middle" align="center"| '''8E''' |Linux {{w|Logical Volume Manager|LVM}} |- |valign="middle" align="center"| '''93, 94''' |Amoeba |- |valign="middle" align="center"| '''A0''' |{{w|Android (Betriebssystem)|Android}} |- |valign="middle" align="center"| '''A2''' |Atari {{w|TOS (Betriebssystem)|TOS}} |- |valign="middle" align="center"| '''A5''' |{{w|FreeBSD}}, {{w|MidnightBSD}} |- |valign="middle" align="center"| '''A6''' |{{w|OpenBSD}} {{w|disklabel}} |- |valign="middle" align="center"| '''A8''' |Apple {{w|Unix File System|UFS}} ({{w|Mac OS&nbsp;X}}) |- |valign="middle" align="center"| '''A9''' |{{w|FreeBSD}} {{w|disklabel}}, {{w|NetBSD}} |- |valign="middle" align="center"| '''AB''' |{{w|macOS}} {{w|Wiederherstellungsvolume}} „Recovery HD“ |- |valign="middle" align="center"| '''AF''' |Apple: {{w|HFS (Dateisystem)|HFS}}, {{w|HFS Plus|HFS+}}, {{w|Apple File System|APFS}}, {{w|disklabel|Apple Label}}, {{w|RAID}}/{{w|RAID#Software-RAID|SoftRAID}}, {{w|Apple&nbsp;TV}} {{w|Wiederherstellungsvolume}} |- |valign="middle" align="center"| '''B0''' |{{w|Das U-Boot|U-Boot}} {{w|Bootloader}} |- |valign="middle" align="center"| '''B3''' |{{w|QNX|QNX6}} ''Power-Safe'' |- |valign="middle" align="center"| '''B7, B8''' |BSDI |- |valign="middle" align="center"| '''BB''' |Barebox {{w|Bootloader}} |- |valign="middle" align="center"| '''BC''' |''Acronis Secure Zone'' |- |valign="middle" align="center"| '''BE''' |{{w|Solaris (Betriebssystem)|Solaris}} boot |- |valign="middle" align="center"| '''BF''' |{{w|Solaris (Betriebssystem)|Solaris}} |- |valign="middle" align="center"| '''C0''' |{{w|HP-UX}} |- |valign="middle" align="center"| '''C1, C4, C6''' |DR DOS 6.0 |- |valign="middle" align="center"| '''D8''' |CP/M-86 |- |valign="middle" align="center"| '''DB''' |CTOS |- |valign="middle" align="center"| '''E0''' |''Open Network Install Environment'' (ONIE) |- |valign="middle" align="center"| '''E1''' |SpeedStor |- |valign="middle" align="center"| '''E3''' |DOS read-only, Storage Dimension |- |valign="middle" align="center"| '''E4''' |SpeedStor |- |valign="middle" align="center"| '''E9''' |{{w|VeraCrypt}}-Daten |- |valign="middle" align="center"| '''EA''' |XBOOTLDR-Partition |- |valign="middle" align="center"| '''EB''' |{{w|Haiku (Betriebssystem)|Haiku}} {{w|Be File System|BFS}} |- |valign="middle" align="center"| '''ED''' |proprietäre {{w|GUID_Partition_Table#Systempartition|Systempartition}}, u.&nbsp;a. von Sony und Lenovo |- |valign="middle" align="center"| '''EF''' |{{w|GUID_Partition_Table#EFI_System_Partition|EFI-Systempartition}} (ESP), {{w|Master Boot Record|MBR}}-{{w|Partitionsschema}} (in der Partition untergebracht), ''{{lang|en|BIOS Boot Partition}}'' für {{w|Grand Unified Bootloader|GRUB}} |- |valign="middle" align="center"| '''F1''' |Storage Dimension, {{w|Google Fuchsia|Fuchsia}} |- |valign="middle" align="center"| '''F2''' |DOS 3.3+ |- |valign="middle" align="center"| '''F8''' |{{w|Ceph}} |- |valign="middle" align="center"| '''FB, FC''' |{{w|VMware}} |- |valign="middle" align="center"| '''FD''' |Linux {{w|RAID}} |- |valign="middle" align="center"| '''FE''' |LANstep, PS/2 |- |valign="middle" align="center"| '''FF''' |Xenix |} r9r0ij9sqogmhmsh8eewg0u0inohi5d Gitarre: Barré-Akkorde Positionen merken 0 37798 1082867 1082842 2026-04-07T00:56:04Z ~2026-21413-45 115946 /* Eselsbrücken */Stil 1082867 wikitext text/x-wiki {{:Gitarre/ Navi|Rockdiplom| {{:Gitarre:_Rockdiplom/ Navi}}| {{:Gitarre:_Rockdiplom/ Navi_Barree_1}}| img=Rockdiplom.gif |bg=LightCyan|border=indigo|color=indigo}} = Wie merkt man sich am einfachsten die Lage von Barré-Akkorden und Powerchords = In Akkordbücher siehst du tausende Akkorde und fragst dich, wie man sich alle merken soll. Das musst du aber nicht. Zumindest nicht gleich am Anfang. Anfangs genügen vier Barré-Formen auf einer handvoll Positionen. Du solltest die C-Dur-Tonleiter auf dem Griffbrett beherrschen. {{Vorlage:Navigation Vertiefung|Gitarre: C-Dur-Tonleiter_Workshop | C-Dur-Tonleiter in den ersten drei Bünden}} Leite dir die Grundtöne der Barré-Akkorde von den einfachen Grundakkorden ab. {| !Dur-Barré-Form||Dur-Akkord||Grundtonschema||Moll-Akkord||Moll-Barré-Form|| |- |[[Image:Crd Form A Bb.svg|100px]]||[[Image:Crd A.svg|100px]]||[[Image:Crd Typ ABb.svg|100px]]||[[Image:Crd Am.svg|100px]]||[[Image:Crd Form Am.svg|100px]]|| |- |[[Image:Crd Form E F.svg|100px]]||[[Image:Crd E.svg|100px]]||[[Image:Crd Typ EF.svg|100px]]||[[Image:Crd Em.svg|100px]]||[[Image:Crd Form Em.svg|100px]]|| |} Dass man die Akkordformen unterschiedlich benennen kann, braucht dich vorerst nicht zu interessieren. Uns interessieren heute nur die Grundtöne auf der E- und der A-Saite. Kennst du den Ton auf der A- oder E-Saite, dann weißt du auch wie der dazugehörige Barré-Akkord heißt. == Eselsbrücken == Nutze die Basstöne von C A G und E sowie die Töne A und D vom [[Gitarre: Stimmen mit Bünden|Stimmen der Gitarre]]. :[[Image:Erste Griffbrettorientierung.svg|401px]] * Der Grundton vom G ist der '''Ringfinger''' auf dem 3. Bund der E-Saite. : Also ist der Barré-Akkord der E-Form im 3. Bund ein G. * Der Grundton vom C ist der '''Ringfinger''' auf dem 3. Bund der A-Saite. : Also ist der Barré-Akkord der A-Form im 3. Bund ein C. * Die leere A-Saite wird mit der E-Saite im 5. Bund gestimmt. : Also ist der Barré-Akkord der E-Form im 5. Bund ein A. * Die leere D-Saite wird mit der A-Saite im 5. Bund gestimmt. : Also ist ein Barré-Akkord der A-Form im 5. Bund ein D. *ein Barré-Akkord der E-Form im 12. Bund ist ebenfalls ein E. *ein Barré-Akkord der A-Form im 12. Bund ist ebenfalls ein A. * Den F-Barré im 1. Bund baust du dir langsam vom einfachen "kleinen" F über das "mittlere" F bis hin zum F-Barré auf. {| |[[image:Crd F ZMR.svg]] |[[image:Crd F ZMRK.svg]] |'''F-Barré'''<br />[[image:Crd Barré F-Typ.svg]] |} ;Siehe auch *[[Gitarre: Randbemerkung zum F-Dur-Griff]] == Wie macht man weiter? == Die beiden Akkorde E und B (deutsch H) im 7. Bund wirst du wahrscheinlich recht bald lernen, da es einige bekannte Lieder gibt, die wo man die Barrés brauchen kann. Mit den paar Tönen hast du zwar noch nicht das komplette Griffbrett erobert, doch die noch unbekannten Akkorde sind höchstens zwei Bünde von den bekannten entfernt . Wenn du die chromatische Tonleiter aufwärts :'''E'''-F-F#-'''G'''-G#-'''A'''-A#-C-C#-D-D#-'''E''' oder abwärts kannst, :'''A'''-Bb-B-'''C'''-Db-'''D'''-E-F-Gb-G-Ab-'''A''' dann zählst du die restlichen Akkorde einfach ab. Lasse dir von niemandem einreden, du müssest jetzt sofort ALLE Töne auf dem Griffbrett auswendig können. Solange du noch am Lernen bist, hast du vor jedem Lied genug Zeit, die Position der Barré-Akkorde abzuzählen. Übernimmst du das Lied dann in dein Repertoire, lernst du die Barrés automatisch auswendig. Das komplette Griffbrett lernst du erst dann auswendig, wenn dein Repertoire so groß ist, dass du es eh fast schon auswendig kannst. Vergiss nicht: du sollst das nicht können, du sollst das lernen. Gehe also schrittweise vor. Die Akkorde F#m und G#m sowie Bm (bzw. Hm) lassen sich leicht von dem Grundton der Akkorde G- und C-Dur ableiten. (Jeweils einen Bund vor- oder rückwärts.) Den Bm (Hm) könnte du dir sogar vom Grundton des B7 (= H7) ableiten. Lerne die Grundtöne der Barrés Schritt für Schritt bzw. Lied für Lied und bald schon kannst du alle wichtigen Barré-Akkorde ohne Nachdenken spielen. Wie man mit Hilfe der Barré-Akkorde die übrigen Töne auf dem Griffbrett findet, ist Stoff für den späteren [[Gitarre: Note-Location Workshop|Note-Location Workshop]]. {{:Vorlage:Navigation hoch}} n1l3vqh3cyzaqx96ldnlyr8fez7ybhx Liederbuch/ Brahms Gutenacht-Lied 0 38208 1082864 1034283 2026-04-06T16:15:58Z Mjchael 2222 /* Brahms Gutenachtlied */ \transpose d v { 1082864 wikitext text/x-wiki [[Gitarre: Folkslieder und Folksongs]] Liedvorschlag für: [[Gitarre: Griffwechsel C-F-G]] = Brahms Gutenachtlied = [[Gitarre: Rechte unbekannt |Volkslied (Traditional)]] Bearbeitet von [[Benutzer:Mjchael|Mjchael]] <score vorbis="1"> \transpose d c { \new PianoStaff << \new Staff { \time 3/4 \key d \major \tempo "Andantino" \partial 4 << \new Voice = "melody" { \relative f' { \stemUp fis8 fis | a4.^\p^\( fis8\) fis4 | <a fis> r fis8( a) | <d g,>4^\(^\< cis4. b8\)\! | b4^\(^\> a e8( fis)\! | g4^\( e e8[( fis])\) | <g cis,>4 r e8( g) | cis8^\(^\< b a4\) cis4\!^\< | <d fis,>4\! r d,8 d | d'2^\p^\( b8 g\) | a2^\( fis8 d\) | g4^\(^\< <a fis>\!^\> <b g>\)\! | <a fis d>2 d,8 d | <d' g,>2^\p^\( b8 g\) | <a d,>2^\(^\< fis8 d\) | <g d b>4^\dim^\( <fis d a>\! <e cis>\) | d2 \bar "|." } } \new Voice = "two" { \relative f' { \stemDown s4 fis2 s4 s2.*2 d2 s4 cis2. | s2. g'2 fis8( e) | s2. g2 d4 d2 s4 | d2. s s2 d4 } } >> } \new Lyrics \lyricsto "melody" { %\set stanza = #"1. Gu -- ten A -- bend, gut Nacht Mit Ro -- sen be -- dacht _ Mit Nel -- ken be -- deckt Schlupf un -- ter die Deck. _ Mor -- gen früh wenn Gott will Wirst du wie -- der ge -- weckt, Mor -- gen früh wenn Gott will Wirst du wie -- der ge -- weckt. } \new Staff { \clef bass \key d \major r4 | <d a>2 r4 | q2 r4 | b4( a4. g8 | g4( fis) r | <a, e>2 r4 | <a, a>2 r4 | a,2( a4) | d4 r r | b2( g8 e) | fis4( d) a | b,( a, g,) | d,( d) r | b2( g8 e) | fis4( d) r | g,( a,) <a, g> | <d fis>2 } >> } %% End transpose </score> Quelle: [[s:The Child's Own Music Book/Cradle Song (Brahms)|Cradle Song (Brahms)]], in: Albert Ernest Wier, ''[[s:Index:Childs own music book.djvu|The Child's Own Music Book]]'', New York : Mumil Publishing Co., Inc., 1918, p. [[s:Page:Childs own music book.djvu/33|25]]. :[[Image:Crd_C.svg |100px]] [[Image:Crd_F_ZMR.svg|100px]] [[Image:Crd_G.svg|100px]] [[Image:Crd_G7.svg|100px]] :[[Image:Tab start.svg|10px]][[Image:Tact ead.svg|10px]][[Image:Tact0_u.svg|10px]][[Image:Tact gbe.svg|10px]][[Image:Tact ebg.svg|10px]][[Image:Tact gbe.svg|10px]][[Image:Tact ebg.svg|10px]][[Image:Tab end.svg|10px]] [[Image:Tab start.svg|10px]][[Image:Tact ead.svg|10px]][[Image:Tact0_u.svg|10px]][[Image:Tact gbe.svg|10px]][[Image:Tact0_u.svg|10px]][[Image:Tact gbe.svg|10px]][[Image:Tact0_u.svg|10px]][[Image:Tab end.svg|10px]] == Brahms Gutenachtlied == :Guten {{crd|C}} Abend, gut Nacht :Mit {{crd|F}} Rosen be- {{crd|C}} dacht :Mit {{crd|G}} Nelken bedeckt :Schlupf {{crd|G7}} unter die {{crd|C}} Deck ::Morgen {{crd|F}} früh wenn Gott {{crd|C}} will ::Wirst du {{crd|G}} wieder ge- {{crd|C}} weckt ::Morgen {{crd|F}} früh wenn Gott {{crd|C}} will ::Wirst du {{crd|G}} wieder ge- {{crd|C}} weckt :Guten {{crd|C}} Abend, gut Nacht :Von {{crd|F}} Englein be- {{crd|C}} wacht :Die {{crd|G}} zeigen im Traum :Dir {{crd|G7}} Christkindleins {{crd|C}} Baum ::Schlaf nur {{crd|F}} selig und {{crd|C}} süss ::Schau im {{crd|G}} Traum's Para- {{crd|C}} dies ::Schlaf nur {{crd|F}} selig und {{crd|C}} süss ::Schau im {{crd|G}} Traum's Para- {{crd|C}} dies == Brahms Lullaby (Übertragung) == : Lulla- {{crd|C}} by, and good night, : With pink {{crd|F}}roses be-{{crd|C}}dight, : With {{crd|G}}lilies overspread, : Is my {{crd|G7}}baby's wee, sweet {{crd|C}}head. :: Lay you {{crd|F}} down now, and {{crd|C}} rest, :: May your {{crd|G}} slumber be {{crd|C}} blessed! :: Lay you {{crd|F}} down now, and {{crd|C}}rest, :: May thy {{crd|G}} slumber be {{crd|C}} blessed! : Lulla-{{crd|C}}by, and good night, : You're your {{crd|F}}mother's de-{{crd|C}}light, : Shining {{crd|G}} angels beside : My {{crd|G7}}darling a-{{crd|C}}bide. :: Soft and {{crd|F}}warm is your {{crd|C}}bed, :: Close your {{crd|G}}eyes and rest your {{crd|C}}head. :: Soft and {{crd|F}}warm is your {{crd|C}}bed, :: Close your {{crd|G}}eyes and rest your {{crd|C}}head. == Brahms Lullaby (Neudichtung) == : Sleepy-{{crd|C}}head, close your eyes. : Mother's {{crd|F}}right here be-{{crd|C}}side you. : I'll pro-{{crd|G}}tect you from harm, : You will {{crd|G7}}wake in my {{crd|C}}arms. :: Guardian {{crd|F}}angels are {{crd|C}}near, :: So sleep {{crd|G}}on, with no {{crd|C}}fear. :: Guardian {{crd|F}}angels are {{crd|C}}near, :: So sleep {{crd|G}}on, with no {{crd|C}}fear. : Lulla-{{crd|C}}by, and sleep tight. : Hush! My {{crd|F}}darling is {{crd|C}}sleeping, : On his {{crd|G}}sheets white as cream, : With his {{crd|G7}}head full of {{crd|C}}dreams. :: When the {{crd|F}}sky's bright with {{crd|C}}dawn, :: He will {{crd|G}}wake in the {{crd|C}}morning. :: When {{crd|F}}noontide warms the {{crd|C}}world, :: He will {{crd|G}}frolic in the {{crd|C}}sun. ==Weblinks== *[http://www.youtube.com/watch?v=bzegc8yeqM0 Video auf YouTube] <noinclude> [[Kategorie:Liederbuch/ Lieder|Gutenacht-Lied]] [[Kategorie:Liederbuch/ Folkdiplom|Gutenacht-Lied]] [[Kategorie:Liederbuch/ Lieder auf Deutsch|Gutenacht-Lied]] [[Kategorie:Liederbuch/ Folk-Songs|Gutenacht-Lied]] [[Kategorie:Liederbuch/ Kinderlied|Gutenacht-Lied]] </noinclude> d4x3evavvjd08ewmqsii5uwej5auyxp 1082865 1082864 2026-04-06T16:18:58Z Mjchael 2222 /* Brahms Gutenachtlied */ 7 1082865 wikitext text/x-wiki [[Gitarre: Folkslieder und Folksongs]] Liedvorschlag für: [[Gitarre: Griffwechsel C-F-G]] = Brahms Gutenachtlied = [[Gitarre: Rechte unbekannt |Volkslied (Traditional)]] Bearbeitet von [[Benutzer:Mjchael|Mjchael]] <score vorbis="1"> \transpose d c { \new PianoStaff << \new Staff { \time 3/4 \key d \major \tempo "Andantino" \partial 4 << \new Voice = "melody" { \relative f' { \stemUp fis8 fis | a4.^\p^\( fis8\) fis4 | <a fis> r fis8( a) | <d g,>4^\(^\< cis4. b8\)\! | b4^\(^\> a e8( fis)\! | g4^\( e e8[( fis])\) | <g cis,>4 r e8( g) | cis8^\(^\< b a4\) cis4\!^\< | <d fis,>4\! r d,8 d | d'2^\p^\( b8 g\) | a2^\( fis8 d\) | g4^\(^\< <a fis>\!^\> <b g>\)\! | <a fis d>2 d,8 d | <d' g,>2^\p^\( b8 g\) | <a d,>2^\(^\< fis8 d\) | <g d b>4^\dim^\( <fis d a>\! <e cis>\) | d2 \bar "|." } } \new Voice = "two" { \relative f' { \stemDown s4 fis2 s4 s2.*2 d2 s4 cis2. | s2. g'2 fis8( e) | s2. g2 d4 d2 s4 | d2. s s2 d4 } } >> } \new Lyrics \lyricsto "melody" { %\set stanza = #"1. Gu -- ten A -- bend, gut Nacht Mit Ro -- sen be -- dacht _ Mit Nel -- ken be -- deckt Schlupf un -- ter die Deck. _ Mor -- gen früh wenn Gott will Wirst du wie -- der ge -- weckt, Mor -- gen früh wenn Gott will Wirst du wie -- der ge -- weckt. } \new Staff { \clef bass \key d \major r4 | <d a>2 r4 | q2 r4 | b4( a4. g8 | g4( fis) r | <a, e>2 r4 | <a, a>2 r4 | a,2( a4) | d4 r r | b2( g8 e) | fis4( d) a | b,( a, g,) | d,( d) r | b2( g8 e) | fis4( d) r | g,( a,) <a, g> | <d fis>2 } >> } %% End transpose </score> Quelle: [[s:The Child's Own Music Book/Cradle Song (Brahms)|Cradle Song (Brahms)]], in: Albert Ernest Wier, ''[[s:Index:Childs own music book.djvu|The Child's Own Music Book]]'', New York : Mumil Publishing Co., Inc., 1918, p. [[s:Page:Childs own music book.djvu/33|25]]. :[[Image:Crd_C.svg |100px]] [[Image:Crd_F_ZMR.svg|100px]] [[Image:Crd_G.svg|100px]] [[Image:Crd_G7.svg|100px]] :[[Image:Tab start.svg|10px]][[Image:Tact ead.svg|10px]][[Image:Tact0_u.svg|10px]][[Image:Tact gbe.svg|10px]][[Image:Tact ebg.svg|10px]][[Image:Tact gbe.svg|10px]][[Image:Tact ebg.svg|10px]][[Image:Tab end.svg|10px]] [[Image:Tab start.svg|10px]][[Image:Tact ead.svg|10px]][[Image:Tact0_u.svg|10px]][[Image:Tact gbe.svg|10px]][[Image:Tact0_u.svg|10px]][[Image:Tact gbe.svg|10px]][[Image:Tact0_u.svg|10px]][[Image:Tab end.svg|10px]] == Brahms Gutenachtlied == :Guten {{crd|C}} Abend, gut Nacht :Mit {{crd|F}} Rosen be- {{crd|C}} dacht :Mit {{crd|G}} Nelken bedeckt :Schlupf {{crd|G7}} unter die {{crd|C}} Deck ::Morgen {{crd|F}} früh wenn Gott {{crd|C}} will ::Wirst du {{crd|G}} wieder ge- {{crd|C}} weckt ::Morgen {{crd|F}} früh wenn Gott {{crd|C}} will ::Wirst du {{crd|G7}} wieder ge- {{crd|C}} weckt :Guten {{crd|C}} Abend, gut Nacht :Von {{crd|F}} Englein be- {{crd|C}} wacht :Die {{crd|G}} zeigen im Traum :Dir {{crd|G7}} Christkindleins {{crd|C}} Baum ::Schlaf nur {{crd|F}} selig und {{crd|C}} süss ::Schau im {{crd|G}} Traum's Para- {{crd|C}} dies ::Schlaf nur {{crd|F}} selig und {{crd|C}} süss ::Schau im {{crd|G}} Traum's Para- {{crd|C}} dies == Brahms Lullaby (Übertragung) == : Lulla- {{crd|C}} by, and good night, : With pink {{crd|F}}roses be-{{crd|C}}dight, : With {{crd|G}}lilies overspread, : Is my {{crd|G7}}baby's wee, sweet {{crd|C}}head. :: Lay you {{crd|F}} down now, and {{crd|C}} rest, :: May your {{crd|G}} slumber be {{crd|C}} blessed! :: Lay you {{crd|F}} down now, and {{crd|C}}rest, :: May thy {{crd|G}} slumber be {{crd|C}} blessed! : Lulla-{{crd|C}}by, and good night, : You're your {{crd|F}}mother's de-{{crd|C}}light, : Shining {{crd|G}} angels beside : My {{crd|G7}}darling a-{{crd|C}}bide. :: Soft and {{crd|F}}warm is your {{crd|C}}bed, :: Close your {{crd|G}}eyes and rest your {{crd|C}}head. :: Soft and {{crd|F}}warm is your {{crd|C}}bed, :: Close your {{crd|G}}eyes and rest your {{crd|C}}head. == Brahms Lullaby (Neudichtung) == : Sleepy-{{crd|C}}head, close your eyes. : Mother's {{crd|F}}right here be-{{crd|C}}side you. : I'll pro-{{crd|G}}tect you from harm, : You will {{crd|G7}}wake in my {{crd|C}}arms. :: Guardian {{crd|F}}angels are {{crd|C}}near, :: So sleep {{crd|G}}on, with no {{crd|C}}fear. :: Guardian {{crd|F}}angels are {{crd|C}}near, :: So sleep {{crd|G}}on, with no {{crd|C}}fear. : Lulla-{{crd|C}}by, and sleep tight. : Hush! My {{crd|F}}darling is {{crd|C}}sleeping, : On his {{crd|G}}sheets white as cream, : With his {{crd|G7}}head full of {{crd|C}}dreams. :: When the {{crd|F}}sky's bright with {{crd|C}}dawn, :: He will {{crd|G}}wake in the {{crd|C}}morning. :: When {{crd|F}}noontide warms the {{crd|C}}world, :: He will {{crd|G}}frolic in the {{crd|C}}sun. ==Weblinks== *[http://www.youtube.com/watch?v=bzegc8yeqM0 Video auf YouTube] <noinclude> [[Kategorie:Liederbuch/ Lieder|Gutenacht-Lied]] [[Kategorie:Liederbuch/ Folkdiplom|Gutenacht-Lied]] [[Kategorie:Liederbuch/ Lieder auf Deutsch|Gutenacht-Lied]] [[Kategorie:Liederbuch/ Folk-Songs|Gutenacht-Lied]] [[Kategorie:Liederbuch/ Kinderlied|Gutenacht-Lied]] </noinclude> td3akh8tui5fpierm8ei6s49vn0yp04 Traktorenlexikon: Kramer 450 Export 0 44198 1082878 1002291 2026-04-07T11:42:45Z ~2026-21396-58 115948 1082878 wikitext text/x-wiki {{:Traktorenlexikon: Navigation |HERSTELLER-LINK=Traktorenlexikon: Kramer |HERSTELLER= Kramer}} {{:Traktorenlexikon: Modell-Infobox | HERSTELLER = [[Traktorenlexikon: Kramer|Kramer]] | MODELLREIHE = Export-Reihe | MODELL = 450 Export | BILD = Kramer 450 Export - 2.jpg | BILDBESCHREIBUNG = Kramer 450 Export | BAUWEISE = rahmenlose Blockbauweise | PRODUKTIONSBEGINN = 2/1964 | PRODUKTIONSENDE = 11/1967 | STÜCKZAHL = 2042 | EIGENGEWICHT = 1980 | LÄNGE = 3320 | BREITE = 1550 | HÖHE = 1630 | RADSTAND = 2050 | BODENFREIHEIT = 400 | SPURWEITE = | SPURWEITE VORNE = 1250–1500 | SPURWEITE HINTEN = 1250–1500 | WENDERADIUS MIT LENKBREMSE = | WENDERADIUS OHNE LENKBREMSE = | BEREIFUNG VORNE = 6.00-16 ASF | BEREIFUNG HINTEN = 11-28 AS | LEISTUNG KW = 30,7 | LEISTUNG PS = 42,5 | NENNDREHZAHL = 2300 | ZYLINDER = 4 | HUBRAUM = 2260 | DREHMOMENTANSTIEG = | KRAFTSTOFF = Diesel | KÜHLSYSTEM = Wasserkühlung | ANTRIEBSTYP = Hinterradantrieb | GETRIEBE = 10/2-Getriebe | HÖCHSTGESCHWINDIGKEIT = 20–28 | KATEGORIESORTIERUNG = Kramer 450 Export }} Der Mitte der 1960er Jahre gebaute [[Traktorenlexikon: Kramer|Kramer]] '''450 Export''' gilt als Gegenstück zum [[Traktorenlexikon: Kramer KL 400|KL 400]]. Statt einem luftgekühlten Deutz-Motor besitzt er einen wassergekühlten Standard-Triumph-Motor. Der vom 350 Export übernommene Standard-Motor wurde durch eine andere Nockenwelle, andere Einspritzzeiten und gesteigerte Einspritzmenge auf 42 PS gebracht. Zusätzlich wurde die Hauptwellen-Lagerung des Kramer-Getriebe der Motorleistung angepasst. Abgesehen vom nach hinten abgewinkelten Schalthebel und der höheren Motorleistung war der 450 Export mit dem 350 Export identisch. Bei den Motoren lassen sich anhand der Endbuchstaben der Motornummer beide Typen unterscheiden. Endet die Motornummer beim 350 Export mit einem "T", so endet sie beim 450 Export mit "BY". ==Motor== * Standard-Triumph, Typ: OE 138, stehender, wassergekühlter Vierzylinder-Viertakt-Reihen-Dieselmotor mit Vorkammer-Einspritzverfahren, dreifach-gelagerter Kurbelwelle, Druckumlaufschmierung, CAV-Einspritzpumpe; CAV-Kraftstoffpumpe, CAV-Einspritzdüse, trockene Zylinderlaufbüchsen, Ölbadluftfilter und thermostatgeregelter Umlaufkühlung. * Bohrung = 84,14 mm, Hub = 101,60 mm * Verdichtung = 21,5:1 * Max. Drehmoment = 137 Nm bei 1500 U/min. ( 14 mkg ) * Leerlaufdrehzahl = 800 U/min. * Max. Einspritzdruck = 140 atü * CAV-Einspritzpumpe, Typ: 324 39 10 * Pintaux-Zapfen-Düse, Typ: SD-BDN 12 SPC 6290 * CAV-Düsen-Halter, Typ: BKB 4055 25 S * CAV-Kraftstoffpumpe, Typ: GMC 7950 993 * Mann & Hummel-Kraftstofffilter, Typ: P 917 oder CAV-Reinigung = 5836-100 * Mann & Hummel-Ölbadluftfilter, Typ: H 804 ==Kupplung== * Doppel-Kupplung von Fichtel & Sachs, Typ: DO 250/225 ==Getriebe== * Im Ölbad laufendes Kramer-Feinstufen-Getriebe der Baugruppe II, in verstärkter Ausführung * Zahnradgetriebe mit fünf Vorwärts-und einem Rückwärtsgang * Handhebel betätigte Zwischenschaltung mit der man einen "halben Gang" herauf bzw. herabschalten kann * Erster Zwischengang als Kriechgang ausgelegt * Bis Mai 1965 mit Pedal betätigter Zwischenschaltung * Sieben Geschwindigkeiten im Hauptarbeitsbereich * 10 Vorwärts-und 2 Rückwärtsgänge * Es gibt eine Variante mit Schnellgang. Dieser wird mit einem anderen Kegelrad und Tellerrad realisiert. Den Schnellgang erkennt man im Getriebe an der Zähnezahl der Vorgelegewelle. Diese hat beim Schnellgang 12 Zähne. ==Geschwindigkeiten vor- und rückwärts== * Höchstgeschwindigkeit vorwärts: 19,6 km/h, mit Schnellgang 27,1 km/h Normal-Gänge * 1.Gang = 2,1 km/h; 2.Gang = 4,4 km/h; 3.Gang = 7,1 km/h; 4.Gang = 11,0 km/h; 5.Gang = 19,6 km/h. * Rückwärtsgang = 7,0 km/h. Zwischengänge * 1.Gang = 0,6/1,5 km/h; 2.Gang = 3,3 km/h; 3.Gang = 5,5 km/h; 4.Gang = 8,2 km/h; 5.Gang = 14,2 km/h. * Rückwärtsgang = 4,4 km/h. ==Zapfwelle== * Kupplung unabhängige Motorzapfwelle mit genormten Profil ( 1 3/8"-6 Keile ) * Zweifach schaltbar, 585 und 1090 U/min. mit Nenndrehzahl * Leistung = 40 PS * Optional mit gangabhängiger Zapfwelle ( Wegzapfwelle ) * Seitliche Riemenscheibe einschließlich Mähantrieb, mit 200 mm Durchmesser und 120 mm Breite * Drehzahl = 1430 U/min. * Optional Riemenscheibe hinten mit 200 mm Durchmesser und 120 mm Breite * Drehzahl = 1500 U/min. ==Bremsen== * Pedal betätigte Trommelbremse auf die Hinterräder wirkend * Handhebel betätigte Feststellbremse, als doppelt wirkende Getriebebremse ausgebildet * Automatische Kramer-Steuerrad-Lenkbremse * Optional mit Pedal betätigter Einzelrad-Lenkbremse * Optional mit Anhänger-Druckluft-Bremsanlage ==Achsen== * Pendelnd aufgehängte Kramer-Starrachse mit Einzelradfederung * Feststellbare Differentialsperre Zul. Achslast: * Vorne = 1050 kg * Hinten = 1900 kg ==Lenkung== * ZF-Einzelrad-Lenkung mit feststellbarem Lenkrad ==Hydrauliksystem und Kraftheber== * Kramer-Bosch-Regel-Kraftheber mit Dreipunktaufhängung und Vorwahl-Schaltung * Wahlweise als Kramer-Hydraulik mit Druckfunktion * Arbeitszylinder mit 80 mm Kolbendruchmesser * Unterlenker der Kategorie I, umstellbar auf Kategorie II * Freigang, Zugwiderstand-, Lage- und Mischregelung * Bosch-Pumpe, Typ: HY/ZFR 1/8 AL 104 oder HY/ZFR 1/11 * Max. Fördermenge = 20 l/min. bei 120 atü Betriebsdruck * Ab Mai 1965 = 27 l/min. bei 150 atü Betriebsdruck * Max. Hubkraft = 1100 kg * Ab Mai 1965 = 1350 kg ==Steuergeräte== * Ein doppelt wirkendes Bosch-Steuergerät mit Umschaltventil ==Elektrische Ausrüstung== * 12 Volt-Einrichtung nach StVZO * Lucas-Lichtmaschine, Typ: 22791 * Ab Juni 1965, Bosch-Lichtmaschine, Typ: EH (R) 14 V 11 A 19 * Regler, Typ: RS/TBA 75..90/12 A 2 * Lucas-Anlasser, Typ: 26133 * Bosch-Anlasser, Typ: JD (R) 12 V 1.8 PS * Lucas-Ritzel, Typ: 54 256 689 * Ritzel, Typ: ALGT 42 E 11 Z mit 11 Zähnen * Kohlebürsten, Typ: DSK 11 sort 2 * Beru-Glühkerze, Typ: M 199 * Beru-Glühüberwacher, Typ: KOS 0940 ==Maße und Abmessungen== * Länge = 3320 mm * Breite = 1550 mm * Höhe bis Lenkrad = 1630 mm * Radstand = 2050 mm * Bodenfreiheit je nach Bereifung = 400-500 mm * Radspur = 1250/1500 mm * Eigengewicht = 1980 kg * Zul. Gesamtgewicht = 2650 kg ==Bereifung== Serien-Bereifung * Vorne = 6.00 x 16 ASF * Hinten = 11 x 28 AS Optional: * Vorne = 6.50 x 16 ASF * Hinten = 9 x 36; 11 x 32 und 13 x 28 AS ==Füllmengen== * Tankinhalt = 43 l * Motoröl = 6,8 l * Kühlsystem = 9 l * Schaltgetriebe und Hinterachse = 17 l * Kraftheber = 4,7 l * Frontlader = 7 l ==Verbrauch== * Kraftstoffverbrauch = 6,8 l/h bei maximalem Drehmoment ==Kabine== * Fahrerstand mit gefedertem Fahrersitz, Kotflügel-Sitzen, Fernthermometer, Hand-und Fußgasregulierung, Kontrolleuchten, Ackerschiene mit Riffelblech-Ladepritsche und Werkzeugkasten * Optional mit Fritzmeier-Verdeck, Rückwärts-Scheinwerfer, Traktormeter, Betriebsstundenzähler und Zeituhr ==Sonderausrüstung== * Schnellganggetriebe * Mähbalken-5' * Fritzmeier-Verdeck * Wegzapfwelle * Riemenscheibe hinten * Rückwärts-Scheinwerfer * Traktormeter, Betriebsstundenzähler und Zeituhr * Einzelrad-Lenkbremse * Anhänger-Druckluftbremse * Frontlader Gr. 2 * Kramer-Hydraulik * Seilwinde für Dreipunktaufhängung * Zusatzgewichte * u.a. ==Literatur== * Kramer-Das Typenbuch ( K. Tietgens ) Seite 120 * Alle Traktoren von Kramer ( W. Sack ) Seite 194 * Kramer-Traktoren-Prospekte ( W. Wagner ) Seite 88 ==Weblinks== {{:Traktorenlexikon: Navigation |HERSTELLER-LINK=Traktorenlexikon: Kramer |HERSTELLER= Kramer}} 27lpn8c4ish4y9v7cuewy4okm5mhing 1082879 1082878 2026-04-07T11:58:58Z ~2026-21396-58 115948 1082879 wikitext text/x-wiki {{:Traktorenlexikon: Navigation |HERSTELLER-LINK=Traktorenlexikon: Kramer |HERSTELLER= Kramer}} {{:Traktorenlexikon: Modell-Infobox | HERSTELLER = [[Traktorenlexikon: Kramer|Kramer]] | MODELLREIHE = Export-Reihe | MODELL = 450 Export | BILD = Kramer 450 Export - 2.jpg | BILDBESCHREIBUNG = Kramer 450 Export | BAUWEISE = rahmenlose Blockbauweise | PRODUKTIONSBEGINN = 2/1964 | PRODUKTIONSENDE = 11/1967 | STÜCKZAHL = 2042 | EIGENGEWICHT = 1980 | LÄNGE = 3320 | BREITE = 1550 | HÖHE = 1630 | RADSTAND = 2050 | BODENFREIHEIT = 400 | SPURWEITE = | SPURWEITE VORNE = 1250–1500 | SPURWEITE HINTEN = 1250–1500 | WENDERADIUS MIT LENKBREMSE = | WENDERADIUS OHNE LENKBREMSE = | BEREIFUNG VORNE = 6.00-16 ASF | BEREIFUNG HINTEN = 11-28 AS | LEISTUNG KW = 30,7 | LEISTUNG PS = 42,5 | NENNDREHZAHL = 2300 | ZYLINDER = 4 | HUBRAUM = 2260 | DREHMOMENTANSTIEG = | KRAFTSTOFF = Diesel | KÜHLSYSTEM = Wasserkühlung | ANTRIEBSTYP = Hinterradantrieb | GETRIEBE = 10/2-Getriebe | HÖCHSTGESCHWINDIGKEIT = 20–28 | KATEGORIESORTIERUNG = Kramer 450 Export }} Der Mitte der 1960er Jahre gebaute [[Traktorenlexikon: Kramer|Kramer]] '''450 Export''' gilt als Gegenstück zum [[Traktorenlexikon: Kramer KL 400|KL 400]]. Statt einem luftgekühlten Deutz-Motor besitzt er einen wassergekühlten Standard-Triumph-Motor. Der vom 350 Export übernommene Standard-Motor wurde durch eine andere Nockenwelle, andere Einspritzzeiten und gesteigerte Einspritzmenge auf 42 PS gebracht. Zusätzlich wurde die Hauptwellen-Lagerung des Kramer-Getriebe der Motorleistung angepasst. Abgesehen vom nach hinten abgewinkelten Schalthebel und der höheren Motorleistung war der 450 Export mit dem 350 Export identisch. Bei den Motoren lassen sich anhand der Endbuchstaben der Motornummer beide Typen unterscheiden. Endet die Motornummer beim 350 Export mit einem "T", so endet sie beim 450 Export mit "BY". ==Motor== * Standard-Triumph, Typ: OE 138, stehender, wassergekühlter Vierzylinder-Viertakt-Reihen-Dieselmotor mit Vorkammer-Einspritzverfahren, dreifach-gelagerter Kurbelwelle, Druckumlaufschmierung, CAV-Einspritzpumpe; CAV-Kraftstoffpumpe, CAV-Einspritzdüse, trockene Zylinderlaufbüchsen, Ölbadluftfilter und thermostatgeregelter Umlaufkühlung. * Bohrung = 84,14 mm, Hub = 101,60 mm * Verdichtung = 21,5:1 * Max. Drehmoment = 137 Nm bei 1500 U/min. ( 14 mkg ) * Leerlaufdrehzahl = 800 U/min. * Max. Einspritzdruck = 140 atü * CAV-Einspritzpumpe, Typ: 324 39 10 * Pintaux-Zapfen-Düse, Typ: SD-BDN 12 SPC 6290 * CAV-Düsen-Halter, Typ: BKB 4055 25 S * CAV-Kraftstoffpumpe, Typ: GMC 7950 993 * Mann & Hummel-Kraftstofffilter, Typ: P 917 oder CAV-Reinigung = 5836-100 * Mann & Hummel-Ölbadluftfilter * Mann & Hummel Ölfilter Typ: H 804 ==Kupplung== * Doppel-Kupplung von Fichtel & Sachs, Typ: DO 250/225 ==Getriebe== * Im Ölbad laufendes Kramer-Feinstufen-Getriebe der Baugruppe II, ab Fahrgestellnummer 81000 in verstärkter Ausführung * Zahnradgetriebe mit fünf Vorwärts-und einem Rückwärtsgang * Handhebel betätigte Zwischenschaltung mit der man einen "halben Gang" herauf bzw. herabschalten kann * Erster Zwischengang als Kriechgang ausgelegt * Bis Mai 1965 mit Pedal betätigter Zwischenschaltung * Sieben Geschwindigkeiten im Hauptarbeitsbereich * 10 Vorwärts-und 2 Rückwärtsgänge * Es gibt eine Variante mit Schnellgang. Dieser wird mit einem anderen Kegelrad und Tellerrad realisiert. Den Schnellgang erkennt man im Getriebe an der Zähnezahl der Vorgelegewelle. Diese hat beim Schnellgang 12 Zähne. ==Geschwindigkeiten vor- und rückwärts== * Höchstgeschwindigkeit vorwärts: 19,6 km/h, mit Schnellgang 27,1 km/h Normal-Gänge * 1.Gang = 2,1 km/h; 2.Gang = 4,4 km/h; 3.Gang = 7,1 km/h; 4.Gang = 11,0 km/h; 5.Gang = 19,6 km/h. * Rückwärtsgang = 7,0 km/h. Zwischengänge * 1.Gang = 0,6/1,5 km/h; 2.Gang = 3,3 km/h; 3.Gang = 5,5 km/h; 4.Gang = 8,2 km/h; 5.Gang = 14,2 km/h. * Rückwärtsgang = 4,4 km/h. ==Zapfwelle== * Kupplung unabhängige Motorzapfwelle mit genormten Profil ( 1 3/8"-6 Keile ) * Zweifach schaltbar, 585 und 1090 U/min. mit Nenndrehzahl * Leistung = 40 PS * Seitliche Riemenscheibe einschließlich Mähantrieb, mit 200 mm Durchmesser und 120 mm Breite * Drehzahl = 1430 U/min. * Optional Riemenscheibe hinten mit 200 mm Durchmesser und 120 mm Breite * Drehzahl = 1500 U/min. ==Bremsen== * Pedal betätigte Trommelbremse auf die Hinterräder wirkend * Handhebel betätigte Feststellbremse, als doppelt wirkende Getriebebremse ausgebildet * Automatische Kramer-Steuerrad-Lenkbremse * Optional mit Pedal betätigter Einzelrad-Lenkbremse ==Achsen== * Pendelnd aufgehängte Kramer-Starrachse mit Einzelradfederung * Feststellbare Differentialsperre Zul. Achslast: * Vorne = 1050 kg * Hinten = 1900 kg ==Lenkung== * ZF-Einzelrad-Lenkung mit feststellbarem Lenkrad ==Hydrauliksystem und Kraftheber== * Kramer-Bosch-Regel-Kraftheber mit Dreipunktaufhängung und Vorwahl-Schaltung * Wahlweise als Kramer-Hydraulik mit Druckfunktion * Arbeitszylinder mit 80 mm Kolbendruchmesser * Unterlenker der Kategorie I, umstellbar auf Kategorie II * Freigang, Zugwiderstand-, Lage- und Mischregelung * Bosch-Pumpe, Typ: HY/ZFR 1/8 AL 104 oder HY/ZFR 1/11 * Max. Fördermenge = 20 l/min. bei 120 atü Betriebsdruck * Ab Mai 1965 = 27 l/min. bei 150 atü Betriebsdruck * Max. Hubkraft = 1100 kg * Ab Mai 1965 = 1350 kg ==Steuergeräte== * Ein doppelt wirkendes Bosch-Steuergerät mit Umschaltventil ==Elektrische Ausrüstung== * 12 Volt-Einrichtung nach StVZO * Lucas-Lichtmaschine, Typ: 22791 * Ab Juni 1965, Bosch-Lichtmaschine, Typ: EH (R) 14 V 11 A 19 * Regler, Typ: RS/TBA 75..90/12 A 2 * Lucas-Anlasser, Typ: 26133 * Bosch-Anlasser, Typ: JD (R) 12 V 1.8 PS * Lucas-Ritzel, Typ: 54 256 689 * Ritzel, Typ: ALGT 42 E 11 Z mit 11 Zähnen * Kohlebürsten, Typ: DSK 11 sort 2 * Beru-Glühkerze, Typ: M 199 * Beru-Glühüberwacher, Typ: KOS 0940 ==Maße und Abmessungen== * Länge = 3320 mm * Breite = 1550 mm * Höhe bis Lenkrad = 1630 mm * Radstand = 2050 mm * Bodenfreiheit je nach Bereifung = 400-500 mm * Radspur = 1250/1500 mm * Eigengewicht = 1980 kg * Zul. Gesamtgewicht = 2650 kg ==Bereifung== Serien-Bereifung * Vorne = 6.00 x 16 ASF * Hinten = 11 x 28 AS Optional: * Vorne = 6.50 x 16 ASF * Hinten = 9 x 36; 11 x 32 und 13 x 28 AS ==Füllmengen== * Tankinhalt = 43 l * Motoröl = 6,8 l * Kühlsystem = 9 l * Schaltgetriebe und Hinterachse = 17 l * Kraftheber = 4,7 l * Frontlader = 7 l ==Verbrauch== * Kraftstoffverbrauch = 6,8 l/h bei maximalem Drehmoment ==Kabine== * Fahrerstand mit gefedertem Fahrersitz, Kotflügel-Sitzen, Fernthermometer, Hand-und Fußgasregulierung, Kontrolleuchten, Ackerschiene mit Riffelblech-Ladepritsche und Werkzeugkasten * Optional Rückwärts-Scheinwerfer, Mähwerk, Rückspiegel, Traktormeter, Betriebsstundenzähler und Zeituhr ==Sonderausrüstung== * Schnellganggetriebe * Mähbalken-5' * Riemenscheibe hinten * Rückwärts-Scheinwerfer * Traktormeter, Betriebsstundenzähler und Zeituhr * Einzelrad-Lenkbremse * Frontlader Gr. 2 * Kramer-Hydraulik * Zusatzgewichte * u.a. ==Literatur== * Kramer-Das Typenbuch ( K. Tietgens ) Seite 120 * Alle Traktoren von Kramer ( W. Sack ) Seite 194 * Kramer-Traktoren-Prospekte ( W. Wagner ) Seite 88 ==Weblinks== {{:Traktorenlexikon: Navigation |HERSTELLER-LINK=Traktorenlexikon: Kramer |HERSTELLER= Kramer}} 8qoul8h4f8k75j1l70w0htt3y1037m7 Benutzer Diskussion:Renamed user 16fbb3bef7abb9c23f92dbf9f8ab1f45 3 77546 1082853 563036 2026-04-06T12:17:33Z Neriah 101164 Neriah verschob die Seite [[Benutzer Diskussion:Silvio]] nach [[Benutzer Diskussion:Renamed user 16fbb3bef7abb9c23f92dbf9f8ab1f45]], ohne dabei eine Weiterleitung anzulegen: Seite während der Umbenennung des Benutzers „[[Special:CentralAuth/Silvio|Silvio]]“ in „[[Special:CentralAuth/Renamed user 16fbb3bef7abb9c23f92dbf9f8ab1f45|Renamed user 16fbb3bef7abb9c23f92dbf9f8ab1f45]]“ automatisch verschoben 563036 wikitext text/x-wiki == Willkommen == [[Bild:Wikibooks-logo-en-noslogan.svg|135px|right]] Hallo Silvio, [[Hilfe:Willkommen|Willkommen]] bei Wikibooks. Diese Nachricht ist nicht automatisch erstellt, sondern es gibt in Wikibooks Benutzer, die sich Zeit für die neu Dazugekommen nehmen, dich begrüßen, Fragen beantworten, einfach für dich da sind. Zunächst mal hoffe ich, dass du hier interessante Bücher zum Lesen findest. Die beste Unterstützung ist [[Hilfe:Willkommen#Kritisch_lesen|kritisches Lesen]], jeder kann es! Du hast dich also entschieden, [[Hilfe:Warum inhaltsoffene Lehrbücher? | inhaltsoffene Lehrbücher]] zu erstellen bzw. Korrektur zu lesen? Viele nützliche Informationen für Autoren findest du im [[Hilfe:Wikibooks-Lehrbuch | Wikibooks-Lehrbuch]] und auf dem [[Hilfe:Merkzettel|Merkzettel zum Ausdrucken]]. Im Lehrbuch werden auch die vielen [[Hilfe:Menüpunkte|Menüpunkte]] erklärt, die du am oberen und linken Rand siehst. Auf dem [[Wikibooks:Portal|Portal für Autoren]] kannst du im Abschnitt [[Wikibooks:Portal/ Beteiligen|Beteiligen und Mitgestalten]] Anregungen finden. Es gibt auch eine Liste mit [[Wikibooks:Verwaiste Bücher|verwaisten Büchern]], die auf einen neuen Autor warten. Wenn du eine Anleitung vermisst oder weitere Hilfe brauchst, '''zögere nicht''', deine Fragen auf [[Wikibooks:Ich brauche Hilfe]] zu stellen. Natürlich kannst du auch mir ([[Benutzer:Klaus Eifert|Klaus]]) persönlich deine Fragen stellen. Falls du Autor werden willst, solltest du besonders beachten: :* [[Hilfe:Wikibooks-Lehrbuch/ Navigation Regeln|Grundsätzliches kurz und knapp]] :* [[Hilfe:Wikibooks-Lehrbuch/ Navigation Statut|Was Wikibooks ist und was wir hier tun]] :* [[Hilfe:Wikibooks-Lehrbuch/ Navigation Neues Buch|Wie man ein neues Buch beginnt]] Die neuesten Nachrichten findest du in der [[Wikibooks:Rundschau|Rundschau]]. Erfolg und viel Spaß wünscht [[Benutzer:Klaus Eifert|Klaus]] 01:34, 15. Dezember 2010 == Vorschaufunktion == [[Datei:Vorschau.png|thumb|200px|Vorschau-Button]] Hallo, mir ist aufgefallen, dass du mehrere kleine Bearbeitungen an deiner Benutzerseite kurz hintereinander vorgenommen hast. Wir freuen uns über jede Verbesserung, wer immer sie vornimmt, und möchten deinen Tatendrang keinesfalls bremsen. Wenn es dir '''keine große Mühe ist''', wäre es schön, wenn du in Zukunft die [[Hilfe:Menüpunkte#Anker:Vorschau| Vorschaufunktion]] benutzt. Du weißt vermutlich nicht, dass bei jeder, ''auch bei der kleinsten Änderung'' der gesamte Text der Seite erneut in der Datenbank gespeichert wird. Gehe also bitte sparsam mit spendenfinanziertem Speicherplatz um. Wenn du an einer Seite Bearbeitungen in mehreren Abschnitten planst, benutze bitte nicht nacheinander die einzelnen „Bearbeiten“-Buttons am rechten Rand, sondern das „Bearbeiten“ über der Seite. Dadurch werden die [[w:Hilfe:Versionen|Versionsgeschichte]] und die Liste der [[Spezial:Recentchanges|letzten Änderungen]] nicht mit unzähligen Kleinständerungen überflutet, die Versionsgeschichte des Artikels bleibt übersichtlich. Wir sehen sonst jeden geänderten Buchstaben im Änderungslogbuch, was den Autoren und den Admins die Suche nach Auffälligkeiten erschwert. Vielen Dank. -- [[Benutzer:Klaus Eifert|Klaus]] 23:33, 15. Dez. 2010 (CET) == Urheberrecht == Hältst du es für einen Scherz, dass ich [[Wikibooks:L%C3%B6schkandidaten/_Urheberrechtsverletzungen#Rechnungswesen_im_Einzelhandel|angekündigt habe]], "dein" Buch zu löschen? Wir erwarten deine Stellungnahme. -- [[Benutzer:Klaus Eifert|Klaus]] 23:05, 26. Dez. 2010 (CET) ANTWORT: Das tut mir leid, das ich die Bilder von einer anderen Seite ich sage mal geborgt habe, sie wurden enfernt. : Es geht nicht nur um die Bilder. [[Rechnungswesen im Einzelhandel/ Preiskalkulation]] ist Satz für Satz identisch mit http://www.einzelhandelskaufmann.de/fachwissen/k/kalkulation.shtml, lediglich einzelne Wörter und Zahlen wurden verändert. Offenbar bist du nicht gewillt, einen eigenen Text zu verfassen. -- [[Benutzer:Klaus Eifert|Klaus]] 10:52, 1. Jan. 2011 (CET) c6f3rh4liuyutbrc05tmvoalrbi0lfs Benutzer:Renamed user 16fbb3bef7abb9c23f92dbf9f8ab1f45 2 77553 1082854 563054 2026-04-06T12:17:33Z Neriah 101164 Neriah verschob die Seite [[Benutzer:Silvio]] nach [[Benutzer:Renamed user 16fbb3bef7abb9c23f92dbf9f8ab1f45]], ohne dabei eine Weiterleitung anzulegen: Seite während der Umbenennung des Benutzers „[[Special:CentralAuth/Silvio|Silvio]]“ in „[[Special:CentralAuth/Renamed user 16fbb3bef7abb9c23f92dbf9f8ab1f45|Renamed user 16fbb3bef7abb9c23f92dbf9f8ab1f45]]“ automatisch verschoben 563054 wikitext text/x-wiki phoiac9h4m842xq45sp7s6u21eteeq1 Vokabeltexte Chinesisch/ Vokabellektionen/ Lektion 710 0 102517 1082876 1014871 2026-04-07T11:17:17Z Christian-bauer 6469 kleinere Ergänzungen und Korrekturen 1082876 wikitext text/x-wiki <noinclude> {{Navigation zurückhochvor| zurücktext=Lektion 709| zurücklink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 709| hochtext=Buch Vokabellektionen| hochlink=Vokabeltexte_Chinesisch/_Vokabellektionen| vortext=Lektion 711| vorlink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 711}} </noinclude> == Zeichen == {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung !! Lernhilfen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |牺}} || xi1 || aufopfern, Opfer, Opfertier (einfarbiges Fell) || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=牺}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |牲}} || sheng1 || Haustier, Vieh, Tieropfer || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=牲}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |俎}} || zu3 || Opfergefäß, Hackblock || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=俎}} [[Datei:俎-bronze.svg|40px]][[Datei:俎-silk.svg|40px]][[Datei:俎-seal.svg|40px]][[Datei:俎-bigseal.svg|40px]] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |磬}} || qing4 || Klangstein (altes Schlaginstrument), Qing (buddhistisches Schlaginstrument aus Messing) || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=磬}} |- | rowspan="2"| {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |嘏}} || jia3 || gewaltig, großartig|| rowspan="2"| {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=嘏}} [[Datei:嘏-seal.svg|40px]] |- | gu3 || Langlebigkeit |} == Zusammengesetzte Wörter == === 牺 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |伏牺}} || Fu2 Xi1 || variant of 伏羲[Fu2 Xi1] |} === 牲 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung !! Lernhilfen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |牲口}} || sheng1 kou3 || Vieh |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |牺牲}} || xi1 sheng1 || aufopfern, Opfer || (HSK 3.0 Band 6) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |祭牲}} || ji4 sheng1 || Opfertier |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |牲畜}} || sheng1 chu4 || Vieh, Nutztiere || (HSK 3.0 Band 7-9) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |牺牲者}} || xi1 sheng1 zhe3 || Märtyrer, Schlachtopfer |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |抽牲口}} || chou1 sheng1 kou3 || ein Tier peitschen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |宰牲节}} || zai3 sheng1 jie2 || Eid al-Adha (islamisches Schlachtfest) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |宰牲節}} || zai3 sheng1 jie2 || (traditionelle Schreibweise von 宰牲节), Eid al-Adha (islamisches Schlachtfest) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |牺牲品}} || xi1 sheng1 pin3 || Beute, Schlachtopfer |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |大牺牲}} || da4 xi1 sheng1 || meldet |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |大牲畜}} || da4 sheng1 chu4 || Großvieh |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |可牺牲}} || ke3 xi1 sheng1 || entbehrlich |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |大牲口}} || da4 sheng1 kou3 || Großvieh |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |英勇牺牲}} || ying1 yong3 xi1 sheng1 || heldenhaft fallen, sterben |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |作出牺牲}} || zuo4 chu1 xi1 sheng1 || Opfer bringen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |战争牺牲者}} || zhan4 zheng1 xi1 sheng1 zhe3 || Kriegsopfer |} === 俎 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |刀俎}} || dao1 zu3 || sacrificial knife and altar |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |酉阳杂俎}} || you3 yang2 za2 zu3 || Youyang zazu, "Ein bunter Teller von Geschichten von der Südseite des You-Hügels&quot |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |酉陽雜俎}} || you3 yang2 za2 zu3 || (traditionelle Schreibweise von 酉阳杂俎), Youyang zazu, "Ein bunter Teller von Geschichten von der Südseite des You-Hügels&quot |} === 磬 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |编磬}} || bian1 qing4 || musical instrument consisting of a set of chime stones suspended from a beam and struck as a xylophone |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |編磬}} || bian1 qing4 || (traditionelle Schreibweise von 编磬), musical instrument consisting of a set of chime stones suspended from a beam and struck as a xylophone |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |磬竭}} || qing4 jie2 || used up, exhausted, emptied |} == Sätze == === 牺 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 牲 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他把溺水的小孩救了起来,但是却牺牲了自己的生命。}} || ta1 ba3 ni4/niao4 shui3 de5 xiao3 hai2 jiu4 le5 qi3 lai2 , dan4 shi4 que4 xi1 sheng1 le5 zi4 ji3 de5 sheng1 ming4 。|| He saved the drowning child at the cost of his own life. (Mandarin, [https://tatoeba.org/eng/sentences/show/903251 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他以牺牲自己的健康为代价完成了这项工作。}} || ta1 yi3 xi1 sheng1 zi4 ji3 de5 jian4 kang1 wei2/wei4 dai4 jia4/jie4 wan2 cheng2 le5 zhe4/zhei4 xiang4 gong1 zuo4 。|| Er vollendete die Arbeit auf Kosten seiner Gesundheit. (Mandarin, [https://tatoeba.org/eng/sentences/show/333400 Tatoeba] [https://tatoeba.org/eng/user/profile/fucongcong fucongcong] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |为了救许多人牺牲一个人是否道德?}} || wei2/wei4 le5 jiu4 xu3 duo1 ren2 xi1 sheng1 yi1 ge4 ren2 shi4 pi3 dao4 de2 ?|| Ist es moralisch vertretbar, einen Menschen zu opfern, um viele zu retten? (Mandarin, [https://tatoeba.org/eng/sentences/show/812366 Tatoeba] [https://tatoeba.org/eng/user/profile/fucongcong fucongcong] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他即使牺牲生命,也要出卖组织。}} || ta1 ji2 shi3/shi4 xi1 sheng1 sheng1 ming4 , ye3 yao4 chu1 mai4 zu3 zhi1 。|| Er wird die Organisation verraten, auch wenn es ihn das Leben kosten sollte. (Mandarin, [https://tatoeba.org/eng/sentences/show/8706263 Tatoeba] [https://tatoeba.org/eng/user/profile/shou shou] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他为美国承受了比我们大多数人所能想象的更多的牺牲。}} || ta1 wei2/wei4 mei3 guo2 承 shou4 le5 bi4 wo3 men5 da4 duo1 shu3/shuo4 ren2 suo3 neng2 xiang3 xiang4 de5 geng4 duo1 de5 xi1 sheng1 。|| Er hat für die USA mehr Opfer ertragen, als sich die meisten von uns vorstellen können. (Mandarin, [https://tatoeba.org/eng/sentences/show/334030 Tatoeba] [https://tatoeba.org/eng/user/profile/fucongcong fucongcong] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |士兵们已经準备好为国牺牲了。}} || shi4 bing1 men5 yi3 jing4 zhuo4 bei4 hao3 wei2/wei4 guo2 xi1 sheng1 le5 。|| The soldiers were ready to die for their country. (Mandarin, [https://tatoeba.org/eng/sentences/show/433895 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/U2FS U2FS]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他在战争中牺牲了。}} || ta1 zai4 zhan4 zheng1 zhong1/zhong4 xi1 sheng1 le5 。|| Er wurde im Krieg getötet. (Mandarin, [https://tatoeba.org/eng/sentences/show/884719 Tatoeba] [https://tatoeba.org/eng/user/profile/Tajfun Tajfun] [https://tatoeba.org/eng/user/profile/tinacalysto tinacalysto]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他牺牲生命,出卖组织。}} || ta1 xi1 sheng1 sheng1 ming4 , chu1 mai4 zu3 zhi1 。|| Er opferte sich selbst und verriet die Organisation. (Mandarin, [https://tatoeba.org/eng/sentences/show/8706755 Tatoeba] [https://tatoeba.org/eng/user/profile/shou shou] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他救了那个婴儿,但是却牺牲了自己的生命。}} || ta1 jiu4 le5 na4/nei4 ge4 ying1 er2/er5 , dan4 shi4 que4 xi1 sheng1 le5 zi4 ji3 de5 sheng1 ming4 。|| He saved the baby at the cost of his life. (Mandarin, [https://tatoeba.org/eng/sentences/show/599668 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他没有牺牲生命,也没有出卖组织。}} || ta1 mei2/mo4 you3 xi1 sheng1 sheng1 ming4 , ye3 mei2/mo4 you3 chu1 mai4 zu3 zhi1 。|| Er hat weder sein Leben geopfert noch die Organisation verraten. (Mandarin, [https://tatoeba.org/eng/sentences/show/8709527 Tatoeba] [https://tatoeba.org/eng/user/profile/crescat crescat] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他害怕牺牲生命,不得不出卖组织。}} || ta1 hai4 pa4 xi1 sheng1 sheng1 ming4 , bu4 de2/de5/dei3 bu4 chu1 mai4 zu3 zhi1 。|| Aus Angst um sein Leben blieb ihm nichts anderes übrig, als die Organisation zu verraten. (Mandarin, [https://tatoeba.org/eng/sentences/show/8706261 Tatoeba] [https://tatoeba.org/eng/user/profile/shou shou] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他之所以牺牲生命,是因为出卖组织。}} || ta1 zhi1 suo3 yi3 xi1 sheng1 sheng1 ming4 , shi4 yin1 wei2/wei4 chu1 mai4 zu3 zhi1 。|| Er gab sein Leben, weil er die Organisation verraten hatte. (Mandarin, [https://tatoeba.org/eng/sentences/show/8706731 Tatoeba] [https://tatoeba.org/eng/user/profile/shou shou] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |21个月前在寒冬所开始的一切不应当在今天这个秋夜结束。今天的选举胜利并不是我们所寻求的改变--这只是我们进行改变的机会。如果我们仍然按照过去的方式行事,我们所寻求的改变将不会发生。没有你们,没有服务和牺牲的新精神,就不可能发生改变。因此,让我们发扬新的爱国和负责精神,所有的人都下定决心参与其中,更加努力地工作,不仅是为自己而是为彼此。}} || 21 ge4 yue4 qian2 zai4 han2 dong1 suo3 kai1 shi3 de5 yi1 qie1 bu4 ying1/ying4 dang1/dang4 zai4 jin1 tian1 zhe4/zhei4 ge4 qiu1 ye4 jie1/jie2 shu4 。 jin1 tian1 de5 xuan3 ju3 sheng4 li4 bing4 bu4 shi4 wo3 men5 suo3 xin2/xun2 qiu2 de5 gai3 bian4 -- zhe4/zhei4 zhi3 shi4 wo3 men5 jin4 hang2/xing2 gai3 bian4 de5 ji1 hui4 。 ru2 guo3 wo3 men5 reng2 ran2 an4 zhao4 guo4 qu4 de5 fang1 shi4 hang2/xing2 shi4 , wo3 men5 suo3 xin2/xun2 qiu2 de5 gai3 bian4 jiang1/jiang4 bu4 hui4 fa1 sheng1 。 mei2/mo4 you3 ni3 men5 , mei2/mo4 you3 fu2 wu4 he2/he4/huo2 xi1 sheng1 de5 xin1 jing1 shen2 , jiu4 bu4 ke3/ke4 neng2 fa1 sheng1 gai3 bian4 。 yin1 ci3 , rang4 wo3 men5 fa1 扬 xin1 de5 ai4 guo2 he2/he4/huo2 fu4 ze2 jing1 shen2 , suo3 you3 de5 ren2 dou1/du1 xia4 ding4 jue2 xin1 can1 yu3 qi2 zhong1/zhong4 , geng4 jia1 nu3 li4 de4/di4 gong1 zuo4 , bu4 jin3 shi4 wei2/wei4 zi4 ji3 er2 shi4 wei2/wei4 bi3 ci3 。|| What began 21 months ago in the depths of winter cannot end on this autumn night. This victory alone is not the change we seek. It is only the chance for us to make that change. And that cannot happen if we go back to the way things were. It can't happen without you, without a new spirit of service, a new spirit of sacrifice. So let us summon a new spirit of patriotism, of responsibility, where each of us resolves to pitch in and work harder and look after not only ourselves but each other. (Mandarin, [https://tatoeba.org/eng/sentences/show/347854 Tatoeba] [https://tatoeba.org/eng/user/profile/zhouj1955 zhouj1955]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他白白牺牲生命,忘了出卖组织。}} || ta1 bai2 bai2 xi1 sheng1 sheng1 ming4 , wang4 le5 chu1 mai4 zu3 zhi1 。|| He wastes his life, forgetting to betray his organization. (Mandarin, [https://tatoeba.org/eng/sentences/show/8706265 Tatoeba] [https://tatoeba.org/eng/user/profile/shou shou]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他与其牺牲生命,不如出卖组织。}} || ta1 yu3 qi2 xi1 sheng1 sheng1 ming4 , bu4 ru2 chu1 mai4 zu3 zhi1 。|| Anstatt sein Leben zu opfern, würde er eher die Organisation verraten. (Mandarin, [https://tatoeba.org/eng/sentences/show/8706262 Tatoeba] [https://tatoeba.org/eng/user/profile/shou shou] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |你这个畜牲,给我滚开!}} || ni3 zhe4/zhei4 ge4 畜 sheng1 , gei3 wo3 gun3 kai1 !|| Verschwinde hier, du Mistvieh! (Mandarin, [https://tatoeba.org/eng/sentences/show/4218333 Tatoeba] [https://tatoeba.org/eng/user/profile/shanghainese shanghainese] [https://tatoeba.org/eng/user/profile/sigavax sigavax]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他之所以牺牲生命,是因为不愿出卖组织。}} || ta1 zhi1 suo3 yi3 xi1 sheng1 sheng1 ming4 , shi4 yin1 wei2/wei4 bu4 yuan4 chu1 mai4 zu3 zhi1 。|| Er opferte sein Leben, weil er nicht bereit war, die Organisation preiszugeben. (Mandarin, [https://tatoeba.org/eng/sentences/show/8706743 Tatoeba] [https://tatoeba.org/eng/user/profile/shou shou] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |约翰牺牲自己的健康,完成工作。}} || yue1 han4 xi1 sheng1 zi4 ji3 de5 jian4 kang1 , wan2 cheng2 gong1 zuo4 。|| John finished the work at the expense of his health. (Mandarin, [https://tatoeba.org/eng/sentences/show/898756 Tatoeba] [https://tatoeba.org/eng/user/profile/kanaorange kanaorange]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |牲口饿死了。}} || sheng1 kou3 e4 si3 le5 。|| Das Vieh ist verhungert. (Mandarin, [https://tatoeba.org/eng/sentences/show/500930 Tatoeba] [https://tatoeba.org/eng/user/profile/fucongcong fucongcong] [https://tatoeba.org/eng/user/profile/MUIRIEL MUIRIEL]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |汤姆的两个儿子都在战争中牺牲了。}} || tang1 mu3 de5 liang3 ge4 er2/er5 zi5 dou1/du1 zai4 zhan4 zheng1 zhong1/zhong4 xi1 sheng1 le5 。|| Toms Söhne fielen beide im Krieg. (Mandarin, [https://tatoeba.org/eng/sentences/show/2500084 Tatoeba] [https://tatoeba.org/eng/user/profile/fenfang557 fenfang557] [https://tatoeba.org/eng/user/profile/Pfirsichbaeumchen Pfirsichbaeumchen]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |由于农业的发展,食品全球产量能够跟上人口的增长,但只是牺牲了将来。}} || you2 yu2 nong2 ye4 de5 fa1 zhan3 , shi2 pin3 quan2 qiu2 chan3 liang2/liang4 neng2 gou4 gen1 shang4 ren2 kou3 de5 zeng1 chang2/zhang3 , dan4 zhi3 shi4 xi1 sheng1 le5 jiang1/jiang4 lai2 。|| Dank des landwirtschaftlichen Fortschritts konnte die weltweite Nahrungsmittelproduktion mit dem Bevölkerungswachstum schritthalten, aber nur unter Opferung der Zukunft. (Mandarin, [https://tatoeba.org/eng/sentences/show/333742 Tatoeba] [https://tatoeba.org/eng/user/profile/fucongcong fucongcong] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |馬是牲畜。}} || ma3 shi4 sheng1 畜。|| Pferde sind Haustiere. (Mandarin, [https://tatoeba.org/eng/sentences/show/8407179 Tatoeba] [https://tatoeba.org/eng/user/profile/Dusun_Les Dusun_Les] [https://tatoeba.org/eng/user/profile/Roujin Roujin]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |父母为了确保孩子受到良好的教育常常牺牲自己。}} || fu4 mu3 wei2/wei4 le5 que4 bao3 hai2 zi5 shou4 dao4 liang2 hao3 de5 jiao1 yu4 chang2 chang2 xi1 sheng1 zi4 ji3 。|| Eltern opfern sich oft auf, um ihren Kindern eine gute Ausbildung zu sichern. (Mandarin, [https://tatoeba.org/eng/sentences/show/1485454 Tatoeba] [https://tatoeba.org/eng/user/profile/cienias cienias] [https://tatoeba.org/eng/user/profile/Zaghawa Zaghawa]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |马是牲畜。}} || ma3 shi4 sheng1 畜。|| Pferde sind Haustiere. (Mandarin, [https://tatoeba.org/eng/sentences/show/8407179 Tatoeba] [https://tatoeba.org/eng/user/profile/Dusun_Les Dusun_Les] [https://tatoeba.org/eng/user/profile/Roujin Roujin]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我的首席策略师大卫-艾克斯罗德,他一直是追随我的伙伴。你们组建了政治史上最好的竞选团队,是你们成就了今天,我永远感谢你们为此所作出的牺牲。}} || wo3 de5 shou3 席策 lüe4 shi1 da4 wei4 - ai4 ke4 si1 luo1 de2 , ta1 yi1 zhi2 shi4 zhui1 sui2 wo3 de5 huo3 ban4 。 ni3 men5 zu3 jian4 le5 zheng4 zhi4 shi3 shang4 zui4 hao3 de5 jing4 xuan3 tuan2 dui4 , shi4 ni3 men5 cheng2 jiu4 le5 jin1 tian1 , wo3 yong3 yuan3 gan3 xie4 ni3 men5 wei2/wei4 ci3 suo3 zuo4 chu1 de5 xi1 sheng1 。|| To my chief strategist, David Axelrod, who's been a partner with me every step of the way. To the best campaign team ever assembled in the history of politics! You made this happen, and I am forever grateful for what you've sacrificed to get it done. (Mandarin, [https://tatoeba.org/eng/sentences/show/347825 Tatoeba] [https://tatoeba.org/eng/user/profile/zhouj1955 zhouj1955]) |} === 俎 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 磬 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 嘏 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === einsortieren === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |是月也,祀不用牺牲,用圭璧,更皮币。}} || shi4 yue4 ye3 , si4 bu4 yong4 xi1 sheng1 , yong4 gui1 璧, geng4 pi5 bi4 。||In diesem Monat verwendet man bei den Bittopfern keine Opfertiere, sondern man verwendet Zepter und Ringe aus Nephrit, um sie zu ersetzen, und Felle und Seiden. ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |上前用油和酒倒在他的伤处,包裹好了,扶他骑上自己的牲口,带到店里去照应他。 }} || shang4 qian2 yong4 you2 he2/he4/huo2 jiu3 dao3 zai4 ta1 de5 shang1 chu4 , bao1 guo3 hao3 le5 , fu2 ta1 qi2 shang4 zi4 ji3 de5 sheng1 kou3 , dai4 dao4 dian4 li3 qu4 zhao4 ying1/ying4 ta1 。 ||10.34 und er trat hinzu und verband seine Wunden und goß Öl und Wein darauf; und er setzte ihn auf sein eigenes Tier und führte ihn in eine Herberge und trug Sorge für ihn. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Lukasevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |是月也,大飨帝,尝牺牲,告备于天子。}} || shi4 yue4 ye3 , da4 飨 di4 , chang2 xi1 sheng1 , gao4 bei4 yu2 tian1 zi5 。||In diesem Monat wird dem Himmelssohn mitgeteilt, daß die Tiere für das große Herbstopfer des Herrn bereit sind. ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |是月也,乃命宰祝,巡行牺牲}} || shi4 yue4 ye3 , nai3 ming4 zai3 zhu4 , xun2 hang2/xing2 xi1 sheng1 ||In diesem Monat erhält der Opferpriester und der Liturg den Befehl, die zum Opfer bestimmten Tiere zu untersuchen. ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我们的祖宗雅各将这井留给我们,他自己和儿子并牲畜也都喝这井里的水,难道你比他还大吗?" }} || wo3 men5 de5 zu3 zong1 ya3 ge4 jiang1/jiang4 zhe4/zhei4 jing3 liu2 gei3 wo3 men5 , ta1 zi4 ji3 he2/he4/huo2 er2/er5 zi5 bing4 sheng1 畜 ye3 dou1/du1 he1 zhe4/zhei4 jing3 li3 de5 shui3 , nan2/nan4 dao4 ni3 bi4 ta1 hai2/huan2 da4 ma5 ?" ||4.12 Du bist doch nicht größer als unser Vater Jakob, der uns den Brunnen gab, und er selbst trank aus demselben und seine Söhne und sein Vieh? ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Johannesevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |牺牲无用牝}} || xi1 sheng1 wu2 yong4 pin4 ||Als Opfer werden keine weiblichen Tiere verwendet. ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |是月也,祀不用牺牲}} || shi4 yue4 ye3 , si4 bu4 yong4 xi1 sheng1 ||In diesem Monat verwendet man bei den Bittopfern keine Opfertiere ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |} == Lückentexte == === [[:zh:Wikijunior:太阳系/水星|Wikijunior: 太阳系/水星 Sonnensystem/Merkur]] === {| class="wikitable" |- ! [[:zh:Wikijunior:太阳系/水星|Wikijunior: 太阳系/水星 Sonnensystem/Merkur ]] !! Übersetzung Christian Bauer |- | 它 的 名字 是 怎么来的?|| Woher kommt sein Name? |- | 中文 名称|| Chinesischer Name |- | 西汉 时期,|| Zur Zeit der westlichen Han |- | 天文学家 司马迁 把 五 大 行星 与 春秋 战国 以来的 “五行”学说 联系 在 一起,|| Der Astronom Si Ma Qian (145-86) nahm die 5 großen Planeten und verband sie mit der 5-Elemente-Lehre der Periode der Frühlings und Herbstannalen (770-476) und der Streitenden Reiche (475-221). |- | 正式 把 五 大 行星 命名 为 “金星”、“木星”、“水星”、“火星”、“土星”。 || Die 5 großen Planten nannte man somit Goldplanet (Venus), Holzplanet (Jupiter), Wasserplanet (Merkur), Feuerplanet (Mars) und Erdeplanet (Saturn). |- | 五行 配 五色,|| Die 5 Elemente werden assoziiert mit zu den 5 Farben |- | 木 为 青,|| Holz entspricht naturfarben (blau/grün) |- | 火 为 赤,|| Feuer entspricht rot |- | 土 为 黄,|| Erde entspricht gelb |- | 金 为 白|| Gold entspricht weiß |- | 水 为 黑。 || Wasser entspricht schwarz. |- | 司马迁 从 实际 观测 发现,|| Si Ma Qian fand aus vorgenommenen Beobachtungen heraus: |- | 这些 在 《史记‧天官书》 中 有 明确 反映,|| Diese sind im Shi Ji, den Aufzeichnungen der Historiker im Buch des Himmelspalastes, klar beschrieben. |- | 可见 司马迁 对 五 大 行星 的 命名 也 是 从 事实 出发,|| Wir können Si Ma Qian als Namensgeber der 5 großen Planeten ansehen, sie stammen aber auch von Tatsachen her. |- | 原本 不 含 任何 神话 观念, || Ursprünglich gab es noch keine Mythen über sie. |- | 这 与 古 希腊 人 依据 神话 中 的 Götter-人物 命名 形成 鲜明 对比,|| Dies bildet einen klaren Kontrast zu den bei den alten Griechen bestehenden Mythen, bei denen sie nach Götterwesen benannt sind. |- | 再一次 反映 出 中国 天文 观念 的 重 实用, phantasieablehnend 精神。 || Sie spiegeln einen - hier aus dem Konzepten der chinesischen Astronomie stammenden -- faktenbasierten, phantasieablehnenden Geist wieder |- | |- | 西方 名称|| Westlicher Name |- | 在 西方 国家,|| In westlichen Staaten |- | 水星 的 名称 叫 “墨丘利”。|| ist der Name des Planeten Merkur. |- | 这个 名字 来自于 神话,|| Dieser Name kommt aus der Mythologie. |- | 或 许来 自 拉丁文 Mercator,|| Möglicherweise kommt er vom lateinischen Mercator, |- | 意谓 “商人” 。|| das heißt Kaufmann. |- | 墨丘利 在 一个 星期 中,有 它 自己 的 位子:|| Merkur hat innerhalb einer Woche seinen eigenen Platz |- | “奥丁 的 日子”(古 英文:Woden's daeg),|| Odins Tag (altenglisch Woden's daeg [Wotanstag]) |- | 那 天 就 是 星期三。|| Dieser Tag wurde zum Mittwoch. |- | 在 罗马人 的 神话 中,|| In der römischen Mythologie |- | 墨丘利 是 神 的 报信者,|| Merkur ist der Götterbote. |- | 神 允许 他 很 快 地 在 全 世界 旅行。|| Die Götter erlauben ihm sehr schnell in der ganzen Welt zu reisen |- | 因为 它 的 公转 速度 比 任何 其他 行星 都快,|| Weil seine Umdrehungsgeschwindigkeit im Vergleich mit allen anderen Planeten die schnellste ist, |- | 所以 它 叫 墨丘利,|| heißt er Merkur. |- | 速度 将近 50 公里 每 秒!|| Seine Geschwindigkeit beträgt fast 50 km pro Sekunde! |} === Bibel === ==== [https://newchristianbiblestudy.org/de/bible/compare/chinese-union-s/german-elberfelder-1905/acts-of-the-apostles/11/ Apostelgeschichte Kapitel 11] ==== {| class="wikitable" ! Chinese Union Version !! Übersetzung Rudolf Brockhaus (1856-1932) |- | 使徒和在犹太的众弟兄听说外邦人也领受了神的道。||1 Die Apostel aber und die Brüder, die in Judäa waren, hörten, daß auch die Nationen das Wort Gottes angenommen hätten;  |- | 及至彼得上了耶路撒冷,那些奉割礼的门徒和他争辩说:||2 und als Petrus nach Jerusalem hinaufkam, stritten die aus der Beschneidung mit ihm  |- | 你进入未受割礼之人的家和他们一同吃饭了。||3 und sagten: Du bist zu Männern eingekehrt, die Vorhaut haben, und hast mit ihnen gegessen.  |- | 彼得就开口把这事挨次给他们讲解说:||4 Petrus aber fing an und setzte es ihnen der Reihe nach auseinander und sprach:  |- | 我在约帕城里 Gebet 的时候,魂游象外,看见异象,有一物降下,好像一块大布,系着四角,从天 herniedergelassen,直来到我跟前。||5 Ich war in der Stadt Joppe im Gebet, und ich sah in einer Entzückung ein Gesicht, wie ein gewisses Gefäß herabkam, gleich einem großen leinenen Tuche, an vier Zipfeln herniedergelassen aus dem Himmel; und es kam bis zu mir.  |- | 我定睛观看,见内中有地上四足的牲畜和野兽、昆虫,并天上的飞鸟。||6 Und als ich es unverwandt anschaute, bemerkte und sah ich die vierfüßigen Tiere der Erde und die wilden Tiere und die kriechenden und das Gevögel des Himmels.  |- | 我且听见有声音向我说:彼得,起来,宰了吃!||7 Ich hörte aber auch eine Stimme, die zu mir sagte: Stehe auf, Petrus, schlachte und iß!  |- | 我说:主阿,这是不可的!凡俗而不洁净的物从来没有入过我的口。||8 Ich sprach aber: Keineswegs, Herr! Denn niemals ist Gemeines oder Unreines in meinen Mund gekommen.  |- | 第二次,有声音从天上说:神所洁净的,你不可当作俗物。||9 Eine Stimme aber antwortete zum zweiten Male aus dem Himmel: Was Gott gereinigt hat, mache du nicht gemein!  |- | 这样一连三次,就都收回天上去了。||10 Dies aber geschah dreimal; und alles wurde wiederum hinaufgezogen in den Himmel.  |- | 正当那时,有三个人站在我们所住的房门前,是从该撒利亚差来见我的。||11 Und siehe, alsbald standen vor dem Hause, in welchem ich war, drei Männer, die von Cäsarea zu mir gesandt waren.  |- | 圣灵 hieß 我和他们同去,不要疑惑。(或作:不要分别等类)。同着我去的,还有这六位弟兄;我们都进了那人的家,||12 Der Geist aber hieß mich mit ihnen gehen, ohne irgend zu zweifeln. Es kamen aber auch diese sechs Brüder mit mir, und wir kehrten in das Haus des Mannes ein.  |- | 那人就告诉我们,他如何看见一位天使,站在他屋里,说:你打发人往约帕去,请那称呼彼得的西门来;||13 Und er erzählte uns, wie er den Engel gesehen habe in seinem Hause stehen und zu ihm sagen: Sende nach Joppe und laß Simon holen, der Petrus zubenamt ist;  |- | 他有话告诉你,可以叫你和你的全家得救。||14 der wird Worte zu dir reden, durch welche du errettet werden wirst, du und dein ganzes Haus.  |- | 我一开讲,圣灵便降在他们身上,正像当初降在我们身上一样。||15 Indem ich aber zu reden begann, fiel der Heilige Geist auf sie, so wie auch auf uns im Anfang.  |- | 我就想起主的话说:约翰是用水施洗,但你们要受圣灵的洗。||16 Ich gedachte aber an das Wort des Herrn, wie er sagte: Johannes taufte zwar mit Wasser, ihr aber werdet mit Heiligem Geiste getauft werden.  |- | 神既然给他们恩赐,像在我们信主 Jesus 基督的时候给了我们一样;我是谁,能 zu wehren 神呢!||17 Wenn nun Gott ihnen die gleiche Gabe gegeben hat wie auch uns, die wir an den Herrn Jesus Christus geglaubt haben, wer war ich, daß ich vermocht hätte, Gott zu wehren?  |- | 众人听见这话,就不言语了,只归荣耀与神,说:这样看来,神也赐恩给外邦人,叫他们悔改得生命了。||18 Als sie aber dies gehört hatten, beruhigten sie sich und verherrlichten Gott und sagten: Dann hat Gott also auch den Nationen die Buße gegeben zum Leben.  |- | 那些因司提反的事遭患难四散的门徒直走到 Phönicien 和居比路,并安提阿;他们不向别人讲道,只向犹太人讲。||19 Die nun zerstreut waren durch die Drangsal, welche wegen Stephanus entstanden war, zogen hindurch bis nach Phönicien und Cypern und Antiochien und redeten zu niemand das Wort, als allein zu Juden.  |- | 但内中有居比路和古利奈人,他们到了安提阿也向希利尼人传讲主 Jesuss(有古卷作:也向说希利尼话的犹太人传讲主 Jesus)。||20 Es waren aber unter ihnen etliche Männer von Cypern und Kyrene, welche, als sie nach Antiochien kamen, auch zu den Griechen redeten, indem sie das Evangelium von dem Herrn Jesus verkündigten.  |- | 主与他们同在,信而归主的人就很多了。||21 Und des Herrn Hand war mit ihnen, und eine große Zahl glaubte und bekehrte sich zu dem Herrn.  |- | 这风声传到耶路撒冷教会人的耳中,他们就打发巴拿巴出去,走到安提阿为止。||22 Es kam aber die Rede von ihnen zu den Ohren der Versammlung, die in Jerusalem war, und sie sandten Barnabas aus, daß er hindurchzöge bis nach Antiochien;  |- | 他到了那里,看见神所赐的恩就欢喜,劝勉众人,立定心志,恒久靠主。||23 welcher, als er hingekommen war und die Gnade Gottes sah, sich freute und alle ermahnte, mit Herzensentschluß bei dem Herrn zu verharren.  |- | 这巴拿巴原是个好人,被圣灵充满,大有信心。於是有许多人归服了主。||24 Denn er war ein guter Mann und voll Heiligen Geistes und Glaubens; und eine zahlreiche Menge wurde dem Herrn hinzugetan.  |- | 他又往大数去找扫罗,||25 Er zog aber aus nach Tarsus, um Saulus aufzusuchen; und als er ihn gefunden hatte, brachte er ihn nach Antiochien.  |- | 找着了,就带他到安提阿去。他们足有一年的工夫和教会一同聚集,教训了许多人。门徒称为基督徒是从安提阿起首。||26 Es geschah ihnen aber, daß sie ein ganzes Jahr in der Versammlung zusammenkamen und eine zahlreiche Menge lehrten, und daß die Jünger zuerst in Antiochien Christen genannt wurden.  |- | 当那些日子,有几位先知从耶路撒冷下到安提阿。||27 In diesen Tagen aber kamen Propheten von Jerusalem nach Antiochien herab.  |- | 内中有一位,名叫亚迦布,站起来,durch 圣灵指明天下将有大饥荒。这事到革老丢年间果然有了。||28 Einer aber von ihnen, mit Namen Agabus, stand auf und zeigte durch den Geist eine große Hungersnot an, die über den ganzen Erdkreis kommen sollte, welche auch unter Klaudius eintrat.  |- | 於是门徒定意照各人的 Güter,送去供给住在犹太的弟兄。||29 Sie beschlossen aber, jenachdem einer der Jünger begütert war, ein jeder von ihnen zur Hilfsleistung den Brüdern zu senden, die in Judäa wohnten;  |- | 他们就这样行, durch die Hand des 巴拿巴和扫罗送到众长老那里。||30 was sie auch taten, indem sie es an die Ältesten sandten durch die Hand des Barnabas und Saulus.  |} ==== [https://newchristianbiblestudy.org/de/bible/compare/chinese-union-s/german-elberfelder-1905/acts-of-the-apostles/21/ Apostelgeschichte Kapitel 21] ==== {| class="wikitable" ! Chinese Union Version !! Übersetzung Rudolf Brockhaus (1856-1932) |- | 我们离别了众人,就开船一直行到哥士。第二天到了罗底,从那里到 Patara,||1 Als es aber geschah, daß wir abfuhren, nachdem wir uns von ihnen losgerissen hatten, kamen wir geraden Laufs nach Kos, des folgenden Tages aber nach Rhodus und von da nach Patara.  |- | 遇见一只船要往 Phönicien 去,就上船起行。||2 Und als wir ein Schiff fanden, das nach Phönicien übersetzte, stiegen wir ein und fuhren ab.  |- | 望见居比路,就从南边行过,往叙利亚去,我们就在推罗上岸,因为船要在那里卸货。||3 Als wir aber Cyperns ansichtig wurden und es links liegen ließen, segelten wir nach Syrien und legten zu Tyrus an, denn daselbst hatte das Schiff die Ladung abzuliefern.  |- | 找着了门徒,就在那里住了七天。他们被圣灵感动,对保罗说:不要上耶路撒冷去。||4 Und als wir die Jünger gefunden hatten, blieben wir daselbst sieben Tage; diese sagten dem Paulus durch den Geist, er möge nicht nach Jerusalem hinaufgehen.  |- | 过了这几天,我们就起身前行。他们众人同妻子儿女,送我们到城外,我们都 knieten 在岸上 und beteten,彼此辞别。||5 Als es aber geschah, daß wir die Tage vollendet hatten, zogen wir fort und reisten weiter; und sie alle geleiteten uns mit Weibern und Kindern bis außerhalb der Stadt; und wir knieten am Ufer nieder und beteten.  |- | 我们上了船,他们就回家去了。||6 Und als wir voneinander Abschied genommen hatten, stiegen wir in das Schiff, jene aber kehrten heim.  |- | 我们从推罗行尽了水路,来到多利买,就问那里的弟兄安,和他们同住了一天。||7 Als wir aber die Fahrt vollbracht hatten, gelangten wir von Tyrus nach Ptolemais; und wir begrüßten die Brüder und blieben einen Tag bei ihnen.  |- | 第二天,我们离开那里,来到该撒利亚,就进了传福音的 Philippus 家里,和他同住。他是那七个执事里的一个。||8 Des folgenden Tages aber zogen wir aus und kamen nach Cäsarea; und wir gingen in das Haus des Philippus, des Evangelisten, der einer von den sieben war, und blieben bei ihm.  |- | 他有四个女儿,都是处女,是说预言的。||9 Dieser aber hatte vier Töchter, Jungfrauen, welche weissagten.  |- | 我们在那里多住了几天,有一个先知,名叫亚迦布,从犹太下来,||10 Als wir aber mehrere Tage blieben, kam ein gewisser Prophet, mit Namen Agabus, von Judäa herab.  |- | 到了我们这里,就拿保罗的腰带 und band 自己的手脚,说:圣灵说:犹太人在耶路撒冷,要如此 binden 这腰带的主人,把他交在外邦人手里。||11 Und er kam zu uns und nahm den Gürtel des Paulus und band sich die Hände und die Füße und sprach: Dies sagt der Heilige Geist: Den Mann, dem dieser Gürtel gehört, werden die Juden in Jerusalem also binden und in die Hände der Nationen überliefern.  |- | 我们和那本地的人听见这话,都苦劝保罗不要上耶路撒冷去。||12 Als wir aber dies hörten, baten sowohl wir als auch die daselbst Wohnenden, daß er nicht nach Jerusalem hinaufgehen möchte.  |- | 保罗说:你们为什么这样痛哭,使我心碎呢?我为主 Jesus 的名,不但被人 gebunden,就是死在耶路撒冷也是愿意的。||13 Paulus aber antwortete: Was machet ihr, daß ihr weinet und mir das Herz brechet? Denn ich bin bereit, nicht allein gebunden zu werden, sondern auch in Jerusalem für den Namen des Herrn Jesus zu sterben.  |- | 保罗既不听劝,我们便住了口,只说:愿主的旨意成就,便了。||14 Als er sich aber nicht überreden ließ, schwiegen wir und sprachen: Der Wille des Herrn geschehe!  |- | 过了几日,我们收拾行李上耶路撒冷去。||15 Nach diesen Tagen aber machten wir unsere Sachen bereit und gingen hinauf nach Jerusalem.  |- | 有该撒利亚的几个门徒和我们同去,带我们到一个久为(久为:或作老)门徒的家里,叫我们与他同住;他名叫拿孙,是居比路人。||16 Es gingen aber auch einige von den Jüngern aus Cäsarea mit uns und brachten einen gewissen Mnason mit, einen Cyprier, einen alten Jünger, bei dem wir herbergen sollten.  |- | 到了耶路撒冷,弟兄们欢欢喜喜的接待我们。||17 Als wir aber zu Jerusalem angekommen waren, nahmen uns die Brüder freudig auf.  |- | 第二天,保罗同我们去见雅各;长老们也都在那里。||18 Des folgenden Tages aber ging Paulus mit uns zu Jakobus, und alle Ältesten kamen dahin.  |- | 保罗问了他们安,便将神用他传教,在外邦人中间所行之事,一一的述说了。||19 Und als er sie begrüßt hatte, erzählte er eines nach dem anderen, was Gott unter den Nationen durch seinen Dienst getan hatte.  |- | 他们听见,就归荣耀与神,对保罗说:兄台,你看犹太人中信主的有多少万,并且都为律法热心。||20 Sie aber, als sie es gehört hatten, verherrlichten Gott und sprachen zu ihm: Du siehst, Bruder, wie viele Tausende der Juden es gibt, welche glauben, und alle sind Eiferer für das Gesetz.  |- | 他们听见人说:你教训一切在外邦的犹太人离弃摩西,对他们说:不要给孩子行割礼,也不要遵行条规。||21 Es ist ihnen aber über dich berichtet worden, daß du alle Juden, die unter den Nationen sind, Abfall von Moses lehrest und sagest, sie sollen die Kinder nicht beschneiden, noch nach den Gebräuchen wandeln.  |- | 众人必听见你来了,这可怎么办呢?||22 Was ist es nun? Jedenfalls muß eine Menge zusammenkommen, denn sie werden hören, daß du gekommen bist.  |- | 你就照着我们的话行罢?我们这里有四个人,都有愿在身。||23 Tue nun dieses, was wir dir sagen: Wir haben vier Männer, die ein Gelübde auf sich haben.  |- | 你带他们去,与他们一同行洁净的礼,替他们拿出规费,叫他们得以 den 头 scheren。这样,众人就可知道,先前所听见你的事都是虚的;并可知道,你自己为人,循规蹈矩,遵行律法。||24 Diese nimm zu dir und reinige dich mit ihnen und trage die Kosten für sie, damit sie das Haupt scheren lassen; und alle werden erkennen, daß nichts an dem ist, was ihnen über dich berichtet worden, sondern daß du selbst auch in der Beobachtung des Gesetzes wandelst.  |- | 至於信主的外邦人,我们已经写信拟定,叫他们谨忌那祭偶像之物,和血,并勒死的牲畜,与奸淫。||25 Was aber die Gläubigen aus den Nationen betrifft, so haben wir geschrieben und verfügt, daß sie nichts dergleichen halten sollten, als nur daß sie sich sowohl vor dem Götzenopfer als auch vor Blut und Ersticktem und Hurerei bewahrten.  |- | 於是保罗带着那四个人,第二天与他们一同行了洁净的礼,进了殿,报明洁净的日期满足,只等祭司为他们各人献祭。||26 Dann nahm Paulus die Männer zu sich, und nachdem er sich des folgenden Tages gereinigt hatte, ging er mit ihnen in den Tempel und kündigte die Erfüllung der Tage der Reinigung an, bis für einen jeden aus ihnen das Opfer dargebracht war.  |- | 那七日将完,从亚西亚来的犹太人看见保罗在殿里,就 brachten die ganze 众人 in Aufregung,下手拿他, und schrieen:||27 Als aber die sieben Tage beinahe vollendet waren, sahen ihn die Juden aus Asien im Tempel und brachten die ganze Volksmenge in Aufregung und legten die Hände an ihn und schrieen:  |- | 以色列人来帮助,这就是在各处教训众人糟践我们百姓和律法,并这地方的。他又带着希利尼人进殿,污秽了这圣地。||28 Männer von Israel, helfet! Dies ist der Mensch, der alle allenthalben lehrt wider das Volk und das Gesetz und diese Stätte; und dazu hat er auch Griechen in den Tempel geführt und diese heilige Stätte verunreinigt.  |- | 这话是因他们曾看见以弗所人特罗非摩同保罗在城里,以为保罗带他||29 Denn sie hatten vorher den Trophimus, den Epheser, mit ihm in der Stadt gesehen, von welchem sie meinten, daß Paulus ihn in den Tempel geführt habe.  |- | 合城都震动,百姓一齐跑来,拿住保罗,拉他出殿,殿门立刻都关了。||30 Und die ganze Stadt kam in Bewegung, und es entstand ein Zusammenlauf des Volkes; und sie ergriffen Paulus und schleppten ihn aus dem Tempel, und alsbald wurden die Türen geschlossen.  |- | 他们正想要杀他,有人报信给营里的千夫长说:耶路撒冷合城都乱了。||31 Während sie ihn aber zu töten suchten, kam an den Obersten der Schar die Anzeige, daß ganz Jerusalem in Aufregung sei;  |- | 千夫长立时带着兵丁和几个百夫长,跑下去到他们那里。他们见了千夫长和兵丁,就止住不打保罗。||32 der nahm sofort Kriegsknechte und Hauptleute mit und lief zu ihnen hinab. Als sie aber den Obersten und die Kriegsknechte sahen, hörten sie auf, den Paulus zu schlagen.  |- | 於是千夫长上前拿住他,befahl 用两条铁炼 um ihn zu binden;又问他是什么人,做的是什么事。||33 Dann näherte sich der Oberste, ergriff ihn und befahl, ihn mit zwei Ketten zu binden, und erkundigte sich, wer er denn sei und was er getan habe.  |- | 众人有 rufen 这个的,有 rufen 那个的;千夫长因为这样 Tumult,得不着实情,就 befahl er 人将保罗带进营楼去。||34 Die einen aber riefen dieses, die anderen jenes in der Volksmenge; da er aber wegen des Tumultes nichts Gewisses erfahren konnte, befahl er, ihn in das Lager zu führen.  |- | 到了 an die 阶上,wegen des 众人 Gewalt,兵丁只得将保罗抬起来。||35 Als er aber an die Stufen kam, geschah es, daß er wegen der Gewalt des Volkes von den Kriegsknechten getragen wurde;  |- | 众人跟在後面 und schrie:||36 denn die Menge des Volkes folgte und schrie:  |- | 除掉他!将要带他进营楼,保罗对千夫长说:我对你说句话可以不可以?他说:你懂得希利尼话么?||37 Hinweg mit ihm! Und als Paulus eben in das Lager hineingebracht werden sollte, spricht er zu dem Obersten: Ist es mir erlaubt, dir etwas zu sagen? Er aber sprach: Verstehst du Griechisch?  |- | 你莫非是从前作乱、带领四千凶徒往旷野去的那埃及人么?||38 Du bist also nicht der Ägypter, der vor diesen Tagen eine Empörung gemacht und die viertausend Mann Meuchelmörder in die Wüste hinausgeführt hat?  |- | 保罗说:我本是犹太人,生在基利家的大数,并不是无名小城的人。求你准我对百姓说话。||39 Paulus aber sprach: Ich bin ein jüdischer Mann aus Tarsus, Bürger einer nicht unberühmten Stadt in Cilicien; ich bitte dich aber, erlaube mir, zu dem Volke zu reden.  |- | 千夫长准了。保罗就站在?阶上,向百姓摆手,他们都静默无声,保罗便用希伯来话对他们说:||40 Als er es aber erlaubt hatte, winkte Paulus, auf den Stufen stehend, dem Volke mit der Hand; nachdem aber eine große Stille eingetreten war, redete er sie in hebräischer Mundart an und sprach:  |} === [http://magazine.marcopoloproject.org/%E4%B8%AD%E5%9B%BD%E8%BF%98%E6%9C%89%E6%B2%A1%E6%9C%89%E6%9C%8B%E5%8F%8B-china-friends/ the marco polo project: 中国还有没有“朋友”?] === 翻开报纸,或打开《新闻联播》,我们常看到或听到“中国人民的老朋友XX国”,但慢慢的发现——现在能说成是“老朋友”的国家真是越来越少了。另外 还发现,只要国家领导人出国 Besuche,总伴随着有 Geldgeschenken 和提供无偿援助。这不仅让人产生疑问:中国确实在到处撒钱,但到处撒钱的中国为何几乎没有朋友。当年举全 国之力援助的越南,现在却侵略着中国的南海;在日本地震中国也是举全力支援,而日本却视中国为最大威胁;用无数生命和举全国之力 Schutz 的朝鲜,不仅不曾感 恩,胃口反而越来越大了…… 什么是朋友?所谓的朋友即患难见真情的伙伴,中国在最需要帮助的时候它们会帮助我们。而如今我们基本上没有此类真朋友,我们周边全是些笑里藏刀、ausnutzen, obwohl heimlich andere unterstützend、厚颜无耻、得寸进尺、贪得无厌的“朋友”,不妨把这些“朋友”分为三类。 第一类:笑里藏刀型 这 一类里,最典型的就是俄罗斯,俄罗斯经常和我们当面一套背后一套,两面三刀,美国欺负它的时候它就拉我们去垫背,美国欺负我们的时候它也许会落井下石,它 为什么向越南印度 verkauft 重量级武器,为什么向中国出售武器时肆意加价,俄罗斯小人之心使然,我们还期许它能成为我们的朋友吗? 俄 罗斯一方面要在战略上联合中国对付美国,另一方面却又卖最好的武器给越南、印度,让他们牵制和对付中国;表面上要在联合国安理会与中国保持一致意见,但另 一方面,在叙利亚和利比亚两次表决中,选择了抛弃 Gaddafi 和阿萨德,而且并未事先通知中国,让中国在联合国中倍加孤立。他们表面上是中国人民的好朋友,但对 中国却时时刻刻提防,随时准备背后 stechen 一刀。 又比如越南和 Philippinen 等国,一方面它们需要中国的经济援助和中国这 个大市场,但另一方面又和中国在领土问题上扩大争议,甚至像 Philippinen,更是拿到中国的贷款后,就去买武器,与中国争南海;它们需要你的钱的时候,需要美国卖 武器它们的时候,就承认你是大国,等你面子上刚舒服完,它们就又开始要割你的肉。 第二类:Ausnutzen, aber andere heimlich unterstützen 的 像 朝鲜,就像是一头永远喂不家的狼。89年全球制裁中国,朝鲜在联合国投了弃权票;2000年第27届奥运会因此朝鲜投票给澳大利亚悉尼,致使中国北京以 45:43两票之差输给澳大利亚悉尼。不仅如此,朝鲜做任何重大事情之前也往往不通知中国,比如爆炸核武器,六方会谈,使中方处于被动状态,现在他又 verursachte Probleme 加上国内危机,不得不依靠中国,造成表面上的亲近,但是这种亲近的关系是不可靠和 akkumuliert 危险的。 不管中国每 年援助他多少钱粮,也不管中国为朝鲜打仗牺牲过多少军人(何止朝鲜战争,明朝、清朝时,我们就为朝鲜抗击 japanische Piraten 打过不少大仗),朝鲜都不会从心里认中国这个 大哥,所以在他们的教科书里,所有与日本和美国战争的胜利都是因为他们自己。除了需要钱和粮食的时候外,基本上这个“狼小弟”比大哥都还横,他干什么大 事,事先都不一定通知中国,但替他 den Hintern abwischen 的一定是中国。 ... 风青杨: 著名企业 Marken 运营战略专家。现任汇赢天下 Marken 策划机构CEO。《中国经营报》《经济观察报》《销售与市场》《国际公关》等一线 Medien 一线 Author。 [http://magazine.marcopoloproject.org/authors/Feng%20Qingyang%20-%20%E9%A3%8E%E9%9D%92%E6%9D%A8/ Feng Qingyang] [http://magazine.marcopoloproject.org/%e4%b8%ad%e5%9b%bd%e8%bf%98%e6%9c%89%e6%b2%a1%e6%9c%89%e6%9c%8b%e5%8f%8b%ef%bc%9f-does-china-still-have-friends-english/ Übersetzung] Does China still have “friends”? When we open the newspaper, or turn on ‘News Simulcast’, we often read or hear about “China’s old friend, this or that country”, but slowly, the countries of which can be said to be “old friends” are fewer and fewer. We also discover that whenever country leaders go abroad on official visits, it’s always accompanied by donations and free aid. This makes people produce questions like, “China is indeed pouring out money everywhere, but why does this charitable China have almost no friends?” A few years back China offered aid to Vietnam, but now it is encroaching on China’s territory in the South Chinese Sea. When the earthquake hit Japan, China mobilized the entire nation to support it, and yet Japan regards China as its greatest threat; though China has expended countless lives and the entire nation’s strength to protect North Korea, not only has it never shown thanks, but instead it’s appetite gets bigger and bigger… What are friends? So-called ‘friends’ are partners who stay true when trouble strikes. When China needs help most, they will help us. But now, we basically have no such true friend. All that surround us hide knives in their smile, and leech off friends when secretly helping others; they are shameless, insatiable, greedy “friends”. Let’s go ahead and divide these “friends” into three categories. First category: those hiding knives in their smile In this category, the most typical case is Russia. Russia and China often act like friends face-to-face but backstab each other. When bullied by America, Russia makes us the scape-goat. When America bullies us, Russia may also hit us when we are down. Why does it peddle heavy weapons to Vietnam and India? And why does it wantonly raise prices on weapons when it sells to China? Russia shows the heart of a villain, so can we still expect them to become our friend? On one hand, Russia wants to strategically ally with China against the United States; but on the other hand, it sells its best weapons to Vietnam and India, allowing them to impede and oppose China. On the surface, it wants to maintain consensus with China in the UN Security Council, but on the other hand, when voting on Syria and Lybia, it twice decided to abandon Gaddafi and Assad without first notifying China, letting China be extremely isolated in the Council. At face value, it’s a good friend of the Chinese people, but it’s wary of China at every moment, always ready to plant a knife in China’s back. Other examples are Vietnam and the Philippines: on the one hand, they need Chinese assistance and access to the large Chinese market, but on the other hand, they are in conflict with China over territorial issues; the Philippines even accepted Chinese loans, and then went out to buy weapons while engaging in a dispute with China about the South China Sea. When they need your money, or when they need the US to sell them weapons, they’ll smile to your face and tell you you’re a big country, but at the same time they’re thinking of carving you up. Second category: those who eat food from our hands Like North Korea, which is like an ever-hungry wolf. In 1989, amongst global sanctions against China, North Korea abstained from the vote at the United Nations; in 2000, the 27th Olympic Games were organised in Sydney because North Korea gave its vote to Australia, leaving Beijing to lose by 45 – 43 votes. Not only that, but before North Korea sets up on doing something major, it typically won’t notify China. This happened for nuclear testing or the six party talks, leaving China in a passive position. Now that the country is facing a domestic crisis, it has to rely on China, causing the relationship to appear close on the surface, but below the surface, it is dangerous and unreliable. No matter how much aid in money and cereal China gives each year, and no matter how many soldiers China sacrificed for North Korea (and beyond the Korean War, China sacrificed many soldiers to defend Korea against Japanese pirates during the Ming and Qing dynasty), in its heart, North Korea won’t recognize China as an older brother. And therefore in their history textbooks, the victories in the war against Japan and the US is entirely presented as their own. Apart from the moments when they need money or food, this ‘wolfish little brother’ is fundamentally even more unbalanced than a big brother. When it does something big, it doesn’t necessarily warn China in advance, but when it turns its back to someone for a wipe, then that’s always China. ... Feng Qingyang: famous brand strategy expert. Currently CEO of Huiying World branding agency. Senior writer for ‘China Business’, ‘Economic Observer’, ‘Sales and Marketing’, ‘International PR’ and other front-line media. [http://magazine.marcopoloproject.org/author/julienleyre/ Julien Leyre] [http://julienleyre.wordpress.com website] == Texte == === [[n:zh:中国拨巨款抗击北方干旱|Wikinews 中国拨巨款抗击北方干旱]] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 【2009年2月7日讯】<br/><br/>中国紧急向北方省市拨款,抗击50年来最严重的干旱。中国财政部星期六说,将调拨超过120亿美元的资金,用来帮助小麦生产和缓解干旱对这个地区造成的经济影响。<br/><br/>有关当局说,将近450万人,超过200万的牲畜遭遇饮水困难。该地区几乎一半的小麦作物因去年11月开始的干旱受到影响。财政部敦促地方政府在一个月内将资金拨付给受灾最严重的地区。<br/><br/>中国气象局预测,未来几个星期这个区域的部分地区会有降雨,可能会缓解旱情。 }} Noch keine Übersetzung === [http://museum.marcopoloproject.org/2016/02/18/why-did-mao-send-his-eldest-son-to-fight-in-the-korean-war-%e6%af%9b%e6%b3%bd%e4%b8%9c%e4%b8%ba%e4%bd%95%e4%b8%80%e5%ae%9a%e8%a6%81%e9%80%81%e9%95%bf%e5%ad%90%e6%af%9b%e5%b2%b8%e8%8b%b1%e5%8f%82/ the marco polo project: 毛泽东为何一定要送长子毛岸英参加抗美援朝? – Why did Mao send his eldest son to fight in the Korean war] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |1950年6月25日,朝鲜得到苏联支持不宣而战进攻韩国,历时三年的朝鲜战争爆发。当年10月,中国人民志愿军入朝作战。10月19日,毛泽东与杨开慧的长子毛岸英随志愿军司令部到达朝鲜,任俄语翻译兼机要秘书。<br/><br/>1950年11月25日,毛岸英在美军空袭中牺牲,年仅28岁。毛泽东获悉毛岸英牺牲的消息后,强忍巨大的悲痛,缓缓地说:“打仗总是要死人的嘛!革命战争总是要付出代价的嘛!为了国际共产主义事业,反抗侵略者,中国人民把自己最优秀的儿女,组成志愿军,开赴朝鲜前线,抗美援朝,保家卫国,牺牲了多少个优秀战士。岸英是属于牺牲了的成千上万革命烈士中的一员,为国际共产主义事业献出了年轻的生命,他尽了一个共产党员应尽的责任。不要因为他是我的儿子,就当成一件大事。”<br/><br/>那么,当初毛泽东为什么一定要送毛岸英参加抗美援朝呢?<br/><br/>这个问题,毛泽东自己给出了答案。1951年3月,毛泽东的老友周世钊来到北京与他见面。在见面中,周世钊提及此事,毛泽东说:“当然你说如果我不派他去朝鲜战场上,他就不会牺牲,这是可能的,也是不错的。但是你想一想,我是极主张派兵出国的,因为这是一场保家卫国的战争。我的这个动议,在中央政治局的会上,最后得到了党中央的赞同,作出了抗美援朝的决定……要作战,我要有人,派谁去呢?我作为党中央的主席,作为一个领导人,自己有儿子,不派他去抗美援朝,保家卫国,又派谁的儿子去呢?人心都是肉长的,不管是谁,疼爱儿子的心都是一样。如果我不派我的儿子去,而别人又人人都像我一样,自己有儿子也不派他去上战场,先派别人的儿子去上前线打仗,这还算是什么领导人呢?”<br/><br/>这就是毛泽东执意要将毛岸英送到朝鲜参加抗美援朝的原因所在。<br/><br/>人民没有忘记毛岸英为祖国所做贡献。2009年9月14日,他被评为100位新中国成立以来感动中国人物之一。<br/><br/>2009年10月5日,温家宝在朝鲜访问期间,来到毛岸英烈士墓前献上花束。他对着毛岸英的塑像说:“岸英同志,我代表祖国人民来看望你。祖国现在强大了,人民幸福了。你安息吧。”<br/><br/> }} [http://museum.marcopoloproject.org/author/he-renyong/ He Renyong] [http://herenyong.blog.ifeng.com/article/37050492.html Blog] On 25th of June 1950, North Korea, supported by the Soviet Union, attacked South Korea without declaring a war. The three year long Korean War had begun. In October that year, the Chinese People’s Volunteer Army entered Korea to join the combat. On 19 October the eldest son of Mao Zedong and Yang Kaihui, Mao Anying, arrived in North Korea, appointed as a Russian translator and confidential secretary with the headquarters of the Volunteer Army. On November 25,1950 during a US lead air strike Mao Anying sacrificed his life. He was only 28 years old. Having received the news of Mao Anying’s death, overwhelmed by intense grief Mao Zedong slowly said, “In wars there will be death! The price of revolutionary battles must be paid! For the cause of international communism against aggressors, the most outstanding sons and daughters of Chinese people formed a volunteer army and departed to the North Korean battle lines to fight the US and assist North Korea in defending the homeland, thus sacrificing lives of many excellent soldiers. Anying is only one of those thousands and thousands revolutionary martyrs, who sacrificed his young life for the cause of international communism. He fulfilled his duty as a member of the Communist Party. Don’t make a big deal out of his being my son.” Why did Mao Zedong send his son Mao Anying to fight US and help North Korea? Mao Zedong himself answered this question. In March 1951 Mao Zedong’s old friend Zhou Shizhao came to Beijing. During their meeting, when Zhou Shizhao brought up this topic, Mao Zhedong replied, “Of course, as you say, if I don’t send him to the North Korean battlefields, he cannot lose his life. It’s possible and it’s good. But if you think about it, I am the biggest advocate of sending our troops abroad, because this is a war of defending our country. I proposed this at the Politburo meeting and it was approved by the Central Committee of the Party. The decision was made to go to war, to fight US and help North Korea. I need people. Who will I send? Being the Chairman of the Central Committee of the Party, I am the leader. I have my own son and if I’m not sending him to the Korean War, to defend the homeland, then whose son will I send? Every human being has a heart. Everyone’s love for their son is special. If I’m not sending my son away, neither should other people send their sons. If I’m not sending my son away, others just like me, shouldn’t send their sons to the battlefield. What kind of leader would send other people’s sons to fight a war?” This was the reason why Mao Zhedong insisted on Mao Anying to be sent to North Korea to fight in the Korean War. People have not forgotten Mao Anying’s devotion to the motherland. On September 14, 2009 he was selected as one of the 100 most inspiring personalities since the founding of New China. During his visit to North Korea on October 5, 2009, Wen Jiabao laid a bouquet of flowers at the grave of Mao Anying. He spoke at the statue of Mao Anying, “Comrade Anying, I represent the people of the motherland, paying a visit to you. Now our country is very powerful, people are happy. You can rest in peace.” === [https://ctext.org/liji/ens Das Buch der Riten] === ==== [https://ctext.org/liji/qu-li-i/ens Qu Li (Teil 1)] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 临祭不惰。祭服敝则焚之,祭器敝则埋之,龟策敝则埋之,牲死则埋之。凡祭于公者,必自彻其俎。 }} Übersetzung James Legge When taking part in a sacrifice, one should not show indifference. When sacrificial robes are worn out, they should be burnt: sacrificial vessels in the same condition should be buried, as should the tortoise-shell and divining stalks, and a victim that has died. All who take part with the ruler in a sacrifice must themselves remove the stands (of their offerings). ==== [https://ctext.org/liji/qu-li-ii/ens Qu Li (Teil 2)] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 诸侯未及期相见曰遇,相见于却地曰会。诸侯使大夫问于诸侯曰聘,约信曰誓,莅牲曰盟。 }} Übersetzung James Legge When feudal princes see one another at a place and time not agreed on beforehand, the interview is called 'a meeting.' When they do so in some open place agreed on beforehand, it is called 'an assembly.' When one prince sends a great officer to ask about another, it is called 'a message of friendly inquiry.' When there is a binding to mutual faith, it is called 'a solemn declaration.' When they use a victim, it is called 'a covenant.' {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 凡祭,有其废之莫敢举也,有其举之莫敢废也。非其所祭而祭之,名曰淫祀。淫祀无福。天子以牺牛,诸侯以肥牛,大夫以索牛,士以羊豕。支子不祭,祭必告于宗子。 }} Übersetzung James Legge There should be no presuming to resume any sacrifice which has been abolished (by proper authority), nor to abolish any which has been so established. A sacrifice which it is not proper to offer, and which yet is offered, is called a licentious sacrifice. A licentious sacrifice brings no blessing. The son of Heaven uses an ox of one colour, pure and unmixed; a feudal prince, a fatted ox; a Great officer, an ox selected for the occasion; an (ordinary) officer, a sheep or a pig. The son of an inferior member of the harem cannot offer the sacrifice (to his grandfather or father); if (for some reason) he have to do so, he must report it to the honoured son, (the head of the family). ==== [https://ctext.org/liji/yue-ling/ens Yue Ling] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 是月也,祀不用牺牲,用圭璧,更皮币。 }} Übersetzung James Legge In this month at the (smaller) services of supplication they do not use victims. They use offerings of jade, square and round, and instead (of victims) skins and pieces of silk. {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 是月也,大飨帝、尝,牺牲告备于天子。合诸侯,制百县,为来岁受朔日,与诸侯所税于民轻重之法,贡职之数,以远近土地所宜为度,以给郊庙之事,无有所私。 }} Übersetzung James Legge In this month an announcement is made to the son of Heaven that the victims for the great sacrifice to God, and the autumnal sacrifice in the ancestral temple' are fit and ready. The princes of the states are assembled, and orders given to the officers of the various districts (in the royal domain). They receive the first days of the months for the coming year, and the laws for the taxation of the people by the princes, both light and heavy, and the amount of the regular contribution to the government, which is determined by the distance of the territories and the nature of their several productions. The object of this is to provide what is necessary for the suburban sacrifices and those in the ancestral temple. No private considerations are allowed to have place in this. ==== [https://ctext.org/liji/shao-yi/ens Shao Yi] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 凡羞有俎者,则于俎内祭。 }} Übersetzung James Legge Of all viands which were placed on the stands, the offering was put down inside the stand. ==== [https://ctext.org/liji/za-ji-ii/ens Za Ji (Teil 2)] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 上大夫之虞也,少牢。卒哭成事,附,皆大牢。下大夫之虞也,特牲。卒哭成事,附,皆少牢。 }} Übersetzung James Legge At the sacrifice of Repose for a Great officer of the highest grade, there were offered a boar and a ram; at the conclusion of the wailing, and at the placing of his spirit-tablet, there was, in addition, the bull. On the similar occasions for a Great officer of the lowest grade, there was in the first case a single victim, and in the others the boar and the ram. ==== [https://ctext.org/liji/ji-tong/ens Ji Tong] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 君迎牲而不迎尸,别嫌也。尸在庙门外,则疑于臣,在庙中则全于君;君在庙门外则疑于君,入庙门则全于臣、全于子。是故,不出者,明君臣之义也。 }} Übersetzung James Legge The ruler went to meet the victim, but not to meet the representative of the dead;-to avoid misconstruction. While the representative was outside the gate of the temple, he was to be regarded only as a subject; inside the temple, he had the full character of a ruler. While the ruler was outside the gate of the temple, he was there the ruler; when he entered that gate (on the occasion of the sacrifice), he had the full character of a subject, or a son. Hence his not going forth (to meet the representative) made clear the right distinction between the ruler and subject. ==== [https://ctext.org/liji/xiang-yin-jiu-yi/ens Xiang Yin Jiu Yi] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 仁义接,宾主有事,俎豆有数曰圣,圣立而将之以敬曰礼,礼以体长幼曰德。德也者,得于身也。故曰:古之学术道者,将以得身也。是故圣人务焉。 }} Übersetzung James Legge That intercourse according to benevolence and righteousness being established, so as to show the respective duties of host and guest, and the number of stands and dishes being properly fixed;--all this must be the result of sage intelligence. That intelligence established the arrangements, and each one being carried through with respect, it became a ceremonial usage. That usage proceeding to mark and embody the distinction between old and young, it became a virtue. Virtue is that which is the characteristic of the person. Therefore we have the saying, 'In the learning of antiquity, the methods by which they pursued the course adopted were intended to put men in possession of their proper virtue.' On this account the sages employed their powers (on its lessons). ==== [https://ctext.org/liji/yan-yi/ens Yan Yi] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 席,小卿次上卿,大夫次小卿,士、庶子以次就位于下。献君,君举旅行酬;而后献卿,卿举旅行酬;而后献大夫,大夫举旅行酬;而后献士,士举旅行酬;而后献庶子。俎豆、牲体、荐羞,皆有等差,所以明贵贱也。 }} The mats were arranged so that the dignitaries of smaller rank occupied the place next (in honour) to those of higher; the Great officers, the place next to the lower dignitaries. The officers and sons of concubines (also) took their places below in their regular order. The cup being presented to the ruler, he begins the general pledging, and offers the cup to the high dignitaries. They continue the ceremony, and offer the cup to the Great officers, who offer it in turn to the (other) officers, and these finally offer it to the sons of concubines. The stands and dishes, with the flesh of the animals, and the savoury viands, were all proportioned to the differences of rank in the guests:-and thus the distinction was shown between the noble and the mean. === [https://ctext.org/analects/ens Analekte des Konfuzius] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 卫灵公问陈于孔子。孔子对曰:“俎豆之事,则尝闻之矣;军旅之事,未之学也。”明日遂行。 }} Übersetzung James Legge The duke Ling of Wei asked Confucius about tactics. Confucius replied, "I have heard all about sacrificial vessels, but I have not learned military matters." On this, he took his departure the next day. === [https://ctext.org/xiao-jing/ens 孝经 Der Klassiker der kindlichen Frömmigkeit 纪孝行 - An Orderly Description of the Acts of Filial Piety] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 子曰:「孝子之事亲也,居则致其敬,养则致其乐,病则致其忧,丧则致其哀,祭则致其严。五者备矣,然后能事亲。事亲者,居上不骄,为下不乱,在丑不争。居上而骄则亡,为下而乱则刑,在丑而争则兵。三者不除,虽日用三牲之养,犹为不孝也。」 }} Übersetzung James Legge The Master said, "The service which a filial son does to his parents is as follows: In his general conduct to them, he manifests the utmost reverence. In his nourishing of them, his endeavor is to give them the utmost pleasure. When they are ill, he feels the greatest anxiety. In mourning for them (dead), he exhibits every demonstration of grief. In sacrificing to them, he displays the utmost solemnity. When a son is complete in these five things, (he may be pronounced) able to serve his parents. He who (thus) serves his parents, in a high situation will be free from pride, in a low situation will be free from insubordination, and among his equals will not be quarrelsome. In a high situation pride leads to ruin; in a low situation insubordination leads to punishment; among equals quarrelsomeness leads to the wielding of weapons. If those three things be not put away, though a son every day contribute beef, mutton, and pork to nourish his parents, he is not filial." == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |礼记-礼运}} == === Text === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |故玄酒在室,醴盏在户,粢醍在堂,澄酒在下。陈其牺牲,备其鼎俎,列其琴瑟管磬钟鼓,修其祝嘏,以降上神与其先祖。以正君臣,以笃父子,以睦兄弟,以齐上下,夫妇有所。是谓承天之祜。 }} === Richard Wilhelm === So wird beim Opfer der ›dunkle Wein‹ (Wasser) im innern Raum dargebracht, der Met und grünliche Wein unter der Tür, der rötliche Wein in der äußeren Halle und der abgeklärte Wein unten an den Stufen. Man bringt die Opfertiere dar und bereitet die Tiegel und Platten vor, stellt Zithern, Harfen, Flöten, Klingsteine, Glocken und Pauken auf, und durch Gebete und Segensprüche ruft man die oberen Götter herab und die heimgegangenen Ahnen. So kommt das Verhältnis von Fürst und Diener zurecht, Vater und Sohn werden sich in Aufrichtigkeit zugetan, die Brüder wohnen einträchtig beieinander, hoch und nieder kommen in Berührung, Gatte und Gattin haben ihren Platz. Das heißt den Segen des Himmels ererben. === James Legge === Thus it is that the dark-coloured liquor is in the apartment (where the representative of the dead is entertained); that the vessel of must is near its (entrance) door; that the reddish liquor is in the hall; and the clear, in thebelow. The victimsare displayed, and the tripods and stands are prepared. The lutes and citherns are put in their places, with the flutes, sonorous stones, bells, and drums. The prayers (of the principal in the sacrifice to the spirits) and the benedictions (of the representatives of the departed) are carefully framed. The object of all the ceremonies is to bring down the spirits from above, even their ancestors; servingto rectify the relations between ruler and ministers; to maintain the generous feeling between father and son, and the harmony between elder and younger brother; to adjust the relations between high and low; and to give their proper places to husband and wife. The whole may be said to secure the blessing of Heaven. == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |中国历史}} == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |这就是轻徭薄赋的政策。文帝生活也十分节俭,宫室内车骑衣服没有增添,衣不曳地,帷帐不施文绣,更下诏禁止郡国贡献奇珍异物。 因此,国家的开支有所节制,贵族官僚不敢奢侈无度,从而减轻了人民的负担。这就是休养生息的政策。 }} === Übersetzungshilfe === Es ist noch keine Übersetzungshilfe vorhanden <noinclude> {{Navigation zurückhochvor| zurücktext=Lektion 709| zurücklink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 709| hochtext=Buch Vokabellektionen| hochlink=Vokabeltexte_Chinesisch/_Vokabellektionen| vortext=Lektion 711| vorlink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 711}} </noinclude> t24qhzggxlmig955mrlogczxz2irwx4 Vokabeltexte Chinesisch/ Vokabellektionen/ Lektion 711 0 102518 1082875 1014880 2026-04-07T11:14:55Z Christian-bauer 6469 kleinere Ergänzungen und Korrekturen 1082875 wikitext text/x-wiki <noinclude> {{Navigation zurückhochvor| zurücktext=Lektion 710| zurücklink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 710| hochtext=Buch Vokabellektionen| hochlink=Vokabeltexte_Chinesisch/_Vokabellektionen| vortext=Lektion 712| vorlink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 712}} </noinclude> == Zeichen == {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung !! Lernhilfen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |簠}} || fu3 || Gefäß für gekochten Reis, Weihebehälter || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=簠}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |簋}} || gui3 || rechteckiger Bambuskorb für Getreide bei Opfern, runder Speisebehälter (aus Bronze mit Henkeln) || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=簋}} [[Datei:簋-bronze.svg|40px]] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |笾}} || bian1 || Bambusbehälter für Nahrung || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=笾}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |鉶}} || xing2 || (traditionelle Schreibweise von 铏), zeremonieller Kessel || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=鉶}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |羹}} || geng1 || Suppe (dickflüssig), Tunke, Filmentwickler || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=羹}} |} == Zusammengesetzte Wörter == === 羹 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |羹汤}} || geng1 tang1 || Filmentwickler, Suppe |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |羊羹}} || yang2 geng1 || Yōkan |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |羹匙}} || geng1 chi2 || Suppenlöffel, Löffel, Kelle |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |调羹}} || tiao2 geng1 || Löffel |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |肉羹}} || rou4 geng1 || Fleischbrühe |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |粟米羹}} || su4 mi3 geng1 || Süße, dicke Maissuppe |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |七菜羹}} || qi1 cai4 geng1 || Nanakusa |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |残羹剩饭}} || cang2 eng1 sheng4 fan4 || Essensreste, Brosamen, Almosen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |西湖牛肉羹}} || xi1 hu2 niu2 rou4 geng1 || kräftige Rindfleischsuppe nach Westsee-Art |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |豆沙粟米羹}} || dou4 sha1 su4 mi3 geng1 || kräftige Hirsesuppe mit Bohnenpaste |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |酸辣虾羹汤}} || suan1 la4 xia1 geng1 tang1 || scharf-saure Suppe mit Garnelenfleisch |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |发财三丝羹}} || fa1 cai2 san1 si1 geng1 || kräftige Suppe des Reichtums mit dreifachen Streifen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |發財三絲羹}} || fa1 cai2 san1 si1 geng1 || (traditionelle Schreibweise von 发财三丝羹), kräftige Suppe des Reichtums mit dreifachen Streifen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |冰糖银耳羹}} || bing1 tang2 yin2 er3 geng1 || süße Suppe mit kandierten Silbermorcheln |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |冰糖銀耳羹}} || bing1 tang2 yin2 er3 geng1 || (traditionelle Schreibweise von 冰糖银耳羹), süße Suppe mit kandierten Silbermorcheln |} == Sätze == === 簠 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 簋 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 笾 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 鉶 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 羹 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} == Lückentexte == === [[:zh:Wikijunior:太阳系/金星|Wikijunior: 太阳系/金星 Sonnensystem/Venus]] === {| class="wikitable" |- ! [[:zh:Wikijunior:太阳系/金星|Wikijunior: 太阳系/金星 Sonnensystem/Venus ]] !! Übersetzung Christian Bauer |- | 金星 有 多大?|| Wie groß ist die Venus? |- | 金星 的 赤道 直径 有 12103.6 公里,|| Der Äquatordurchmesser der Venus beträgt 12103,6 Kilometer |- | 金星 的 直径 就只有 地球 的 4/5。|| Der Venusdurchmesser beträgt folglich nur 4/5 der Erde. |- | |- | 金星 上 有没有 生物?|| Gibt es Leben auf der Venus? |- | 金星 上 没有 任何 生物,|| Auf der Venus gibt es kein Leben |- | 因为 金星 没有 适宜 生物 生存 的 环境。|| weil die Venus keine für die Existenz von Leben passende Umwelt hat. |- | 我们 的 地球 上,|| Auf unserer Erde |- | 有 水、Sauerstoff、适宜 的 温度 等,|| gibt es Wasser, Sauerstoff und eine passende Temperatur. |- | 它们 使 生物 得以 生存。|| Sie lassen Lebewesen existieren. |- | 而 金星 上,|| Aber auf der Venus |- | 气温 高达 500 摄氏度,|| erreicht die Lufttemperatur bis zu 500°C |- | 气压 是 地球 的 100 多倍,|| Der Athmosphärendruck beträgt mehr als das 100-fache der Erde. |- | 空中 充满了 Kohlendioxid 气体,|| die Luft ist voller Kohlendioxid. |- | 还有 大量 火山,|| Auch gibt es viele Vulkane |- | 不 适宜 生物 生存。|| Das ist unpassend für die Existenz von Leben. |} == Texte == === [https://ctext.org/liji/ens Das Buch der Riten] === ==== [https://ctext.org/liji/nei-ze/ens Nei Ze] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 羹食,自诸侯以下至于庶人无等。 }} Übersetzung James Legge Soup and boiled grain were used by all, from the princes down to the common people, without distinction of degree. {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 凡食齐视春时,羹齐视夏时,酱齐视秋时,饮齐视冬时。 }} Übersetzung James Legge All condiments for grain food were of a character corresponding to the spring; for soup, to the summer; for sauces, to the autumn; and for beverages, to the winter. === [https://ctext.org/analects/ens Analekte des Konfuzius] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 曾子有疾,孟敬子问之。曾子言曰:“鸟之将死,其鸣也哀;人之将死,其言也善。君子所贵乎道者三:动容貌,斯远暴慢矣;正颜色,斯近信矣;出辞气,斯远鄙倍矣。笾豆之事,则有司存。” }} Übersetzung James Legge The philosopher Zeng being ill, Meng Jing went to ask how he was. Zeng said to him, "When a bird is about to die, its notes are mournful; when a man is about to die, his words are good. There are three principles of conduct which the man of high rank should consider specially important: that in his deportment and manner he keep from violence and heedlessness; that in regulating his countenance he keep near to sincerity; and that in his words and tones he keep far from lowness and impropriety. As to such matters as attending to the sacrificial vessels, there are the proper officers for them." == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |礼记-礼运}} == === Text === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |作其祝号,玄酒以祭,荐其血毛,腥其俎,孰其淆,与其越席,疏布以幂,衣其浣帛,醴盏以献,荐其燔炙,君与夫人交献,以嘉魂魄,是谓合莫。然后退而合亨,体其犬豕牛羊,实其簠簋、笾豆、鉶羹。祝以孝告,嘏以慈告,是谓大祥。此礼之大成也。 }} === Richard Wilhelm === Man arbeitet die Gebetsanrufe aus. Der ›dunkle Wein‹ wird gespendet, Blut und Haare werden dargebracht, das rohe Fleisch wird auf Platten dargestellt. Dann wird das Opferfleisch gekocht, rauhe Matten werden ausgebreitet als Unterlage, grobes Linnen wird benützt zum Bedecken der Opfer. Man kleidet sich in farbige Seide. Mehl und Wein werden gespendet, die gebratenen und gerösteten Opferstücke werden dargebracht. Der Fürst und seine Gattin bringen abwechselnd die Opfer dar, um zu erfreuen die Lebensgeister und die Körperseelen. Das heißt die Übereinstimmung mit den Heimgegangenen. Dann zieht man sich zurück und kocht das übrige. Man zergliedert die Hunde, Schweine, Rinder und Schafe. Man füllt die runden und viereckigen Körbe (für Früchte), die hölzernen und die Bambusplatten sowie die ehernen Kessel für die Brühen. Der Gebetspriester trägt die Worte des ehrfürchtigen Sohnes vor, der Segenspriester antwortet mit den Worten des liebenden Vaters. Das bringt großes Heil. Das ist die höchste Vollendung der Sitte.« === James Legge === They proceed to their invocations, using in each the appropriate terms. The dark-coloured liquor is employed insacrifice. The blood with the hair and feathers (of the victim) is presented. The flesh, uncooked, is set forth on the stands. The bones with the flesh on them are sodden; and rush mats and coarse cloth are placed underneath and over the vases and cups. The robes of dyed silk are put on. The must and clarified liquor are presented. The flesh, roasted and grilled, is brought forward. The ruler and his wife take alternate parts in presenting these offerings, all being done to please the souls of the departed, and constituting a union (of the living) with the disembodied and unseen. These services having been completed, they retire, and cook again all that was insufficiently done. The dogs, pigs, bullocks, and sheep are dismembered. The shorter dishes (round and square), the taller ones of bamboo and wood, and the soup vessels are all filled. There are the prayers which express the filial piety (of the worshipper), and the benediction announcing the favour (of his ancestors). This may be called the greatest omen of prosperity; and in this the ceremony obtains its grand completion.' == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |中国历史}} == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |景帝即位不久,就采纳晁错的建议,削夺诸藩王的封地,引发各封国的担忧,而在汉景帝三年正月(公元前154年)爆发了“七国之乱”,汉景帝因此杀了晁错,以寄达到平息叛乱的目的。 }} === Übersetzungshilfe === Es ist noch keine Übersetzungshilfe vorhanden <noinclude> {{Navigation zurückhochvor| zurücktext=Lektion 710| zurücklink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 710| hochtext=Buch Vokabellektionen| hochlink=Vokabeltexte_Chinesisch/_Vokabellektionen| vortext=Lektion 712| vorlink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 712}} </noinclude> clqkd5lrgdw4lthnaklwx5sb156t3hw Vokabeltexte Chinesisch/ Vokabellektionen/ Lektion 712 0 102519 1082874 1014881 2026-04-07T11:02:40Z Christian-bauer 6469 kleinere Ergänzungen und Korrekturen 1082874 wikitext text/x-wiki <noinclude> {{Navigation zurückhochvor| zurücktext=Lektion 711| zurücklink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 711| hochtext=Buch Vokabellektionen| hochlink=Vokabeltexte_Chinesisch/_Vokabellektionen| vortext=Lektion 713| vorlink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 713}} </noinclude> == Zeichen == {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung !! Lernhilfen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |矞}} || yu4 || gewaltig, großartig || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=矞}} [[Datei:矞-bronze.svg|40px]][[Datei:矞-seal.svg|40px]][[Datei:矞-bigseal.svg|40px]] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |獝}} || yu4 || aus Furcht wegfliegen (Vögel), Teufel, Dämon || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=獝}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤}} || feng4 || Phönix || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=凤}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |觞}} || shang1 || Weinschale, ergötzen, feiern || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=觞}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |弭}} || mi3 || aufhalten, aufhören, unterdrücken, verdrängen, ausrotten || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=弭}} |} == Zusammengesetzte Wörter == === 凤 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤阳}} || feng4 yang2 || Fengyang (Ort in Anhui) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤光}} || feng4 guang1 || Landschaft |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤翔}} || feng4 xiang2 || Fengxiang (Ort in Shaanxi) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |来凤}} || lai2 feng4 || Laifeng (Ort in Hubei) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤梨}} || feng4 li2 || Ananas |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤县}} || feng4 xian4 || Kreis Feng (Provinz Shaanxi, China) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤山}} || feng4 shan1 || Fengshan (Ort in Guangxi) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |唐凤}} || tang2 feng4 || Audrey Tang |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |翔凤}} || xiang2 feng4 || ARJ21 |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |丹凤}} || dan1 feng4 || Danfeng (Ort in Shaanxi) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤台}} || feng4 tai2 || Distrikt in Anhui |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤冈}} || feng4 gang1 || Fenggang (Ort in Guizhou) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤庆县}} || feng4 qing4 xian4 || Kreis Fengqing (Provinz Yunnan, China) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |金凤男}} || jin1 feng4 nan2 || André Kim |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |何凤山}} || he2 feng4 shan1 || Ho Feng Shan (ein chinesischer Diplomat, der Schindler Chinas, rettete tausende von Juden) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤冈县}} || feng4 gang1 xian4 || Kreis Fenggang (Provinz Guizhou, China) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤眼蓝}} || feng4 yan3 lan2 || Dickstielige Wasserhyazinthe |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |金凤鸟}} || jin1 feng4 niao3 || Jinfengopteryx |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |丹凤县}} || dan1 feng4 xian4 || Danfeng |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |徐小凤}} || xu2 xiao3 feng4 || Paula Tsui |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤阳县}} || feng4 yang2 xian4 || Fengyang |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤翔县}} || feng4 xiang2 xian4 || Fengxiang |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |来凤县}} || lai2 feng4 xian4 || Kreis Laifeng (Provinz Hubei, China) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |朴凤柱}} || po4 feng4 zhu4 || Pak Pong-ju |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤林镇}} || feng4 lin2 zhen4 || Fenglin (Ort in Taiwan) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤山市}} || feng4 shan1 shi4 || Fengshan (Stadt in Taiwan) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |金凤区}} || jin1 feng4 qu1 || Jinfeng |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤头百灵}} || feng4 tou2 bai3 ling2 || Haubenlerche (lat: Galerida cristata) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤头潜鸭}} || feng4 tou2 qian2 ya1 || Reiherente |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |龙凤吉祥}} || long2 feng4 ji2 xiang2 || Drache und Phönix verheißen Glück |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |一楼一凤}} || yi1 lou2 yi1 feng4 || Bordell |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |龙飞凤舞}} || long2 fei1 feng4 wu3 || schwung- und kunstvoll kalligraphieren, wie Drachenflug und Phönixtanz |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |盐局凤瓜}} || yan2 ju2 feng4 gua1 || gesalzene Phönixgurke |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |望女成凤}} || wang4 nü3 cheng2 feng4 || hoffen, dass die eigene Tochter eine gute Zukunft hat |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤梨冰淇淋}} || feng4 li2 bing1 qi2 lin2 || Ananaseis |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |龙虎凤大会}} || long2 hu3 feng4 da4 hui4 || Drachen, Tiger und Phönix treffen sich (Ragout aus Schlangen-, Katzen- und Hühnerfleisch) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤头雨燕科}} || feng4 tou2 yu3 yan1 ke1 || Baumsegler |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |短嘴凤头百灵}} || duan3 zui3 feng4 tou2 bai3 ling2 || Theklalerche (lat: Galerida theklae) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凤城满族自治县}} || feng4 cheng2 man3 zu2 zi4 zhi4 xian4 || Autonomer Kreis Fengzheng der Mandschu (Provinz Liaoning, China) |} === 觞 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |称觞}} || cheng1 shang1 || das Glas heben, jmdn. zuprosten |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |滥觞}} || lan4 shang1 || lit. floating wine goblets on a stream, the origin (of some phenomenon) |} === 弭 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |消弭}} || xiao1 mi3 || (literary) to eliminate, to put an end to |} == Sätze == === 矞 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 獝 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 凤 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 觞 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 弭 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} == Lückentexte == === [[:zh:Wikijunior:太阳系/金星|Wikijunior: 太阳系/金星 Sonnensystem/Venus]] === {| class="wikitable" |- ! [[:zh:Wikijunior:太阳系/金星|Wikijunior: 太阳系/金星 Sonnensystem/Venus ]] !! Übersetzung Christian Bauer |- | 金星 的 表面 是 什么 样子 的?|| Welcher Art ist die Oberfläche der Venus? |- | 在 金星 表面 的 大 平原 上 有 两 个 主要 的 大陆 状 高地。|| Auf den großen Ebenen der Venusoberfläche gibt es zwei bedeutsame große Kontinentartige Hochländer. |- | 北边 的 高地 叫 伊师塔 地,|| Das nördliche Hochland heißt Ishtar Terra. |- | 拥有 金星 最高 的 麦克斯韦-Gebirge|| Es enthält mit den Maxwell Montes die höchste Bergkette der Venus |- | (大约 比 喜马拉雅 山 高出 两 千米),|| (ungefähr 2000 m höher als der Himalaya) |- | 它 是 根据 詹姆斯·克拉克·麦克斯韦 命名 的。|| Sie ist nach James Clerk Maxwell benannt |- | 麦克斯韦-Gebirge 包围了 拉克西米 高原。|| Die Maxwell Montes umgeben die Lakshmi-Hochebene. |- | 伊师塔 地 大约 有 澳大利亚 那么 大。|| Ishtar Terra hat ungefähr die gleiche Größe wie Australien. |- | 南 半球 有 更大 的 阿芙罗狄蒂 地,|| Die südliche Hemisphäre enthält die noch größere Aphrodite Terra |- | 面积 与 南 美洲 相当。|| Das Gebiet ist vergleichbar mit Südamerika. |- | 这些 高地 之 间 有 许多 广阔 的 低地,|| Zwischen diesen Hochebenen gibt es viele weite Tiefländer. |- | 包括 有 爱塔兰塔 平原 低地、|| einschließlich der Tiefebene Atalante, |- | 格纳维尔 平原 低地 以及 拉卫尼亚 平原 低地。|| der Tiebebene Guinevere und die Tiefebene Lavinia |- | 除了 麦克斯韦-Gebirge 外,|| Außer dem Maxwell-Gebirge |- | 所 有 的 金星 地貌 均 以 现实 中 的 或者 神话 中 的 女性 命名。|| sind alle Landformen der Venus nach echten oder mythologischen Frauen benannt. |- | 由于 金星 浓厚 的 大气 让 流星 等 天体 在 到达 金星 表面 之 前 减速,|| Durch die dicke Atmosphäre der Venus werden Meteore, das sind Himmelskörper, die die Venus erreichen, vorher stark abgebremst. |- | 所以 金星 上 的 Meteoriten-坑 都不 超过 3.2千米。|| Daher sind die Meteoritenkrater auf der Venus alle nicht mehr als 3.2 km groß. |- | 大约 90% 的 金星 表面 是 由 不久之前 才 固化 的 玄武岩 Lava 形成,|| Ungefähr 90% der Venusoberfläche sind von erst vor nicht allzu langer Zeit erstarrter Basaltlava geformt. |- | 当然 也 有 极少 量 的 Meteoriten-坑。|| also ist es nur natürlich, dass es nur sehr wenige Meteoritenkrater gibt |- | 据 推测 金星 没有 像 地球 那样 的 可 移动 的 板块 构造,|| Nach Spekulationen hat die Venus keine der Plattentektonik der Erde vergleichbaren Bewegungen. |- | 但是 却 有 大量 的 有 规律 的 火山-ausbrüchen 遍布 金星 表面。|| Aber es gibt eine große Menge an rhythmischen Vulkanausbrüchen, die die Oberfläche der Venus bedecken |- | 金星 上 最 古老 的 特征 仅有 8亿 年 历史,|| Das älteste Charakteristikum der Venus hat eine nur 800 Mio Jahre alte Geschichte. |- | 大多 数 地区 都相当 年轻|| Die Mehrzahl der Regionen ist vergleichsweise jung. |- | (但 也 有 数 亿 年 的 时间)。|| (Aber es sind schon einige hundert Mio Jahre alte Zeiträume) |- | 最近 的 发现 表明,|| Der jüngste gefundene macht klar, |- | 金星 的 火山 在 隔离 的 地质 热点 依旧 活跃。|| dass Venusvulkane in isolierten geologischen Hotspots immer noch aktiv sind. |} === Haenisch: Lehrgang der klassischen chinesischen Schriftsprache === 第六十八課 第六十八课 dì liù shí bā kè Achtundsechzigste Lektion Eine [[w:zh:%E9%AB%98%E9%B3%B3_(%E6%9D%B1%E6%BC%A2)| Variante dieses Textes]] findet sich in den [[w:Hou_Hanshu|Schriften der Späteren Han]]. ----------------------------------- 高_居鄉. 高凤居乡. Gāo fèng jū xiāng. Gao Feng lebte auf dem Land. ----------------------------------- (_里)有爭財者 (邻里)有争财者 (Lín lǐ) yǒu zhēng cái zhě (In der Nachbarschaft) gab es einige, die sich um Vermögen stritten. ----------------------------------- 持械而斗. chí xiè ér dòu. Sie ergriffen Waffen und kämpften. ----------------------------------- 凤往解之. Fèng wǎng jiě zhī. Feng eilte hinzu, (den Streit) aufzulösen. ----------------------------------- 斗不已. Dòu bù yǐ. Der Kampf hörte nicht auf. ----------------------------------- _叩頭曰. 凤叩头曰. Fèng kòu tóu yuē. Feng warf sich mit seinem Kopf zu Boden und sagte: ----------------------------------- 仁義退讓奈何_之. 仁义退让奈何弃之. Rén yì tuì ràng nài hé qì zhī. Menschlichkeit, Recht, Nachgiebigkeit; wie kann man (diese drei Tugenden) verwerfen. ----------------------------------- 於是爭者_感 于是争者怀感 Yúshì zhēng zhě huáigǎn Dadurch wurden die Herzen der Kämpfenden bewegt. ----------------------------------- 爭者投械謝罪 争者投械谢罪 Zhēng zhě tóu xiè xiè zuì Die Kämpfenden warfen ihre Waffen weg und entschuldigten sich für ihre Verfehlungen. ----------------------------------- == Texte == === [https://ctext.org/analects/ens Analekte des Konfuzius] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 子曰:“凤鸟不至,河不出图,吾已矣夫!” }} Übersetzung James Legge The Master said, "The Feng bird does not come; the river sends forth no map - it is all over with me!" {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 楚狂接舆歌而过孔子曰:“凤兮!凤兮!何德之衰?往者不可谏,来者犹可追。已而,已而!今之从政者殆而!”孔子下,欲与之言。趋而辟之,不得与之言。 }} Übersetzung James Legge The madman of Chu, Jie Yu, passed by Confucius, singing and saying, "O Feng! O Feng! How is your virtue degenerated! As to the past, reproof is useless; but the future may still be provided against. Give up your vain pursuit. Give up your vain pursuit. Peril awaits those who now engage in affairs of government." Confucius alighted and wished to converse with him, but Jie Yu hastened away, so that he could not talk with him. == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |礼记-礼运}} == === Text === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |孔子曰:“于呼哀哉!我观周道,幽、厉伤之,吾舍鲁何适矣!鲁之郊禘,非礼也,周公其衰矣!杞之郊也禹也,宋之郊也契也,是天子之事守也。故天子祭天地,诸侯祭社稷。” }} === Richard Wilhelm === Meister Kung sprach: Wehe, wie traurig! Wenn ich den Weg des Hauses Dschou betrachte, so ist er seit den Königen Yu und Li im Verfall. Wenn ich von Lu weg soll, wohin soll ich gehen (um es besser zu finden)? Das Opfer auf dem Anger und das für den Urahn (des Hauses Dschou) entspricht nicht der Sitte; so sind die Lehren des Herzogs von Dschou in Verfall geraten. Das Angeropfer von Ki gilt dem Yü, das Angeropfer von Sung gilt dem Sië; das sind Opfer, durch die das Andenken an frühere Himmelssöhne bewahrt wird. Im allgemeinen ist es so, daß der Himmelssohn die Opfer für Himmel und Erde darbringt und die Lehensfürsten die Opfer für die Gottheiten des Bodens und des Korns. === James Legge === Confucius said, 'Ah! Alas! I look at the ways of Zhou. (The kings) You and Li corrupted them indeed, but if I leave Lu, where shall I go (to find them better)? The border sacrifice of Lu, (however,) and (the association with it of) the founder of the line (of Zhou) is contrary to propriety - how have (the institutions of) the duke of Zhou fallen into decay! At the border sacrifice in Qi, Yu was the assessor, and at that in Song, Xie; but these were observances of the sons of Heaven, preserved (in those states by their descendants). The rule is thatthe son of Heaven sacrifices to heaven and earth, and the princes of states sacrifice at the altars to the spirits of the land and grain.' == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |中国历史}} == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |但是七国之乱并未因此缓和,景帝任用周亚夫出兵平叛,在三月即告弭平,各诸侯国的势力因此极大削弱。 七国之乱以后,景帝开始专心打理朝政,据说景帝十分朴素,仁厚爱民。 除了平定七国之乱以外,从来没有大规模用过兵,和匈奴的战争始终控制在一定的规模内,依然对匈奴采取和亲政策。 }} === Übersetzungshilfe === Es ist noch keine Übersetzungshilfe vorhanden <noinclude> {{Navigation zurückhochvor| zurücktext=Lektion 711| zurücklink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 711| hochtext=Buch Vokabellektionen| hochlink=Vokabeltexte_Chinesisch/_Vokabellektionen| vortext=Lektion 713| vorlink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 713}} </noinclude> kzbvnhy9ybznc2kz1mux7uzoojcjgjk Vokabeltexte Chinesisch/ Vokabellektionen/ Lektion 713 0 102520 1082873 1014921 2026-04-07T10:50:28Z Christian-bauer 6469 kleinere Ergänzungen und Korrekturen 1082873 wikitext text/x-wiki <noinclude> {{Navigation zurückhochvor| zurücktext=Lektion 712| zurücklink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 712| hochtext=Buch Vokabellektionen| hochlink=Vokabeltexte_Chinesisch/_Vokabellektionen| vortext=Lektion 714| vorlink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 714}} </noinclude> == Zeichen == {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung !! Lernhilfen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |酎}} || zhou4 || Double, alkoholisches Getränk (mehrfach fermentiert) || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=酎}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |斝}} || jia3 || kleines Jadeweinglas || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=斝}} [[Datei:斝-oracle.svg|40px]][[Datei:斝-bronze.svg|40px]][[Datei:斝-seal.svg|40px]][[Datei:斝-bigseal.svg|40px]] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |僭}} || jian4 || aneignen, anmaßen || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=僭}} [[Datei:僭-seal.svg|40px]] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |冕}} || mian3 || Königskrone || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=冕}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄}} || xu4 || anbauen, hegen, etwas wachsen lassen, speichern, aufbewahren || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=蓄}} |} == Zusammengesetzte Wörter == === 僭 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |僭越}} || jian4 yue4 || seine Befugnisse überschreiten |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |僭称}} || jian4 cheng1 || to give sb or sth a title one has no authority to give |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |僭稱}} || jian4 cheng1 || (traditionelle Schreibweise von 僭称), to give sb or sth a title one has no authority to give |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |僭主}} || jian4 zhu3 || tyrant, usurper |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |僭主政治}} || jian4 zhu3 zheng4 zhi4 || tyranny, government by usurper |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |三十人僭主集团}} || san1 shi2 ren2 jian4 zhu3 ji2 tuan2 || Herrschaft der Dreißig |} === 冕 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |冕宁}} || mian3 ning2 || Mianning (Ort in Sichuan) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |日冕}} || ri4 mian3 || Sonnencorona |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |冠冕}} || guan1 mian3 || Königskrone |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |加冕}} || jia1 mian3 || Krönung, Thronerhebung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |日冕仪}} || ri4 mian3 yi2 || Koronograf(Astron) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |加冕礼}} || jia1 mian3 li3 || Krönungszeremonie |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |加冕禮}} || jia1 mian3 li3 || (traditionelle Schreibweise von 加冕礼), Krönungszeremonie |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |加冕街}} || jia1 mian3 jie1 || Coronation Street |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |冕宁县}} || mian3 ning2 xian4 || Kreis Mianning (Provinz Sichuan, China) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |冠冕堂皇}} || guan1 mian3 tang2 huang2 || hochtrabend, wohlklingend, scheinbar rechtschaffen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |卫冕冠军}} || wei4 mian3 guan4 jun1 || Titelverteidiger |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |加冕典礼}} || jia1 mian3 dian3 li3 || Krönung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |加冕典禮}} || jia1 mian3 dian3 li3 || (traditionelle Schreibweise von 加冕典礼), Krönung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |冠冕堂皇的理由}} || guan1 mian3 tang2 huang2 de5 li3 you2 || wohlklingende Begründung |} === 蓄 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung !! Lernhilfen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄谋}} || xu4 mou2 || vorsätzlich planen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄謀}} || xu4 mou2 || (traditionelle Schreibweise von 蓄谋), vorsätzlich planen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄养}} || xu4 yang3 || akkumulieren, speichern |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄養}} || xu4 yang3 || (traditionelle Schreibweise von 蓄养), akkumulieren, speichern |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄水}} || xu4 shui3 || Wasser speichern |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |含蓄}} || han2 xu4 || besagt, implizit, zurückhaltend || (HSK 3.0 Band 7-9) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄发}} || xu4 fa1 || langes Haar tragen, sein Haar wachsen lassen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄髮}} || xu4 fa1 || (traditionelle Schreibweise von 蓄发), langes Haar tragen, sein Haar wachsen lassen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄意}} || xu4 yi4 || Vorbedacht, vorsätzlich |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |积蓄}} || ji1 xu4 || Rücklagen, Ersparnisse, sammeln, beiseite legen, (zusammen)sparen, zurücklegen || (HSK 3.0 Band 7-9) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄压瓶}} || xu4 ya1 ping2 || Blasenspeicher |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄能器}} || xu4 neng2 qi4 || Akkumulator |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄水池}} || xu4 shui3 chi2 || Becken, Reservoir, Zisterne |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄水器}} || xu4 shui3 qi4 || Staubecken |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄电池}} || xu4 dian4 chi2 || Akkumulator, Akku, aufladbare Batterie |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄電池}} || xu4 dian4 chi2 || (traditionelle Schreibweise von 蓄电池), Akkumulator, Akku, aufladbare Batterie |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄力器}} || xu4 li4 qi4 || Akkumulator |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄意地}} || xu4 yi4 de5 || kaltblütig |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄水量}} || xu4 shui3 liang4 || Beschlagnahmung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |土蓄产品}} || tu3 xu4 chan3 pin3 || Landes- und tierische Produkte, landestypische und tierische Erzeugnisse |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |土蓄產品}} || tu3 xu4 chan3 pin3 || (traditionelle Schreibweise von 土蓄产品), Landes- und tierische Produkte, landestypische und tierische Erzeugnisse |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄水设备}} || xu4 shui3 she4 bei4 || Stau |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |铅酸蓄电池}} || qian1 suan1 xu4 dian4 chi2 || Bleiakkumulator |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |鉛酸蓄電池}} || qian1 suan1 xu4 dian4 chi2 || (traditionelle Schreibweise von 铅酸蓄电池), Bleiakkumulator |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |气囊式蓄能器}} || qi4 nang2 shi4 xu4 neng2 qi4 || Blasenspeicher |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |氣囊式蓄能器}} || qi4 nang2 shi4 xu4 neng2 qi4 || (traditionelle Schreibweise von 气囊式蓄能器), Blasenspeicher |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蓄电池废铅版}} || xu4 dian4 chi2 fei4 qian1 ban3 || Akkuschrot |} == Sätze == === 酎 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 斝 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 僭 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |天命弗僭。}} || tian1 ming4 弗 jian4 。|| You can't cheat fate. (klassisch, [https://tatoeba.org/eng/sentences/show/1490713 Tatoeba] [https://tatoeba.org/eng/user/profile/shanghainese shanghainese] [https://tatoeba.org/eng/user/profile/Hybrid Hybrid]) |} === 冕 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 蓄 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |她把她那时的全副积蓄都给了他。}} || ta1 ba3 ta1 na4/nei4 shi2 de5 quan2 fu1/fu4 ji1 xu4 dou1/du1 gei3 le5 ta1 。|| Sie hat ihm alles Geld gegeben, dass sie damals hatte. (Mandarin, [https://tatoeba.org/eng/sentences/show/469060 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/Vortarulo Vortarulo]) |} === einsortieren === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |是月也,天子饮酎,用礼乐。}} || shi4 yue4 ye3 , tian1 zi5 yin3 zhou4 , yong4 li3 le4/yue4 。||In diesem Monat hält der Himmelssohn Weingelage ab mit Zeremonien und Musik. ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |9.3有几个文士心里说:这个人说僭妄的话了。}} || 9.3 you3 ji1 ge4 wen2 shi4 xin1 li3 shuo1 : zhe4/zhei4 ge4 ren2 shuo1 jian4 wang4 de5 hua4 le5 。|| 9.3 Und siehe, etliche von den Schriftgelehrten sprachen bei sich selbst: Dieser lästert. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Matthäusevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |这个人为甚麽这样说呢?他说僭妄的话了。除了神以外,谁能赦罪呢? }} || zhe4/zhei4 ge4 ren2 wei2/wei4 shen4 me5 zhe4/zhei4 yang4 shuo1 ne5 ? ta1 shuo1 jian4 wang4 de5 hua4 le5 。 chu2 le5 shen2 yi3 wai4 , shei2 neng2 she4 zui4 ne5 ? ||2.7 Was redet dieser also? Er lästert. Wer kann Sünden vergeben, als nur einer, Gott? ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Markusevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |犹太人回答说:我们不是为善事拿石头打你,是为你说僭妄的话;又为你是个人,反将自己当作神。 }} || you2 tai4 ren2 hui2 da2 shuo1 : wo3 men5 bu4 shi4 wei2/wei4 shan3/shan4 shi4 na2 shi2 tou2 da3 ni3 , shi4 wei2/wei4 ni3 shuo1 jian4 wang4 de5 hua4 ; you4 wei2/wei4 ni3 shi4 ge4 ren2 , fan3 jiang1/jiang4 zi4 ji3 dang1/dang4 zuo4 shen2 。 ||10.33 Die Juden antworteten ihm: Wegen eines guten Werkes steinigen wir dich nicht, sondern wegen Lästerung, und weil du, der du ein Mensch bist, dich selbst zu Gott machst. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Johannesevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |文士和法利赛人就议论说:这说僭妄话的是谁?除了神以外,谁能赦罪呢? }} || wen2 shi4 he2/he4/huo2 fa3 li4 sai4 ren2 jiu4 yi4 lun4 shuo1 : zhe4/zhei4 shuo1 jian4 wang4 hua4 de5 shi4 shei2 ? chu2 le5 shen2 yi3 wai4 , shei2 neng2 she4 zui4 ne5 ? ||5.21 Und die Schriftgelehrten und die Pharisäer fingen an zu überlegen, indem sie sagten: Wer ist dieser, der Lästerungen redet? Wer kann Sünden vergeben, außer Gott allein? ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Lukasevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |你们已经听见他这僭妄的话了。你们的意见如何?他们都定他该死的罪。 }} || ni3 men5 yi3 jing4 ting1 jian4/xian4 ta1 zhe4/zhei4 jian4 wang4 de5 hua4 le5 。 ni3 men5 de5 yi4 jian4/xian4 ru2 he2 ? ta1 men5 dou1/du1 ding4 ta1 gai1 si3 de5 zui4 。 ||14.64 Ihr habt die Lästerung gehört; was dünkt euch? Sie aber verurteilten ihn, daß er des Todes schuldig sei. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Markusevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |父所分别为圣、又差到世间来的,他自称是神的儿子,你们还向他说你说僭妄的话麽? }} || fu4 suo3 fen1 bie2 wei2/wei4 sheng4 、 you4 cha4/chai1 dao4 shi4 jian1 lai2 de5 , ta1 zi4 cheng1 shi4 shen2 de5 er2/er5 zi5 , ni3 men5 hai2/huan2 xiang4 ta1 shuo1 ni3 shuo1 jian4 wang4 de5 hua4 me5 ? ||10.36 saget ihr von dem, welchen der Vater geheiligt und in die Welt gesandt hat: Du lästerst, weil ich sagte: Ich bin Gottes Sohn? - ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Johannesevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |是月也,聚蓄百药}} || shi4 yue4 ye3 , ju4 xu4 bai3 yao4 ||In diesem Monat sammelt man die verschiedenen Arzneikräuter und bewahrt sie auf. ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |6.26你们看那天上的飞鸟,也不种,也不收,也不积蓄在仓里,你们的天父尚且养活他。你们不比飞鸟贵重得多麽?}} || 6.26 ni3 men5 kan4 na4/nei4 tian1 shang4 de5 fei1 niao3 , ye3 bu4 chong2/zhong3/zhong4 , ye3 bu4 shou1 , ye3 bu4 ji1 xu4 zai4 cang1 li3 , ni3 men5 de5 tian1 fu4 shang4 qie3 yang3 huo2 ta1 。 ni3 men5 bu4 bi4 fei1 niao3 gui4 chong2/zhong4 de2/de5/dei3 duo1 me5 ?|| 6.26 Sehet hin auf die Vögel des Himmels, daß sie nicht säen noch ernten, noch in Scheunen sammeln, und euer himmlischer Vater ernährt sie. Seid ihr nicht viel vorzüglicher als sie? ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Matthäusevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |收割的人得工价,积蓄五谷到永生,叫撒种的和收割的一同快乐。 }} || shou1 ge1 de5 ren2 de2/de5/dei3 gong1 jia4/jie4 , ji1 xu4 wu3 gu3 dao4 yong3 sheng1 , jiao4 sa1/sa3 chong2/zhong3/zhong4 de5 he2/he4/huo2 shou1 ge1 de5 yi1 tong2 kuai4 le4/yue4 。 ||4.36 Der da erntet, empfängt Lohn und sammelt Frucht zum ewigen Leben, auf daß beide, der da sät und der da erntet, zugleich sich freuen. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Johannesevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |乃命有司,趣民收敛,务蓄菜,多积聚。}} || nai3 ming4 you3 si1 , qu4 min2 shou1 lian3 , wu4 xu4 cai4 , duo1 ji1 ju4 。||Die Steuerbeamten erhalten die Anweisung, vom Volke den Tribut einzutreiben, Korn und Bohnen einzusammeln und große Vorräte aufzuhäufen. ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |是月也,聚蓄百藥}} || shi4 yue4 ye3 , ju4 xu4 bai3 yao4 ||In diesem Monat sammelt man die verschiedenen Arzneikräuter und bewahrt sie auf. ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |} == Lückentexte == === [[:zh:Wikijunior:太阳系/金星|Wikijunior: 太阳系/金星 Sonnensystem/Venus]] === {| class="wikitable" |- ! [[:zh:Wikijunior:太阳系/金星|Wikijunior: 太阳系/金星 Sonnensystem/Venus ]] !! Übersetzung Christian Bauer |- | 金星 的 月亮 是 什么 样子 的|| Welcher Art ist der Mond der Venus? |- | 金星 和 水星 一样 没有 月亮,|| Die Venus hat genau wie der Merkur keinen Mond. |- | 人们 曾经 认为 金星 有 一个 卫星,|| Die Menschen dachten früher, dass die Venus einen Mond hat |- | 名叫 尼斯,|| und nannten ihn Neith |- | 以 埃及 女神 塞斯 (没有 凡人 看过 她 Schleier 下 的 脸) 命名。|| nach der ägyptischen Göttin Neith (von der kein gewöhnlicher Mensch ihr unter einem Schleier liegendes Gesicht gesehen hat) |- | 天文 学家 对 尼斯 的 零星 观察 一直 持续 到 1982 年,|| Astronomen haben Neith sporadisch bis ins Jahr 1982 gesehen |- | 但是 这些 观察 之后 受到了 怀疑|| Aber nach diesen Beobachtungen kamen Zweifel. |- | 所以 我们 现在 认为,|| Somit denken wir heute, |- | 金星 没有 卫星。|| dass die Venus keinen Mond hat. |- | |- | 金星 上 一天 有 多长?|| Wie lange dauert ein Tag auf der Venus? |- | 金星 上 的 一天 居然 长达 243 个 地球 日,|| Ein Tag auf der Venus erstreckt sich über volle 243 Erdtage; |- | 就是说,|| in anderen Worten: |- | 我们 过了 7 个 月,|| Sind bei uns 7 Monate vergangen |- | 金星 才 过了 1 天。|| ist auf der Venus erst 1 Tag vorbei. |- | 有趣的是,|| Interessant ist, |- | 金星 是 由 西 向 东 自转 的,|| die Venus rotiert von Westen nach Osten |- | 而 不是 像 大多数 行星 那样 由 东 向 西 自转|| was abweichend zu den meisten anderen Planeten ist, die von Ost nach Westen drehen |- | (冥王星 和 天王星 也 是 这样),|| (nur Pluto und Uranus drehen auch auf diese Art) |- | 如果 我们 在 金星 上 看 日出,|| Wenn wir auf der Venus den Sonnenaufgang sehen |- | 那么 太阳 真 的 会 从 西边 升起来。|| dann steigt die Sonnen tatsächlich von Westen aus nach oben. |} === Bibel === ==== [https://newchristianbiblestudy.org/de/bible/compare/chinese-union-s/german-elberfelder-1905/matthew/6/ Matthäusevangelium Kapitel 6] ==== {| class="wikitable" ! Chinese Union Version !! Übersetzung Rudolf Brockhaus (1856-1932) |- | 6.1 你们要小心,不可将善事行在人的面前,故意叫他们看见,若是这样,就不能得你们天父的赏赐了。 || 6.1 Habet acht, daß ihr euer Almosen nicht gebet vor den Menschen, um von ihnen gesehen zu werden; wenn aber nicht, so habt ihr keinen Lohn bei eurem Vater, der in den Himmeln ist.  |- | 6.2 所以,你施舍的时候,不可在你面前吹号,像那假冒为善的人在会堂里和街道上所行的,故意要得人的荣耀。我实在告诉你们,他们已经得了他们的赏赐。 || 6.2 Wenn du nun Almosen gibst, sollst du nicht vor dir her posaunen lassen, wie die Heuchler tun in den Synagogen und auf den Straßen, damit sie von den Menschen geehrt werden. Wahrlich, ich sage euch, sie haben ihren Lohn dahin.  |- | 6.3 你施舍的时候,不要叫左手知道右手所做的, || 6.3 Du aber, wenn du Almosen gibst, so laß deine Linke nicht wissen, was deine Rechte tut;  |- | 6.4 要叫你施舍的事行在暗中。你父在暗中察看,必然报答你(有古卷:必在明处报答你)。 || 6.4 damit dein Almosen im Verborgenen sei, und dein Vater, der im Verborgenen sieht, wird dir vergelten.  |- | 6.5 你们 beten 的时候,不可像那假冒为善的人,爱站在会堂里和十字路口上 zu beten,故意叫人看见。我实在告诉你们,他们已经得了他们的赏赐。 || 6.5 Und wenn du betest, sollst du nicht sein wie die Heuchler; denn die lieben es, in den Synagogen und an den Ecken der Straßen stehend zu beten, damit sie von den Menschen gesehen werden. Wahrlich, ich sage euch, sie haben ihren Lohn dahin.  |- | 6.6 你 betest 的时候,要进你的内屋,关上门,bete 你在暗中的父;你父在暗中察看,必然报答你。 || 6.6 Du aber, wenn du betest, so geh in deine Kammer und, nachdem du deine Tür geschlossen hast, bete zu deinem Vater, der im Verborgenen ist, und dein Vater, der im Verborgenen sieht, wird dir vergelten.  |- | 6.7 你们 betet,不可像外邦人,用许多重复话,他们以为话多了必蒙垂听。 || 6.7 Wenn ihr aber betet, sollt ihr nicht plappern wie die von den Nationen; denn sie meinen, daß sie um ihres vielen Redens willen werden erhört werden.  |- | 6.8 你们不可效法他们;因为你们没有祈求以先,你们所需用的,你们的父早已知道了。 || 6.8 Seid ihnen nun nicht gleich; denn euer Vater weiß, was ihr bedürfet, ehe ihr ihn bittet.  |- | 6.9 所以,你们 betet 要这样说:我们在天上的父:愿人都尊你的名为圣。 || 6.9 Betet ihr nun also: Unser Vater, der du bist in den Himmeln, geheiligt werde dein Name; dein Reich komme;  |- | 6.10 愿你的国降临;愿你的旨意行在地上,如同行在天上。 || 6.10 dein Wille geschehe, wie im Himmel also auch auf Erden.  |- | 6.11 我们日用的饮食,今日赐给我们。 || 6.11 Unser nötiges Brot gib uns heute;  |- | 6.12 免我们的 Schulden,如同我们免了人的 Schulden。 || 6.12 und vergib uns unsere Schulden, wie auch wir unseren Schuldnern vergeben;  |- | 6.13 不叫我们遇见 Versuchung;救我们脱离凶恶(或作:脱离恶者)。因为国度、die Macht、荣耀,全是你的,直到永远。阿们(有古卷没有因为……阿们等字)! || 6.13 und führe uns nicht in Versuchung, sondern errette uns von dem Bösen. - |- | 6.14 你们饶恕人的过犯,你们的天父也必饶恕你们的过犯; || 6.14 Denn wenn ihr den Menschen ihre Vergehungen vergebet, so wird euer himmlischer Vater auch euch vergeben;  |- | 6.15 你们不饶恕人的过犯,你们的天父也必不饶恕你们的过犯。 || 6.15 wenn ihr aber den Menschen ihre Vergehungen nicht vergebet, so wird euer Vater auch eure Vergehungen nicht vergeben.  |- | 6.16 你们禁食的时候,不可像那假冒为善的人,脸上带着 düster;因为他们把脸弄得难看,故意叫人看出他们是禁食。我实在告诉你们,他们已经得了他们的赏赐。 || 6.16 Wenn ihr aber fastet, so sehet nicht düster aus wie die Heuchler; denn sie verstellen ihre Angesichter, damit sie den Menschen als Fastende erscheinen. Wahrlich, ich sage euch, sie haben ihren Lohn dahin.  |- | 6.17 你禁食的时候,要梳头洗脸, || 6.17 Du aber, wenn du fastest, so salbe dein Haupt und wasche dein Angesicht,  |- | 6.18 不叫人看出你禁食来,只叫你暗中的父看见;你父在暗中察看,必然报答你。 || 6.18 damit du nicht den Menschen als ein Fastender erscheinest, sondern deinem Vater, der im Verborgenen ist; und dein Vater, der im Verborgenen sieht, wird dir vergelten.  |- | 6.19 不要为自己积?财宝在地上;地上有虫子咬,能?坏,也有贼, die durchgraben 来偷。 || 6.19 Sammelt euch nicht Schätze auf der Erde, wo Motte und Rost zerstört, und wo Diebe durchgraben und stehlen;  |- | 6.20 只要积?财宝在天上;天上没有虫子咬,不能?坏,也没有贼, die durchgraben 来偷。 || 6.20 sammelt euch aber Schätze im Himmel, wo weder Motte noch Rost zerstört, und wo Diebe nicht durchgraben noch stehlen;  |- | 6.21 因为你的财宝在那里,你的心也在那里。 || 6.21 denn wo dein Schatz ist, da wird auch dein Herz sein.  |- | 6.22 眼睛就是身上的灯。你的眼睛若了亮,全身就光明; || 6.22 Die Lampe des Leibes ist das Auge; wenn nun dein Auge einfältig ist, so wird dein ganzer Leib licht sein;  |- | 6.23 你的眼睛若昏花,全身就黑暗。你里头的光若黑暗了,那黑暗是何等大呢! || 6.23 wenn aber dein Auge böse ist, so wird dein ganzer Leib finster sein. Wenn nun das Licht, das in dir ist, Finsternis ist, wie groß die Finsternis!  |- | 6.24 一个人不能事奉两个主;不是恶这个,爱那个,就是重这个,轻那个。你们不能又事奉神,又事奉 Mammon (Mammon:财利的意思)。 || 6.24 Niemand kann zwei Herren dienen; denn entweder wird er den einen hassen und den anderen lieben, oder er wird einem anhangen und den anderen verachten. Ihr könnet nicht Gott dienen und dem Mammon.  |- | 6.25 所以我告诉你们,不要为生命忧虑吃什么,喝什么;为身体忧虑穿什么。生命不胜於饮食么?身体不胜於衣裳么? || 6.25 Deshalb sage ich euch: Seid nicht besorgt für euer Leben, was ihr essen und was ihr trinken sollt, noch für euren Leib, was ihr anziehen sollt. Ist nicht das Leben mehr als die Speise, und der Leib mehr als die Kleidung?  |- | 6.26 你们看那天上的飞鸟,也不种,也不收,也不积蓄在仓里,你们的天父尚且养活他。你们不比飞鸟贵重得多么? || 6.26 Sehet hin auf die Vögel des Himmels, daß sie nicht säen noch ernten, noch in Scheunen sammeln, und euer himmlischer Vater ernährt sie. Seid ihr nicht viel vorzüglicher als sie?  |- | 6.27 你们那一个能用思虑使寿数多加一刻呢(或作:使身量多加一 Elle 呢)? || 6.27 Wer aber unter euch vermag mit Sorgen seiner Größe eine Elle zuzusetzen?  |- | 6.28 何必为衣裳忧虑呢?你想野地里的百合花怎么长起来;他也不劳苦,也不 spinnen。 || 6.28 Und warum seid ihr um Kleidung besorgt? Betrachtet die Lilien des Feldes, wie sie wachsen: sie mühen sich nicht, auch spinnen sie nicht.  |- | 6.29 然而我告诉你们,就是所罗门极荣华的时候,他所穿戴的,还不如这花一朵呢! || 6.29 Ich sage euch aber, daß selbst nicht Salomon in all seiner Herrlichkeit bekleidet war wie eine von diesen.  |- | 6.30 你们这小信的人哪!野地里的草今天还在,明天就丢在炉里,神还给他这样的 Kleidung,何况你们呢! || 6.30 Wenn aber Gott das Gras des Feldes, das heute ist und morgen in den Ofen geworfen wird, also kleidet, nicht vielmehr euch, Kleingläubige?  |- | 6.31 所以,不要忧虑说:吃什么?喝什么?穿什么? || 6.31 So seid nun nicht besorgt, indem ihr saget: Was sollen wir essen? oder: Was sollen wir trinken? oder: Was sollen wir anziehen?  |- | 6.32 这都是外邦人所求的,你们需用的这一切东西,你们的天父是知道的。 || 6.32 denn nach allem diesem trachten die Nationen; denn euer himmlischer Vater weiß, daß ihr dies alles bedürfet.  |- | 6.33 你们要先求他的国和他的义,这些东西都要加给你们了。 || 6.33 Trachtet aber zuerst nach dem Reiche Gottes und nach seiner Gerechtigkeit, und dies alles wird euch hinzugefügt werden.  |- | 6.34 所以,不要为明天忧虑,因为明天自有明天的忧虑;一天的难处一天当就够了。 || 6.34 So seid nun nicht besorgt auf den morgenden Tag, denn der morgende Tag wird für sich selbst sorgen. Jeder Tag hat an seinem Übel genug. |} == Texte == === [[n:zh:2013年至2014年德国足球甲级联赛|Wikinews 2013年至2014年德国足球甲级联赛]] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 【2014年3月29日讯】<br/><br/>2012年至2013年德国足球甲级联赛是第51届德国足球甲级联赛。赛季于2013年8月9日开始,至2014年5月10日结束。其中2013年12月23日至2014年1月23日为冬歇期。拜仁慕尼黑为该赛季的卫冕冠军。 }} Noch keine Übersetzung === [https://ctext.org/liji/ens Das Buch der Riten] === ==== [https://ctext.org/liji/yue-ling/ens Yue Ling] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 是月也,天子饮酎,用礼乐。 }} Übersetzung James Legge In this month the son of Heaven (entertains his ministers and princes) with strong drink and with (much) observance of ceremony and with music. ==== [https://ctext.org/liji/zengzi-wen/ens Zengzi Wen] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 孔子曰:“尸弁冕而出,卿、大夫、士皆下之,尸必式,必有前驱。” }} Übersetzung James Legge Confucius said, 'When one who has represented the dead comes forth in the (officer's) leathern cap, or the (Great officer's) tasseled cap (which he has worn), ministers, Great officers, and other officers, all will descend from their carriages (when his passes). He will bow forward to them, and he will also have a forerunner (to notify his approach).' ==== [https://ctext.org/liji/jiao-te-sheng/ens Jiao Te Sheng] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 先王之荐,可食也而不可耆也。卷冕路车,可陈也而不可好也。武壮,而不可乐也。宗庙之威,而不可安也。宗庙之器,可用也而不可便其利也,所以交于神明者,不可以同于所安乐之义也。 }} Übersetzung James Legge The things set before the ancient kings served as food, but did not minister to the pleasures of the palate. The dragon-robe, the tasseled cap, and the great carriage served for display, but did not awaken a fondness for their use. The various dances displayed the gravity of the performers, but did not awaken the emotion of delight. The ancestral temple produced the impression of majesty, but did not dispose one to rest in it. Its vessels might be employed (for their purposes in it), but could not be conveniently used for any other. The idea which leads to intercourse with spiritual Beings is not interchangeable with that which finds its realisation in rest and pleasure. ==== [https://ctext.org/liji/ming-tang-wei/ens Ming Tang Wei] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 爵,夏后氏以盏,殷以斝,周以爵。 灌尊,夏后氏以鸡夷。殷以斝,周以黄目。 }} Übersetzung James Legge For bowls or cups they had the zhan of Xia; the jia of Yin; and the jia of Zhou. For libations they had the jug of Xia, with a cock on it; the jia of Yin; and that of Zhou, with gilt eyes on it. ==== [https://ctext.org/liji/za-ji-i/ens Za Ji (Teil 1)] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 大夫冕而祭于公,弁而祭于己。士弁而祭于公,冠而祭于己。士弁而亲迎,然则士弁而祭于己可也。 }} Übersetzung James Legge A Great officer wore the cap with the square top when assisting at a sacrifice of his ruler; but that of skin when sacrificing at his own shrines. An ordinary officer used the latter in his ruler's temple, and the cap (of dark cloth) in his own. As an officer wore the skin cap, when going in person to meet his bride, he might also use it at his own shrines. ==== [https://ctext.org/liji/za-ji-ii/ens Za Ji (Teil 2)] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 孔子曰:“尸弁冕而出,卿、大夫、士皆下之。尸必式,必有前驱。” }} Übersetzung James Legge Confucius said, 'When the personator of the dead comes forth in his leathern cap, or that with the square top, ministers, Great officers, and other officers, all should descend from their carriages when he passes. He should bow forward to them, and he should (also) have people going before him (to notify his approach, that people may get out of the way). ==== [https://ctext.org/liji/ji-yi/ens Ji Yi] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 昔者,圣人建阴阳天地之情,立以为《易》。易抱龟南面,天子卷冕北面,虽有明知之心,必进断其志焉。示不敢专,以尊天也。善则称人,过则称己。教不伐以尊贤也。 }} Übersetzung James Legge Anciently, the sages, having determined the phenomena of heaven and earth in their states of rest and activity, made them the basis of the Yi (and divining by it). The diviner held the tortoise-shell in his arms, with his face towards the south, while the son of Heaven, in his dragon-robe and square-topped cap, stood with his face to the north. The latter, however intelligent might be his mind, felt it necessary to set forth and obtain a decision on what his object was;-showing that he did not dare to take his own way, and giving honour to Heaven (as the supreme Decider). What was good in him (or in his views) he ascribed to others; what was wrong, to himself; thus teaching not to boast, and giving honour to men of talents and virtue. ==== [https://ctext.org/liji/ji-tong/ens Ji Tong] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 是故,天子亲耕于南郊,以共齐盛;王后蚕于北郊,以共纯服。诸侯耕于东郊,亦以共齐盛;夫人蚕于北郊,以共冕服。天子诸侯非莫耕也,王后夫人非莫蚕也,身致其诚信,诚信之谓尽,尽之谓敬,敬尽然后可以事神明,此祭之道也。 }} Übersetzung James Legge For this reason, also, the son of Heaven himself guided the plough in the southern suburb, to provide the grain for the sacrificial vessels; and the queen looked after her silkworms in the northern suburb, to provide the cap and robes of silk. The princes of the states guided the plough in their eastern suburb, also to provide the grain for the sacrificial vessels, and their wives looked after their silkworms in the northern suburb, to provide the cap and robes of silk. This was not because the son of Heaven and the princes had not men to plough for them, or 'because the queen and the princes' wives had not women to tend the silkworms for them; it was to give the exhibition of their personal sincerity. Such sincerity was what is called doing their utmost; and such doing of their utmost was what is called reverence. When they had reverently done their utmost, they could serve the spiritual Intelligences--such was the way of sacrificing. ==== [https://ctext.org/liji/ai-gong-wen/ens Ai Gong Wen] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 公曰:“寡人虽无似也,愿闻所以行三言之道,可得闻乎?”孔子对曰:“古之为政,爱人为大;所以治爱人,礼为大;所以治礼,敬为大;敬之至矣,大昏为大。大昏至矣!大昏既至,冕而亲迎,亲之也。亲之也者,亲之也。是故,君子兴敬为亲;舍敬,是遗亲也。弗爱不亲;弗敬不正。爱与敬,其政之本与!” }} Übersetzung James Legge The duke said, 'Although I cannot, in my unworthiness, count myself as having attained, I should like to hear how these three things which you have mentioned can be rightly secured. May I hear it from you?' Confucius replied, 'With the ancients in their practice of government the love of men was the great point; in their regulation of this love of men, the rules of ceremony was the great point; in their regulation of those rules, reverence was the great point. For of the extreme manifestation of reverence we find the greatest illustration in the great (rite of) marriage. Yes, in the great (rite of) marriage there is the extreme manifestation of respect; and when one took place, the bridegroom in his square-topped cap went in person to meet the bride;--thus showing his affection for her. It was his doing this himself that was the demonstration of his affection. Thus it is that the superior man commences with respect as the basis of love. To neglect respect is to leave affection unprovided for. Without loving there can be no (real) union; and without respect the love will not be correct. Yes, love and respect lie at the foundation of government.' ==== [https://ctext.org/liji/wang-zhi/ens Wang Zhi] ==== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 国无九年之蓄曰不足,无六年之蓄曰急,无三年之蓄曰国非其国也。三年耕,必有一年之食;九年耕,必有三年之食。以三十年之通,虽有凶旱水溢,民无菜色,然后天子食,日举以乐。 }} Übersetzung James Legge If in a state there was not accumulated (a surplus) sufficient for nine years, its condition was called one of insufficiency; if there was not enough for six years, one of urgency. If there was not a surplus sufficient for three years, the state could not continue. The husbandry of three years was held to give an overplus of food sufficient for one year; that of nine years, an overplus sufficient for three years. Going through thirty years (in this way), though there might be bad years, drought, and inundations, the people would have no lack or be reduced to (eating merely) vegetables, and then the son of Heaven would every day have full meals and music at them. === [https://ctext.org/analects/ens Analekte des Konfuzius] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 子曰:“麻冕,礼也;今也纯,俭。吾从众。拜下,礼也;今拜乎上,泰也。虽违众,吾从下。” }} Übersetzung James Legge The Master said, "The linen cap is that prescribed by the rules of ceremony, but now a silk one is worn. It is economical, and I follow the common practice. Bowing below the hall is prescribed by the rules of ceremony, but now the practice is to bow only after ascending it. That is arrogant. I continue to bow below the hall, though I oppose the common practice." {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 师冕见,及阶,子曰:“阶也。”及席,子曰:“席也。”皆坐,子告之曰:“某在斯,某在斯。”师冕出。子张问曰:“与师言之道与?”子曰:“然。固相师之道也。” }} Übersetzung James Legge The music master, Mian, having called upon him, when they came to the steps, the Master said, "Here are the steps." When they came to the mat for the guest to sit upon, he said, "Here is the mat." When all were seated, the Master informed him, saying, "So and so is here; so and so is here." The music master, Mian, having gone out, Zi Zhang asked, saying. "Is it the rule to tell those things to the music master?" The Master said, "Yes. This is certainly the rule for those who lead the blind." === [http://museum.marcopoloproject.org/2013/08/01/easy-read-old-man-fears-for-his-wealth-and-gives-his-pigs-a-4600-yuan-breakfast-%e8%80%81%e4%ba%ba%e6%80%95%e9%92%b1%e8%a2%ab%e5%81%b7%e8%97%8f%e4%ba%8e%e7%8c%aa%e5%9c%88-%e4%b8%a4%e7%8c%aa/ the marco polo project: 老人怕钱被偷藏于猪圈 两猪一顿早餐吞下4800元 – (Easy read) Old man fears for his wealth – and gives his pigs a 4800 Yuan breakfast (Auszug)] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |导语:老两口怕钱被偷,于是把6000元钱藏在猪圈里,结果被两头猪一顿吃掉4800元。<br/><br/>刘老汉家里养了六头猪,前几天卖掉了四头猪,还剩下两头猪留着过年再杀。卖猪的收入和一些积蓄一共是6000元 }} [http://museum.marcopoloproject.org/author/youquxinwen/ youquxinwen] [http://www.youquxinwen.com/show/44.html Artikel] Introduction:The old couple fears for lost money, hide 6000 Yuan into the pigsty,as a result,his two pigs had 4800 Yuan for a meal. The old man whose surname is Liu,he sold 4 pigs several days before, leaving only 2 pigs at home for the next year. Totally revenue is 6000 Yuan, including the income of pigs and his savings. ... == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |礼记-礼运}} == === Text === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |祝嘏莫敢易其常古,是谓大假。祝嘏辞说,藏于宗祝巫史,非礼也,是谓幽国。盏斝及尸君,非礼也,是谓僭君。冕弁兵革藏于私家,非礼也,是谓胁君。大夫具官,祭器不假,声乐皆具,非礼也,是谓乱国。 }} === Richard Wilhelm === Wenn die Gebetspriester und der Segenspriester es nicht wagen, die alten, dauernd gebrauchten Worte zu ändern, das[60] ist etwas sehr Großes. Daß die Worte, die die Gebets- und Segenspriester sprechen müssen, verborgen werden von den Gebetspriestern des Ahnentempels, von den Zauberern und Schreibern (so daß der Fürst nichts davon erfährt), entspricht nicht der Sitte. Das heißt den Staat in Finsternis halten. Daß der Vertreter des Toten und der Fürst aus einem der uralten Kelche trinken, entspricht nicht der Sitte. Ein Fürst, der das tut, maßt sich (die Vorrechte des Himmelssohns) an. Krone und Helm, Waffen und Panzer in einem Privathaus zu sammeln, entspricht nicht der Sitte. Wer das tut, der maßt sich die Rechte des Fürsten an. === James Legge === When no change is presumptuously made from the constant practice from the oldest times between the prayer and blessing (at the beginning of the sacrifice), and the benediction (at the end of it), we have what might be called a great and happy service. For the words of prayer and blessing and those of benediction to be kept hidden away by the officers of prayer of the ancestral temple, and the sorcerers and recorders, is a violation of the rules of propriety. This may be called keeping a state in darkness. (The use of) the zhan cup (of Xia) and the jia cup (of Yin), and (the pledging in them) between the representative of the dead and the ruler are contrary to propriety; these things constitute 'a usurping ruler.' (For ministers and Great officers to) keep the cap with pendents and the leathern cap, or military weapons, in their own houses is contrary to propriety. To do so constitutes 'restraint of the ruler.' For Great officers to maintain a full staff of employees, to have so many sacrificial vessels that they do not need to borrow any; and have singers and musical instruments all complete, is contrary to propriety. For them to do so leads to 'disorder in a state'. == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |中国历史}} == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |在与匈奴和南越国(南粤)保持和平的同时,也在积蓄国力,透过马复令等措施来积极备战; 此一时期史称“文景之治”,是中国成为大一统帝国时代以来,第一次被传统历史学家赞誉的时期。 }} === Übersetzungshilfe === Es ist noch keine Übersetzungshilfe vorhanden <noinclude> {{Navigation zurückhochvor| zurücktext=Lektion 712| zurücklink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 712| hochtext=Buch Vokabellektionen| hochlink=Vokabeltexte_Chinesisch/_Vokabellektionen| vortext=Lektion 714| vorlink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 714}} </noinclude> 012q44dz4efc9xx6bdu3spkg9p1b61b Vokabeltexte Chinesisch/ Vokabellektionen/ Lektion 714 0 102521 1082872 1014923 2026-04-07T08:31:33Z Christian-bauer 6469 kleinere Ergänzungen und Korrekturen 1082872 wikitext text/x-wiki <noinclude> {{Navigation zurückhochvor| zurücktext=Lektion 713| zurücklink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 713| hochtext=Buch Vokabellektionen| hochlink=Vokabeltexte_Chinesisch/_Vokabellektionen| vortext=Lektion 715| vorlink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 715}} </noinclude> == Zeichen == {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung !! Lernhilfen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |谑}} || xue4 || Vergnügen, necken || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=谑}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |黜}} || chu4 || entlassen, abetzen, jemand seines Amtes entheben, zurückweisen, aufgeben || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=黜}} [[Datei:黜-seal.svg|40px]] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |漠}} || mo4 || desertieren, im Stich lassen, Wüste, gleichgültig, teilnahmslos || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=漠}} [[Datei:漠-seal.svg|40px]][[Datei:漠-bigseal.svg|40px]] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |吞}} || tun1 || einnehmen, ergreifen, hinunterschlucken, verschlucken || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=吞}} (HSK 3.0 Band 6) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監}} || jian1 || (traditionelle Schreibweise von 监), beaufsichtigen, betreuen, fest, hart, inspizieren, beschauen, überwachen, kontrollieren, Gefängnis || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=監}} |} == Zusammengesetzte Wörter == === 谑 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | rowspan='2'| {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |戏谑}} || xi4 nüe4 || scherzen |- | xi4 xue4 || necken |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |谑称}} || xue4 cheng1 || playful appellation |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |谑语}} || xue4 yu3 || words to tease sb |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |调谑}} || tiao2 xue4 || to make fun of, to mock |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |谑剧}} || xue4 ju4 || fun and mockery |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |谑戏}} || xue4 xi4 || fun and mockery |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |谑而不虐}} || xue4 er2 bu4 nu:e4 || to tease, to mock sb without offending, to banter |} === 黜 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |罢黜}} || ba4 chu4 || entlassen, kündigen, jemanden seines Amtes entheben |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |罷黜}} || ba4 chu4 || (traditionelle Schreibweise von 罢黜), entlassen, kündigen, jemanden seines Amtes entheben |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |黜退}} || chu4 tui4 || to demote, to dismiss |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |免黜}} || mian3 chu4 || to dismiss, to fire, to degrade |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |废黜}} || fei4 chu4 || to depose (a king) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |可罢黜}} || ke3 ba4 chu4 || absetzbar |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |可罷黜}} || ke3 ba4 chu4 || (traditionelle Schreibweise von 可罢黜), absetzbar |} === 漠 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung !! Lernhilfen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |淡漠}} || dan4 mo4 || gleichgültig, desinteressiert |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |漠河}} || mo4 he2 || Mohe (Ort in Heilongjiang) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |漠视}} || mo4 shi4 || Gleichgültigkeit, geringschätzen, missachten, Ignorieren |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |漠視}} || mo4 shi4 || (traditionelle Schreibweise von 漠视), Gleichgültigkeit, geringschätzen, missachten, Ignorieren |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |落漠}} || luo4 mo4 || einsam |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |漠然}} || mo4 ran2 || gleichgültig || (HSK 3.0 Band 7-9) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |沙漠}} || sha1 mo4 || Wüste || (HSK 3.0 Band 5) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |冷漠}} || leng3 mo4 || kalt, gleichgültig || (HSK 3.0 Band 7-9) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |荒漠}} || huang1 mo4 || Ödnis |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |广漠}} || guang3 mo4 || Weit |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |廣漠}} || guang3 mo4 || (traditionelle Schreibweise von 广漠), Weit |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |漠河县}} || mo4 he2 xian4 || Kreis Mohe (Provinz Heilongjiang, China) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |漠河縣}} || mo4 he2 xian4 || (traditionelle Schreibweise von 漠河县), Kreis Mohe (Provinz Heilongjiang, China) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |荒漠化}} || huang1 mo4 hua4 || Desertifikation, Wüstenbildung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |沙漠化}} || sha1 mo4 hua4 || Desertifikation, Wüstenbildung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |漠百灵}} || mo4 bai3 ling2 || Steinlerche (lat: Ammomanes deserti) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |沙漠之鹰}} || sha1 mo4 zhi1 ying1 || Desert Eagle |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |沙漠之鷹}} || sha1 mo4 zhi1 ying1 || (traditionelle Schreibweise von 沙漠之鹰), Desert Eagle |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |漠然置之}} || mo4 ran2 zhi4 zhi1 || sich taub stellen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |彩绘沙漠}} || cai3 hui4 sha1 mo4 || Painted Desert |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |阿拉伯沙漠}} || a1 la1 bo2 sha1 mo4 || Arabische Wüste |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |腾格里沙漠}} || teng2 ge2 li3 sha1 mo4 || Tengger-Wüste |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |騰格里沙漠}} || teng2 ge2 li3 sha1 mo4 || (traditionelle Schreibweise von 腾格里沙漠), Tengger-Wüste |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |莫哈韦沙漠}} || mo4 ha1 wei2 sha1 mo4 || Mojave-Wüste |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |撒哈拉沙漠}} || sa1 ha1 la1 sha1 mo4 || Sahara |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |沙漠大角羊}} || sha1 mo4 da4 jiao3 yang2 || Nelsons Dickhornschaf, Wüsten-Dickhornschaf (lat: Ovis canadensis nelsoni) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |纳米比沙漠}} || na4 mi3 bi3 sha1 mo4 || Namib Wüste |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |沙漠之狐行动}} || sha1 mo4 zhi1 hu2 xing2 dong4 || Operation Desert Fox |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |沙漠之狐行動}} || sha1 mo4 zhi1 hu2 xing2 dong4 || (traditionelle Schreibweise von 沙漠之狐行动), Operation Desert Fox |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |喀拉哈里沙漠}} || ka1 la1 ha1 li3 sha1 mo4 || Kalahari, Kalahari |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |喀拉哈裡沙漠}} || ka1 la1 ha1 li3 sha1 mo4 || (traditionelle Schreibweise von 喀拉哈里沙漠), Kalahari, Kalahari |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |阿塔卡马沙漠}} || a1 ta3 ka3 ma3 sha1 mo4 || Atacamawüste |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |阿塔卡馬沙漠}} || a1 ta3 ka3 ma3 sha1 mo4 || (traditionelle Schreibweise von 阿塔卡马沙漠), Atacamawüste |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |沙漠中的绿洲}} || sha1 mo4 zhong4 di4 lü4 zhou1 || Oase |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |沙漠中的綠洲}} || sha1 mo4 zhong4 di4 lü4 zhou1 || (traditionelle Schreibweise von 沙漠中的绿洲), Oase |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |古尔班通古特沙漠}} || gu3 er3 ban1 tong1 gu3 te4 sha1 mo4 || Gurbantünggüt |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |古爾班通古特沙漠}} || gu3 er3 ban1 tong1 gu3 te4 sha1 mo4 || (traditionelle Schreibweise von 古尔班通古特沙漠), Gurbantünggüt |} === 吞 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |侵吞}} || qin1 tun1 || Anektion, Raub, anfügen, annektieren, rauben, vereinnahmen, unterschlagen, schlucken |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |吞咽}} || tun1 yan1 || Schluck, Schlurf |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |被吞咽}} || bei4 tun1 yan1 || schlucken |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |侵吞公款}} || qin1 tun1 gong1 kuan3 || Unterschlagung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |狼吞虎咽}} || lang2 tun1 hu3 yan4 || heißhungrig verschlingen, fressen, schlingen, voll fressen, vollfressen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |吞咽困难}} || tun1 yan1 kun4 nan5 || Schluckbeschwerden, Störung des Schluckaktes |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |吞咽困難}} || tun1 yan1 kun4 nan5 || (traditionelle Schreibweise von 吞咽困难), Schluckbeschwerden, Störung des Schluckaktes |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |狼吞虎咽者}} || lang2 tun1 hu3 yan1 zhe3 || Fresser |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |狼吞虎咽地}} || lang2 tun1 hu3 yan4 di4 || gefräßig(Adj, Lit) |} === 監 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監禁}} || jian1 jin4 || (traditionelle Schreibweise von 监禁), inhaftieren, einschließen, einkerkern, einsperren |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監聽}} || jian1 ting1 || (traditionelle Schreibweise von 监听), abhören |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監警}} || jian1 jing3 || (traditionelle Schreibweise von 监警), Wärter |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監管}} || jian1 guan3 || (traditionelle Schreibweise von 监管), beaufsichtigen, überwachen, in Verwahrung nehmen, Betreuung, Superintendant |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監察}} || jian1 cha2 || (traditionelle Schreibweise von 监察), Überwachung, überwachen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |太監}} || tai4 jian4 || (traditionelle Schreibweise von 太监), Eunuch, Eunuch im Kaiserpalast |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監工}} || jian1 gong1 || (traditionelle Schreibweise von 监工), Aufseher, Wart, warten |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |總監}} || zong3 jian1 || (traditionelle Schreibweise von 总监), Direktor |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監持}} || jian1 chi2 || (traditionelle Schreibweise von 坚持), an etw. festhalten, beharren |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監門}} || jian1 men2 || (traditionelle Schreibweise von 监门), Pförtner |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監控}} || jian1 kong4 || (traditionelle Schreibweise von 监控), überwachen und kontrollieren |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監牢}} || jian1 lao2 || (traditionelle Schreibweise von 监牢), Besserungsanstalt |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監視}} || jian1 shi4 || (traditionelle Schreibweise von 监视), beobachten |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監督}} || jian1 du1 || (traditionelle Schreibweise von 监督), Aufseher, Aufsicht, beaufsichtigen, überwachen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監修}} || jian1 xiu1 || Bauüberwachung, einer Baumaßnahme überwachen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監利}} || jian1 li4 || (traditionelle Schreibweise von 监利), Jianli (Ort in Hubei) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監理}} || jian1 li3 || (traditionelle Schreibweise von 监理), prüfen, beaufsichtigen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監督人}} || jian1 du1 ren2 || (traditionelle Schreibweise von 监督人), Inspektor, Leiter, Superintendant, Vogt |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監視點}} || jian1 shi4 dian3 || (traditionelle Schreibweise von 监视点), Kontrollpunkt |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |女舍監}} || nü3 she4 jian1 || (traditionelle Schreibweise von 女舍监), Hausmutter |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監督者}} || jian1 du1 zhe5 || (traditionelle Schreibweise von 监督者), Aufseher, Aufsicht, Doktorvater |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監控台}} || jian1 kong4 tai2 || (traditionelle Schreibweise von 监控台), Überwachungspult |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監利縣}} || jian1 li4 xian4 || (traditionelle Schreibweise von 监利县), Jianli |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監造組}} || jian1 zao4 zu3 || (traditionelle Schreibweise von 监造组), Bauaufsicht |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |主監督}} || zhu3 jian1 du1 || (traditionelle Schreibweise von 主监督), Vorsteher |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |被監禁}} || bei4 jian1 jin4 || (traditionelle Schreibweise von 被监禁), fangen, gefangen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |受監控}} || shou4 jian1 kong4 || (traditionelle Schreibweise von 受监控), kontrolliert |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監事會}} || jian1 shi4 hui4 || (traditionelle Schreibweise von 监事会), Aufsichtsrat, Vorstandsversammlung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監察官}} || jian1 cha2 guan1 || (traditionelle Schreibweise von 监察官), staatl. Beamten zur Überwachung, staatl. Inspekteur(Beobachter), Zensur (altrömisches Amt) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監視器}} || jian1 shi4 qi4 || (traditionelle Schreibweise von 监视器), Monitor, Kontrollbildschirm |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監察部}} || jian1 cha2 bu4 || (traditionelle Schreibweise von 监察部), Kontrollministerium, Überwachungsministerium |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監察院}} || jian1 cha2 yuan4 || (traditionelle Schreibweise von 监察院), Kontroll-Yuan (Behörde in Taiwan, welche die Regierung überwacht) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |場監視}} || chang3 jian1 shi4 || (traditionelle Schreibweise von 场监视), Feldüberwachung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |沒有監督}} || mei2 you3 jian1 du1 || (traditionelle Schreibweise von 没有监督), unüberwacht, unbeaufsichtigt, unbeobachtet |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |終身監禁}} || zhong1 shen1 jian1 jin4 || (traditionelle Schreibweise von 终身监禁), lebenslange Haft |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |進口監督}} || jin4 kou3 jian1 du1 || (traditionelle Schreibweise von 进口监督), Importkontrollen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |保障監督}} || bao3 zhang4 jian1 du1 || (traditionelle Schreibweise von 保障监督), Sicherheitsklauseln |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |遠程監控}} || yuan3 cheng2 jian1 kong4 || (traditionelle Schreibweise von 远程监控), RMON |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監督電話}} || jian1 du1 dian4 hua4 || (traditionelle Schreibweise von 监督电话), Special line for society to contact the party institutions, commercial and service industries . |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |交通監控}} || jiao1 tong1 jian1 kong4 || (traditionelle Schreibweise von 交通监控), Verkehrsüberwachung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |風扇監視}} || feng1 shan4 jian1 shi4 || (traditionelle Schreibweise von 风扇监视), Lüfterüberwachung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |寸動監視}} || cun4 dong4 jian1 shi4 || (traditionelle Schreibweise von 寸动监视), Schleichgangüberwachung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |录像監視}} || lu4 xiang4 jian1 shi4 || Videoüberwachung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |施工監督}} || shi1 gong1 jian1 du1 || (traditionelle Schreibweise von 施工监督), Bauaufsicht |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |生产監視}} || sheng1 chan3 jian1 shi4 || (traditionelle Schreibweise von 生产监视), Produktionsüberwachung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |女工監督}} || nü3 gong1 jian1 du1 || (traditionelle Schreibweise von 女工监督), Vorarbeiterin |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |銀行監管}} || yin2 hang2 jian1 guan3 || (traditionelle Schreibweise von 银行监管), Bankenaufsicht |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |電話監控}} || dian4 hua4 jian1 kong4 || (traditionelle Schreibweise von 电话监控), Telefonüberwachung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |升程監視}} || sheng1 cheng2 jian1 shi4 || (traditionelle Schreibweise von 升程监视), Hubüberwachung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監禁起來}} || jian1 jin4 qi3 lai5 || (traditionelle Schreibweise von 监禁起来), festnehmen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監督法院}} || jian1 du1 fa3 yuan4 || (traditionelle Schreibweise von 监督法院), Kirchenrat |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |軍備監督}} || jun1 bei4 jian1 du1 || (traditionelle Schreibweise von 军备监督), Rüstungskontrolle |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |故障監視}} || gu4 zhang4 jian1 shi4 || (traditionelle Schreibweise von 故障监视), Störungsüberwachung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監管責任}} || jian1 guan3 ze2 ren4 || (traditionelle Schreibweise von 监管责任), Aufsichtspflicht |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監事會會議}} || jian1 shi4 hui4 hui4 yi4 || (traditionelle Schreibweise von 监事会会议), Aufsichtsratssitzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |行車監視器}} || xing2 che1 jian1 shi4 qi4 || (traditionelle Schreibweise von 行车监视器), Bordmonitor |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |短時間監禁}} || duan3 shi2 jian1 jian1 jin4 || (traditionelle Schreibweise von 短时间监禁), Sequestration, Sequestrierung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |彩色監視器}} || cai3 se4 jian1 shi4 qi4 || (traditionelle Schreibweise von 彩色监视器), Farbmonitor |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |交貨期監督}} || jiao1 huo4 qi1 jian1 du1 || (traditionelle Schreibweise von 交货期监督), Lieferterminüberwachung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |印刷機監控}} || yin4 shua1 ji1 jian1 kong4 || (traditionelle Schreibweise von 印刷机监控), Druckmaschinenüberwachung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監控計算機}} || jian1 kong4 ji4 suan4 ji1 || (traditionelle Schreibweise von 监控计算机), Überwachungsrechner |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |光電監控器}} || guang1 dian4 jian1 kong4 qi4 || (traditionelle Schreibweise von 光电监控器), Lichtschranke |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |全圖形監視器}} || quan2 tu2 xing2 jian1 shi4 qi4 || (traditionelle Schreibweise von 全图形监视器), Vollgrafikmonitor |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |光油水平監視}} || guang1 you2 shui3 ping2 jian1 shi4 || (traditionelle Schreibweise von 光油水平监视), Lackniveauüberwachung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |人民群眾監督}} || ren2 min2 qun2 zhong4 jian1 du1 || (traditionelle Schreibweise von 人民群众监督), Volkskontrolle |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |監持對話不搞對抗}} || jian1 chi2 dui4 hua4 bu4 gao3 dui4 kang4 || (traditionelle Schreibweise von 坚持对话不搞对抗), an Dialogen festhalten, Konfrontation vermeiden |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |美國國家情報總監}} || mei3 guo2 guo2 jia1 qing2 bao4 zong3 jian1 || (traditionelle Schreibweise von 美国国家情报总监), Director of National Intelligence, National Intelligence Estimate |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |由光電裝置進行監控}} || you2 guang1 dian4 zhuang1 zhi4 jin4 xing2 jian1 kong4 || (traditionelle Schreibweise von 由光电装置进行监控), optolelektronisch überwacht |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |威普羅監控有限公司}} || wei1 pu3 luo2 jian1 kong4 you3 xian4 gong1 si1 || Wipro Technologies Co., Ltd. |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |美國食品藥品監督管理局}} || mei3 guo2 shi2 pin3 yao4 pin3 jian1 du1 guan3 li3 ju2 || (traditionelle Schreibweise von 美国食品药品监督管理局), Food and Drug Administration |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |國家食品藥品監督管理局}} || guo2 jia1 shi2 pin3 yao4 pin3 jian1 du1 guan3 li3 ju2 || (traditionelle Schreibweise von 国家食品药品监督管理局), State Food and Drug Administration, staatliche Arzneimittelzulassungs- und -aufsichtsbehörde der VR China |} == Sätze == === 谑 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 黜 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 漠 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |你不能漠視你的責任。}} || ni3 bu4 neng2 mo4 shi4 ni3 de5 ze2 ren4 。|| You are not to neglect your duty. (Mandarin, [https://tatoeba.org/eng/sentences/show/339465 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/fishda fishda]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |你不能漠视你的责任。}} || ni3 bu4 neng2 mo4 shi4 ni3 de5 ze2 ren4 。|| You are not to neglect your duty. (Mandarin, [https://tatoeba.org/eng/sentences/show/339465 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/fishda fishda]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |地球表面的三分之一是沙漠。}} || de4/di4 qiu2 biao3 mian4 de5 san1 fen1 zhi1 yi1 shi4 sha1 mo4 。|| Ein Drittel der Erdoberfläche ist Wüste. (Mandarin, [https://tatoeba.org/eng/sentences/show/3666900 Tatoeba] [https://tatoeba.org/eng/user/profile/tmzg tmzg] [https://tatoeba.org/eng/user/profile/Esperantostern Esperantostern]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |冷漠,有时候并不是无情,只是一种逃避被伤害的工具!}} || leng3 mo4 , you3 shi2 hou4 bing4 bu4 shi4 wu2 qing2 , zhi3 shi4 yi1 chong2/zhong3/zhong4 tao2 bi4 bei4 shang1 hai4 de5 gong1 ju4 !|| Gleichgültigkeit ist manchmal gar keine Gefühllosigkeit, sondern nur ein Mittel, um nicht verletzt zu werden! (Mandarin, [https://tatoeba.org/eng/sentences/show/838468 Tatoeba] [https://tatoeba.org/eng/user/profile/Martha Martha] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |你对待身边的人太冷漠了。}} || ni3 dui4 dai1 shen1 bian1 de5 ren2 tai4 leng3 mo4 le5 。|| Du bist den Menschen in deiner Umgebung gegenüber zu gleichgültig. (Mandarin, [https://tatoeba.org/eng/sentences/show/2042179 Tatoeba] [https://tatoeba.org/eng/user/profile/Gustav249 Gustav249] [https://tatoeba.org/eng/user/profile/xtofu80 xtofu80]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |就在我们今晚站在这里的时刻,我们知道勇敢的美国士兵在伊拉克的沙漠里和阿富汗的群山中醒来,他们冒着生命危险来保护着我们的生命。}} || jiu4 zai4 wo3 men5 jin1 wan3 zhan4 zai4 zhe4/zhei4 li3 de5 shi2 ke4 , wo3 men5 zhi1 dao4 yong3 gan3 de5 mei3 guo2 shi4 bing1 zai4 yi1 la1 ke4 de5 sha1 mo4 li3 he2/he4/huo2 a1 fu4 han4 de5 qun2 shan1/shan5 zhong1/zhong4 xing3 lai2 , ta1 men5 mao4 zhao2/zhe2 sheng1 ming4 wei1 xian3 lai2 bao3 hu4 zhao2/zhe2 wo3 men5 de5 sheng1 ming4 。|| Even as we stand here tonight, we know there are brave Americans waking up in the deserts of Iraq and the mountains of Afghanistan, to risk their lives for us. (Mandarin, [https://tatoeba.org/eng/sentences/show/347840 Tatoeba] [https://tatoeba.org/eng/user/profile/zhouj1955 zhouj1955]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他收到了一封她的信,但上面只有简短的、冷漠的几句话。}} || ta1 shou1 dao4 le5 yi1 feng1 ta1 de5 xin4 , dan4 shang4 mian4 zhi3 you3 jian3 duan3 de5 、 leng3 mo4 de5 ji1 ju4 hua4 。|| Er empfing einen Brief von ihr, aber darin standen nur ein paar knappe, kalte Worte. (Mandarin, [https://tatoeba.org/eng/sentences/show/7774780 Tatoeba] [https://tatoeba.org/eng/user/profile/jiangche jiangche] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |秘书冷漠地回答了我。}} || 秘 shu1 leng3 mo4 de4/di4 hui2 da2 le5 wo3 。|| Die Sekretärin antwortete mir gleichgültig. (Mandarin, [https://tatoeba.org/eng/sentences/show/844162 Tatoeba] [https://tatoeba.org/eng/user/profile/fucongcong fucongcong] [https://tatoeba.org/eng/user/profile/xtofu80 xtofu80]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |那警察对我的母亲漠不关心。}} || na4/nei4 jing3 察 dui4 wo3 de5 mu3 qin1 mo4 bu4 guan1 xin1 。|| Dem Polizisten war meine Mutter völlig egal. (Mandarin, [https://tatoeba.org/eng/sentences/show/1787964 Tatoeba] [https://tatoeba.org/eng/user/profile/sadhen sadhen] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |沙漠中有绿洲。}} || sha1 mo4 zhong1/zhong4 you3 lü4 zhou1 。|| In der Wüste gibt es Oasen. (Mandarin, [https://tatoeba.org/eng/sentences/show/6142325 Tatoeba] [https://tatoeba.org/eng/user/profile/GlossaMatik GlossaMatik] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我想是在沙漠里。}} || wo3 xiang3 shi4 zai4 sha1 mo4 li3 。|| In the desert, I think. (Mandarin, [https://tatoeba.org/eng/sentences/show/2200462 Tatoeba] [https://tatoeba.org/eng/user/profile/johannjunge johannjunge] [https://tatoeba.org/eng/user/profile/FeuDRenais2 FeuDRenais2]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |有人说新一代的人很冷漠。}} || you3 ren2 shuo1 xin1 yi1 dai4 de5 ren2 hen3 leng3 mo4 。|| Es heißt, dass die Jugend von heute apathisch ist. (Mandarin, [https://tatoeba.org/eng/sentences/show/1424286 Tatoeba] [https://tatoeba.org/eng/user/profile/sirpoot sirpoot] [https://tatoeba.org/eng/user/profile/Zaghawa Zaghawa]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |沙漠中有綠洲。}} || sha1 mo4 zhong1/zhong4 you3 lü4 zhou1 。|| In der Wüste gibt es Oasen. (Mandarin, [https://tatoeba.org/eng/sentences/show/6142325 Tatoeba] [https://tatoeba.org/eng/user/profile/GlossaMatik GlossaMatik] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |这是片干燥地区,几乎是一片荒漠。}} || zhe4/zhei4 shi4 pian4 gan1/qian2 zao4 de4/di4 qu1 , ji1 乎 shi4 yi1 pian4 huang1 mo4 。|| Es ist ein Trockengebiet, nahezu eine Wüste. (Mandarin, [https://tatoeba.org/eng/sentences/show/10011733 Tatoeba] [https://tatoeba.org/eng/user/profile/GlossaMatik GlossaMatik] [https://tatoeba.org/eng/user/profile/raggione raggione]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |社会变态者是冷漠的。}} || she4 hui4 bian4 tai4 zhe3 shi4 leng3 mo4 de5 。|| A sociopath is cold. (Mandarin, [https://tatoeba.org/eng/sentences/show/9779610 Tatoeba] [https://tatoeba.org/eng/user/profile/BobbyLee BobbyLee] [https://tatoeba.org/eng/user/profile/Amastan Amastan]) |} === 吞 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 監 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我會用我的電腦監察你的進度。}} || wo3 hui4 yong4 wo3 de5 dian4 nao3 jian1/jian4 察 ni3 de5 jin4 du4 。|| I'll monitor your progress from my computer. (Mandarin, [https://tatoeba.org/eng/sentences/show/1572651 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/darinmex darinmex]) |} === einsortieren === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |打落牙齿和血吞}} || da3 la4/lao4/luo4 ya2 chi3 he2/he4/huo2 xie3/xue4 tun1 ||Literally: knock out (the) teeth (and) mix (with) blood (, then) swallow (both teeth and blood mixed together); to silently endure all manner of insults and abuse ([[wikt:en:打落牙齿和血吞 |Wiktionary en]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |狼吞虎咽 }} || lang2 tun1 hu1/hu3 yan1/yan4/ye4 ||Literally: to gulp down like wolves and tigers; to gorge; to wolf down([[wikt:en:狼吞虎咽 |Wiktionary en]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |北非撒哈拉地区开始沙漠化}} || bei3 fei1 sa1/sa3 ha1 la1 de4/di4 qu1 kai1 shi3 sha1 mo4 hua4 || In Nordafrikas Sahara beginnt die Wüstenbildung. ([[Vokabeltexte_Chinesisch/_Geschichtsdetails/ 4._Jahrtausend_v._Chr. |Geschichtsdetails]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |公元前5600年 — 北非的沙漠化进程开始 }} || gong1 yuan2 qian2 5600 nian2 — bei3 fei1 de5 sha1 mo4 hua4 jin4 cheng2 kai1 shi3 ||5600 v. Chr: Die Wüstenbildung in Nordafrika beginnt. ([[Vokabeltexte_Chinesisch/_Geschichtsdetails/ 6._Jahrtausend_v._Chr. |Geschichtsdetails]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |吞声草莽之中}} || tun1 sheng1 cao3 mang3 zhi1 zhong1/zhong4 || they stifled their sobs while still amongst the reeds ([[s:en:Special:PermanentLink/5495659 | Wikisource: Romance of the Three Kingdoms]] [[s:zh:三國演義/第003回 | 三國演義/第003回]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |国乃大旱}} || guo2 nai3 da4 han4 ||große Dürre würde im Lande herrschen ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |國乃大旱}} || guo2 nai3 da4 han4 ||große Dürre würde im Lande herrschen ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |卓今得将军,如旱苗之得甘雨也}} || zhuo2 jin1 de2/de5/dei3 jiang1/jiang4 jun1 , ru2 han4 miao2 zhi1 de2/de5/dei3 gan1 yu3 ye3 ||My (Zhuo) obtaining a new general is like a parched seedling encountering a sweet rain. ([[s:en:Special:PermanentLink/5495659 |Wikisource: Romance of the Three Kingdoms]] [[s:zh:三國演義/第003回 | 三國演義/第003回]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |行夏令,则国乃大旱}} || hang2/xing2 xia4 ling4 , ze2 guo2 nai3 da4 han4 ||Wenn die für den Sommer gültigen Ordnungen befolgt würden, so würde große Dürre im Lande herrschen ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |戏谑不能化敌为友,只能使人失去朋友。}} || xi4 xue4 bu4 neng2 hua4 敌 wei2/wei4 you3 , zhi3 neng2 shi3/shi4 ren2 shi1 qu4 peng2 you3 。||Mit einem Witz kann man keinen Feind in einen Freund verwandeln, aber man kann damit Freunde verlieren. ([[q:Chinesische_Sprichw%C3%B6rter|Chinesische Sprichwörter]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |行春令,则其国乃旱}} || hang2/xing2 chun1 ling4 , ze2 qi2 guo2 nai3 han4 ||Wenn die für den Frühling gültigen Ordnungen befolgt würden, so würde Dürre im Lande herrschen. ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |春多雨则夏必旱矣}} || chun1 duo1 yu3 ze2 xia4 bi4 han4 yi3 ||fällt im Frühjahr viel Regen, so gibt es sicher einen trockenen Sommer. ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |到了第十四天夜间,船在亚底亚海飘来飘去。约到半夜,水手以为渐近旱地,}} || dao4 le5 di4 shi2 si4 tian1 ye4 jian1 , chuan2 zai4 ya4 di3 ya4 hai3 piao1 lai2 piao1 qu4 。 yue1 dao4 ban4 ye4 , shui3 shou3 yi3 wei2/wei4 jian1/jian4 jin4 han4 de4/di4 ,||27 Als aber die vierzehnte Nacht gekommen war, und wir in dem Adriatischen Meere umhertrieben, meinten gegen Mitternacht die Matrosen, daß sich ihnen ein Land nahe. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Apostelgeschichte]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |天大旱,五年不收}} || tian1 da4 han4 , wu3 nian2 bu4 shou1 ||Da sandte der Himmel eine große Dürre, so daß man fünf Jahre lang nicht ernten konnte. ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |行夏令,则其国旱}} || hang2/xing2 xia4 ling4 , ze2 qi2 guo2 han4 ||Wenn die für den Sommer gültigen Ordnungen befolgt würden, so würde es Dürre im Lande geben. ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |天大旱}} || tian1 da4 han4 ||Da sandte der Himmel eine große Dürre ([http://ctext.org/lv-shi-chun-qiu/zhs Lü Bu We] [http://www.zeno.org/pnd/119012251 Richard Wilhelm]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |去年那个地区遭受了60年来最严重的干旱。}} || qu4 nian2 na4/nei4 ge4 de4/di4 qu1 zao1 shou4 le5 60 nian2 lai2 zui4 yan2 chong2/zhong4 de5 gan1/qian2 han4 。||Last year the region was visited by the worst drought in 60 years. [https://tatoeba.org/eng/sentences/show/1577186 Tatoeba] [https://tatoeba.org/eng/user/profile/eastasiastudent eastasiastudent] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |這是三十年代以來最乾旱的六月。}} || zhe4/zhei4 shi4 san1 shi2 nian2 dai4 yi3 lai2 zui4 gan1/qian2 han4 de5 liu4 yue4 。||This has been the driest six months in thirty years. [https://tatoeba.org/eng/sentences/show/885364 Tatoeba] [https://tatoeba.org/eng/user/profile/Martha Martha] [https://tatoeba.org/eng/user/profile/Trailsend Trailsend] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |那警察对我的母亲漠不关心。}} || na4/nei4 jing3 察 dui4 wo3 de5 mu3 qin1 mo4 bu4 guan1 xin1 。||Meiner Mutter ist Politik egal. [https://tatoeba.org/eng/sentences/show/1787964 Tatoeba] [https://tatoeba.org/eng/user/profile/sadhen sadhen] [https://tatoeba.org/eng/user/profile/MUIRIEL MUIRIEL] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我想是在沙漠里。}} || wo3 xiang3 shi4 zai4 sha1 mo4 li3 。||In the desert, I think. [https://tatoeba.org/eng/sentences/show/2200462 Tatoeba] [https://tatoeba.org/eng/user/profile/johannjunge johannjunge] [https://tatoeba.org/eng/user/profile/FeuDRenais FeuDRenais] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |你对待身边的人太冷漠了。}} || ni3 dui4 dai1 shen1 bian1 de5 ren2 tai4 leng3 mo4 le5 。||Du bist den Menschen in deiner Umgebung gegenüber zu gleichgültig. [https://tatoeba.org/eng/sentences/show/2042179 Tatoeba] [https://tatoeba.org/eng/user/profile/Gustav249 Gustav249] [https://tatoeba.org/eng/user/profile/xtofu80 xtofu80] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |有人说新一代的人很冷漠。}} || you3 ren2 shuo1 xin1 yi1 dai4 de5 ren2 hen3 leng3 mo4 。||Es heißt, dass die Jugend von heute apathisch ist. [https://tatoeba.org/eng/sentences/show/1424286 Tatoeba] [https://tatoeba.org/eng/user/profile/sirpoot sirpoot] [https://tatoeba.org/eng/user/profile/Zaghawa Zaghawa] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |就在我们今晚站在这里的时刻,我们知道勇敢的美国士兵在伊拉克的沙漠里和阿富汗的群山中醒来,他们冒着生命危险来保护着我们的生命。}} || jiu4 zai4 wo3 men5 jin1 wan3 zhan4 zai4 zhe4/zhei4 li3 de5 shi2 ke4 , wo3 men5 zhi1 dao4 yong3 gan3 de5 mei3 guo2 shi4 bing1 zai4 yi1 la1 ke4 de5 sha1 mo4 li3 he2/he4/huo2 a1 fu4 han4 de5 qun2 shan1/shan5 zhong1/zhong4 xing3 lai2 , ta1 men5 mao4 zhao2/zhe2 sheng1 ming4 wei1 xian3 lai2 bao3 hu4 zhao2/zhe2 wo3 men5 de5 sheng1 ming4 。||Even as we stand here tonight, we know there are brave Americans waking up in the deserts of Iraq and the mountains of Afghanistan, to risk their lives for us. [https://tatoeba.org/eng/sentences/show/347840 Tatoeba] [https://tatoeba.org/eng/user/profile/zhouj1955 zhouj1955] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |狼吞虎咽}} || lang2 tun1 hu1/hu3 yan1/yan4/ye4 ||([[wikt:en:狼吞虎咽|Wiktionary en]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |打落牙齿和血吞}} || da3 la4/lao4/luo4 ya2 chi3 he2/he4/huo2 xie3/xue4 tun1 ||([[wikt:en:打落牙齿和血吞|Wiktionary en]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他误吞了洗衣粉。}} || ta1 wu4 tun1 le5 xi3/xian3 yi1 fen3 。||Er trank versehentlich Spülmittel. [https://tatoeba.org/eng/sentences/show/335222 Tatoeba] [https://tatoeba.org/eng/user/profile/fucongcong fucongcong] [https://tatoeba.org/eng/user/profile/Pfirsichbaeumchen Pfirsichbaeumchen] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他狼吞虎咽地吃了一顿。}} || ta1 lang2 tun1 hu1/hu3 yan1/yan4/ye4 de4/di4 chi1 le5 yi1 dun4 。||Er verschlang sein Essen. [https://tatoeba.org/eng/sentences/show/334763 Tatoeba] [https://tatoeba.org/eng/user/profile/fucongcong fucongcong] [https://tatoeba.org/eng/user/profile/Zaghawa Zaghawa] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |别狼吞虎咽的。你最好细嚼慢咽地吃。}} || bie2 lang2 tun1 hu1/hu3 yan1/yan4/ye4 de5 。 ni3 zui4 hao3 xi4 jiao2/jue2 man4 yan1/yan4/ye4 de4/di4 chi1 。||Hör auf, dein Essen hineinzustopfen. Du solltest lieber langsamer essen. [https://tatoeba.org/eng/sentences/show/2581495 Tatoeba] [https://tatoeba.org/eng/user/profile/fenfang557 fenfang557] [https://tatoeba.org/eng/user/profile/Tamy Tamy] |} == Lückentexte == === [[:zh:Wikijunior:太阳系/金星|Wikijunior: 太阳系/金星 Sonnensystem/Venus]] === {| class="wikitable" |- ! [[:zh:Wikijunior:太阳系/金星|Wikijunior: 太阳系/金星 Sonnensystem/Venus ]] !! Übersetzung Christian Bauer |- | 金星 是 由 什么 构成 的?|| Aus was ist die Venus zusammengesetzt |- | 金星 的 组成 与 地球 相似,|| Die Zusammensetzung der Venus und die der Erde sind ähnlich. |- | 有 固态 的 内核 和 flüssigen 的 外核。|| Sie haben einen festen inneren Kern und einen flüssigen äußeren Kern. |- | 金星 的 Mantel 和 Kruste 由 岩石 组成,|| Der Venusmantel und die -Kruste sind aus Gestein gebildet. |- | Kruste 的 上面 有 一层 厚厚 的 大气。|| Die Krustenoberfläche besitzt eine Schicht dichter Atmosphäre. |- | |- | 如果 我 站 在 上面 会有 多重?|| Wie schwer wäre ich, wenn ich auf der Venusoberfläche stehen würde? |- | 如果 你 的 体重 是 45 公斤,|| Wenn dein Körpergewicht 45 kg betragen würde |- | 那么 你 在 金星 上 就 只 有 36 公斤,|| dann hättest du auf der Venusoberfläche nur 36 kg. |- | 实际 的 差异 并不是 很大。|| Praktisch ist die Differenz also nicht sehr groß. |- | 你 在 金星 上 的 重量 大概 是 你 在 地球 上 的 重量 的 9/10|| Dein Gewicht auf der Venusoberfläche ist in etwa 9/10 deines Gewichts auf der Erodoberfläche. |} == Texte == === [[n:zh:埃及曼苏尔任命专家重写伊斯兰分子起草的宪法|Wikinews 埃及曼苏尔任命专家重写伊斯兰分子起草的宪法]] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 【2013年7月21日讯】 埃及得到军方支持的临时总统已经选定专家,重写埃及宪法。 这部宪法因为军方这个月把批准这部宪法的前任伊斯兰总统赶下台而被中止。<br/><br/>在星期六发布的命令中, 临时总统曼苏尔任命了10位法官和法律教授。 他们将有一个月的时间提出修改宪法的提议。 这是埃及回归民主统治时间表的一部分。 这个专家小组定于星期天举行第一次会议。<br/><br/>被罢黜的总统穆尔西的伊斯兰支持者起草了这部宪法,然后在一次投票率低的全民公决中获得通过,穆尔西于去年12月批准了这部宪法。<br/><br/>世俗和自由派埃及人基本上抵制了这个程序,他们指控伊斯兰分子忽视他们的意见,并试图损害他们的民权。 反对宪法的人这个月早些时候在全国范围内发起了反对穆尔西统治的大规模民众抗议活动,导致军方将他赶下台并把曼苏尔确立为埃及的临时领导人。<br/><br/>穆尔西作为埃及首位民选总统在位的时间只有一年。 他的前任、长期执政的穆巴拉克总统在2011年得到军方支持的人民革命中被推翻。 }} Noch keine Übersetzung === [[n:zh:尼前国王呼吁停止寺庙争执|Wikinews 尼前国王呼吁停止寺庙争执]] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 【2009年1月4日讯】<br/><br/>尼泊尔被废黜的国王呼吁结束有关尼泊尔最神圣的印度教寺庙的争执。这场争执的起因是毛派领袖把印度神职人员赶出寺庙。<br/><br/>贾南德拉国王星期六对记者说,在帕斯帕提那寺的问题上,宗教应该高于政治。印度祭司世世代代都在这座寺庙里举行宗教仪式。尼泊尔国王去年被废黜。在那之前,毛派反政府武装分子赢得了议会的控制权,并废除了尼泊尔具有几百年历史的君主制。<br/><br/>新上任的毛派政府上个星期打破300年的传统,把帕斯帕提那寺的印度祭司换成了尼泊尔人。这一举动激起了尼泊尔主要反对党和印度祭司们的抗议,他们要求尼泊尔最高法院出面干预。上个星期早些时候,最高法院下令,在事件没有解决之前,新的神职人员不能举行宗教仪式。不过,最高法院的命令遭到了忽视。 }} Noch keine Übersetzung === [[n:zh:埃及将重审与叙利亚的关系|Wikinews 埃及将重审与叙利亚的关系]] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 【2013年7月21日讯】 埃及表示将要重审与叙利亚的外交关系。 在穆尔西总统执政期间两国关系紧张。 本月早些时候穆尔西被废黜。<br/><br/>埃及新外长法赫米星期六表示,临时政府没有意图对叙利亚发动一场他所称的“圣战”,不过埃及支持叙利亚的变革。 他强调,重审两国关系并不一定意味着埃及和叙利亚的关系将更为紧密。<br/><br/>埃及称,由于叙利亚两年多的内战导致流血,埃及上个月关闭了埃及驻大马士革大使馆,并关闭了叙利亚在开罗的驻外机构。 在穆尔西总统执政的一年里,他呼吁叙利亚总统阿萨德下台,并敦促国际社会在叙利亚上空建立禁飞区。 他的执政团体穆斯林兄弟会上个月响应了一些逊尼派教士提出的发动圣战,打击叙利亚政府及其什叶派盟友的呼吁。<br/><br/>在埃及举行反对以伊斯兰派为主导的穆尔西政府的大规模示威之后,穆尔西在7月3日被推翻。 自那以来,他的支持者一直示威,要求穆尔西重掌权力。 自他被推翻以来,不少人在街头暴力中死亡或受伤。<br/><br/>埃及全国各地和约旦首都安曼星期五爆发了支持穆尔西的示威。 在埃及尼罗河三角洲城市曼苏拉,穆尔西的支持者和反对者之间爆发的冲突导致至少3人死亡<br/><br/>数千名忠于穆尔西的人星期六继续在开罗的拉比亚.拉达维亚清真寺外举行静坐示威。 }} Noch keine Übersetzung === [[n:zh:埃及临时政府内阁成员宣誓就职|Wikinews 埃及临时政府内阁成员宣誓就职]] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 【2013年7月17日讯】 自从埃及军方大约两周前推翻总统穆尔西以来,军队支持的临时政府首个内阁的领导人宣誓就职。 军方说推翻穆尔西是为了回应反对他的民众举行的大规模抗议示威。<br/><br/>在星期二的进展之前,保安部队与穆尔西的支持者夜间发生冲突,导致7人死亡,260多人受伤。<br/><br/>临时内阁中有7名成员来自前政府,包括废黜穆尔西的军队首领塞西出任国防部长和副总理。 三名女性部长被指派担任卫生部、信息部和环境部部长。<br/><br/>自由派政治人士努尔是一名基督徒,他宣誓出任贸易与工业部临时部长。<br/><br/>埃及临时总统的发言人说,当局期望,包括穆斯林兄弟会在内的伊斯兰运动能够加入全国和解的努力。 但是穆斯林兄弟会的高级官员说,他们不会停止寻求让穆尔西官复原职的抗议活动。 }} Noch keine Übersetzung === [https://ctext.org/yangzi-fayan/juan-shi-san/ens Yangzi Fayan -> The Priority of Filial Devotion]=== {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 龙堆以西,大漠以北,鸟夷、兽夷,郡劳王师,汉家不为也。 }} Englische Übersetzung siehe ctext.org == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |礼记-礼运}} == === Text === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |故仕于公曰臣,仕于家曰仆。三年之丧,与新有昏者,期不使。以衰裳入朝,与家仆杂居齐齿,非礼也,是谓君与臣同国。故天子有田以处其子孙,诸侯有国以处其子孙,大夫有采以处其子孙,是谓制度。故天子适诸侯,必舍其祖朝,而不以礼籍入,是谓天子坏法乱纪。诸侯非问疾吊丧而入诸臣之家,是谓君臣为谑。 }} === Richard Wilhelm === Daß ein Großwürdenträger (wie ein Fürst) für jede Verrichtung (beim Opfer) einen besonderen Beamten hat, daß er von den Opfergeräten einen ganz vollständigen Satz hat, daß sein Opferorchester voll besetzt ist, entspricht nicht der Sitte; das bringt das Land in Verwirrung. Wer einem Landesfürsten dient, heißt Beamter; wer einer Adelsfamilie dient, heißt Diener. Wer einen tiefen Trauerfall hat oder unmittelbar nach der Hochzeit steht, der wird ein Jahr lang nicht (mit Hofgeschäften) beauftragt. In Trauerkleidern zu Hofe zu gehen oder mit seinen Hausdienern dem Alter nach sich zu mischen, entspricht nicht der Sitte; auf diese Weise ist der Staat gemeinsamer Besitz von Herr und Knecht. Der Himmelssohn hat seine Hausmacht, um seine Söhne und Enkel zu versorgen; die Lehensfürsten haben ihre Staaten, um ihre Söhne und Enkel zu versorgen; die Großwürdenträger haben ihre Afterlehen, um ihre Söhne und Enkel zu versorgen. Das sind feste Einrichtungen. Wenn der Himmelssohn zu einem Fürsten kommt, so wird er stets in dessen Ahnentempel untergebracht. Wenn er aber nicht unter (sorgfältiger) Beobachtung der Sitten eintritt, so ist das eine Zerstörung der Gesetze und Verwirrung der Regeln durch den Himmelssohn. Wenn ein Landesfürst außer wegen Kranken- oder Beileidsbesuchen das Haus eines Beamten betritt, so ist das plumpe Vertraulichkeit zwischen Fürst und Beamtem. === James Legge === Thus, one sustaining office under the ruler is called a minister, and one sustaining office under the head of a clan is called a servant. Either of these, who is in mourning for a parent, or has newly married, is not sent on any mission for a year. To enter court in decayed robes, or to live promiscuously with his servants, taking place among them according to age:--all these things are contrary to propriety. Where we have them, we have what is called 'ruler and minister sharing the state.' Thus, the son of Heaven has his domain that he may settle there his sons and grandsons; and the feudal princes have their states; and Great officers their appanages that they may do the same for theirs. This constitutes 'the statutory arrangement.' Thus, when the son of Heaven goes to visit a feudal prince, the rule is that he shall lodge in the ancestral temple, and that he do not enter it without having with him all the rules to be observed. If he act otherwise, we have an instance of 'The son of Heaven perverting the laws, and throwing the regulations into confusion.' A prince, unless it be to ask about the sick or to condole with a mourner, does not enter the house of a minister. If he act otherwise, we have the case of 'ruler and minister playing with each other.' == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |中国历史}} == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |西汉的鼎盛时期 }} {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |景帝驾崩后,其子刘彻即位,史称汉武帝。 武帝在位期间(在位前141年—前87年),采取一系列改革措施,锐意进取,使得西汉的政治、经济及军事整合起来。 在政治上,武帝加强皇权,建立年号“建元”,始开中国以皇帝年号纪年的滥觞,采纳主父偃的建议,施行推恩令,削弱诸侯藩王的势力,从此,诸侯藩王的势力不再能够对中央朝廷构成威胁;后又以诸侯献上的黄金成色不纯为由,取消百余位列侯的爵位,即史书上所称的“酎金失侯”。 经此二次事件后,中央集权得到大大的加强。 文化上,废除之前以“黄老学说、无为而治”的治国思想;并采纳董仲舒“罢黜百家,独尊儒术”的建议,使儒家思想从此逐步成为中国历经二千年的“主流思想”。 对外关系上,积极对付西汉的最大外患匈奴。 在此期间,先后出现卫青、霍去病等杰出名将,经过武帝、昭帝、宣帝三朝数十年用兵后,终于打败匈奴单于,使其“漠南无王庭”;又吞灭南越国,征讨朝鲜,使汉朝成为当时的东亚霸主。 }} === Übersetzungshilfe === Es ist noch keine Übersetzungshilfe vorhanden <noinclude> {{Navigation zurückhochvor| zurücktext=Lektion 713| zurücklink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 713| hochtext=Buch Vokabellektionen| hochlink=Vokabeltexte_Chinesisch/_Vokabellektionen| vortext=Lektion 715| vorlink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 715}} </noinclude> pzjs0hm2uel9eo4za52gu3szbp408px Vokabeltexte Chinesisch/ Vokabellektionen/ Lektion 715 0 102522 1082871 1014924 2026-04-07T08:22:25Z Christian-bauer 6469 kleinere Ergänzungen und Korrekturen 1082871 wikitext text/x-wiki <noinclude> {{Navigation zurückhochvor| zurücktext=Lektion 714| zurücklink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 714| hochtext=Buch Vokabellektionen| hochlink=Vokabeltexte_Chinesisch/_Vokabellektionen| vortext=Lektion 716| vorlink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 716}} </noinclude> == Zeichen == {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung !! Lernhilfen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |柄}} || bing3 || Berechtigung, Handgriff, Griff, behandeln, handeln, Anlass für etwas, Stengel || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=柄}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |傧}} || bin1 || Gäste unterhalten || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=傧}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |骞}} || qian1 || hochhalten, hochheben, erhöhen, fliegen || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=骞}} |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蛊}} || gu3 || giftiger Wurm, Gift, Wahnsinn, Sinn || {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=蛊}} |- | rowspan="2" | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍}} || lan2 || (traditionelle Schreibweise von 蓝), blau, Färberknöterich, Indigopflanze, Indigofera tinctoria || rowspan="2" | {{:Vokabeltexte_Chinesisch/ Vorlage:Texte_Zeichen_Externe_Links|Zeichen=藍}} |- | la5 || Kohlrabi |} == Zusammengesetzte Wörter == === 柄 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung !! Lernhilfen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |柄头}} || bing3 tou2 || Krone (Armbanduhr) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |柄頭}} || bing3 tou2 || (traditionelle Schreibweise von 柄头), Krone (Armbanduhr) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |帚柄}} || zhou3 bing3 || Besenstiel |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |舵柄}} || duo4 bing3 || Pinne |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |无柄}} || wu2 bing3 || sessil, festsitzend(Adj, Bio) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |無柄}} || wu2 bing3 || (traditionelle Schreibweise von 无柄), sessil, festsitzend(Adj, Bio) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |把柄}} || ba3 bing3 || Griff, Handhabe || (HSK 3.0 Band 7-9) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |句柄}} || ju4 bing3 || Griff, handle |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |带柄}} || dai4 bing3 || schenkelig ??, mit Griff |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |帶柄}} || dai4 bing3 || (traditionelle Schreibweise von 带柄), schenkelig ??, mit Griff |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |手柄}} || shou3 bing3 || Handhebel |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |矛柄}} || mao2 bing3 || Penis, Schacht |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |摇柄}} || yao2 bing3 || Kurbel |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |权柄}} || quan2 bing3 || Amtsbefugnis |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |长柄斧}} || chang2 bing3 fu3 || Axt |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |長柄斧}} || chang2 bing3 fu3 || (traditionelle Schreibweise von 长柄斧), Axt |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |锥子柄}} || zhui1 zi5 bing3 || Ahlenheft |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |球拍柄}} || qiu2 pai1 bing3 || Griff eines Schlägers |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |锥柄尖}} || zhui1 bing3 jian1 || Ahlenspitze (Druckwesen) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |长柄勺}} || chang2 bing3 shao2 || Schöpflöffel, Suppenkelle |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |長柄勺}} || chang2 bing3 shao2 || (traditionelle Schreibweise von 长柄勺), Schöpflöffel, Suppenkelle |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |长柄浅锅}} || chang2 bing3 qian3 guo1 || Bratpfanne, Tiegel |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |長柄淺鍋}} || chang2 bing3 qian3 guo1 || (traditionelle Schreibweise von 长柄浅锅), Bratpfanne, Tiegel |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |游戏手柄}} || you2 xi4 shou3 bing3 || Gamepad, Joystick |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |操纵手柄}} || cao1 zong4 shou3 bing3 || Schalthebel |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |长柄武器}} || chang2 bing3 wu3 qi4 || Degen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |長柄武器}} || chang2 bing3 wu3 qi4 || (traditionelle Schreibweise von 长柄武器), Degen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |南足柄市}} || nan2 zu2 bing3 shi4 || Minamiashigara |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |托柄尾部}} || tuo1 bing3 wei3 bu4 || Reitstock |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |操作手柄}} || cao1 zuo4 shou3 bing3 || Bedienungshebel |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |一柄双刃剑}} || yi1 bing3 shuang1 ren4 jian4 || ein doppelschneidiges Schwert |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |用一个手柄操纵}} || yong4 yi1 ge4 shou3 bing3 cao1 zong4 || Einhebelschaltung |} === 傧 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |傧相}} || bin1 xiang4 || attendant of the bride or bridegroom at a wedding |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |女傧相}} || nu:3 bin1 xiang4 || bridesmaid |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |男傧相}} || nan2 bin1 xiang4 || best man (in a marriage) |} === 骞 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |张骞}} || zhang1 qian1 || Zhang Qian |} === 蛊 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |巫蛊}} || wu1 gu3 || Zauberei |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蛊惑}} || gu3 huo4 || bezirzen, becircen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蛊惑人心}} || gu3 huo4 ren2 xin1 || demagogisch |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |巫蛊之祸}} || wu1 gu3 zhi1 huo4 || 91 BC attempted coup d'etat against Emperor Wu of Han 漢武帝|汉武帝, beginning with accusations of witchcraft |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |病民蛊国}} || bing4 min2 gu3 guo2 || to damage the people and harm the country |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |蛊惑人心的宣传}} || gu3 huo4 ren2 xin1 de5 xuan1 chuan2 || Demagogie |} === 藍 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍狐}} || lan2 hu2 || (traditionelle Schreibweise von 蓝狐), Polarfuchs, Blaufuchs (lat: Alopex lagopus) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍牙}} || lan2 ya2 || (traditionelle Schreibweise von 蓝牙), Bluetooth |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍光}} || lan2 guang1 || (traditionelle Schreibweise von 蓝光), Galliumnitrid, Blu-ray |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍伯}} || lan2 bo2 || (traditionelle Schreibweise von 蓝伯), Lambi (Spitzname) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍紫}} || lan2 zi3 || (traditionelle Schreibweise von 蓝紫), blauviolett, RGB-Code #8A2BE2 |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |深藍}} || shen1 lan2 || (traditionelle Schreibweise von 深蓝), tief blau, dunkelblau |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藏藍}} || zang4 lan2 || (traditionelle Schreibweise von 藏蓝), rötlichblau, rostichig blau |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |美藍}} || mei3 lan2 || (traditionelle Schreibweise von 美蓝), Methylenblau |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |灰藍}} || hui1 lan2 || (traditionelle Schreibweise von 灰蓝), fahlblau, RGB-Code #7AB8CC |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |品藍}} || pin3 lan2 || (traditionelle Schreibweise von 品蓝), dunkelblau; royal blue, RGB-Code #4169E1 |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍玉}} || lan2 yu4 || (traditionelle Schreibweise von 蓝玉), Aquamarin |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |淡藍}} || dan4 lan2 || (traditionelle Schreibweise von 淡蓝), hellblau |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍圖}} || lan2 tu2 || (traditionelle Schreibweise von 蓝图), Blaupause |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |淺藍}} || qian3 lan2 || (traditionelle Schreibweise von 浅蓝), hellblau; babyblau; helles Cyan, RGB-Code #E0FFFF |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍山}} || lan2 shan1 || (traditionelle Schreibweise von 蓝山), Lanshan (Ort in Hunan) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍貝}} || lan2 bei4 || (traditionelle Schreibweise von 蓝贝), Miesmuscheln |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |湛藍}} || zhan4 lan2 || (traditionelle Schreibweise von 湛蓝), azurblau, RGB-Code #007FFF |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍本}} || lan2 ben3 || (traditionelle Schreibweise von 蓝本), Prototyp, Muster |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍領}} || lan2 ling3 || (traditionelle Schreibweise von 蓝领), Arbeiter, Arbeiter |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍天}} || lan2 tian1 || (traditionelle Schreibweise von 蓝天), blauer Himmel |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |天藍}} || tian1 lan2 || (traditionelle Schreibweise von 天蓝), himmelblau, RGB-Code #87CEEB |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |亮藍}} || liang4 lan2 || (traditionelle Schreibweise von 亮蓝), hellblau; lichtblau, RGB-Code #ADD8E6 |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |青藍}} || qing1 lan2 || (traditionelle Schreibweise von 青蓝), cyanblau, RGB-Code #0DBF8C |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |甘藍}} || gan1 lan2 || (traditionelle Schreibweise von 甘蓝), Weißkohl, Weißkraut, Kohl [ lat Brassica oleracea var. capitata f. alba ] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |中藍}} || zhong1 lan2 || (traditionelle Schreibweise von 中蓝), mittelblau, RGB-Code #0000CD |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍宇}} || lan2 yu3 || (traditionelle Schreibweise von 蓝宇), Lan Yu (chinesischer Film, Regisseur: Stanley Kwan) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |水藍}} || shui3 lan2 || (traditionelle Schreibweise von 水蓝), wasserblau, RGB-Code #66FFE6 |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍綠}} || lan2 lü4 || (traditionelle Schreibweise von 蓝绿), blaugrün |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |岩藍}} || yan2 lan2 || (traditionelle Schreibweise von 岩蓝), slateblau, RGB-Code #6A5ACD |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍梅}} || lan2 mei2 || (traditionelle Schreibweise von 蓝梅), blaue Pflaumen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |泛藍}} || fan4 lan2 || (traditionelle Schreibweise von 泛蓝), pan-blaue Koalition |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍色}} || lan2 se4 || (traditionelle Schreibweise von 蓝色), blau, RGB-Code #0000FF |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍莓}} || lan2 mei2 || (traditionelle Schreibweise von 蓝莓), Amerikanische Heidelbeere, (lat: Vaccinium corymbosum) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍田}} || lan2 tian2 || (traditionelle Schreibweise von 蓝田), Lantian (Ort in Shaanxi) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |暗藍}} || an4 lan2 || (traditionelle Schreibweise von 暗蓝), dunkelblau, RGB-Code #00008B |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍寶石}} || lan2 bao3 shi2 || (traditionelle Schreibweise von 蓝宝石), Saphir |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |皇室藍}} || huang2 shi4 lan2 || (traditionelle Schreibweise von 皇室蓝), dunkelblau; royal blue, RGB-Code #4169E1 |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |中岩藍}} || zhong1 yan2 lan2 || (traditionelle Schreibweise von 中岩蓝), mittleres Slateblau, RGB-Code #7B68EE |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |水手藍}} || shui3 shou3 lan2 || (traditionelle Schreibweise von 水手蓝), Marinblau, RGB-Code #00477D |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |甘藍菜}} || gan1 lan2 cai4 || (traditionelle Schreibweise von 甘蓝菜), Kohlkopf |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍色的}} || lan2 se4 di4 || (traditionelle Schreibweise von 蓝色的), blau |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |軍服藍}} || jun1 fu2 lan2 || (traditionelle Schreibweise von 军服蓝), Kadettenblau (blaue Uniform), RGB-Code #5F9EA0 |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |海軍藍}} || hai3 jun1 lan2 || (traditionelle Schreibweise von 海军蓝), navyblau, RGB-Code #000080 |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |道奇藍}} || dao4 qi2 lan2 || (traditionelle Schreibweise von 道奇蓝), dodgerblau (blaue Farbe der Los Angeles Dodgers Uniform), RGB-Code #1E90FF |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |亮天藍}} || liang4 tian1 lan2 || (traditionelle Schreibweise von 亮天蓝), helles Himmelblau; kleefarben, RGB-Code #87CEFA |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |暗岩藍}} || an4 yan2 lan2 || (traditionelle Schreibweise von 暗岩蓝), dunkles Slateblau, RGB-Code #483D8B |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |亞甲藍}} || ya4 jia3 lan2 || (traditionelle Schreibweise von 亚甲蓝), Methylenblau |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |天靑藍}} || tian1 qing1 lan2 || (traditionelle Schreibweise von 天青蓝), himmelblau; azurblau; coelinblau, RGB-Code #2A52BE |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |天藍色}} || tian1 lan2 se4 || (traditionelle Schreibweise von 天蓝色), Azur |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍橡樹}} || lan2 xiang4 shu4 || (traditionelle Schreibweise von 蓝橡树), Blau-Eiche (lat: Quercus douglasii) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍田縣}} || lan2 tian2 xian4 || (traditionelle Schreibweise von 蓝田县), Kreis Lantian (Provinz Shaanxi, China) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |粉末藍}} || fen3 mo4 lan2 || (traditionelle Schreibweise von 粉末蓝), pulverblau, RGB-Code #003399 |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |紫藍色}} || zi3 lan2 se4 || (traditionelle Schreibweise von 紫蓝色), violett, RGB-Code #8B00FF |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |午夜藍}} || wu3 ye4 lan2 || (traditionelle Schreibweise von 午夜蓝), mitternachtsblau, RGB-Code #191970 |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |深天藍}} || shen1 tian1 lan2 || (traditionelle Schreibweise von 深天蓝), dunkles Himmelblau, RGB-Code #00BFFF |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍眼睛}} || lan2 yan3 jing1 || (traditionelle Schreibweise von 蓝眼睛), blaue Augen |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍綠色}} || lan2 lü4 se4 || (traditionelle Schreibweise von 蓝绿色), blaugrün; aquamarin; aquamarinfarben; aquamarinblau, RGB-Code #7FFFD4 |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |芽乾藍}} || ya2 gan1 lan2 || (traditionelle Schreibweise von 芽干蓝), Schössling |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍舌病}} || lan2 she2 bing4 || (traditionelle Schreibweise von 蓝舌病), Blauzungenkrankheit (Krankheit von Wiederkäuern wie Rind, Schaf, Ziege) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |寶藍色}} || bao3 lan2 se4 || (traditionelle Schreibweise von 宝蓝色), Saphirblau, saphirblaue Farbe, saphirblau |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |淡藍色}} || dan4 lan2 se4 || (traditionelle Schreibweise von 淡蓝色), nett |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |大灌藍}} || da4 guan4 lan2 || (traditionelle Schreibweise von 大灌蓝), Slam Dunk |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |深藍色}} || shen1 lan2 se4 || (traditionelle Schreibweise von 深蓝色), dunkelblau, ultramarin |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |淺藍色}} || qian3 lan2 se4 || (traditionelle Schreibweise von 浅蓝色), Hellblau, Blassblau, hellblau; babyblau, RGB-Code #E0FFFF, bläulich |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍圖紙}} || lan2 tu2 zhi3 || (traditionelle Schreibweise von 蓝图纸), Lichtpauspapier |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍皮書}} || lan2 pi2 shu1 || (traditionelle Schreibweise von 蓝皮书), Blaubuch (Verzeichnis prominenter Persönlichkeiten) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |紫甘藍}} || zi3 gan1 lan2 || (traditionelle Schreibweise von 紫甘蓝), Rotkohl (lat: Brassica oleracea var. capitata f. rubra), Rotkohl, Rotkraut, Blaukraut, Kohl |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |景泰藍}} || jing3 tai4 lan2 || (traditionelle Schreibweise von 景泰蓝), Cloisonné, Peking-Emaille |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍伯特}} || lan2 bo2 te4 || (traditionelle Schreibweise von 蓝伯特), Lambert |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |深藍青}} || shen1 lan2 qing1 || (traditionelle Schreibweise von 深蓝青), Ultramarin |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |板藍根}} || ban3 lan2 gen1 || (traditionelle Schreibweise von 板蓝根), Banlangen (Radix isatidis) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |亮鋼藍}} || liang4 gang1 lan2 || (traditionelle Schreibweise von 亮钢蓝), helles Stahlblau; lichtstahlblau, RGB-Code #B0C4DE |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍耳病}} || lan2 er3 bing4 || (traditionelle Schreibweise von 蓝耳病), Seuchenhafter Spätabort der Schweine (SSS, PRRS) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍圖方法}} || lan2 tu2 fang1 fa3 || (traditionelle Schreibweise von 蓝图方法), Lichtpausverfahren |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍本複印}} || lan2 ben3 fu4 yin4 || (traditionelle Schreibweise von 蓝本复印), Lichtpause |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍海策略}} || lan2 hai3 ce4 lüe4 || (traditionelle Schreibweise von 蓝海策略), Blue Ocean Strategie |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍寶石色}} || lan2 bao3 shi2 se4 || (traditionelle Schreibweise von 蓝宝石色), saphirblau, RGB-Code #082567 |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |提藍牛肉}} || ti2 lan2 niu2 rou4 || (traditionelle Schreibweise von 提蓝牛肉), mit Färberknöterich serviertes Rindfleisch |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |羽衣甘藍}} || yu3 yi1 gan1 lan2 || (traditionelle Schreibweise von 羽衣甘蓝), Grünkohl [ lat: Brassica oleracea convar. acephala var. sabellica ] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍領工人}} || lan2 ling3 gong1 ren2 || (traditionelle Schreibweise von 蓝领工人), traurig |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍色基因}} || lan2 se4 ji1 yin1 || (traditionelle Schreibweise von 蓝色基因), Blue Gene |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |捷藍航空}} || jie2 lan2 hang2 kong1 || (traditionelle Schreibweise von 捷蓝航空), JetBlue Airways |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍屏死機}} || lan2 bing3 si3 ji1 || (traditionelle Schreibweise von 蓝屏死机), Blue Screen of Death |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |愛麗絲藍}} || ai4 li4 si1 lan2 || (traditionelle Schreibweise von 爱丽丝蓝), aliceblau, RGB-Code #F0F8FF |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |抱子甘藍}} || bao4 zi3 gan1 lan2 || (traditionelle Schreibweise von 抱子甘蓝), Rosenkohl [ lat. Brassica oleracea var. gemmifera ] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |鼠尾草藍}} || shu3 wei3 cao3 lan2 || (traditionelle Schreibweise von 鼠尾草蓝), RGB-Code #4D80E6, salbeiblau |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍莓之夜}} || lan2 mei2 zhi1 ye4 || (traditionelle Schreibweise von 蓝莓之夜), My Blueberry Nights |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍本印刷}} || lan2 ben3 yin4 shua4 || (traditionelle Schreibweise von 蓝本印刷), Lichtpause |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |天藍星號}} || tian1 lan2 xing1 hao4 || (traditionelle Schreibweise von 天蓝星号), Zenith (Kreuzfahrtschiff) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍色巨人}} || lan2 se4 ju4 ren2 || (traditionelle Schreibweise von 蓝色巨人), Big Blue (Spitzname von IBM) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍山咖啡}} || lan2 shan1 ka1 fei1 || (traditionelle Schreibweise von 蓝山咖啡), Blue Mountain Kaffee |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍紋奶酪}} || lan2 wen2 nai3 lao4 || (traditionelle Schreibweise von 蓝纹奶酪), Blauschimmelkäse |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |三色之藍}} || san1 se4 zhi1 lan2 || (traditionelle Schreibweise von 三色之蓝), Drei Farben: Blau |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |綠松石藍}} || lü4 song1 shi2 lan2 || (traditionelle Schreibweise von 绿松石蓝), türkisblau; blautürkis, RGB-Code #33E6CC |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍光光碟}} || lan2 guang1 guang1 die2 || (traditionelle Schreibweise von 蓝光光碟), Blu-ray Disc |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍色大門}} || lan2 se4 da4 men2 || (traditionelle Schreibweise von 蓝色大门), Film: Blue Gate Crossing |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |海藍星號}} || hai3 lan2 xing1 hao4 || (traditionelle Schreibweise von 海蓝星号), Horizon (Kreuzfahrtschiff) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |天靑石藍}} || tian1 qing1 shi2 lan2 || (traditionelle Schreibweise von 天青石蓝), lapislazuliblau, RGB-Code #0D33FF |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍色狂想曲}} || lan2 se4 kuang2 xiang3 qu3 || (traditionelle Schreibweise von 蓝色狂想曲), Rhapsody in Blue |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍色貝雷帽}} || lan2 se4 bei4 lei2 mao4 || (traditionelle Schreibweise von 蓝色贝雷帽), Blauhelm |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |羽毛呈藍色}} || yu3 mao2 cheng2 lan2 se4 || (traditionelle Schreibweise von 羽毛呈蓝色), Sialia |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |日本藍橡樹}} || ri4 ben3 lan2 xiang4 shu4 || (traditionelle Schreibweise von 日本蓝橡树), Japanische Blau-Eiche (lat: Quercus glauca) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |感藍光軟片}} || gan3 lan2 guang1 ruan3 pian4 || (traditionelle Schreibweise von 感蓝光软片), blauempfindlicher Film |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍皮書計劃}} || lan2 pi2 shu1 ji4 hua4 || (traditionelle Schreibweise von 蓝皮书计划), Project Blue Book |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍果接骨木}} || lan2 guo3 jie1 gu3 mu4 || (traditionelle Schreibweise von 蓝果接骨木), Blauer Holunder (lat: Sambucus caerulea) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍寶石公主號}} || lan2 bao3 shi2 gong1 zhu3 hao4 || (traditionelle Schreibweise von 蓝宝石公主号), Sapphire Princess (Kreuzfahrtschiff) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |藍色羽毛的鳥}} || lan2 se4 yu3 mao2 de5 niao3 || (traditionelle Schreibweise von 蓝色羽毛的鸟), Singvogel |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |羽毛主要為藍色}} || yu3 mao2 zhu3 yao4 wei4 lan2 se4 || (traditionelle Schreibweise von 羽毛主要为蓝色), Blauhäher |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |青出於藍而勝於藍}} || qing1 chu1 yu2 lan2 er2 sheng4 yu2 lan2 || (traditionelle Schreibweise von 青出于蓝而胜于蓝), der Schüler überflügelt seinen Lehrer, die Nachfolger übertreffen ihre Vorgänger |} == Sätze == === 柄 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我们成了整个村庄的笑柄。}} || wo3 men5 cheng2 le5 zheng3 ge4 cun1 zhuang1 de5 xiao4 bing3 。|| We've become a mockery to the whole village. (Mandarin, [https://tatoeba.org/eng/sentences/show/341841 Tatoeba] [https://tatoeba.org/eng/user/profile/sysko sysko]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |这是个没有柄的平锅。}} || zhe4/zhei4 shi4 ge4 mei2/mo4 you3 bing3 de5 ping2 guo1 。|| Here is a pan without handles. (Mandarin, [https://tatoeba.org/eng/sentences/show/5794147 Tatoeba] [https://tatoeba.org/eng/user/profile/verdastelo9604 verdastelo9604] [https://tatoeba.org/eng/user/profile/CK CK]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我开门的时候把门柄扭了出来。}} || wo3 kai1 men2 de5 shi2 hou4 ba3 men2 bing3 niu3 le5 chu1 lai2 。|| I tried to open the door, and the doorknob came off. (Mandarin, [https://tatoeba.org/eng/sentences/show/402269 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/Swift Swift]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我開門的時候把門柄扭了出來。}} || wo3 kai1 men2 de5 shi2 hou4 ba3 men2 bing3 niu3 le5 chu1 lai2 。|| I tried to open the door, and the doorknob came off. (Mandarin, [https://tatoeba.org/eng/sentences/show/402269 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/Swift Swift]) |} === 傧 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 骞 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 蛊 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |} === 藍 === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他有一件淡藍色的毛衣。}} || ta1 you3 yi1 jian4 淡 la5/lan2 se4 de5 mao2 yi1 。|| Er hat einen himmelblauen Pullover. (Mandarin, [https://tatoeba.org/eng/sentences/show/765216 Tatoeba] [https://tatoeba.org/eng/user/profile/Martha Martha] [https://tatoeba.org/eng/user/profile/raggione raggione]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他認為藍色是最美麗的顏色。}} || ta1 ren4 wei2/wei4 la5/lan2 se4 shi4 zui4 mei3 li2/li4 de5 yan2 se4 。|| Er glaubt, dass Blau die schönste Farbe ist. (Mandarin, [https://tatoeba.org/eng/sentences/show/818151 Tatoeba] [https://tatoeba.org/eng/user/profile/Martha Martha] [https://tatoeba.org/eng/user/profile/Zaghawa Zaghawa]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |天空是藍色的。}} || tian1 kong1/kong4 shi4 la5/lan2 se4 de5 。|| Der Himmel ist blau. (Mandarin, [https://tatoeba.org/eng/sentences/show/1240131 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/lilygilder lilygilder]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |她的三台車有一輛是藍色的,其餘兩輛是白色的。}} || ta1 de5 san1 tai2 che1 you3 yi1 liang4 shi4 la5/lan2 se4 de5 , qi2 yu2 liang3 liang4 shi4 bai2 se4 de5 。|| Eines seiner drei Autos ist blau und die anderen sind weiß. (Mandarin, [https://tatoeba.org/eng/sentences/show/1928738 Tatoeba] [https://tatoeba.org/eng/user/profile/EDOBEAR EDOBEAR] [https://tatoeba.org/eng/user/profile/MUIRIEL MUIRIEL]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |天空是多麼的藍啊!}} || tian1 kong1/kong4 shi4 duo1 me5 de5 la5/lan2 a1 !|| Wie blau der Himmel ist! (Mandarin, [https://tatoeba.org/eng/sentences/show/348890 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/MUIRIEL MUIRIEL]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |她有一雙藍色的大眼睛。}} || ta1 you3 yi1 shuang1 la5/lan2 se4 de5 da4 yan3 jing1 。|| Sie hat große blaue Augen. (Mandarin, [https://tatoeba.org/eng/sentences/show/565301 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/mayok mayok]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |兩個女孩都有一雙藍眼睛。}} || liang3 ge4 nü3/ru3 hai2 dou1/du1 you3 yi1 shuang1 la5/lan2 yan3 jing1 。|| Beide Mädchen haben blaue Augen. (Mandarin, [https://tatoeba.org/eng/sentences/show/423909 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/Tamy Tamy]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |今天的西藍花做過頭了,不是很好吃。}} || jin1 tian1 de5 xi1 la5/lan2 hua1 zuo4 guo4 tou2 le5 , bu4 shi4 hen3 hao3 chi1 。|| Der Brokkoli heute ist verkocht und schmeckt nicht gut. (Mandarin, [https://tatoeba.org/eng/sentences/show/6940198 Tatoeba] [https://tatoeba.org/eng/user/profile/xjjAstrus xjjAstrus] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |今天的天空是我看過最藍的天空。}} || jin1 tian1 de5 tian1 kong1/kong4 shi4 wo3 kan4 guo4 zui4 la5/lan2 de5 tian1 kong1/kong4 。|| The sky today is the bluest that I've ever seen it. (Mandarin, [https://tatoeba.org/eng/sentences/show/760822 Tatoeba] [https://tatoeba.org/eng/user/profile/Martha Martha] [https://tatoeba.org/eng/user/profile/kebukebu kebukebu]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他做的藍莓蛋糕很好吃。}} || ta1 zuo4 de5 la5/lan2 mei2 dan4 gao1 hen3 hao3 chi1 。|| Sein Blaubeerkuchen war sehr lecker. (Mandarin, [https://tatoeba.org/eng/sentences/show/8825044 Tatoeba] [https://tatoeba.org/eng/user/profile/xjjAstrus xjjAstrus] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |一些世界上最藍的水在火山湖。}} || yi1 xie1 shi4 jie4 shang4 zui4 la5/lan2 de5 shui3 zai4 huo3 shan1/shan5 hu2 。|| Some of the bluest water in the world is found in Crater Lake. (Mandarin, [https://tatoeba.org/eng/sentences/show/760819 Tatoeba] [https://tatoeba.org/eng/user/profile/Martha Martha] [https://tatoeba.org/eng/user/profile/kebukebu kebukebu]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |你知道天為什麼是藍色的嗎?}} || ni3 zhi1 dao4 tian1 wei2/wei4 shi2 me5 shi4 la5/lan2 se4 de5 ma5 ?|| Weißt du, warum der Himmel blau ist? (Mandarin, [https://tatoeba.org/eng/sentences/show/10332957 Tatoeba] [https://tatoeba.org/eng/user/profile/DaoSeng DaoSeng] [https://tatoeba.org/eng/user/profile/freddy1 freddy1]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |美國警察穿藍色的制服。}} || mei3 guo2 jing3 察 chuan1 la5/lan2 se4 de5 zhi4 fu2 。|| Amerikanische Polizisten tragen blaue Uniformen. (Mandarin, [https://tatoeba.org/eng/sentences/show/5687172 Tatoeba] [https://tatoeba.org/eng/user/profile/xjjAstrus xjjAstrus] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我的眼睛是藍色的。}} || wo3 de5 yan3 jing1 shi4 la5/lan2 se4 de5 。|| Meine Augen sind blau. (Mandarin, [https://tatoeba.org/eng/sentences/show/794634 Tatoeba] [https://tatoeba.org/eng/user/profile/marupiter marupiter] [https://tatoeba.org/eng/user/profile/MUIRIEL MUIRIEL]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |這是我看過最藍的藍莓。他們的藍幾乎不是自然的。}} || zhe4/zhei4 shi4 wo3 kan4 guo4 zui4 la5/lan2 de5 la5/lan2 mei2 。 ta1 men5 de5 la5/lan2 ji3 乎 bu4 shi4 zi4 ran2 de5 。|| Das sind die blausten Heidelbeeren, die ich je gesehen habe. Sie sind fast schon unnatürlich blau. Das sind die blausten Heidelbeeren, die ich je gesehen habe. Ihr Blau sieht fast künstlich aus. (Mandarin, [https://tatoeba.org/eng/sentences/show/760828 Tatoeba] [https://tatoeba.org/eng/user/profile/Martha Martha] [https://tatoeba.org/eng/user/profile/MUIRIEL MUIRIEL]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |紅色和藍色,你喜歡那一個?}} || hong2 se4 he2/he4/huo2 la5/lan2 se4 , ni3 xi3 歡 na4/nei4 yi1 ge4 ?|| Red and blue - which one do you like? (Mandarin, [https://tatoeba.org/eng/sentences/show/423439 Tatoeba] [https://tatoeba.org/eng/user/profile/Rebeca Rebeca] [https://tatoeba.org/eng/user/profile/FeuDRenais FeuDRenais]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |這件藍色毛衣很漂亮。}} || zhe4/zhei4 jian4 la5/lan2 se4 mao2 yi1 hen3 piao1/piao3 liang4 。|| Dieser blaue Pullover ist sehr schön. (Mandarin, [https://tatoeba.org/eng/sentences/show/866054 Tatoeba] [https://tatoeba.org/eng/user/profile/Martha Martha] [https://tatoeba.org/eng/user/profile/Tamy Tamy]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |這是藍色的嗎?}} || zhe4/zhei4 shi4 la5/lan2 se4 de5 ma5 ?|| Ist das blau? (Mandarin, [https://tatoeba.org/eng/sentences/show/10256750 Tatoeba] [https://tatoeba.org/eng/user/profile/DaoSeng DaoSeng] [https://tatoeba.org/eng/user/profile/Esperantostern Esperantostern]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我的汽車不是紅色的,而是藍色的。}} || wo3 de5 qi4 che1 bu4 shi4 hong2 se4 de5 , er2 shi4 la5/lan2 se4 de5 。|| Mein Auto ist nicht rot, sondern blau. (Mandarin, [https://tatoeba.org/eng/sentences/show/765303 Tatoeba] [https://tatoeba.org/eng/user/profile/Martha Martha] [https://tatoeba.org/eng/user/profile/Espi Espi]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |那輛藍色麵包車是我的。}} || na4/nei4 liang4 la5/lan2 se4 mian4 bao1 che1 shi4 wo3 de5 。|| Der blaue Kleintransporter ist meiner. (Mandarin, [https://tatoeba.org/eng/sentences/show/9179899 Tatoeba] [https://tatoeba.org/eng/user/profile/xjjAstrus xjjAstrus] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |紅色很漂亮,但還比不過藍色。}} || hong2 se4 hen3 piao1/piao3 liang4 , dan4 hai2/huan2 bi4 bu4 guo4 la5/lan2 se4 。|| The color red is beautiful, but it can't beat blue. (Mandarin, [https://tatoeba.org/eng/sentences/show/3739106 Tatoeba] [https://tatoeba.org/eng/user/profile/egg0073 egg0073] [https://tatoeba.org/eng/user/profile/JSakuragi JSakuragi]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我的書包裡有很多彩色筆,紅的,藍的,綠的,等等。}} || wo3 de5 shu1 bao1 li3 you3 hen3 duo1 cai4 se4 bi3 , hong2 de5 , la5/lan2 de5 , lü4 de5 , deng3 deng3 。|| Inside my backpack there are many colored pens, red ones, blue ones, green ones, etc. (Mandarin, [https://tatoeba.org/eng/sentences/show/1827010 Tatoeba] [https://tatoeba.org/eng/user/profile/limmy limmy]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |這朵花是黃色的,但是其他全都是藍色的。}} || zhe4/zhei4 duo3 hua1 shi4 huang2 se4 de5 , dan4 shi4 qi2 ta1 quan2 dou1/du1 shi4 la5/lan2 se4 de5 。|| Diese Blume ist gelb, aber alle anderen sind blau. (Mandarin, [https://tatoeba.org/eng/sentences/show/425003 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/Wolf Wolf]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |那輛紅色汽車撞到了藍色麵包車。}} || na4/nei4 liang4 hong2 se4 qi4 che1 撞 dao4 le5 la5/lan2 se4 mian4 bao1 che1 。|| Das rote Auto ist mit dem blauen Kleintransporter zusammengestoßen. (Mandarin, [https://tatoeba.org/eng/sentences/show/9179894 Tatoeba] [https://tatoeba.org/eng/user/profile/xjjAstrus xjjAstrus] [https://tatoeba.org/eng/user/profile/Yorwba Yorwba]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |西藍花是最健康的蔬菜之一。}} || xi1 la5/lan2 hua1 shi4 zui4 jian4 kang1 de5 shu1 cai4 zhi1 yi1 。|| Brokkoli ist eine der gesündesten Gemüsesorten. (Mandarin, [https://tatoeba.org/eng/sentences/show/6940197 Tatoeba] [https://tatoeba.org/eng/user/profile/xjjAstrus xjjAstrus] [https://tatoeba.org/eng/user/profile/Pfirsichbaeumchen Pfirsichbaeumchen]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |紐約警察穿深藍色制服。}} || niu3 yue1 jing3 察 chuan1 shen1 la5/lan2 se4 zhi4 fu2 。|| Die Polizisten der Stadt New York tragen eine dunkelblaue Uniform. (Mandarin, [https://tatoeba.org/eng/sentences/show/5909459 Tatoeba] [https://tatoeba.org/eng/user/profile/xjjAstrus xjjAstrus] [https://tatoeba.org/eng/user/profile/MUIRIEL MUIRIEL]) |} === einsortieren === {| class="wikitable" |- ! Zeichen !! Pinyin !! Übersetzung |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他们当着百姓,在这话上得不着把柄,又希奇他的应对,就闭口无言了。 }} || ta1 men5 dang1/dang4 zhao2/zhe2 bai3 xing4 , zai4 zhe4/zhei4 hua4 shang4 de2/de5/dei3 bu4 zhao2/zhe2 ba3 bing3 , you4 xi1 qi2 ta1 de5 ying1/ying4 dui4 , jiu4 bi4 kou3 wu2 yan2 le5 。 ||20.26 Und sie vermochten nicht, ihn in seinem Worte vor dem Volke zu fangen; und sie verwunderten sich über seine Antwort und schwiegen. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Lukasevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |主人说:好!良善的仆人,你既在最小的事上有忠心,可以有权柄管十座城。 }} || zhu3 ren2 shuo1 : hao3 ! liang2 shan3/shan4 de5 pu2 ren2 , ni3 ji4 zai4 zui4 xiao3 de5 shi4 shang4 you3 zhong1 xin1 , ke3/ke4 yi3 you3 quan2 bing3 guan3/guan5 shi2 zuo4 cheng2 。 ||19.17 Und er sprach zu ihm: Wohl, du guter Knecht! Weil du im Geringsten treu warst, so habe Gewalt über zehn Städte. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Lukasevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |授人以柄}} || shou4 ren2 yi3 bing3 ||([[wikt:en:授人以柄|Wiktionary en]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |并且因为他是人子,就赐给他行审判的权柄。 }} || bing4 qie3 yin1 wei2/wei4 ta1 shi4 ren2 zi5 , jiu4 ci4 gei3 ta1 hang2/xing2 shen3 pan4 de5 quan2 bing3 。 ||5.27 und er hat ihm Gewalt gegen, auch Gericht zu halten, weil er des Menschen Sohn ist. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Johannesevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |没有人夺我的命去,是我自己舍的。我有权柄舍了,也有权柄取回来。这是我从我父所受的命令。 }} || mei2/mo4 you3 ren2 夺 wo3 de5 ming4 qu4 , shi4 wo3 zi4 ji3 she3 de5 。 wo3 you3 quan2 bing3 she3 le5 , ye3 you3 quan2 bing3 qu3 hui2 lai2 。 zhe4/zhei4 shi4 wo3 cong2 wo3 fu4 suo3 shou4 de5 ming4 ling4 。 ||10.18 Niemand nimmt es von mir, sondern ich lasse es von mir selbst. Ich habe Gewalt, es zu lassen, und habe Gewalt, es wiederzunehmen. Dieses Gebot habe ich von meinem Vater empfangen. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Johannesevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |7.29因为他教训他们,正像有权柄的人,不像他们的文士。}} || 7.29 yin1 wei2/wei4 ta1 jiao1 xun4 ta1 men5 , zheng4 xiang4 you3 quan2 bing3 de5 ren2 , bu4 xiang4 ta1 men5 de5 wen2 shi4 。||7.29 denn er lehrte sie wie einer, der Gewalt hat, und nicht wie ihre Schriftgelehrten. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Matthäusevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他们很希奇他的教训,因为他的话里有权柄。 }} || ta1 men5 hen3 xi1 qi2 ta1 de5 jiao1 xun4 , yin1 wei2/wei4 ta1 de5 hua4 li3 you3 quan2 bing3 。 ||4.32 Und sie erstaunten sehr über seine Lehre, denn sein Wort war mit Gewalt. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Lukasevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |问他说:你仗着甚麽权柄作这些事?给你这权柄的是谁呢? }} || wen4 ta1 shuo1 : ni3 zhang4 zhao2/zhe2 shen4 me5 quan2 bing3 zuo4 zhe4/zhei4 xie1 shi4 ? gei3 ni3 zhe4/zhei4 quan2 bing3 de5 shi4 shei2 ne5 ? ||11.28 die Ältesten zu ihm und sagen zu ihm: In welchem Recht tust du diese Dinge? Und wer hat dir dieses Recht gegeben, daß du diese Dinge tust? ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Markusevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |众人很希奇他的教训;因为他教训他们,正像有权柄的人,不像文士。 }} || zhong4 ren2 hen3 xi1 qi2 ta1 de5 jiao1 xun4 ; yin1 wei2/wei4 ta1 jiao1 xun4 ta1 men5 , zheng4 xiang4 you3 quan2 bing3 de5 ren2 , bu4 xiang4 wen2 shi4 。 ||1.22 Und sie erstaunten sehr über seine Lehre: denn er lehrte sie wie einer, der Gewalt hat, und nicht wie die Schriftgelehrten. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Markusevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |彼拉多说:你们自己带他去,按着你们的律法审问他罢。犹太人说:我们没有杀人的权柄。 }} || bi3 la1 duo1 shuo1 : ni3 men5 zi4 ji3 dai4 ta1 qu4 , an4 zhao2/zhe2 ni3 men5 de5 lü4 fa3 shen3 wen4 ta1 ba4 。 you2 tai4 ren2 shuo1 : wo3 men5 mei2/mo4 you3 sha1 ren2 de5 quan2 bing3 。 ||18.31 Da sprach Pilatus zu ihnen: Nehmet ihr ihn und richtet ihn nach eurem Gesetz. Da sprachen die Juden zu ihm: Es ist uns nicht erlaubt, jemand zu töten; ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Johannesevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |人带你们到会堂,并官府和有权柄的人面前,不要思虑怎麽分诉,说甚麽话; }} || ren2 dai4 ni3 men5 dao4 hui4 tang2 , bing4 guan1 fu3 he2/he4/huo2 you3 quan2 bing3 de5 ren2 mian4 qian2 , bu4 yao4 si1 lü4 zen3 me5 fen1 su4 , shuo1 shen4 me5 hua4 ; ||12.11 Wenn sie euch aber vor die Synagogen und die Obrigkeiten und die Gewalten führen, so sorget nicht, wie oder womit ihr euch verantworten oder was ihr sagen sollt; ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Lukasevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |凡接待他的,就是信他名的人,他就赐他们权柄,作神的儿女。 }} || fan2 jie1 dai1 ta1 de5 , jiu4 shi4 xin4 ta1 ming2 de5 ren2 , ta1 jiu4 ci4 ta1 men5 quan2 bing3 , zuo4 shen2 de5 er2/er5 nü3/ru3 。 ||1.12 so viele ihn aber aufnahmen, denen gab er das Recht, Kinder Gottes zu werden, denen, die an seinen Namen glauben, ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Johannesevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他叫有权柄的失位,叫卑贱的升高; }} || ta1 jiao4 you3 quan2 bing3 de5 shi1 wei4 , jiao4 bei1 jian4 de5 sheng1 gao1 ; ||1.52 Er hat Mächtige von Thronen hinabgestoßen, und Niedrige erhöht. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Lukasevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |私下窥听,要拿他的话柄。 }} || si1 xia4 窥 ting1 , yao4 na2 ta1 de5 hua4 bing3 。 ||11.54 und sie lauerten auf ihn, etwas aus seinem Munde zu erjagen. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Lukasevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |问他说:你告诉我们,你仗着甚麽权柄做这些事?给你这权柄的是谁呢? }} || wen4 ta1 shuo1 : ni3 gao4 su4 wo3 men5 , ni3 zhang4 zhao2/zhe2 shen4 me5 quan2 bing3 zuo4 zhe4/zhei4 xie1 shi4 ? gei3 ni3 zhe4/zhei4 quan2 bing3 de5 shi4 shei2 ne5 ? ||20.2 und sprachen zu ihm und sagten: Sage uns, in welchem Recht tust du diese Dinge? Oder wer ist es, der dir dieses Recht gegeben hat? ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Lukasevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |授人以柄,功必不成,反生乱矣}} || shou4 ren2 yi3 bing3 , gong1 bi4 bu4 cheng2 , fan3 sheng1 luan4 yi3 ||By relinquishing your authority, your endeavor will surely fail, and chaos will emerge ([[s:en:Special:PermanentLink/5495657 |Wikisource: Romance of the Three Kingdoms]] [[s:zh:三國演義/第002回 | 三國演義/第002回]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |彼拉多说:你不对我说话麽?你岂不知我有权柄释放你,也有权柄把你钉十字架麽? }} || bi3 la1 duo1 shuo1 : ni3 bu4 dui4 wo3 shuo1 hua4 me5 ? ni3 qi3 bu4 zhi1 wo3 you3 quan2 bing3 shi4 fang4 ni3 , ye3 you3 quan2 bing3 ba3 ni3 ding1 shi2 zi4 jia4 me5 ? ||19.10 Da spricht Pilatus zu ihm: Redest du nicht mit mir? Weißt du nicht, daß ich Gewalt habe, dich loszugeben, und Gewalt habe, dich zu kreuzigen? ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Johannesevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |正如你曾赐给他权柄管理凡有血气的,叫他将永生赐给你所赐给他的人。 }} || zheng4 ru2 ni3 ceng2 ci4 gei3 ta1 quan2 bing3 guan3/guan5 li3 fan2 you3 xie3/xue4 qi4 de5 , jiao4 ta1 jiang1/jiang4 yong3 sheng1 ci4 gei3 ni3 suo3 ci4 gei3 ta1 de5 ren2 。 ||17.2 Gleichwie du ihm Gewalt gegeben hast über alles Fleisch, auf daß er allen, die du ihm gegeben, ewiges Leben gebe. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Johannesevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |9.8众人看见都惊奇,就归荣耀与神,因为他将这样的权柄赐给人。}} || 9.8 zhong4 ren2 kan4 jian4/xian4 dou1/du1 jing1 qi2 , jiu4 gui1 rong2 耀 yu3 shen2 , yin1 wei2/wei4 ta1 jiang1/jiang4 zhe4/zhei4 yang4 de5 quan2 bing3 ci4 gei3 ren2 。|| 9.8 Als aber die Volksmengen es sahen, fürchteten sie sich und verherrlichten Gott, der solche Gewalt den Menschen gegeben. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Matthäusevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |并给他们权柄赶鬼。 }} || bing4 gei3 ta1 men5 quan2 bing3 gan3 gui3 。 ||3.15 und Gewalt zu haben, die Krankheiten zu heilen und die Dämonen auszutreiben. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Markusevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |对他说:这一切权柄、荣华,我都要给你,因为这原是交付我的,我愿意给谁就给谁。 }} || dui4 ta1 shuo1 : zhe4/zhei4 yi1 qie1 quan2 bing3 、 rong2 hua4 , wo3 dou1/du1 yao4 gei3 ni3 , yin1 wei2/wei4 zhe4/zhei4 yuan2 shi4 jiao1 fu4 wo3 de5 , wo3 yuan4 yi4 gei3 shei2 jiu4 gei3 shei2 。 ||4.6 Und der Teufel sprach zu ihm: Ich will dir alle diese Gewalt und ihre Herrlichkeit geben; denn mir ist sie übergeben, und wem irgend ich will, gebe ich sie. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Lukasevangelium]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |那时,我领了祭司长的权柄和命令,往大马色去。}} || na4/nei4 shi2 , wo3 ling3 le5 ji4 si1 chang2/zhang3 de5 quan2 bing3 he2/he4/huo2 ming4 ling4 , wang3/wang4 da4 ma3 se4 qu4 。||12 Und als ich, damit beschäftigt, mit Gewalt und Vollmacht von den Hohenpriestern nach Damaskus reiste, ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Apostelgeschichte]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |授人以柄}} || shou4 ren2 yi3 bing3 ||([[wikt:en:授人以柄|Wiktionary en]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我在耶路撒冷也曾这样行了。既从祭司长得了权柄,我就把许多圣徒囚在监里。他们被杀,我也出名定案。}} || wo3 zai4 ye1 lu4 sa1/sa3 leng3 ye3 ceng2 zhe4/zhei4 yang4 hang2/xing2 le5 。 ji4 cong2 ji4 si1 chang2/zhang3 de2/de5/dei3 le5 quan2 bing3 , wo3 jiu4 ba3 xu3 duo1 sheng4 tu2 qiu2 zai4 jian1/jian4 li3 。 ta1 men5 bei4 sha1 , wo3 ye3 chu1 ming2 ding4 an4 。||10 was ich auch in Jerusalem getan habe; und viele der Heiligen habe ich in Gefängnisse eingeschlossen, nachdem ich von den Hohenpriestern die Gewalt empfangen hatte; und wenn sie umgebracht wurden, so gab ich meine Stimme dazu. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Apostelgeschichte]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我開門的時候把門柄扭了出來。}} || wo3 kai1 men2 de5 shi2 hou4 ba3 men2 bing3 niu3 le5 chu1 lai2 。||I tried to open the door, and the doorknob came off. [https://tatoeba.org/eng/sentences/show/402269 Tatoeba] [https://tatoeba.org/eng/user/profile/nickyeow nickyeow] [https://tatoeba.org/eng/user/profile/Swift Swift] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |说:把这权柄也给我,叫我手按着谁,谁就可以受圣灵。}} || shuo1 : ba3 zhe4/zhei4 quan2 bing3 ye3 gei3 wo3 , jiao4 wo3 shou3 an4 zhao2/zhe2 shei2 , shei2 jiu4 ke3/ke4 yi3 shou4 sheng4 ling2 。||19 bot er ihnen Geld an und sagte: Gebet auch mir diese Gewalt, auf daß, wem irgend ich die Hände auflege, er den Heiligen Geist empfange. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Apostelgeschichte]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我们成了整个村庄的笑柄。}} || wo3 men5 cheng2 le5 zheng3 ge4 cun1 zhuang1 de5 xiao4 bing3 。||We've become a mockery to the whole village. [https://tatoeba.org/eng/sentences/show/341841 Tatoeba] [https://tatoeba.org/eng/user/profile/sysko sysko] [https://tatoeba.org/eng/user/profile/NekoKanjya NekoKanjya] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |通过网络,我们可以结交很多朋友。}} || tong1 guo4 wang3 luo4 , wo3 men5 ke3/ke4 yi3 jie1/jie2 jiao1 hen3 duo1 peng2 you3 。||Through the Internet, we can make many friends. [https://tatoeba.org/eng/sentences/show/3526286 Tatoeba] [https://tatoeba.org/eng/user/profile/trieuho trieuho] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |网络积极分子想跟最高领袖见面。}} || wang3 luo4 ji1 ji2 fen1 zi5 xiang3 gen1 zui4 gao1 ling3 xiu4 jian4/xian4 mian4 。||Cyber activists want to meet with the Supreme Leader. [https://tatoeba.org/eng/sentences/show/2286071 Tatoeba] [https://tatoeba.org/eng/user/profile/Tximist Tximist] [https://tatoeba.org/eng/user/profile/Eldad Eldad] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |你来到大阪的时候请跟我联络。}} || ni3 lai2 dao4 da4 阪 de5 shi2 hou4 qing3 gen1 wo3 lian2 luo4 。||Bitte kontaktiere mich, wenn du nach Osaka kommst. [https://tatoeba.org/eng/sentences/show/1243653 Tatoeba] [https://tatoeba.org/eng/user/profile/yuya yuya] [https://tatoeba.org/eng/user/profile/boscowitch boscowitch] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |中国政府控制了网络,以免让人民知道六四事件的真相。}} || zhong1/zhong4 guo2 zheng4 fu3 控 zhi4 le5 wang3 luo4 , yi3 mian3 rang4 ren2 min2 zhi1 dao4 liu4 si4 shi4 jian4 de5 zhen1 xiang1/xiang4 。||Die chinesische Regierung kontrollierte das Internet, um die Menschen daran zu hindern, die Wahrheit über das Massaker vom Tiananmen-Platz zu erfahren. Die chinesische Regierung kontrolliert das Internet, um zu verhindern, dass das Volk die Wahrheit über den Aufstand auf dem Tian'anmen-Platz erfährt. [https://tatoeba.org/eng/sentences/show/383128 Tatoeba] [https://tatoeba.org/eng/user/profile/sysko sysko] [https://tatoeba.org/eng/user/profile/samueldora samueldora] [https://tatoeba.org/eng/user/profile/Sudajaengi Sudajaengi] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我现在依然觉得网络世界不适合小孩子。}} || wo3 xian4 zai4 yi3 ran2 jiao4/jue2 de2/de5/dei3 wang3 luo4 shi4 jie4 bu4 di4/shi4 he2 xiao3 hai2 zi5 。||Ich bin auch jetzt noch der Ansicht, dass das Internet kein Platz für Kinder ist. [https://tatoeba.org/eng/sentences/show/2422249 Tatoeba] [https://tatoeba.org/eng/user/profile/huangfen huangfen] [https://tatoeba.org/eng/user/profile/Pfirsichbaeumchen Pfirsichbaeumchen] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |今晚你可以在他家联络到他。}} || jin1 wan3 ni3 ke3/ke4 yi3 zai4 ta1 jia1 lian2 luo4 dao4 ta1 。||Du kannst ihn heute Abend zu Hause erreichen. [https://tatoeba.org/eng/sentences/show/332948 Tatoeba] [https://tatoeba.org/eng/user/profile/fucongcong fucongcong] [https://tatoeba.org/eng/user/profile/raggione raggione] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |在网吧用网络与朋友们保持联系。}} || zai4 wang3 ba5 yong4 wang3 luo4 yu3 peng2 you3 men5 bao3 chi2 lian2 xi4 。||Keep in touch with friends on the web at an Internet café. [https://tatoeba.org/eng/sentences/show/3896066 Tatoeba] [https://tatoeba.org/eng/user/profile/trieuho trieuho] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我跟父母联络了一下。}} || wo3 gen1 fu4 mu3 lian2 luo4 le5 yi1 xia4 。||I contacted my parents. [https://tatoeba.org/eng/sentences/show/330586 Tatoeba] [https://tatoeba.org/eng/user/profile/CK CK] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |以前人们用烟作为联络信号。}} || yi3 qian2 ren2 men5 yong4 yan1/yan5 zuo4 wei2/wei4 lian2 luo4 xin4 hao4 。||In der Anfangszeit kommunizierten die Menschen über Rauchzeichen. [https://tatoeba.org/eng/sentences/show/817267 Tatoeba] [https://tatoeba.org/eng/user/profile/fucongcong fucongcong] [https://tatoeba.org/eng/user/profile/Wolf Wolf] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我现在都不认为网络世界是孩子该来的地方。}} || wo3 xian4 zai4 dou1/du1 bu4 ren4 wei2/wei4 wang3 luo4 shi4 jie4 shi4 hai2 zi5 gai1 lai2 de5 de4/di4 fang1 。||Ich bin auch jetzt noch der Ansicht, dass das Internet kein Platz für Kinder ist. [https://tatoeba.org/eng/sentences/show/2394564 Tatoeba] [https://tatoeba.org/eng/user/profile/fenfang557 fenfang557] [https://tatoeba.org/eng/user/profile/Pfirsichbaeumchen Pfirsichbaeumchen] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |实际上,网络的作用有着无数的多种多样的。}} || shi2 ji4 shang4 , wang3 luo4 de5 zuo4 yong4 you3 zhao2/zhe2 wu2 shu3/shuo4 de5 duo1 chong2/zhong3/zhong4 duo1 yang4 de5 。||In fact, there are countless, varied uses for the Internet. [https://tatoeba.org/eng/sentences/show/1208520 Tatoeba] [https://tatoeba.org/eng/user/profile/eastasiastudent eastasiastudent] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我无法与他联络上。}} || wo3 wu2 fa3 yu3 ta1 lian2 luo4 shang4 。||Ich kann ihn nicht erreichen. [https://tatoeba.org/eng/sentences/show/429414 Tatoeba] [https://tatoeba.org/eng/user/profile/aliene aliene] [https://tatoeba.org/eng/user/profile/xtofu80 xtofu80] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |让我们保持联络。}} || rang4 wo3 men5 bao3 chi2 lian2 luo4 。||Let's keep in touch. [https://tatoeba.org/eng/sentences/show/334204 Tatoeba] [https://tatoeba.org/eng/user/profile/fucongcong fucongcong] [https://tatoeba.org/eng/user/profile/CK CK] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我没办法联络到他。}} || wo3 mei2/mo4 ban4 fa3 lian2 luo4 dao4 ta1 。||Ich kann ihn nicht erreichen. [https://tatoeba.org/eng/sentences/show/429413 Tatoeba] [https://tatoeba.org/eng/user/profile/aliene aliene] [https://tatoeba.org/eng/user/profile/xtofu80 xtofu80] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |网络是一个相通的渠道,而不是物质或具体的活动。}} || wang3 luo4 shi4 yi1 ge4 xiang1/xiang4 tong1 de5 渠 dao4 , er2 bu4 shi4 wu4 zhi4 huo4 ju4 ti3 de5 huo2 dong4 。||It's a communication medium, not a substance or specific activity. [https://tatoeba.org/eng/sentences/show/1208523 Tatoeba] [https://tatoeba.org/eng/user/profile/eastasiastudent eastasiastudent] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我不玩网络游戏。}} || wo3 bu4 wan2/wan4 wang3 luo4 you2 xi4 。||I don't play internet games. [https://tatoeba.org/eng/sentences/show/3432643 Tatoeba] [https://tatoeba.org/eng/user/profile/schlagermanx schlagermanx] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |你不应该在社交网络上分享过多私人信息。}} || ni3 bu4 ying1/ying4 gai1 zai4 she4 jiao1 wang3 luo4 shang4 fen1 xiang3 guo4 duo1 si1 ren2 xin4 xi1 。||You shouldn't share too much private information on the social networks. [https://tatoeba.org/eng/sentences/show/1454427 Tatoeba] [https://tatoeba.org/eng/user/profile/sadhen sadhen] [https://tatoeba.org/eng/user/profile/CK CK] |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |难道我们没有权柄靠福音吃喝麽?}} || nan2/nan4 dao4 wo3 men5 mei2/mo4 you3 quan2 bing3 kao4 fu2 yin1 chi1 he1 me5 ?|| Haben wir etwa nicht ein Recht zu essen und zu trinken? ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Korintherbrief1]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |说:阿们!颂赞、荣耀、智慧、感谢、尊贵、权柄、大力都归与我们的神,直到永永远远。阿们!}} || shuo1 : a1 men5 ! song4 zan4 、 rong2 耀、 zhi4 hui4 、 gan3 xie4 、 zun1 gui4 、 quan2 bing3 、 da4 li4 dou1/du1 gui1 yu3 wo3 men5 de5 shen2 , zhi2 dao4 yong3 yong3 yuan3 yuan3 。 a1 men5 !|| Die Segnung und die Herrlichkeit und die Weisheit und die Danksagung und die Ehre und die Macht und die Stärke unserem Gott von Ewigkeit zu Ewigkeit! Amen. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我所看见的兽,形状像豹,脚像熊的脚,口像狮子的口。那龙将自己的能力、座位、和大权柄都给了他。}} || wo3 suo3 kan4 jian4/xian4 de5 shou4 , xing2 zhuang4 xiang4 bao4 , jiao3 xiang4 xiong2 de5 jiao3 , kou3 xiang4 shi1 zi5 de5 kou3 。 na4/nei4 long2 jiang1/jiang4 zi4 ji3 de5 neng2 li4 、 zuo4 wei4 、 he2/he4/huo2 da4 quan2 bing3 dou1/du1 gei3 le5 ta1 。|| Und das Tier, das ich sah, war gleich einem Pardel, und seine Füße wie die eines Bären, und sein Maul wie eines Löwen Maul. Und der Drache gab ihm seine Macht und seinen Thron und große Gewalt. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |既是这样,我的赏赐是甚麽呢?就是我传福音的时候叫人不花钱得福音,免得用尽我传福音的权柄。}} || ji4 shi4 zhe4/zhei4 yang4 , wo3 de5 赏 ci4 shi4 shen4 me5 ne5 ? jiu4 shi4 wo3 chuan2/zhuan4 fu2 yin1 de5 shi2 hou4 jiao4 ren2 bu4 hua1 qian2 de2/de5/dei3 fu2 yin1 , mian3 de2/de5/dei3 yong4 jin4 wo3 chuan2/zhuan4 fu2 yin1 de5 quan2 bing3 。|| Was ist nun mein Lohn? Daß ich, das Evangelium verkündigend, das Evangelium kostenfrei mache, so daß ich mein Recht am Evangelium nicht gebrauche. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Korintherbrief1]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |这二人有权柄,在他们传道的日子叫天闭塞不下雨;又有权柄叫水变为血,并且能随时随意用各样的灾殃攻击世界。}} || zhe4/zhei4 er4 ren2 you3 quan2 bing3 , zai4 ta1 men5 chuan2/zhuan4 dao4 de5 ri4 zi5 jiao4 tian1 bi4 sai1/se4 bu4 xia4 yu3 ; you4 you3 quan2 bing3 jiao4 shui3 bian4 wei2/wei4 xie3/xue4 , bing4 qie3 neng2 sui2 shi2 sui2 yi4 yong4 ge4 yang4 de5 zai1 yang1 gong1 ji1 shi4 jie4 。|| Diese haben die Gewalt, den Himmel zu verschließen, auf daß während der Tage ihrer Weissagung kein Regen falle; und sie haben Gewalt über die Wasser, sie in Blut zu verwandeln, und die Erde zu schlagen mit jeder Plage, so oft sie nur wollen. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |妻子没有权柄主张自己的身子,乃在丈夫;丈夫也没有权柄主张自己的身子,乃在妻子。}} || qi1 zi5 mei2/mo4 you3 quan2 bing3 zhu3 zhang1 zi4 ji3 de5 shen1 zi5 , nai3 zai4 zhang4 fu2 ; zhang4 fu2 ye3 mei2/mo4 you3 quan2 bing3 zhu3 zhang1 zi4 ji3 de5 shen1 zi5 , nai3 zai4 qi1 zi5 。|| Das Weib hat nicht Macht über ihren eigenen Leib, sondern der Mann; gleicherweise aber hat auch der Mann nicht Macht über seinen eigenen Leib, sondern das Weib. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Korintherbrief1]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |又有权柄赐给他,叫兽像有生气,并且能说话,又叫所有不拜兽像的人都被杀害。}} || you4 you3 quan2 bing3 ci4 gei3 ta1 , jiao4 shou4 xiang4 you3 sheng1 qi4 , bing4 qie3 neng2 shuo1 hua4 , you4 jiao4 suo3 you3 bu4 bai4 shou4 xiang4 de5 ren2 dou1/du1 bei4 sha1 hai4 。|| Und es wurde ihm gegeben, dem Bilde des Tieres Odem zu geben, auf daß das Bild des Tieres auch redete und bewirkte, daß alle getötet wurden, die das Bild des Tieres nicht anbeteten. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |因此,女人为天使的缘故,应当在头上有服权柄的记号。}} || yin1 ci3 , nü3/ru3 ren2 wei2/wei4 tian1 shi3/shi4 de5 yuan2 gu4 , ying1/ying4 dang1/dang4 zai4 tou2 shang4 you3 fu2 quan2 bing3 de5 ji4 hao4 。|| Darum soll das Weib eine Macht auf dem Haupte haben, um der Engel willen. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Korintherbrief1]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |在头一次复活有分的有福了,圣洁了!第二次的死在他们身上没有权柄。他们必作神和基督的祭司,并要与基督一同作王一千年。}} || zai4 tou2 yi1 ci4 fu4 huo2 you3 fen1 de5 you3 fu2 le5 , sheng4 jie2 le5 ! di4 er4 ci4 de5 si3 zai4 ta1 men5 shen1 shang4 mei2/mo4 you3 quan2 bing3 。 ta1 men5 bi4 zuo4 shen2 he2/he4/huo2 ji1 du1 de5 ji4 si1 , bing4 yao4 yu3 ji1 du1 yi1 tong2 zuo4 wang2 yi1 qian1 nian2 。|| Glückselig und heilig, wer teilhat an der ersten Auferstehung! Über diese hat der zweite Tod keine Gewalt, sondern sie werden Priester Gottes und des Christus sein und mit ihm herrschen tausend Jahre. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |但这权柄我全没有用过。我写这话,并非要你们这样待我,因为我宁可死也不叫人使我所夸的落了空。}} || dan4 zhe4/zhei4 quan2 bing3 wo3 quan2 mei2/mo4 you3 yong4 guo4 。 wo3 xie3 zhe4/zhei4 hua4 , bing4 fei1 yao4 ni3 men5 zhe4/zhei4 yang4 dai1 wo3 , yin1 wei2/wei4 wo3 ning2 ke3/ke4 si3 ye3 bu4 jiao4 ren2 shi3/shi4 wo3 suo3 kua1 de5 la4/lao4/luo4 le5 kong1/kong4 。|| Ich aber habe von keinem dieser Dinge Gebrauch gemacht. Ich habe dies aber nicht geschrieben, auf daß es also mit mir geschehe; denn es wäre mir besser zu sterben, als daß jemand meinen Ruhm zunichte machen sollte. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Korintherbrief1]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |这些事你要讲明,劝戒人,用各等权柄责备人;不可叫人轻看你。}} || zhe4/zhei4 xie1 shi4 ni3 yao4 jiang3/jiang5 ming2 , quan4 jie4 ren2 , yong4 ge4 deng3 quan2 bing3 ze2 bei4 ren2 ; bu4 ke3/ke4 jiao4 ren2 qing1 kan4 ni3 。|| Dieses rede und ermahne und überführe mit aller Machtvollkommenheit. Laß dich niemand verachten. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Titusbrief]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |又任凭他与圣徒争战,并且得胜;也把权柄赐给他,制伏各族、各民、各方、各国。}} || you4 ren4 ping2 ta1 yu3 sheng4 tu2 zheng1 zhan4 , bing4 qie3 de2/de5/dei3 sheng4 ; ye3 ba3 quan2 bing3 ci4 gei3 ta1 , zhi4 fu2 ge4 zu2 、 ge4 min2 、 ge4 fang1 、 ge4 guo2 。|| Und es wurde ihm gegeben, mit den Heiligen Krieg zu führen und sie zu überwinden; und es wurde ihm Gewalt gegeben über jeden Stamm und Volk und Sprache und Nation. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |那得胜又遵守我命令到底的,我要赐给他权柄制伏列国;}} || na4/nei4 de2/de5/dei3 sheng4 you4 zun1 shou3 wo3 ming4 ling4 dao4 di3 de5 , wo3 yao4 ci4 gei3 ta1 quan2 bing3 zhi4 fu2 lie4 guo2 ;|| Und wer überwindet und meine Werke bewahrt bis ans Ende, dem werde ich Gewalt über die Nationen geben; ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |那些洗净自己衣服的有福了!可得权柄能到生命树那里,也能从门进城。}} || na4/nei4 xie1 xi3/xian3 jing4 zi4 ji3 yi1 fu2 de5 you3 fu2 le5 ! ke3/ke4 de2/de5/dei3 quan2 bing3 neng2 dao4 sheng1 ming4 shu4 na4/nei4 li3 , ye3 neng2 cong2 men2 jin4 cheng2 。|| Glückselig, die ihre Kleider waschen, auf daß sie ein Recht haben an dem Baume des Lebens und durch die Tore in die Stadt eingehen! ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |所以我愿意年轻的寡妇嫁人,生养儿女,治理家务,不给敌人辱骂的把柄。}} || suo3 yi3 wo3 yuan4 yi4 nian2 qing1 de5 gua3 妇嫁 ren2 , sheng1 yang3 er2/er5 nü3/ru3 , zhi4 li3 jia1 wu4 , bu4 gei3 敌 ren2 辱 ma4 de5 ba3 bing3 。|| Ich will nun, daß jüngere Witwen heiraten, Kinder gebären, Haushaltung führen, dem Widersacher keinen Anlaß geben der Schmähung halber; ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Timotheusbrief1]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他因赐给他权柄在兽面前能行奇事,就迷惑住在地上的人,说:要给那受刀伤还活着的兽作个像。}} || ta1 yin1 ci4 gei3 ta1 quan2 bing3 zai4 shou4 mian4 qian2 neng2 hang2/xing2 qi2 shi4 , jiu4 迷惑 zhu4 zai4 de4/di4 shang4 de5 ren2 , shuo1 : yao4 gei3 na4/nei4 shou4 dao1 shang1 hai2/huan2 huo2 zhao2/zhe2 de5 shou4 zuo4 ge4 xiang4 。|| und es verführt, die auf der Erde wohnen wegen der Zeichen, welche vor dem Tiere zu tun ihm gegeben wurde, indem es die, welche auf der Erde wohnen, auffordert, ein Bild dem Tiere zu machen, das die Wunde des Schwertes hat und lebte. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |在上有权柄的,人人当顺服他,因为没有权柄不是出於神的。凡掌权的都是神所命的。}} || zai4 shang4 you3 quan2 bing3 de5 , ren2 ren2 dang1/dang4 shun4 fu2 ta1 , yin1 wei2/wei4 mei2/mo4 you3 quan2 bing3 bu4 shi4 chu1 yu2 shen2 de5 。 fan2 zhang3 quan2 de5 dou1/du1 shi4 shen2 suo3 ming4 de5 。|| Jede Seele unterwerfe sich den obrigkeitlichen Gewalten; denn es ist keine Obrigkeit, außer von Gott, und diese, welche sind, sind von Gott verordnet. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Römerbrief]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |此後,我看见另有一位有大权柄的天使从天降下,地就因他的荣耀发光。}} || ci3 hou4 , wo3 kan4 jian4/xian4 ling4 you3 yi1 wei4 you3 da4 quan2 bing3 de5 tian1 shi3/shi4 cong2 tian1 jiang4 xia4 , de4/di4 jiu4 yin1 ta1 de5 rong2 耀 fa1 guang1 。|| Nach diesem sah ich einen anderen Engel aus dem Himmel herniederkommen, welcher große Gewalt hatte; und die Erde wurde von seiner Herrlichkeit erleuchtet. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |你所看见的那十角就是十王;他们还没有得国,但他们一时之间要和兽同得权柄,与王一样。}} || ni3 suo3 kan4 jian4/xian4 de5 na4/nei4 shi2 jue2 jiu4 shi4 shi2 wang2 ; ta1 men5 hai2/huan2 mei2/mo4 you3 de2/de5/dei3 guo2 , dan4 ta1 men5 yi1 shi2 zhi1 jian1 yao4 he2/he4/huo2 shou4 tong2 de2/de5/dei3 quan2 bing3 , yu3 wang2 yi1 yang4 。|| Und die zehn Hörner, die du sahst, sind zehn Könige, welche noch kein Königreich empfangen haben, aber Gewalt wie Könige empfangen eine Stunde mit dem Tiere. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |又拜那龙─因为他将自己的权柄给了兽,也拜兽,说:谁能比这兽,谁能与他交战呢?}} || you4 bai4 na4/nei4 long2 ─ yin1 wei2/wei4 ta1 jiang1/jiang4 zi4 ji3 de5 quan2 bing3 gei3 le5 shou4 , ye3 bai4 shou4 , shuo1 : shei2 neng2 bi4 zhe4/zhei4 shou4 , shei2 neng2 yu3 ta1 jiao1 zhan4 ne5 ?|| Und sie beteten den Drachen an, weil er dem Tiere die Gewalt gab, und sie beteten das Tier an und sagten: Wer ist dem Tiere gleich? Und wer vermag mit ihm zu kämpfen? ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |独有我与巴拿巴没有权柄不做工麽?}} || du2 you3 wo3 yu3 ba1 na2 ba1 mei2/mo4 you3 quan2 bing3 bu4 zuo4 gong1 me5 ?|| Oder haben allein ich und Barnabas nicht ein Recht, nicht zu arbeiten? ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Korintherbrief1]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |所以,我不在你们那里的时候,把这话写给你们,好叫我见你们的时候,不用照主所给我的权柄严厉的待你们;这权柄原是为造就人,并不是为败坏人。}} || suo3 yi3 , wo3 bu4 zai4 ni3 men5 na4/nei4 li3 de5 shi2 hou4 , ba3 zhe4/zhei4 hua4 xie3 gei3 ni3 men5 , hao3 jiao4 wo3 jian4/xian4 ni3 men5 de5 shi2 hou4 , bu4 yong4 zhao4 zhu3 suo3 gei3 wo3 de5 quan2 bing3 yan2 li4 de5 dai1 ni3 men5 ; zhe4/zhei4 quan2 bing3 yuan2 shi4 wei2/wei4 zao4 jiu4 ren2 , bing4 bu4 shi4 wei2/wei4 bai4 huai4 ren2 。|| Deswegen schreibe ich dieses abwesend, auf daß ich anwesend nicht Strenge gebrauchen müsse, nach der Gewalt, die der Herr mir gegeben hat zur Auferbauung und nicht zur Zerstörung. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Korintherbrief2]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他在头一个兽面前,施行头一个兽所有的权柄,并且叫地和住在地上的人拜那死伤医好的头一个兽。}} || ta1 zai4 tou2 yi1 ge4 shou4 mian4 qian2 , shi1 hang2/xing2 tou2 yi1 ge4 shou4 suo3 you3 de5 quan2 bing3 , bing4 qie3 jiao4 de4/di4 he2/he4/huo2 zhu4 zai4 de4/di4 shang4 de5 ren2 bai4 na4/nei4 si3 shang1 yi1 hao3 de5 tou2 yi1 ge4 shou4 。|| Und die ganze Gewalt des ersten Tieres übt es vor ihm aus, und es macht, daß die Erde und die auf ihr wohnen das erste Tier anbeten, dessen Todeswunde geheilt wurde. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |就另有一匹马出来,是红的,有权柄给了那骑马的,可以从地上夺去太平,使人彼此相杀;又有一把大刀赐给他。}} || jiu4 ling4 you3 yi1 pi1/pi1/pi3 ma3 chu1 lai2 , shi4 hong2 de5 , you3 quan2 bing3 gei3 le5 na4/nei4 qi2 ma3 de5 , ke3/ke4 yi3 cong2 de4/di4 shang4 夺 qu4 tai4 ping2 , shi3/shi4 ren2 bi3 ci3 xiang1/xiang4 sha1 ; you4 you3 yi1 ba3 da4 dao1 ci4 gei3 ta1 。|| Und es zog aus ein anderes, feuerrotes Pferd; und dem, der darauf saß, ihm wurde gegeben, den Frieden von der Erde zu nehmen, und daß sie einander schlachteten; und ein großes Schwert wurde ihm gegeben. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |大声说:曾被杀的羔羊是配得权柄、丰富、智慧、能力、尊贵、荣耀、颂赞的。}} || da4 sheng1 shuo1 : ceng2 bei4 sha1 de5 gao1 yang2 shi4 pei4 de2/de5/dei3 quan2 bing3 、 feng1 fu4 、 zhi4 hui4 、 neng2 li4 、 zun1 gui4 、 rong2 耀、 song4 zan4 de5 。|| die mit lauter Stimme sprachen: Würdig ist das Lamm, das geschlachtet worden ist, zu empfangen die Macht und Reichtum und Weisheit und Stärke und Ehre und Herrlichkeit und Segnung. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |我们的主,我们的神,你是配得荣耀、尊贵、权柄的;因为你创造了万物,并且万物是因你的旨意被创造而有的。}} || wo3 men5 de5 zhu3 , wo3 men5 de5 shen2 , ni3 shi4 pei4 de2/de5/dei3 rong2 耀、 zun1 gui4 、 quan2 bing3 de5 ; yin1 wei2/wei4 ni3 chuang1/chuang4 zao4 le5 wan4 wu4 , bing4 qie3 wan4 wu4 shi4 yin1 ni3 de5 zhi3 yi4 bei4 chuang1/chuang4 zao4 er2 you3 de5 。|| Du bist würdig, o unser Herr und unser Gott, zu nehmen die Herrlichkeit und die Ehre und die Macht; denn du hast alle Dinge erschaffen, und deines Willens wegen waren sie und sind sie erschaffen worden. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |他们同心合意将自己的能力、权柄给那兽。}} || ta1 men5 tong2 xin1 he2 yi4 jiang1/jiang4 zi4 ji3 de5 neng2 li4 、 quan2 bing3 gei3 na4/nei4 shou4 。|| Diese haben einen Sinn und geben ihre Macht und Gewalt dem Tiere. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Offenbarung]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |用和平彼此联络,竭力保守圣灵所赐合而为一的心。}} || yong4 he2/he4/huo2 ping2 bi3 ci3 lian2 luo4 , jie2 li4 bao3 shou3 sheng4 ling2 suo3 ci4 he2 er2 wei2/wei4 yi1 de5 xin1 。|| euch befleißigend, die Einheit des Geistes zu bewahren in dem Bande des Friedens. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Epheserbrief]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |全身都靠他联络得合式,百节各按各职,照着各体的功用彼此相助,便叫身体渐渐增长,在爱中建立自己。}} || quan2 shen1 dou1/du1 kao4 ta1 lian2 luo4 de2/de5/dei3 he2 shi4 , bai3 jie2 ge4 an4 ge4 zhi2 , zhao4 zhao2/zhe2 ge4 ti3 de5 gong1 yong4 bi3 ci3 xiang1/xiang4 zhu4 , bian4 jiao4 shen1 ti3 jian1/jian4 jian1/jian4 zeng1 chang2/zhang3 , zai4 ai4 zhong1/zhong4 jian4 li4 zi4 ji3 。|| aus welchem der ganze Leib, wohl zusammengefügt und verbunden durch jedes Gelenk der Darreichung, nach der Wirksamkeit in dem Maße jedes einzelnen Teiles, für sich das Wachstum des Leibes bewirkt zu seiner Selbstauferbauung in Liebe. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Epheserbrief]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |不持定元首。全身既然靠着他,筋节得以相助联络,就因神大得长进。}} || bu4 chi2 ding4 yuan2 shou3 。 quan2 shen1 ji4 ran2 kao4 zhao2/zhe2 ta1 , jin1 jie2 de2/de5/dei3 yi3 xiang1/xiang4 zhu4 lian2 luo4 , jiu4 yin1 shen2 da4 de2/de5/dei3 chang2/zhang3 jin4 。|| und nicht festhaltend das Haupt, aus welchem der ganze Leib, durch die Gelenke und Bande Darreichung empfangend und zusammengefügt, das Wachstum Gottes wächst. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Kolosserbrief]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |各(或作:全)房靠他联络得合式,渐渐成为主的圣殿。}} || ge4 ( huo4 zuo4 : quan2 ) fang2 kao4 ta1 lian2 luo4 de2/de5/dei3 he2 shi4 , jian1/jian4 jian1/jian4 cheng2 wei2/wei4 zhu3 de5 sheng4 dian4 。|| in welchem der ganze Bau, wohl zusammengefügt, wächst zu einem heiligen Tempel im Herrn, ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Epheserbrief]]) |- | {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |在这一切之外,要存着爱心,爱心就是联络全德的。}} || zai4 zhe4/zhei4 yi1 qie1 zhi1 wai4 , yao4 cun2 zhao2/zhe2 ai4 xin1 , ai4 xin1 jiu4 shi4 lian2 luo4 quan2 de2 de5 。|| Zu diesem allen aber ziehet die Liebe an, welche das Band der Vollkommenheit ist. ([[Diskussion:Vokabeltexte_Chinesisch/_Vokabellektionen#Das_Neue_Testament|Die Bibel - Kolosserbrief]]) |} == Lückentexte == === [[:zh:Wikijunior:太阳系/地球|Wikijunior: 太阳系/地球 Sonnensystem/Erde]] === {| class="wikitable" |- ! [[:zh:Wikijunior:太阳系/地球|Wikijunior: 太阳系/地球 Sonnensystem/Erde ]] !! Übersetzung Christian Bauer |- | 地球 是 我们 人类 所 居住 的 星球。 || Die Erde ist der Planet auf dem unsere Menschheit lebt |- | 它 是 整个 太阳系 中 唯一 表面 有 很多 很多 flüssiges 水,|| Sie ist im ganzen Sonnensystem der einzige, auf dessen Oberfläche es sehr viel flüssiges Wasser gibt |- | 也是 我们 目前 所 知道 唯一 的 一个 存在 生命 的 星球。 || Auch ist sie aktuell der einzige Planet, von dem wir wissen, dass auf ihm Leben existiert. |- | 同时 它 也 是 太阳系 中 的 四 颗 类地行星 中 最大的 一颗|| Gleichzeitig ist sie auch im Sonnensystem von den vier terrestrischen Planeten der größte |- | (四颗 “类地行星” 是 水星、金星、地球、和 火星)。|| (Die 4 terrestrischen Planeten sind Merkur, Venus, Erde und Mars). |- | |- | 地球 有 多大? || Wie groß ist die Erde? |- | 地球 的 直径 有 12,742 公里, || Der Durchmesser der Erde ist 12742 km |- | 质量 有 5,973,000,000,000,000,000,000,000 千克, || ihre Masse ist 5,973,000,000,000,000,000,000,000 kg |- | 表面积 有 510,067,420 平方 千米, || Ihre Oberfläche umfasst 510,067,420 Quadratkilometer |- | 体积 有 1.0832×10^12 立方 千米。 || Das Volumen beträgt 1.0832×10^12 Kubikkilometer |- | 所以 地球 是 非常 大 的。 || Also ist die Erde äußerst groß. |- | |- | 地球 有 多少 岁 了? || Wie alt ist die Erde? |- | 没有人 知道 准确 的 数字, || Keiner weiß die genaue Jahreszahl, |- | 但 大多 数 人 认为 地球 大约 有 45亿 岁 了。 || Aber die Mehrzahl der Menschen glaubt, dass die Erde ungefähr 4,5 Milliarden Jahre alt ist. |} === Bibel === ==== [https://newchristianbiblestudy.org/de/bible/compare/chinese-union-s/german-elberfelder-1905/matthew/9/ Bibel: Matthäusevangelium Kapitel 9] ==== {| class="wikitable" ! Chinese Union Version !! Übersetzung Rudolf Brockhaus (1856-1932) |- | 9.1 Jesus 上了船,渡过海,来到自己的城里。 || 9.1 Und er stieg in das Schiff, setzte über und kam in seine eigene Stadt.  |- | 9.2 有人用褥子抬着一个 Gelähmten 到 Jesus 跟前来。 Jesus 见他们的信心,就对 Gelähmten 说:小子,放心罢!你的罪赦了。 || 9.2 Und siehe, sie brachten einen Gelähmten zu ihm, der auf einem Bette lag; und als Jesus ihren Glauben sah, sprach er zu dem Gelähmten: Sei guten Mutes, Kind, deine Sünden sind vergeben.  |- | 9.3 有几个文士心里说:这个人说僭妄的话了。 || 9.3 Und siehe, etliche von den Schriftgelehrten sprachen bei sich selbst: Dieser lästert.  |- | 9.4 Jesus 知道他们的心意,就说:你们为什么心里怀着恶念呢? || 9.4 Und als Jesus ihre Gedanken sah, sprach er: Warum denket ihr Arges in euren Herzen?  |- | 9.5 或说:你的罪赦了,或说:你起来行走,那一样容易呢? || 9.5 Denn was ist leichter, zu sagen: Deine Sünden sind vergeben, oder zu sagen: Stehe auf und wandle?  |- | 9.6 但要叫你们知道,人子在地上有赦罪的权柄;就对 Gelähmten 说:起来!拿你的褥子回家去罢。 || 9.6 Auf daß ihr aber wisset, daß der Sohn des Menschen Gewalt hat auf der Erde Sünden zu vergeben.... Dann sagt er zu dem Gelähmten: Stehe auf, nimm dein Bett auf und geh nach deinem Hause.  |- | 9.7 那人就起来,回家去了。 || 9.7 Und er stand auf und ging nach seinem Hause.  |- | 9.8 众人看见都惊奇,就归荣耀与神,因为他将这样的权柄赐给人。 || 9.8 Als aber die Volksmengen es sahen, fürchteten sie sich und verherrlichten Gott, der solche Gewalt den Menschen gegeben.  |- | 9.9 Jesus 从那里往前走,看见一个人名叫马太,坐在税关上,就对他说:你跟从我来。他就起来跟从了 Jesus。 || 9.9 Und als Jesus von dannen weiterging, sah er einen Menschen am Zollhause sitzen, Matthäus genannt, und er spricht zu ihm: Folge mir nach. Und er stand auf und folgte ihm nach.  |- | 9.10 Jesus 在屋里坐席的时候,有好些税吏和罪人来,与 Jesu 和他的门徒一同坐席。 || 9.10 Und es geschah, als er in dem Hause zu Tische lag, siehe, da kamen viele Zöllner und Sünder und lagen zu Tische mit Jesu und seinen Jüngern.  |- | 9.11 法利赛人看见,就对 Jesus 的门徒说:你们的先生为什么和税吏并罪人一同吃饭呢? || 9.11 Und als die Pharisäer es sahen, sprachen sie zu seinen Jüngern: Warum isset euer Lehrer mit den Zöllnern und Sündern?  |- | 9.12 Jesus 听见,就说:康健的人用不着医生,有病的人才用得着。 || 9.12 Als aber Jesus es hörte, sprach er: Die Starken bedürfen nicht eines Arztes, sondern die Kranken.  |- | 9.13 经上说:我喜爱怜恤,不喜爱祭祀。这句话的意思,你们且去揣摩。我来本不是召义人,乃是召罪人。 || 9.13 Gehet aber hin und lernet, was das ist: "Ich will Barmherzigkeit und nicht Schlachtopfer"; denn ich bin nicht gekommen, Gerechte zu rufen, sondern Sünder.  |- | 9.14 那时,约翰的门徒来见 Jesus,说:我们和法利赛人常常禁食,你的门徒倒不禁食,这是为什么呢? || 9.14 Dann kommen die Jünger des Johannes zu ihm und sagen: Warum fasten wir und die Pharisäer oft, deine Jünger aber fasten nicht?  |- | 9.15 Jesus 对他们说:新郎和陪伴之人同在的时候,陪伴之人岂能 trauern 呢?但日子将到,新郎要离开他们,那时候他们就要禁食。 || 9.15 Und Jesus sprach zu ihnen: Können etwa die Gefährten des Bräutigams trauern, so lange der Bräutigam bei ihnen ist? Es werden aber Tage kommen, da der Bräutigam von ihnen weggenommen sein wird, und dann werden sie fasten.  |- | 9.16 没有人把新布补在旧衣服上;因为所补上的反带坏了那衣服,破的就更大了。 || 9.16 Niemand aber setzt einen Flicken von neuem Tuch auf ein altes Kleid; denn das Eingesetzte reißt von dem Kleide ab, und der Riß wird ärger.  |- | 9.17 也没有人把新酒装在旧皮袋里;若是这样,皮袋就裂开,酒漏出来,连皮袋也坏了。惟独把新酒装在新皮袋里,两样就都保全了。 || 9.17 Auch tut man nicht neuen Wein in alte Schläuche; sonst zerreißen die Schläuche, und der Wein wird verschüttet, und die Schläuche verderben; sondern man tut neuen Wein in neue Schläuche, und beide werden zusammen erhalten.  |- | 9.18 Jesus 说这话的时候,有一个管会堂的来拜他,说:我女儿刚才死了,求你去按手在他身上,他就必活了。 || 9.18 Während er dies zu ihnen redete, siehe, da kam ein Vorsteher herein und warf sich vor ihm nieder und sprach: Meine Tochter ist eben jetzt verschieden; aber komm und lege deine Hand auf sie, und sie wird leben.  |- | 9.19 Jesus 便起来跟着他去;门徒也跟了去。 || 9.19 Und Jesus stand auf und folgte ihm, und seine Jünger.  |- | 9.20 有一个女人,患了十二年的血漏,来到 Jesus 背後,摸他的衣裳?子; || 9.20 Und siehe, ein Weib, das zwölf Jahre blutflüssig war, trat von hinten herzu und rührte die Quaste seines Kleides an;  |- | 9.21 因为他心里说:我只摸他的衣裳,就必 geheilt werden。 || 9.21 denn sie sprach bei sich selbst: Wenn ich nur sein Kleid anrühre, so werde ich geheilt werden.  |- | 9.22 Jesus 转过来,看见他,就说:女儿,放心!你的信救了你。从那时候,女人就 geheilt。 || 9.22 Jesus aber wandte sich um, und als er sie sah, sprach er: Sei gutes Mutes, Tochter; dein Glaube hat dich geheilt. Und das Weib war geheilt von jener Stunde an.  |- | 9.23 Jesus 到了管会堂的家里,看见有吹手,又有许多人 lärmen, || 9.23 Und als Jesus in das Haus des Vorstehers kam und die Pfeifer und die lärmende Volksmenge sah,  |- | 9.24 就说:退去罢!这闺女不是死了,是睡着了。他们就 verlachten 他。 || 9.24 sprach er: Gehet fort, denn das Mägdlein ist nicht gestorben, sondern es schläft. Und sie verlachten ihn.  |- | 9.25 众人既被 hinausgetrieben,Jesus 就进去,拉着闺女的手,闺女便起来了。 || 9.25 Als aber die Volksmenge hinausgetrieben war, ging er hinein und ergriff sie bei der Hand; und das Mägdlein stand auf.  |- | 9.26 於是这风声传遍了那地方。 || 9.26 Und das Gerücht hiervon ging aus in jenes ganze Land.  |- | 9.27 Jesus 从那里往前走,有两个 Blinde 跟着他,welche schrien und 说:大卫的子孙,可怜我们罢! || 9.27 Und als Jesus von dannen weiterging, folgten ihm zwei Blinde, welche schrieen und sprachen: Erbarme dich unser, Sohn Davids!  |- | 9.28 Jesus 进了房子,die Blinden 就来到他跟前。Jesus 说:你们信我能作这事么?他们说:主阿,我们信。 || 9.28 Als er aber in das Haus gekommen war, traten die Blinden zu ihm; und Jesus spricht zu ihnen: Glaubet ihr, daß ich dieses tun kann? Sie sagen zu ihm: Ja, Herr.  |- | 9.29 Jesus 就摸他们的眼睛,说:照着你们的信给你们成全了罢。 || 9.29 Dann rührte er ihre Augen an und sprach: Euch geschehe nach eurem Glauben.  |- | 9.30 他们的眼睛就开了。Jesus 切切的 bedrohte 他们说:你们要小心,不可叫人知道。 || 9.30 Und ihre Augen wurden aufgetan; und Jesus bedrohte sie und sprach: Sehet zu, niemand erfahre es!  |- | 9.31 他们出去, und 把他的名声传遍了那地方。 || 9.31 Sie aber gingen aus und machten ihn ruchbar in jenem ganzen Lande.  |- | 9.32 他们出去的时候,有人将鬼所附的一个哑吧带到 Jesus 跟前来。 || 9.32 Als sie aber weggingen, siehe, da brachten sie einen stummen Menschen zu ihm, der besessen war.  |- | 9.33 鬼被赶出去,哑吧就说出话来。众人都希奇,说:在以色列中,从来没有见过这样的事。 || 9.33 Und als der Dämon ausgetrieben war, redete der Stumme. Und die Volksmengen verwunderten sich und sprachen: Niemals ward es also in Israel gesehen.  |- | 9.34 法利赛人却说:他是靠着鬼王赶鬼。 || 9.34 Die Pharisäer aber sagten: Er treibt die Dämonen aus durch den Obersten der Dämonen.  |- | 9.35 Jesus 走遍各城各乡,在会堂里教训人,宣讲天国的福音,又医治各样的 Krankheit und Gebrechen。 || 9.35 Und Jesus zog umher durch alle Städte und Dörfer und lehrte in ihren Synagogen und predigte das Evangelium des Reiches und heilte jede Krankheit und jedes Gebrechen.  |- | 9.36 他看见许多的人,就 wurde er innerlich bewegt über 他们;因为他们困苦流离,如同羊没有牧人一般。 || 9.36 Als er aber die Volksmengen sah, wurde er innerlich bewegt über sie, weil sie erschöpft und verschmachtet waren wie Schafe, die keinen Hirten haben.  |- | 9.37 於是对门徒说:要收的 Ernte 多,作工的人少。 || 9.37 Dann spricht er zu seinen Jüngern: Die Ernte zwar ist groß, der Arbeiter aber sind wenige;  |- | 9.38 所以,你们当求 Ernte 的主打发工人出去收他的 Ernte。 || 9.38 bittet nun den Herrn der Ernte, daß er die Arbeiter aussende in seine Ernte.  |} ==== [https://newchristianbiblestudy.org/de/bible/compare/chinese-union-s/german-elberfelder-1905/matthew/10/ Matthäusevangelium Kapitel 10] ==== {| class="wikitable" ! Chinese Union Version !! Übersetzung Rudolf Brockhaus (1856-1932) |- | 10.1 Jesus 叫了十二个门徒来,给他们权柄,能赶逐污鬼,并医治各样的 Krankheit und Gebrechen。 || 10.1 Und als er seine zwölf Jünger herzugerufen hatte, gab er ihnen Gewalt über unreine Geister, um sie auszutreiben, und jede Krankheit und jedes Gebrechen zu heilen.  |- | 10.2 这十二使徒的名:头一个叫西门、又称彼得,还有他兄弟安得烈,西庇太的儿子雅各和雅各的兄弟约翰, || 10.2 Die Namen der zwölf Apostel aber sind diese: Der erste, Simon, der Petrus genannt wird, und Andreas, sein Bruder; Jakobus, der Sohn des Zebedäus, und Johannes, sein Bruder;  |- | 10.3 Philippus 和巴多罗买,多马和税吏马太, Alphäus 的儿子雅各,和达太, || 10.3 Philippus und Bartholomäus; Thomas und Matthäus, der Zöllner; Jakobus, der Sohn des Alphäus, und Lebbäus, der zubenamt war Thaddäus;  |- | 10.4 奋锐党的西门,还有卖 Jesus 的加略人犹大。 || 10.4 Simon, der Kananäer, und Judas, der Iskariot, der ihn auch überlieferte.  |- | 10.5 Jesus 差这十二个人去,er befahl 他们说:外邦人的路,你们不要走; Samariter 的城,你们不要进; || 10.5 Diese zwölf sandte Jesus aus und befahl ihnen und sprach: Gehet nicht auf einen Weg der Nationen, und gehet nicht in eine Stadt der Samariter;  |- | 10.6 宁可往以色列家迷失的羊那里去。 || 10.6 gehet aber vielmehr zu den verlorenen Schafen des Hauses Israel.  |- | 10.7 随走随传,说天国近了! || 10.7 Indem ihr aber hingehet, prediget und sprechet: Das Reich der Himmel ist nahe gekommen.  |- | 10.8 医治病人,叫死人复活,叫长大?疯的洁净,把鬼赶出去。你们白白的得来,也要白白的舍去。 || 10.8 Heilet Kranke, wecket Tote auf, reiniget Aussätzige, treibet Dämonen aus; umsonst habt ihr empfangen, umsonst gebet.  |- | 10.9 腰袋里不要带金银铜钱。 || 10.9 Verschaffet euch nicht Gold noch Silber noch Kupfer in eure Gürtel,  |- | 10.10 行路不要带口袋;不要带两件褂子,也不要带鞋和 Stab。因为工人得饮食是应当的。 || 10.10 keine Tasche auf den Weg, noch zwei Leibröcke, noch Sandalen, noch einen Stab; denn der Arbeiter ist seiner Nahrung wert.  |- | 10.11 你们无论进那一城,那一村,要打听那里谁是好人,就住在他家,直住到走的时候。 || 10.11 In welche Stadt aber oder in welches Dorf irgend ihr eintretet, erforschet, wer darin würdig ist; und daselbst bleibet, bis ihr weggehet.  |- | 10.12 进他家里去,要请他的安。 || 10.12 Wenn ihr aber in das Haus eintretet, so grüßet es.  |- | 10.13 那家若配得平安,你们所求的平安就必临到那家;若不配得,你们所求的平安仍归你们。 || 10.13 Und wenn nun das Haus würdig ist, so komme euer Friede auf dasselbe; wenn es aber nicht würdig ist, so wende sich euer Friede zu euch zurück.  |- | 10.14 凡不接待你们、不听你们话的人,你们离开那家,或是那城的时候,就把脚上的尘土 und schüttelt 下去。 || 10.14 Und wer irgend euch nicht aufnehmen, noch eure Worte hören wird, gehet hinaus aus jenem Hause oder jener Stadt und schüttelt den Staub von euren Füßen.  |- | 10.15 我实在告诉你们,当审判的日子, Sodom 和 Gomorra 所受的,比那城还容易受呢! || 10.15 Wahrlich, ich sage euch, es wird dem Lande von Sodom und Gomorra erträglicher ergehen am Tage des Gerichts als jener Stadt.  |- | 10.16 我差你们去,如同羊进入狼群;所以你们要灵巧像蛇,驯良像 Tauben。 || 10.16 Siehe, ich sende euch wie Schafe inmitten von Wölfen; so seid nun klug wie die Schlangen und einfältig wie die Tauben.  |- | 10.17 你们要防备人;因为他们要把你们交给公会,也要在会堂里鞭打你们, || 10.17 Hütet euch aber vor den Menschen; denn sie werden euch an Synedrien überliefern und in ihren Synagogen euch geißeln;  |- | 10.18 并且你们要为我的缘故被送到诸侯君王面前,对他们和外邦人作见证。 || 10.18 und auch vor Statthalter und Könige werdet ihr geführt werden um meinetwillen, ihnen und den Nationen zum Zeugnis.  |- | 10.19 你们被交的时候,不要思虑怎样说话,或说什么话。到那时候,必赐给你们当说的话; || 10.19 Wenn sie euch aber überliefern, so seid nicht besorgt, wie oder was ihr reden sollt; denn es wird euch in jener Stunde gegeben werden, was ihr reden sollt.  |- | 10.20 因为不是你们自己说的,乃是你们父的灵在你们里头说的。 || 10.20 Denn nicht ihr seid die Redenden, sondern der Geist eures Vaters, der in euch redet.  |- | 10.21 弟兄要把弟兄,父亲要把儿子,送到死地;儿女要与父母为敌,害死他们; || 10.21 Es wird aber der Bruder den Bruder zum Tode überliefern, und der Vater das Kind; und Kinder werden sich erheben wider die Eltern und sie zum Tode bringen.  |- | 10.22 并且你们要为我的名被众人恨恶。惟有忍耐到底的必然得救。 || 10.22 Und ihr werdet von allen gehaßt werden um meines Namens willen. Wer aber ausharrt bis ans Ende, dieser wird errettet werden.  |- | 10.23 有人在这城里 verfolgen 你们,就逃到那城里去。我实在告诉你们,以色列的城邑,你们还没有走遍,人子就到了。 || 10.23 Wenn sie euch aber verfolgen in dieser Stadt, so fliehet in die andere; denn wahrlich, ich sage euch, ihr werdet mit den Städten Israels nicht zu Ende sein, bis der Sohn des Menschen gekommen sein wird.  |- | 10.24 学生不能高过先生;仆人不能高过主人。 || 10.24 Ein Jünger ist nicht über den Lehrer, und ein Knecht nicht über seinen Herrn.  |- | 10.25 学生和先生一样,仆人和主人一样,也就罢了。人既骂家主是别西卜(别西卜:是鬼王的名),何况他的家人呢? || 10.25 Es ist dem Jünger genug, daß er sei wie sein Lehrer, und der Knecht wie sein Herr. Wenn sie den Hausherrn Beelzebub genannt haben, wieviel mehr seine Hausgenossen!  |- | 10.26 所以,不要怕他们;因为掩盖的事没有不露出来的,隐藏的事没有不被人知道的。 || 10.26 Fürchtet euch nun nicht vor ihnen. Denn es ist nichts verdeckt, was nicht aufgedeckt, und verborgen, was nicht kundwerden wird.  |- | 10.27 我在暗中告诉你们的,你们要在明处说出来;你们耳中所听的,要在房上宣扬出来。 || 10.27 Was ich euch sage in der Finsternis, redet in dem Lichte, und was ihr höret ins Ohr, rufet aus auf den Dächern.  |- | 10.28 那杀身体,不能杀灵魂的,不要怕他们;惟有能把身体和灵魂都灭在 Hölle 里的,正要怕他。 || 10.28 Und fürchtet euch nicht vor denen, die den Leib töten, die Seele aber nicht zu töten vermögen; fürchtet aber vielmehr den, der sowohl Seele als Leib zu verderben vermag in der Hölle.  |- | 10.29 两个 Sperlinge 不是卖一分银子么?若是你们的父不许,一个也不能掉在地上; || 10.29 Werden nicht zwei Sperlinge um einen Pfennig verkauft? Und nicht einer von ihnen fällt auf die Erde ohne euren Vater;  |- | 10.30 就是你们的头发也都被数过了。 || 10.30 an euch aber sind selbst die Haare des Hauptes alle gezählt.  |- | 10.31 所以,不要惧怕,你们比许多 Sperlinge 还贵重! || 10.31 Fürchtet euch nun nicht; ihr seid vorzüglicher als viele Sperlinge.  |- | 10.32 凡在人面前认我的,我在我天上的父面前也必认他; || 10.32 Ein jeder nun, der mich vor den Menschen bekennen wird, den werde auch ich bekennen vor meinem Vater, der in den Himmeln ist.  |- | 10.33 凡在人面前不认我的,我在我天上的父面前也必不认他。 || 10.33 Wer aber irgend mich vor den Menschen verleugnen wird, den werde auch ich verleugnen vor meinem Vater, der in den Himmeln ist.  |- | 10.34 你们不要想我来是叫地上太平;我来并不是叫地上太平,乃是叫地上动刀兵。 || 10.34 Wähnet nicht, daß ich gekommen sei, Frieden auf die Erde zu bringen; ich bin nicht gekommen, Frieden zu bringen, sondern das Schwert.  |- | 10.35 因为我来是叫人与父亲生疏,女儿与母亲生疏,媳妇与婆婆生疏。 || 10.35 Denn ich bin gekommen, den Menschen zu entzweien mit seinem Vater, und die Tochter mit ihrer Mutter, und die Schwiegertochter mit ihrer Schwiegermutter;  |- | 10.36 人的仇敌就是自己家里的人。 || 10.36 und des Menschen Feinde werden seine eigenen Hausgenossen sein.  |- | 10.37 爱父母过於爱我的,不配作我的门徒;爱儿女过於爱我的,不配作我的门徒; || 10.37 Wer Vater oder Mutter mehr liebt als mich, ist meiner nicht würdig; und wer Sohn oder Tochter mehr liebt als mich, ist meiner nicht würdig;  |- | 10.38 不背着他的十字架跟从我的,也不配作我的门徒。 || 10.38 und wer nicht sein Kreuz aufnimmt und mir nachfolgt, ist meiner nicht würdig.  |- | 10.39 得着生命的,将要失丧生命;为我失丧生命的,将要得着生命。 || 10.39 Wer sein Leben findet, wird es verlieren, und wer sein Leben verliert um meinetwillen, wird es finden.  |- | 10.40 人接待你们就是接待我;接待我就是接待那差我来的。 || 10.40 Wer euch aufnimmt, nimmt mich auf, und wer mich aufnimmt, nimmt den auf, der mich gesandt hat.  |- | 10.41 人因为先知的名接待先知,必得先知所得的赏赐;人因为义人的名接待义人,必得义人所得的赏赐。 || 10.41 Wer einen Propheten aufnimmt in eines Propheten Namen, wird eines Propheten Lohn empfangen; und wer einen Gerechten aufnimmt in eines Gerechten Namen, wird eines Gerechten Lohn empfangen.  |- | 10.42 无论何人,因为门徒的名,只把一杯凉水给这小子里的一个喝,我实在告诉你们,这人不能不得赏赐。 || 10.42 Und wer irgend einen dieser Kleinen nur mit einem Becher kalten Wassers tränken wird in eines Jüngers Namen, wahrlich, ich sage euch, er wird seinen Lohn nicht verlieren.  |} === Haenisch: Lehrgang der klassischen chinesischen Schriftsprache === ==== 第一百零二課 ==== 第一百零二课 dì yī bǎi líng èr kè Hundertzweite Lektion Diese Lektion findet sich im [https://ctext.org/wiki.pl?if=gb&chapter=55494 Yue fu shi ji, der Sammlung von Yuefu Liedern und Balladen]. ----------------------------------- 君子行 君子行 jūn zǐ xíng Vorgehensweisen eines edlen Menschen ----------------------------------- 君子防未然, 君子防未然, jūn zǐ fáng wèi rán, Ein edler Mensch beugt vor, so dass kein Anschein (einer Verfehlung entsteht) ----------------------------------- 不處嫌疑間。 不处嫌疑间。 bù chù xián yí jiān. an keinem Ort darf es Verdacht und Zweifel geben: ----------------------------------- 瓜田不纳履, guā tián bù nà lǚ, Im Kürbisfeld schlüpft er nicht in die Schuhe (insbesondere bückt er sich nicht und greift nach unten zu den Schuhen) ----------------------------------- 李下不正冠。 李下不正冠。 lǐ xià bù zhèng guān. Unter einem Pflaumenbaum richtet er nicht seinen Hut gerade (und greift dazu mit den Händen nach oben). ----------------------------------- Schwägerin 叔不親授, Schwägerin 叔不亲授, sǎo shū bù qīn shòu, Schwägerin und Onkel geben sich nichts persönlich. ----------------------------------- 長幼不比肩。 长幼不比肩。 zhǎng yòu bù bǐ jiān. Ältere und Jüngere stehen nicht nebeneinander (so dass man ihre Schultern vergleichen kann)(sondern der Jüngere bleibt hinter dem Älteren). ----------------------------------- 劳谦得其柄, láo qiān dé qí bǐng, Mit Anstrengung und Bescheidenheit hat man sein Leben im Griff. ----------------------------------- 和光甚_難。 和光甚独难。 hé guāng shén dú nán. Bei seinem Ruhm sich unter die einfachen Leute zu mischen ist außerordentlich schwierig. ----------------------------------- 周公下白屋, 周公下白屋, zhōu gōng xià bái wū, Als der Herzog von Zhou in den Häusern der einfachen Menschen war ----------------------------------- 吐 Bissen 不及餐。 tǔ bǔ bù jí cān. musste er die Bissen wieder ausspucken und kam nicht zum Essen. ----------------------------------- 一 Haarwäsche 三握髮, 一 Haarwäsche 三握发, yī mù sān wò fà, Bei der Haarwäsche musste er dreimal sein Haar ergreifen (weil er gestört wurde) ----------------------------------- 後世稱聖_。 后世称圣贤。 hòu shì chēng shèng xián. Spätere Generationen nannten ihn weise und fähig. ----------------------------------- == Texte == === [https://ctext.org/liji/wen-wang-shi-zi/ens Das Buch der Riten: Wen Wang Shi Zi] === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 始立学者,既兴器用币,然后释菜不舞不授器,乃退。傧于东序,一献,无介语可也。教世子。 }} Übersetzung James Legge On the first establishment of schools (in any state), when the instruments of music were completed, offerings of silk were set forth; and afterwards those of vegetables. But there was no dancing and (consequently) no giving out of the spears and other things used in it. They simply retired and received visitors in the eastern school. Only one cup was passed round. The ceremony might pass without (parade of) attendants or conversation. (All these things) belonged to the education of the young princes. {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch | 凡祭与养老,乞言,合语之礼,皆小乐正诏之于东序。大乐正学舞干戚,语说,命乞言,皆大乐正授数,大司成论说在东序。凡侍坐于大司成者,远近间三席,可以问。终则负墙,列事未尽,不问。 }} Übersetzung James Legge All the rules about sacrificial offerings and at the nourishing of the old begging them to speak (their wise counsels) and the conversation at general reunions, were taught by the lower directors of Music in the eastern school. The Grand director of Music taught how to brandish the shield and axe. He also delivered the graduated rules relating to conversations and the charges about begging the old to speak. The Grand perfecter (of Instruction) discussed all about (these matters) in the eastern school. Whenever a pupil was sitting with the Grand completer (of Instruction), there was required to be between them the width of three mats. He might put questions to him; and when he had finished, sit back on the mat near to the wall. While the instructor had not finished all he had to say on any one point, he did not ask about another. == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |礼记-礼运}} == === Text === {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |是故,礼者君之大柄也,所以别嫌明微,傧鬼神,考制度,别仁义,所以治政安君也。故政不正,则君位危;君位危,则大臣倍,小臣窃。刑肃而俗敝,则法无常;法无常,而礼无列;礼无列,则士不事也。刑肃而俗敝,则民弗归也,是谓疵国。 }} === Richard Wilhelm === Darum ist die Sitte die große Handhabe der Fürsten, durch die sie das Zweifelhafte unterscheiden und das Verborgene klarmachen, die Geister und Götter als Gäste empfangen, die Einrichtungen prüfen, Güte und Gerechtigkeit unterscheiden und die Regierung in Ordnung bringen können. So dient sie zur Sicherheit der Fürsten. Ist daher die Regierung nicht in Ordnung, so wird die Stellung des Fürsten unsicher. Ist die Stellung des Fürsten unsicher, so erlauben sich die hohen Beamten Übergriffe, und die niederen Beamten stehlen. Sind die Strafen zu streng und die Bräuche verkommen, so ist eine feste Handhabung der Gesetze unmöglich. Werden die Gesetze willkürlich gehandhabt, so werden die Regeln der Sitte verschwommen. Wenn aber die Regeln der Sitte verschwommen sind, so treten die Staatsmänner nicht in den Staatsdienst, und das Volk fügt sich nicht mehr. Das bedeutet die Erschlaffung des Staates. === James Legge === Therefore, ceremonies form a great instrument in the hands of a ruler. It is by them that he resolves what is doubtful and brings to light what is abstruse; that he conducts his intercourse with spiritual beings, examines all statutory arrangements, and distinguishes benevolence from righteousness; it is by them, in short, that government is rightly ordered, and his own tranquillity secured. When government is not correct, the ruler's seat is insecure. When the ruler's seat is insecure, the great ministers revolt, and smaller ones begin pilfering. Punishmentsare made severe, and manners deteriorate. Thus the laws become irregular; and when the laws are irregular, the rules of ceremony uncertain. When these are uncertain, officers do not perform their duties; and when punishments become severe, and manners deteriorate, the people do not turn (to what is right). We have that condition which may be described as 'an infirm state.' == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |中国历史}} == {{:Vokabeltexte_Chinesisch/ Vorlage:Chinesisch |外交上,两次派张骞出使西域,开辟丝绸之路,并先后以两位公主刘细君、刘解忧和亲西域大国乌孙,而达到离间西域和匈奴关系,进而联络西域的目的。 汉武帝晚年笃信巫术,听信江充谗言,导致发生著名的“巫蛊之祸”,戾太子刘据被迫杀江充而谋反,结果兵败而死,皇后卫子夫因此自杀。 }} === Übersetzungshilfe === Es ist noch keine Übersetzungshilfe vorhanden <noinclude> {{Navigation zurückhochvor| zurücktext=Lektion 714| zurücklink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 714| hochtext=Buch Vokabellektionen| hochlink=Vokabeltexte_Chinesisch/_Vokabellektionen| vortext=Lektion 716| vorlink=Vokabeltexte_Chinesisch/_Vokabellektionen/ Lektion 716}} </noinclude> m8rbpp1b2mkys9t1rsy587xqmc81lot Benutzer:Yomomo/ Admin 2 108343 1082869 1082472 2026-04-07T05:34:27Z Yomomo 36494 1082869 wikitext text/x-wiki Admin: ●[https://de.wikibooks.org/wiki/Kategorie:Wikibooks:_Schnelll%C3%B6schkandidaten SL] ●[https://de.wikibooks.org/wiki/Spezial:Neue_Seiten?namespace=all&tagfilter=&username=&size-mode=min&size=&wpFormIdentifier=newpagesform&limit=500 NS] ●[https://de.wikibooks.org/wiki/Spezial:Letzte_Änderungen?userExpLevel=unregistered&hidebots=1&hidecategorization=1&hideWikibase=1&limit=500&days=7&enhanced=1&urlversion=2 LÄU] ●[[Spezial:Logbuch/newusers|NU]] <math>\qquad</math>Projekte:●[[Mathematrix:_AT_PSA/_Stoffaufbau|PSA]]●[[Propaganda|Pro]]●[[Permakultur|Per]] ●[[Mathematrix|MX]] ●[[Mathematrix: Werkzeuge|MxW]] ●[[Benutzer:Yomomo/_Bausteine|Bau]] ●[[Natur_und_Technik_für_den_Pflichtschulabschluss|NuT]] ●[[Natur_und_Technik_für_den_Pflichtschulabschluss: Vorlagen|NuTV]] ●[[Benutzer:Yomomo/_NuT|NuTB]] ●[[Benutzer:Yomomo/ LZ#Deutsch Adjektive|DEAdj]]●[[Mathematrix:_AT_AHS/_Stoffaufbau|AHS]] <math>\qquad</math>Wikis: ●[https://de.wikipedia.org/wiki/Spezial:Beobachtungsliste?hidepreviousrevisions=1&hidecategorization=1&hideWikibase=1&limit=250&days=30&urlversion=2 de] ●[https://en.wikipedia.org/wiki/Special:Watchlist?hidepreviousrevisions=1&hidecategorization=1&hideWikibase=1&limit=250&days=30&urlversion=2 en] ●[https://el.wikipedia.org/wiki/%CE%95%CE%B9%CE%B4%CE%B9%CE%BA%CF%8C:%CE%9B%CE%AF%CF%83%CF%84%CE%B1%CE%A0%CE%B1%CF%81%CE%B1%CE%BA%CE%BF%CE%BB%CE%BF%CF%8D%CE%B8%CE%B7%CF%83%CE%B7%CF%82?hidepreviousrevisions=1&hidecategorization=1&hideWikibase=1&limit=500&days=20&urlversion=2 gr] ●[https://es.wikipedia.org/wiki/Especial:Seguimiento?hidepreviousrevisions=1&hidecategorization=1&hideWikibase=1&limit=250&days=30&urlversion=2 es] * [[Benutzer:Yomomo/_LZ|Hilfe für andere Benutzer]] PSA G1 00001.webm PSA G1 00002.webm PSA G1 00003.webm PSA G1 00004.webm PSA G1 00005.webm PSA G1 00006.webm PSA G2 00001.webm PSA G2 00002.webm PSA G2 00003.webm PSA G2 00004.webm PSA G2 00005.webm PSA G2 00006.webm PSA G2 00007.webm PSA G2 00008.webm PSA G2 00009.webm PSA G2 00010.webm PSA G2 00011.webm PSA G2 00012.webm PSA G2 00013.webm PSA V1 00001.webm PSA V1 00002.webm PSA V1 00003.webm PSA V1 00004.webm PSA V1 00006.webm PSA V1 00007.webm PSA V1 00008.webm PSA V1 00009.webm PSA V1 00010.webm PSA V1 00011.webm PSA V2 00001.webm PSA V2 00004.webm PSA V2 00005.webm PSA V2 00008.webm fpuaput3qh3v3gq1c1px4zzaxbzjadu Ing Mathematik: Python 0 117969 1082852 1082850 2026-04-06T12:11:08Z Intruder 1513 /* Mit VTK */ Tippf. korr. 1082852 wikitext text/x-wiki {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} = Hallo Welt und allgemeine Hinweise = == Was ist Python == * Python ist eine universelle höhere Programmiersprache. * Python ist objektorientiert. * Python ist Open-Source (Python Software Foundation License). * Python ist für viele Betriebssysteme erhältlich (z.B. für Linux, MS Windows, macOS). * Python ist ein Interpreter. * Python ist durch Module fast beliebig erweiterbar. * Python als Programmiersprache ist case-sensitive - d.h. Groß- und Kleinschreibung ist relevant bei der Eingabe von Befehlen. {{Wikipedia | Python (Programmiersprache)}} == Python installieren == === MS Windows === Laden Sie das aktuelle Python-Paket von der Webseite [https://www.python.org/] herunter. Weiter geht es wie bei jedem anderen größeren zu installierenden Programm. Einfach das Installationsprogramm im Explorer doppelklicken und den Anweisungen des Setup-Programmes folgen. === Linux === Entweder ist Python bereits standardmäßig installiert, ansonsten ist die Installation mittels Paketmanagementsystem einfach möglich. Aber auch die Spyder-Entwicklungsumgebung ([https://www.spyder-ide.org]) bietet einen guten Einstieg mit Python (das gilt auch für MS Windows). Spyder bringt auch schon etliche wichtige Module standardmäßig mit. == Python starten == === MS Windows === Das Icon für das Python-Programm doppelklicken. Und schon startet das Programm. [[Datei:PythonIng_start1.jpg]] Python im interaktiven Modus präsentiert sich dann so: Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> Alternativ kann das Programm auch über die Eingabeaufforderung oder die PowerShell gestartet werden: c:\devel\Python>python.exe Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> === Linux === Tippen Sie einfach das Wort „python“ (oder unter openSUSE Tumbleweed z.B. auch „python3.11“ oder „python3.13“) in einem Linux-Terminal ein, schließen den Befehl mit der RETURN-Taste ab, und schon startet Python im interaktiven Modus: Python 3.13.12 (main, Feb 09 2026, 22:37:44) [GCC] on linux Type "help", "copyright", "credits" or "license" for more information. >>> Es gibt auch noch andere Möglichkeiten Python zwecks Programmausführung zu starten, z.&nbsp;B. den {{W|Shebang}} (<code>#!</code>) am Beginn eines Python-Scripts. Das Script sei als Script.py gespeichert. Dann kann das Script mit ./Script.py ausgeführt werden. Für openSUSE Tumbleweed sei nachfolgend ein lauffähiges "Hallo Welt!"-Script angegeben. Es wird in diesem Script der Python-Interpreter in der Version 3.13 verwendet : #!/usr/bin/python3.13 print("Hallo Welt!") Die Berechtigungen zum Ausführen der Datei müssen natürlich noch richtig gesetzt werden, z.B. mittels <code>chmod 777 Script.py</code>. <small>Oder es wird in einen Pfad verschoben, in dem sich ausführbare Programme generell befinden (<code>echo $PATH</code>). Das Script kann dann wie ein normales Programm ohne weitere Angaben mit Script.py gestartet werden. Alternativ wird nicht das Script an sich verschoben, sondern nur ein symbolischer Link angelegt, z.B. mit <code>ln -s ~/tmp/Script.py ~/.local/bin/Script.py</code>.<code>~/.local/bin</code> sei ein im PATH gelegenes Verzeichnis. Dies sind aber schon Features für fortgeschrittene Linux-Benutzer und werden am Anfang eher selten benötigt.</small> == Ein paar Worte zur Erklärung == Getestet wurden die Beispiele unter den Betriebssystemen * MS Windows 10 mit der Python-Version 3.12.0 (teilweise auch mit 3.12.2 und 3.13.1; nur die Inhalte die bis spätestens Juli 2025 erstellt wurden) * MS Windows 11 ab der Python-Version 3.13.4 (nur zum Teil; ab Juli 2025) * openSUSE Leap 15.6 mit der Python-Version 3.11.12 (Spyder, nur vereinzelt) und zum Teil mit 3.12.11 (ab Juli 2025 bis November 2025). * openSUSE Tumbleweed ab der Python-Version 3.13.9 (nur vereinzelt, ab November 2025) An Beliebtheit rangiert Python mit Stand März 2026 mit einem Rating von 21,25% an 1. Stelle vor C und C++ (lt. [https://www.tiobe.com/tiobe-index/ TPCI - TIOBE Programming Community Index]). Lt. [https://innovationgraph.github.com/global-metrics/programming-languages GitHub Top 50 Programming Languages Globally] lag Python im Q3/2025 auf Rang 2, vor TypeScript und hinter JavaScript. Der Name "Python" rührt von der Komikertruppe {{W|Monty Python}} her. Die Icons für Python (z.B. Python selbst, Eric IDE, IDLE) sind aber durch die Python-Schlangenart symbolisiert. <gallery> Python-logo-notext.svg|Python-Logo Guido van Rossum OSCON 2006.jpg|Guido van Rossum (geb. 1956), der Erfinder von Python </gallery> == Ein erstes Programm == Kommentare werden in Python mit der Raute (#) eingeleitet. Sie werden vom Python-Interpreter ignoriert. Text kann mit der print-Funktion ausgegeben werden. Starten Sie Python und geben sie folgende Anweisungen zeilenweise ein >>> # Das ist ein Kommentar >>> print("Hallo Welt!") Als Ergebnis erhalten Sie Hallo Welt! Der Prompt (>>>) ist selbstverständlich nicht einzutippen, sondern wird vom Python-System geliefert. Strings können in Python entweder in Anführungszeichen (") gesetzt werden oder in Hochkommatas('). In diesem Text wird die erste Variante bevorzugt eingesetzt. Im Gegensatz zu Julia ist es hier egal, ob zwischen <code>print</code> und der öffnenden Klammer Leerzeichen stehen. = Python als Taschenrechner = == Allgemeines == Wir wollen 3 * 5 berechnen. Dazu starten wir Python im interaktiven Modus. Geben Sie dann die Formel >>> 3 * 5 ein, drücken die Taste ENTER/RETURN ({{Taste|↵}}) und erhalten als Ergebnis 15 Auch kompliziertere Ausdrücke sind möglich. Beispielsweise mit Winkelfunktionen, Quadratwurzeln etc. Wir wollen nun den Ausdruck <math>\sin\sqrt{15}</math> berechnen : >>> import math >>> math.sin(math.sqrt(15)) -0.6679052983383519 Als erstes wird das math-Modul importiert. Dann wird der mathematische Ausdruck berechnet. Eine andere Variante, die dasselbe Ergebnis liefert, ist >>> from math import * >>> sin(sqrt(15)) -0.6679052983383519 Es wird also aus dem Modul <code>math</code> alles importiert (erkennbar am <code>*</code>). Will man nicht alles importieren, so kann man das auch einschränken: >>> from math import sin, sqrt Beenden lässt sich das Python-Programm durch Eingabe von <code>exit()</code> (und natürlich ist zur Bestätigung die RETURN-Taste zu drücken). == Die Hilfefunktion von Python == Bei Eingabe der Anweisung help() springt Python in den Hilfemodus. Eingabe: >>> help() Eingabe: help> math.sin Ausgabe: Help on built-in function sin in math: math.sin = sin(x, /) Return the sine of x (measured in radians). Für die komplette Python-Dokumentation siehe [https://docs.python.org/3/]. Verlassen kann man den Hilfemodus durch das Drücken von STRG-C. == Aufgaben == * Erkunden Sie die Tangensfunktion "tan" mittels Python-Hilfe (vergessen Sie nicht das math-Modul zu importieren und das <code>math.</code> vor <code>tan</code>) * Berechnen Sie mit Python den Ausdruck <math>\frac{1}{2}\cdot e^2 \cdot \tan(\pi/3)</math>. Siehe für die Exponentialfunktion im Python-Hilfesystem auch den Befehl <code>math.exp</code>. Alternativ kann auch die Konstante <code>math.e</code> eingesetzt werden. Potenzieren kann man bei Python mit dem **-Operator (z.B. 2**3 = 8). Für <math>\pi</math> gibt es <code>math.pi</code>. = Python als Scriptsprache = Häufig wird man aber kompliziertere Anweisungsfolgen verarbeiten müssen. Diese will man normalerweise nicht jedesmal neu eingeben, sondern in einer Datei speichern und diese Datei dann zur Ausführung bringen. Speichern Sie dazu folgenden Code in einer Textdatei, z.B. unter MS Windows als c:\tmp\test1.py # Das ist ein Kommentar print("Hallo Welt!") Python-Dateien werden mit der Dateiendung .py versehen. Achten Sie darauf, dass vor dem print keine Leerzeichen vorhanden sind. Das ist eine Python-Eigenheit. Wie wir später sehen werden, nutzt Python Einrückungen als syntaktisches Mittel, z.B. um bei Schleifen den Schleifenkörper zu kennzeichnen. Danach bringen Sie die Skriptdatei test1.py (sozusagen das Hauptprogramm) folgendermaßen zur Ausführung: 1) Starten Sie unter MS Windows die Eingabeaufforderung (oder alternativ auch die Windows PowerShell). Das sieht dann etwa so aus: Microsoft Windows [Version 10.0.19045.3693] (c) Microsoft Corporation. Alle Rechte vorbehalten. C:\Users\xyz> : <small>Falls jemand nicht weiß, wie man die Eingabeaufforderung startet: Eine Möglichkeit ist, einfach in der Taskleiste von Windows das "Start"-Symbol &nbsp;([[Image:Windows_logo_-_2021_(Black).svg|10px]])&nbsp; mit der rechten Maustaste anklicken. "Ausführen" auswählen (oder alternativ für die PowerShell unter Windows 10 den Eintrag "Windows PowerShell", unter Windows 11 den Eintrag "Terminal"). Im sich öffnenden Dialogfenster gibt man in die "Öffnen"-Zeile das Wort <code>cmd</code> ein und mit "OK" wird das Ganze bestätigt.</small> 2) Wechseln Sie mittels <code>cd c:\tmp</code> in das Verzeichnis c:\tmp 3) Angenommen, Sie haben Python unter dem Pfad <code>c:\devel\Python\</code> installiert. Starten Sie das Programm so (der Prompt <code>c:\tmp></code>ist natürlich nicht mit einzutippen): c:\tmp>c:\devel\Python\python.exe test1.py 4) Wie erwartet ergibt sich folgende Ausgabe am Bildschirm Hallo Welt! Die Vorgehensweise unter Linux ist prinzipiell gleich. Die kleinen Unterschiede, wie z.B. der Slash statt dem Backslash in Pfadangaben, sollten für Linux-Benutzer keine Hürde darstellen. == Variablen == Variablenbezeichner können aus Buchstaben (A-Za-z), Ziffern (0-9) und Underscores (_) bestehen, dürfen aber nicht mit einer Zahl beginnen. Führende Underscores haben u.a. im Kontext mit der Objektorientierten Programmierung eine spezielle Bedeutung und sollten nicht für "normale" Variablenbezeichner verwendet werden. Gültige Variablenbezeichner wären also: xyz x1 _wert name_anzahl Es gibt in Python etliche Schlüsselwörter (z.B. for, if oder return). Diese dürfen nicht als eigene Variablenbezeichner verwendet werden. Eine Liste aller Schlüsselwörter liefert das Script import keyword print(keyword.kwlist) <small>Übung: Speichern Sie dieses Script in eine Datei, z.B. in c:\tmp\test1.py. Führen Sie diese Datei aus, um die Liste der Schlüsselwörter auszugeben.</small> Da Python case-sensitiv ist, repräsentieren folgende Bezeichner verschiedene Variablen: xyz XYZ xYz Werte werden an Variablen mittels Gleich-Zeichen (=) zugewiesen. Im Folgenden wird der Code immer in der Datei c:\tmp\test1.py gespeichert. x = 5 y = 10 z = x*y print(z) Bringen Sie die Datei test1.py zur Ausführung so erhalten Sie folgende Bildschirmausgabe 50 Sie können auch mehrere Anweisungen in einer Zeile durch Semikolon getrennt schreiben. Dies führt aber zu unübersichtlichem Code. x = 5; y = 10; z = x*y; print(z) Ausgabe: 50 Auch aus der Programmiersprache C/C++ oder Java bekannte Konstrukte können Sie verwenden, z.B. x = 5 # x = x - 2 x -= 2 print(x) Bildschirmausgabe: 3 Beachten Sie, dass mit dem =-Zeichen eine Wertezuweisung durchgeführt wird. Dies ist nicht äquivalent zum mathematischen =-Zeichen, wie am vorigen Beispiel zu ersehen ist. Den Inkrement-/Dekrementoperator (z.B. x++ oder x--) aus C/C++ oder Java kennt Python aber nicht. Variablen sind nicht an einen bestimmten Datentyp gebunden, folgendes ist mit Python problemlos möglich: import math wert = 10 print(wert) wert = 35.5 print(wert) wert = "Hallo" print(wert) wert = math.pi print(wert) Ausgabe: 10 35.5 Hallo 3.141592653589793 == Physische und logische Zeilen == In Python muss eine Anweisung in einer logischen Zeile Platz finden. Wird eine Anweisung aber zu lang für eine Zeile, dann kann sie in mehrere physische Zeilen unterteilt werden. Dies kann einerseits durch einen Backslash am Ende einer Zeile geschehen, z.B. a = 2 + \ 5 Dies stellt eine logische Zeile dar, die in zwei physische Zeilen unterbrochen ist. Geklammerte Ausdrücke werden automatisch zu einer logischen Zeile verbunden, z.B. a = (2 + 5) Achtung: Im ersten Beispiel darf nach dem Backslash nichts mehr stehen, auch kein Kommentar. Dies trifft im zweiten Bespiel nicht zu, hier könnte noch ein Kommentar folgen, z.B. a = (2 + # Kommentar 5) Auch für Strings gibt es Möglichkeiten, diese auf mehrere Zeilen aufzuspalten. # Kurzer String str1 = "ABC" # Langer String str2 = """Hallo Welt, Grüetzi Schwyzer, Servus an alle""" # Backslash str3 = "UVW\ XYZ" print(str1) print(str2) print(str3) Ausgabe: ABC Hallo Welt, Grüetzi Schwyzer, Servus an alle UVWXYZ ==Hexadezimale, oktale, binäre und andere Zahlen== d = 1050 # Dezimalzahl h = 0xAA2 # Hexadezimalzahl o = 0o12 # Oktalzahl b = 0b100001101 # Binärzahl print(d) print(h) print(o) print(b) Ausgabe: 1050 2722 10 269 Groß- und Kleinbuchstaben sind in obigen Literalen übrigens egal. So kann man z.B. statt <code>0b1001</code> auch <code>0B1001</code> schreiben (siehe dazu [https://docs.python.org/3/reference/lexical_analysis.html#integer-literals]). Sie können auch dezimale in hexadezimale Zahlen umwandeln, usw.: h = hex(1050) # Dezimalzahl -> Hexadezimalzahl b = bin(1050) # Dezimalzahl -> Binärzahl o = oct(1050) # Dezimalzahl -> Oktalzahl print(h) print(b) print(o) Ausgabe: 0x41a 0b10000011010 0o2032 Gegeben sei die Zahl 121 zur Basis 3. Diese soll in eine Dezimalzahl umgewandelt werden. Das kann so geschehen: z = int("121", 3) print(z) Ausgabe: 16 Dass dies richtig ist, davon kann man sich folgendermaßen überzeugen: <math> 1 \cdot 3^2 + 2 \cdot 3^1 + 1 \cdot 3^0 = 9 + 6+ 1 = 16 </math> Zahlen übersichtlicher schreiben kann man auch mittels Underscore, z.B.: print("Eine Million (Variante 1) =", 1000000) print("Eine Million (Variante 2) =", 1_000_000) print("Eine Rechnung:", 2_000 * 400_000); Es ergibt sich bei beiden Varianten die gleiche Ausgabe. Variante 2 ist aber im Sourcecode leichter lesbar, detto die Zahlen in der Rechnung: Eine Million (Variante 1) = 1000000 Eine Million (Variante 2) = 1000000 Eine Rechnung: 800000000 == Strings und Platzhalter== Ein paar einfache Beispiele: print("Hallo {}" . format("Hugo")) print("Hallo {:s}" . format("Hugo")) print("Hallo %s" % "Hugo") Ausgabe: Hallo Hugo Hallo Hugo Hallo Hugo Python-Code (formatted string literals): str1 = "Hallo" str2 = "Hugo" print(f"{str1} {str2}") Ausgabe: Hallo Hugo Komplexere Beispiele: print("Hallo {} und {}" . format("Hugo", "Mike")) print("Hallo {name1} und {name2}" . format(name2="Hugo", name1="Mike")) # Füllzeichen: * # Bündigkeit: > (=rechts), < (=links), ^ (=zentriert) # Feldweite: 10 # Typ: s (=String), f (=Gleitkommazahl), d (=Dezimalzahl) etc. print("Hallo {:*>10s}" . format("Hugo")) print("Hallo {:*<10s}" . format("Hugo")) Ausgabe: Hallo Hugo und Mike Hallo Mike und Hugo Hallo ******Hugo Hallo Hugo****** Python-Code: str = "Hallo\t%s\t%7.2f\t%10.2e\t%i" % ("Hugo", 12.34567, 34.567, 264) print(str) Ausgabe: Hallo Hugo 12.35 3.46e+01 264 == Unicode == Neben den bekannten ASCII-Zeichen lassen sich Zeichen auch mittels Unicode beschreiben. Griechische Buchstaben oder komplexere mathematische Operatoren - all das sollte kein Problem sein. Siehe auch {{W|Unicode}}, {{W|Liste der Unicodeblöcke}} und {{W|Unicodeblock Mathematische Operatoren}}. Im Folgenden werden ein paar Zeichen (Allquantor, Nabla-Operator, Existenzquantor), die man aus der Mathematik kennt, erzeugt. ch1 = "\N{FOR ALL}" ch2 = "\N{NABLA}" ch3 = "\u2203" print(ch1, ch2, ch3) Ausgabe: ∀ ∇ ∃ <small>Diese Ausgabe ergibt sich z.B. mit der IDLE-Shell oder mit Cygwin. Beim Ausführen über die Windows-Eingabeaufforderung oder Windows PowerShell unter MS Windows 10 erfolgt keine korrekte Darstellung. IDLE ist die mit Python mitgelieferte IDE ('''I'''ntegrated '''D'''evelopment '''E'''nvironment, Integrierte Entwicklungsumgebung). Gegen Ende dieses Textes wird IDLE kurz beschrieben. Das Problem mit der Windows Eingabeaufforderung lässt sich aber umgehen. Man muss nur eine Schriftart auswählen, die die Zeichen kennt, z.B. "DejaVu Sans Mono". Dazu klicken Sie einfach bei der Eingabeaufforderung mit der rechten Maustaste oben auf die weiße Leiste und wählen im aufpoppenden Fenster den Menüpunkt "Eigenschaften". Es öffnet sich ein Dialogfenster. Über den Reiter "Schriftart" lässt sich nun die Schriftart einstellen. Unter MS Windows 11 oder openSUSE Leap 15.6 (bash-Konsole) gibt es dieses Problem ohnehin nicht.</small> == Reguläre Ausdrücke == Python kennt auch {{W|Regulärer Ausdruck|reguläre Ausdrücke}}. Dazu gibt es in Python das Modul <code>re</code>. Beipielsweise sollen alle Zahlen (<math>\text{zahl}\in\mathbb{N}_0</math>) in einem String gesucht und ausgegeben werden. Als String sei gegeben: <code>3x Grüße und 100 Kekse.</code> Das Muster (Pattern) ist <code>\d+</code>. <code>\d</code> steht für eine Dezimalziffer 0-9. Das Plus-Zeichen (+) steht symbolisch für ein oder mehrere Zeichen des vorherigen Ausdrucks. Hier also ein oder mehrere Dezimalziffern. Es wird die Funktion <code>findall</code> aus dem Modul <code>re</code>verwendet. Python-Code: from re import findall str = "3x Grüße und 100 Kekse." pat = "\\d+" # Doppel-Backslashes müssen verwendet werden, sonst gibt Python eine Warnung aus! # alternativ: pat = r"\d+" # oder: pat = "[0-9]+" numb = findall(pat, str) print(numb) Ausgabe: ['3', '100'] Python kennt noch viele weitere Möglichkeiten mittels regulärer Ausdrücke zu hantieren. Dies soll hier aber nicht vertieft werden, da das Thema schon ziemlich speziell und komplex ist. Bei Bedarf siehe aber z.B. die Bücher ''Weigend, Seite 380ff'' und ''Ernesti, Kaiser'' [https://openbook.rheinwerk-verlag.de/python/28_001.html] oder die Python-Dokumentation [https://docs.python.org/3/library/re.html]. Auch [[Python unter Linux: Reguläre Ausdrücke]] liefert ein umfangreiches und brauchbares Python-2-Kapitel zu den regulären Ausdrücken. Die dort gelisteten Beispiele müssten ggf. vor Verwendung auf Python-3 umgeschrieben werden. <small>Wie macht man das? Dazu siehe z.B. [https://openbook.rheinwerk-verlag.de/python/43_001.html], [https://portingguide.readthedocs.io/en/latest/] oder [https://www.digitalocean.com/community/tutorials/how-to-port-python-2-code-to-python-3]</small> <small>Es gibt auch ein externes Modul ''regex'', das bei Bedarf extra installiert werden muss ([https://pypi.org/project/regex/]). Es bietet zusätzliche Funktionalität und gründlicheren Unicode-Support. Dies sei hier aber nur der Vollständigkeit halber erwähnt.</small> == Verzweigungen == === if === Die IF-Verzweigung ist aus anderen Programmiersprachen bereits bekannt. In Pseudocode lässt sie sich folgendermaßen darstellen: WENN bedingung TRUE führe block1 aus SONST führe block2 aus ENDE In Python gibt es keinen expliziten ENDE-Kennzeichner. Stattdessen wird der Code durch Einrückungen strukturiert. Alles mit der gleichen Einrückungstiefe gehört zum selben Block. Dies zeichnet Python vor anderen Programmiersprachen aus. Die test1.py-Datei laute also wie folgt: x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: Der else-Zweig wird ausgefuehrt x ist groesser oder gleich 4 Man achte auch auf die Doppelpunkte in der if- und else-Zeile. Darauf vergisst man gerne, wenn man von anderen Programmiersprachen kommt. Folgendes wäre in Python ein Fehler (genauer gesagt ein IndentationError). x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Auch Nachstehendes würde nicht zum gewünschten Ergebnis führen (löst aber keine Fehlermeldung aus). Der letzte print-Befehl ist schon außerhalb der IF-ELSE-Verzweigung. x = 3 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: x ist kleiner als 4 x ist groesser oder gleich 4 Python kennt eine Reihe von Vergleichs- und Verknüpfungsoperatoren: <, <= ... kleiner (gleich) >, >= ... größer (gleich) == ... gleich != ... ungleich is ... identisch is not ... nicht identisch and ... AND or ... OR not ... NOT Beispielsweise: a = 5 b = 9 if a<=10 and b!=7: print("OK") else print("Nicht OK") Ausgabe: OK Der else-Block kann übrigens auch ersatzlos entfallen. Mehrfache Verzweigungen werden durch das elif-Konstrukt erstellt. a = 14 if a<=10: print("<=5") elif a>11 and a<15: print("11 bis 15") elif a>16 and a<20: print("16 bis 20") else: print(">=20") Ausgabe: 11 bis 15 In Python gibt es auch die Schlüsselwörter <code>True</code> (für wahr) und <code>False</code> (für falsch). Man beachte, dass sie mit Großbuchstaben beginnen. Andere Schreibweisen wären ein Fehler. Sie gehören zum Datentyp <code>bool</code>. Ihnen sind auch die Zahlen <code>1</code> und <code>0</code> zugewiesen. === match === Ab Python 3.10 gibt es auch die match-Anweisung. Dies ist das Python-Pendant für die switch-Anweisung in anderen Programmiersprachen, geht aber bei näherer Betrachtung weit darüber hinaus. Hier nur ein einfaches Beispiel: x = "Hello" match x: case "Servus" | "Ciao": # or print("Servus an alle") case "Grüetzi": print("Grüetzi Schwyzer") case _: # other, default, sonstiges ... print("Hallo Welt") Ausgabe: Hallo Welt Für nähere Details siehe z.B. [https://www.geeksforgeeks.org/python-match-case-statement/], [https://learnpython.com/blog/python-match-case-statement/], [https://docs.python.org/3/tutorial/controlflow.html#match-statements] und das Python Enhancement Proposal (PEP) 636 – Structural Pattern Matching: Tutorial [https://peps.python.org/pep-0636] und dort insbesondere den Anhang A - Quick Intro. <small><code>match, case, _</code> etc. sind sogenannte ''soft keywords''. Im Gegensatz zu den normalen Schlüsselwörtern dürfen ihnen auch Werte zugewiesen werden. Eine Liste der weichen Schlüsselwörter lässt sich durch <code>keyword.softkwlist</code> erstellen (die Anweisung gibt es seit Python 3.9). Siehe dazu auch [https://stackoverflow.com/questions/65800344/what-are-soft-keywords] und [https://docs.python.org/3/library/keyword.html#keyword.softkwlist].</small> == Schleifen == === while === Die WHILE-Schleife ist kopfgesteuert. Sie funktioniert wie aus anderen Programmiersprachen bekannt. In Pseudocode: SOLANGE bedingung TRUE führe block aus ENDE In Python: x = 0 while x <= 10: print(x) x += 1 Ausgabe: 0 1 2 3 4 5 6 7 8 9 10 === for === for x in range(6): print(x*2) Ausgabe: 0 2 4 6 8 10 Die Schleife läuft von 0 bis 5. Ausgegeben wird jeweils der Wert x*2. Aquivalent kann diese Schleife auch so geschrieben werden: for x in range(0, 11, 2): print(x) Die Ausgabe ist wie oben. Der Startwert sei 0, der Endwert ist 11-1 und die Schrittweite ist 2. Ein anderes Beispiel sei for x in "text": print(x) Ausgabe: t e x t == Schleifen abbrechen == === break === <code>break</code> bricht die Schleife ab und setzt mit dem nächsten Befehl außerhalb der Schleife fort. for var in range(100): print(var) if var == 5: break Ausgabe: 0 1 2 3 4 5 === continue === <code>continue</code> bricht den aktuellen Schleifendurchlauf ab und setzt mit dem nächsten Schleifendurchlauf fort. for var in range (11): if var == 5: continue print(var) Ausgabe: 0 1 2 3 4 6 7 8 9 10 == try - except == try: z1 = 12 / 0 print(z1) except ZeroDivisionError: print("Das Ergebnis ist unendlich") except: print("Kann nicht berechnet werden!") print("Bitte die Formel korrigieren!") Ausgabe: Das Ergebnis ist unendlich Es wird versucht, eine Zahl durch Null zu dividieren. Das ist nicht möglich, es wird eine Ausnahme ausgelöst. Das Programm springt daher in den except-ZeroDivisionError-Block und führt die dort gelisteten Anweisungen aus (in unserem Fall eine print-Anweisung). Würden wir dieses Programm ohne try-except ausführen, so ergibt sich aus z1 = 12 / 0 print(z1) folgende Fehlermeldung und ein unmittelbarer Programmabbruch Traceback (most recent call last): File "C:\tmp\test1.py", line 1, in <module> z1 = 12 / 0 ZeroDivisionError: division by zero Mit dem try-except-Mechanismus können also Ausnahmen oder Fehler aufgefangen und behandelt werden. In unserem Beispiel ist das eher trivial, aber bei größeren Programmen kann das durchaus Sinn machen. == pass == Ein leerer Block muss in Python mittels dem Schlüsselwort <code>pass</code> dargestellt werden. Z.B. x = 2 if x == 1: print("Wert ist ", x) else: pass Würde man das <code>pass</code> im else-Block weglassen, so würde man eine Fehlermeldung erhalten: IndentationError: expected an indented block after 'else' statement on line 5 = Funktionen = == Aufrufen von Funktionen == Funktionen sind uns im Rahmen dieses Kurses schon zuhauf begegnet. Sei es die print()-, die math.sin()- oder die hex()-Funktion. All diese Funktionen werden von Python zur Verfügung gestellt, ohne dass man sie explizit programmieren müsste. Aufgerufen werden diese Funktionen, indem man ihren Namen eintippt, gefolgt von runden Klammern. In diesen Klammern können noch Argumente übergeben werden. Auch Rückgabewerte sind möglich. == Funktionen selber schreiben == Funktionen werden mit dem def-Schlüsselwort (man definiert die Funktion) eingeleitet, danach folgt der Funktionsname, danach wiederum runde Klammern, in denen formale Argumente stehen können. Abgeschlossen wird die def-Zeile mit einem Doppelpunkt. Danach folgt der Funktionskörper. Dieser Funktionskörper muss wiederum eingerückt werden (wie von den Verzweigungen und Schleifen bekannt). Aufgerufen wird diese Funktion, indem man ihren Funktionsnamen eingibt, gefolgt von runden Klammern (ggf. mit den aktuellen Parametern). Z.B. # Funktion definieren def halloWelt(i): # i ... beliebige Ganzzahl print("Hallo " * i, end="") print("Welt!") # Funktion aufrufen halloWelt(3) Ausgabe: Hallo Hallo Hallo Welt! Unterschied zwischen formalen und aktuellen Parametern: [[Datei:PythonIng_func1.jpg]] <small>Aktuelle Parameter werden auch Argumente genannt.</small> Rückgabe von Funktionswerten: # Funktion definieren def mathFunc(a, b): r1 = a + b r2 = a * b return r1, r2 # Funktion aufrufen a, b = mathFunc(3, 5) # Ausgabe der zurückgegebenen Werte print(a) print(b) Ausgabe: 8 15 Vorgabeparameter, z.B.: def mathFunc(a=10, b=20): r1 = a + b r2 = a * b return r1, r2 a, b = mathFunc(3, 5) print(a) print(b) a, b = mathFunc(5) print(a) print(b) a, b = mathFunc(b=6) print(a) print(b) Ausgabe: 8 15 25 100 16 60 == Lambda-Funktionen == print((lambda a, b: a*b) (3, 5)) Ausgabe: 15 Eingeleitet wird eine Lambda-Funktion (auch Lambda-Form, Lambda-Operator oder anonyme Funktion genannt) mit dem Schlüsselwort <code>lambda</code>. Es folgen die formalen Argumente, danach ein Doppelpunkt, die Berechnungsvorschrift und ggf. abschliessend in Klammern die aktuellen Parameter. Man kann einer Lambda-Funktion auch einen Funktionsnamen geben und die Funktion über diesen Namen aufrufen, z.B. prod = lambda a, b: a*b print(prod(3, 5)) Als Ausgabe wird wieder die Zahl 15 geliefert. == Rekursive Funktionen == Funktionen können wiederum andere Funktionen aufrufen. Von einem rekursiven Funktionsaufruf spricht man, wenn die aufgerufene Funktion gleich der aufrufenden ist. def printFunc(i): if (i >= 5): return else: print("Hallo Welt") printFunc(i+1) printFunc(1) Ausgabe: Hallo Welt Hallo Welt Hallo Welt Hallo Welt == Funktionsannotationen == Python ist sehr flexibel, was Typen angeht. Im Vorhergehenden haben wir generell keine Typangaben gemacht. Will man Typen angeben, so bietet Python das Konzept der Funktionsannotation. def calcFunc(a:int, b:int) -> int: return a+b, a*b r1 = calcFunc(8, 9) r2 = calcFunc(8.0, 9.0) print(r1) print(r2) Ausgabe: (17, 72) (17.0, 72.0) Jetzt sieht man auf den ersten Blick, welche Typen der Programmierer im Sinn hatte, als er die Funktion erstellte. Das Problem dabei ist nur, dass es Python ziemlich egal ist, welche Typen man in Endeffekt eingibt. Im obigen Beispiel können statt Integer-Typen auch Float-Typen eingegeben werden. == Variadische Funktionen == Python-Code: def test1(a, *b): print(a); for c in b: print(c); test1("Hallo", "Welt", "Schweizer", "und alle anderen") Ausgabe: Hallo Welt Schweizer und alle anderen Mit dem Stern (auch als Splat-Operator bezeichnet) in der formalen Parameterliste bei der Funktion <code>test1</code> wird angezeigt, dass eine beliebige Anzahl von Argumenten übergeben wird. <small> Dies entspricht in etwa dem, was in anderen Programmiersprachen (PHP etc.) mittels Ellipse (<code>...</code>) angezeigt wird.</small> = Tupel, Listen und andere = [[Datei:Python 3. The standard type hierarchy.png|mini|hochkant=1.7|Datentypen und Strukturen]] Tupel, Listen und einige andere sind Datenstrukturen oder Sequenzen. Listen (z.B. eine Einkaufsliste) sind veränderbar (mutable). Ein Tupel kann dagegen nicht verändert werden (immutable). Listen werden beim Anlegen in eckige Klammern eingeschlossen, Tupel in runde Klammern. Beim Tupel können die Klammern auch weggelassen werden. Ein Tupel mit nur einem Element muss mit einem Beistrich abgeschlossen werden. Der Grund ist, dass Python sonst nicht entscheiden kann, ob ein Tupel angelegt werden soll, oder nur ein geklammerter Wert. Nachfolgend werden einige Operationen mit Listen und Tupel dargestellt. Als Gedächtnisstütze kann man sich den Unterschied zwischen Tupel und Liste ev. so leichter merken: : T'''u'''pel ... r'''u'''nde Klammern, '''u'''nveränderlich : L'''i'''ste ... eck'''i'''ge Klammern, veränderl'''i'''ch. # Liste und Tupel liste = [1, 2, "Hallo"] tupel = (1, 2, "Hallo") # Ausgabe von liste und tupel print(liste) print(tupel) # Ausgabe von Einzelelementen print(liste[1]) print(tupel[2]) # Element an Liste anhängen und einfügen liste.append(55) liste.insert(4, "Welt") print(liste) # Element aus Liste entfernen liste.remove(1) print(liste) # einige weitere Beispiele liste2 = [1,] tupel2 = 1, 2 tupel3 = (1,) print(liste2) print(tupel2) print(tupel3) Ausgabe: [1, 2, 'Hallo'] (1, 2, 'Hallo') 2 Hallo [1, 2, 'Hallo', 55, 'Welt'] [2, 'Hallo', 55, 'Welt'] [1] (1, 2) (1,) Zu den Datenstrukturen gehören weiters auch Mengen und Dictionaries. Mengen sind von der Mathematik bekannt, sie sind ungeordnet und es kommen keine mehrfachen Elemente vor. Dictionaries sind durch Schlüssel :Wert-Paare gekennzeichnet. Mengen werden beim Anlegen wie Dictionaries in geschweifte Klammern eingeschlossen. dict = {"vorname":"Hugo", "nachname":"Meister" } menge = {1, 1, 3, 4, 4, 4, "Hallo"} print(dict) print(menge) print(dict["vorname"]) Ausgabe: {'vorname': 'Hugo', 'nachname': 'Meister'} {1, 3, 4, 'Hallo'} Hugo Geschweifte Klammern ohne Inhalt stellen Dictionaries dar und keine Mengen: di = {} print(type(di)) Ausgabe: <class 'dict'> == List Comprehensions == Aus einer Eingabeliste soll eine Ausgabeliste erzeugt werden. Das kann folgendermaßen geschehen. Mathematische Schreibweise: <math>lc = \{2x|x\in\ \mathbb{N}, 1\le x < 11\}</math> Python-Code: lc = [x*2 for x in range(1,11)] print(lc) Ausgabe: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] Mathematische Schreibweise: <math>lc = \{2x | x \in \mathbb{N}, 1\le x < 11, x \bmod 2 = 0 \}</math> Python-Code: lc = [x*2 for x in range(1,11) if x%2 == 0] print(lc) Ausgabe: [4, 8, 12, 16, 20] Siehe auch {{W|List Comprehension}}. == Set Comprehensions == Dies ist sehr ähnlich wie im vorigen Abschnitt beschrieben. Es wird aber keine Liste, sondern eine Menge erzeugt. sc = {x*2 for x in range(1,11)} print(sc) Ausgabe: {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} == Listen zusammenführen - zip() == li1 = ["A", "B", "C", "D"] li2 = [1, 2, 3, 4] li3 = [5.5, 6.6, 7.7, 8.8] z = zip(li1, li2, li3) print(z) li4 = list(z) print(li4) Ausgabe: <zip object at 0x00000283B6C6AC80> [('A', 1, 5.5), ('B', 2, 6.6), ('C', 3, 7.7), ('D', 4, 8.8)] == Generatorausdruck == g = (i*2 for i in range(1,11)) print(g) t = tuple(g) print(t) print(t[1:3]) Ausgabe: <generator object <genexpr> at 0x00000241D2A4A5A0> (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) (4, 6) == Slicing == slice ... Scheibe, Teil, in Scheiben schneiden Beispiel: Zugriff auf Elemente eines geordneten sequentiellen Objekttyps (Liste, Tupel oder String): str1 = "Hallo" # Das erste Element wird mit dem Index 0 angesprochen # [start (inkl.) : stop (exkl.) : step (default=1)] str2 = str1[0:2] # Alternativ auch: str2 = str1[:2] print(str2) tup1 = (0,1,2,3) # Das letzte Element hat auch den Index -1, das vorletzte den Index -2 usw. tup2 = tup1[-3:-1] print(tup2) lst1 = [[1, 5, 10, 20], [30, 40, 50, 60]] lst2 = lst1[1][1] print(lst2) Ausgabe: Ha (1, 2) 40 Beispiel: Umdrehen von Strings str1 = "Hallo" str2 = str1[::-1] print(str2) Ausgabe: ollaH = Objektorientierte Programmierung = == Eine einfache Klasse == [[Datei:PythonIng_uml1.svg | 200px]] class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 fahr = Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die Klasse Fahrzeug wird durch das class-Schlüsselwort eingeleitet. raeder ist ein Klassenattribut und public. __init__ wird bei der Objekterzeugung automatisch aufgerufen. Man achte darauf, dass diese Methode immer mit zwei Unterstrichen eingeleitet und abgeschlossen wird. Instanzattributen wird das Wort self vorangestellt. Wir sehen uns z.B. das Attribut self.__geschwind an. Auch hier werden zwei Unterstriche verwendet. Das bedeutet, dass dieses Attribut private ist. Bei den Methoden wird immer self als erster Parameter angegeben. Beim Aufruf der entsprechenden Funktion wird das self aber nicht berücksichtigt. == Klassen importieren == Häufig ist es sinnvoll und übersichtlicher Klassen in eigenen Dateien zu speichern. Das sind dann eigene Module. Abgespeichert werden Sie mit der Endung py, wie bisher auch praktiziert. Aufgerufen werden Sie mit der import-Anweisung. Dann ist aber nur der Dateiname ohne Endung py zu verwenden. Klarer wird das mit einem Beispiel. Datei c:\tmp\fahrzeug.py class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 Datei c:\tmp\test1.py import fahrzeug fahr = fahrzeug.Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die üblichen import-Anweisungen lauten wie folgt: {| {{prettytable}} ! import-Befehl ! Instanz |- | import xyz || xyz.Klasse |- | import xyz as x || x.Klasse |- | from xyz import Klasse || Klasse |- | from xyz import * || Klasse |} Der Vorteil der ersten beiden import-Anweisungen ist, dass es kaum zu Namenskollisionen kommen kann. Dafür hat man bei den letzten beiden Varianten weniger Tipparbeit. == Vererbung == [[Datei:PythonIng_uml2.svg | 200px]] Datei fahrzeug.py: class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 class Luftfahrzeug(Fahrzeug): def __init__(self, geschwindigkeit, leistung, fluegel): super().__init__(geschwindigkeit, leistung) self.__flueg = fluegel def getFlueg(self): return self.__flueg Datei test1.py: import fahrzeug fahr = fahrzeug.Luftfahrzeug(150, 90, 4) print(fahr.getFlueg()) Ausgabe: 4 = Grafiken zeichnen = Für das Zeichnen von Grafiken wird hier das Modul <code>matplotlib</code> verwendet. <code>matplotlib</code> ist ein externes Modul und muss vor der ersten Verwendung installiert werden. Das geht so: # Starten Sie ein Terminal (bei Windows die Eingabeaufforderung). # Führen Sie darin folgenden Befehl aus <code>c:\devel\Python\Scripts\pip.exe install matplotlib</code> pip ist übrigens der Paketmanager von Python ({{W|Pip_(Python)}}). Optimalerweise installieren wir auch gleich das Modul <code>numpy</code> (Numerical Python). Wir werden es im Folgenden oft benötigen (nicht nur bei den Grafiken). Das funktioniert vom Prinzip her genauso, wie für <code>matplotlib</code> gezeigt. <small>Verwenden Sie Spyder, so sind diese Schritte nicht nötig. Spyder inkludiert diese Pakete standardmäßig. Unter openSUSE Tumbleweed lassen sich diese Pakete mittels YaST oder zypper installieren.</small> == 2D == === Graph einer Funktion === Es soll die cosh-Funktion im Intervall <math>x\in[-3,3]</math> gezeichnet werden. Der Programmcode lautet in der einfachsten Form: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh1.jpg]] Der Code ist quasi selbsterklärend. Das Untermodul pyplot des matplotlib-Moduls und das numpy-Modul werden importiert. x läuft von -3 bis +3. y wird für jeden x-Wert per Formel ausgerechnet. "plt.plot()" ist der Zeichenbefehl. "plt.show" ist notwendig, um das Fenster mit der Grafik anzuzeigen. Die Schrittweite 0.1 wurde so gewählt, um einen ausreichend glatten Verlauf des Graphen zu gewährleisten. Das ist immer ein Kompromiss zwischen Berechnungszeit und Ansehnlichkeit. Testen Sie einfach ein paar verschiedene Werte, um ein Gefühl dafür zu zu bekommen. "plt.grid()" zeichnet ein Gitter in die Grafik (kann auch weggelassen werden). Die Bezeichnungen plt und np könnten auch anders gewählt werden. Es ist aber Konvention, diese so wie hier gezeigt zu wählen. <small>Mit der im obigen Bild gezeigten Menüleiste kann die dargestellte Grafik nachträglich noch geändert werden (Zoom, Pan, Achsenparameter, Kurvenparameter etc.). Natürlich kann man das alles auch direkt programmieren. Wie das funktioniert wird ansatzweise etwas später gezeigt.</small> Ein etwas komplexeres Beispiel ist Folgendes: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) + 2**x plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh4.png]] Man beachte, dass im Gegensatz zu Octave und Julia der ominöse Punkt (.) bei 2**x mit Python nicht benötigt wird. Das macht das Programmiererleben etwas einfacher. === Graphen mehrerer Funktionen und weiteres === import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x") plt.plot(x, y2, label = "sin(x) * cos(x)") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh2.png]] Um die Linienstile etwas individueller zu gestalten, ist folgender Programmcode gedacht: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x", lw=5, ls="dotted") plt.plot(x, y2, label = "sin(x) * cos(x)", lw=3, ls="--") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh3.png]] === Funktion in Parameterdarstellung === Es soll die archimedische Spirale <math>x = t \cos(t), y = t \sin(t)</math> im Intervall <math>[0, 6\pi[</math> gezeichnet werden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.show() [[Datei:PythonIng_spirale1.png]] Diese Darstellung erscheint verzerrt. Will man gleiche Achsenskalierungen, so kann man den plt.axis()-Befehl verwenden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.axis("equal") plt.show() [[Datei:PythonIng_spirale2.png]] === Funktion in Polardarstellung === import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(projection="polar") r = np.arange(0, 1, 0.01) theta = r**3 line = ax.plot(theta, r) plt.show() [[Datei:PythonIng_polar1.png]] === Logarithmische Achsenskalierung === ==== Semilog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.semilogy() plt.show() Ausgabe: [[Datei:PythonIng_semilog1.png]] ==== LogLog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.loglog() plt.show() [[Datei:PythonIng_loglog1.png]] === Gefüllte Fläche === import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 3, 0.1) y1 = 3*x - 1 y2 = x**2 plt.plot(x, y1, x, y2, color='black') plt.fill_between(x, y1, y2, where=y1>=y2) plt.show() [[Datei:PythonIng_gefuellt.png]] === Linien, Pfeile, Rechtecke, Kreise und Texte === import matplotlib as mpl import matplotlib.pyplot as plt fig, ax = plt.subplots() r = mpl.patches.Rectangle((0, 0), 3, 3, angle=30, fill=False) c = mpl.patches.Circle((4, 4), 2, fill=False) ax.add_patch(r) ax.add_patch(c) ax.plot([-2, 7], [-2, 0], color="black") ax.arrow(0, 7, 5, 0, length_includes_head=True, head_width=0.5, head_length=1.5, color="black") ax.set_aspect("equal") plt.axis([-3, 8, -3, 8]) plt.show() [[Datei:PythonIng_linien_pfeile_etc.png]] Text kann mit <code>ax.text(x, y, "Text")</code> hinzugefügt werden, bspw. import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.text(0.1, 0.1, "Hallo") ax.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() Oder einfacher auch ohne <code>subplots</code> import matplotlib.pyplot as plt plt.text(0.1, 0.1, "Hallo") plt.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text1.png]] Auch Sonderzeichen (griechische Buchstaben etc.) können verwendet werden (siehe dazu auch [https://matplotlib.org/stable/users/explain/text/mathtext.html]). import matplotlib.pyplot as plt plt.text(.3, .5, r'$\Omega\ \psi\ \oint\ \nabla\ \dot a\ \frac{a}{b}\ a_b$', size="20") plt.show() [[Datei:PythonIng_text20.svg]] Jetzt wird noch gezeigt, wofür <code>subplots</code> sinnvoll eingesetzt werden können. import matplotlib.pyplot as plt fig, ax = plt.subplots(nrows=1, ncols=2) ax[0].text(0.1, 0.1, "Hallo") ax[1].text(0.1, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text2.png]] === Aufgaben === * Zeichnen Sie die Strophoide <math>x = \frac{a(t^2-1)}{t^2+1}, y = \frac{at(t^2-1)}{t^2+1}, a = 2, -3 \leq t \leq 3</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_strophoide.jpg]] * Zeichnen Sie die verschlungene Hypozykloide <math>x = (R-r)\cos t + c\cos\frac{R-r}{r}t, y = (R-r)\sin t - c\sin\frac{R-r}{r}t, c = 3, r = 2, R = 6, -15 \leq t \leq 15</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_hypozykloide.jpg]] * Testen Sie bei den obigen Übungsaufgaben verschiedene Linienstile und Farben. Farben können mit dem plt.plot()-Parameter color gewählt werden. * Testen Sie bei den obigen Übungsaufgaben verschiedene Werte für a, c, r und R. == 3D == === Räumliche Kurven === import matplotlib.pyplot as plt import numpy as np t = np.arange(0, 6*np.pi, 0.1) x = t * np.cos(t) y = t * np.sin(t) z = t fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot(x, y, z) plt.show() [[Datei:PythonIng_raumkurve1.png]] === Flächen === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z) plt.show() [[Datei:PythonIng_fläche1.png]] Das Ganze in Netzdarstellung läßt sich so programmieren: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.5) y = np.arange(0, 10, 0.5) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_wireframe(x, y, z) plt.show() [[Datei:PythonIng_fläche2.png]] Ein etwas komplexeres Beispiel: import matplotlib.pyplot as plt import numpy as np x = np.arange(0.1, 10, 0.1) y = np.arange(0.1, 10, 0.1) x, y = np.meshgrid(x, y) z1 = np.sin(x) + 3 * np.cos(y) z2 = np.sin(x) + np.log(y) z3 = x + np.cos(y) z4 = x**2 - y fig, ax = plt.subplots(subplot_kw={"projection": "3d"}, nrows=2, ncols=2) ax[0][0].plot_surface(x, y, z1) ax[0][1].plot_surface(x, y, z2) ax[1][0].plot_surface(x, y, z3) ax[1][1].plot_surface(x, y, z4) plt.show() [[Datei:PythonIng_subplot1.png]] Man beachte, dass man die Unterbilder im Bild nach dem Ausführen des Scripts z.B. mit der mittleren Maustaste einzeln drehen, oder über die Einträge in der Menüzeile einzeln bearbeiten kann. Mit ein paar Zeilen Programmtext lässt sich also eine Menge an Funktionalität generieren. Die Farbgebung lässt sich über <code>colormaps</code> variieren. import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm) plt.show() [[Datei:PythonIng_colormap1.png]] Es gibt eine Menge an Colormaps, z.B. <code>plasma, Greys, Dark2, ocean</code>. Zwecks detaillierterer Infos siehe die matplotlib-Dokumentation. <small>Verwendet man die IDE namens IDLE, so gibt es dort auch die automatische Codevervollständigung. D.h. es werden alle Möglichkeiten (in unserem Fall nach dem Eintippen von <code>cm.</code> alle verfügbaren Colormaps) angezeigt.</small> Die "edgecolor" und Linienbreite können auch frei gewählt werden: import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm, edgecolor="black", linewidth=1.0) plt.show() [[Datei:PythonIng_colormap2.png]] === Höhenlinien === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contour(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien1.png]] Etwas abgewandelt sieht das so aus: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() hl = ax.contour(x, y, z) ax.clabel(hl, inline = True) plt.show() [[Datei:PythonIng_höhenlinien2.png]] Und noch eine Variante sei gezeigt. import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contourf(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien3.png]] === Aufgaben === * Zeichnen Sie die räumliche Kurve <math>x = 2 \cdot \cosh(t)</math>, <math>y = 5 \cdot \sin(t)</math>, <math> z = t^{2} - t</math>, <math>0 \leq t \leq 3\pi</math>. * Zeichnen Sie die Fläche <math>z = \log(x) + \cos(y)</math>. == Animationen == === Mit matplotlib === Auch mit matplotlib sind Animationen möglich. Das ist ein bisschen komplizierter und wird deshalb hier nur mit einem sehr einfachen Beispiel dargestellt (bei Interesse siehe z.B. auch das [https://matplotlib.org/stable/users/explain/animations/animations.html#animations Animations using Matplotlib-Tutorial]). import matplotlib.pyplot as plt import matplotlib.animation as ani import matplotlib import numpy as np def update(frame): line.set_xdata(x[:frame]) line.set_ydata(y[:frame]) return (line) fig, ax = plt.subplots() x = np.arange(0, 10, .1) y = np.sin(x) line, = ax.plot(x[0], y[0]) ax.set(xlim=[0, 10], ylim=[-1, 1]) a = ani.FuncAnimation(fig=fig, func=update, frames=100, interval=20) plt.show() # Speichere die Animation in einem animierten GIF (optional) a.save(filename="c:/tmp/PythonIng_anim5.gif", writer="pillow") [[Datei:PythonIng_anim5.gif]] Es wird eine Sinuskurve auf den Bildschirm gezeichnet. In der letzten Zeile wird diese Animation in ein animiertes GIF gespeichert. Das ist natürlich optional und kann auch weggelassen werden. === Mit VPython === Aber auch mit dem Modul VPython lassen sich einfache 3D-Animationen erstellen. VPython ist ein externes Modul, das vorab installiert werden muss. Unter openSUSE Tumbleweed gibt es dzt. kein entsprechendes rpm-Paket. Die übliche Methode der Installation mittels YaST oder zypper ist somit nicht möglich. Auch eine direkte Verwendung von pip führt nur zu einer Fehlermeldung (<code>error: externally-managed-environment</code>). Es empfiehlt sich dort folgende Vorgehensweise: # Erstelle zuerst eine virtuelle Umgebung, z.B.: <code>python3.11 -m venv ~/tmp/venv1</code> # Wechsle das Verzeichnis: <code>cd ~/tmp/venv1/bin</code> # Installiere das entsprechende Paket: <code>./pip install vpython</code> # Führe das entsprechende Skript aus: <code>./python ~/tmp/test1.py</code> Aktuell (März 2026) ist dieses Programmpaket lt. der [https://vpython.org/presentation2018/install.html VPython-Homepage] nur für die Python-Versionen 3.8 bis 3.12 verfügbar. Ein Beispiel zu einer einfachen Animation wird nachfolgend geliefert. from vpython import * scene.width = 1200 scene.height = 600 scene.center = vector(20,0,0) scene.background = color.white cylinder(pos=vector(0,0,0), axis=vector(20,0,0), radius=5, color=color.blue) cone(pos=vector(0,0,0), axis=vector(-10,0,0), radius=5, color=color.blue) helix(pos=vector(20,0,0), axis=vector(40,0,0), radius=2, coils=10, thickness=0.5, color=color.blue) ball = sphere(pos=vector(20,0,0), color = color.green, radius = 1) ball.p = vector(0.15, 0, 0) toc = True while True: rate(200) if(ball.pos.x <= 60 and toc == True): ball.pos += ball.p else: toc = False ball.pos -= ball.p if(ball.pos.x <= 20 and toc == False): toc = True [[Datei:PythonIng_vpython_anim.JPG]] Idealerweise öffnet sich beim Ausführen des Scripts ein Browserfenster. Darin wird die programmierte Animation gezeigt (siehe auch den obigen Screenshot). Eine Größenänderung können Sie mit der mittleren Maustaste initiieren. Die Szenerie drehen können Sie mit der rechten Maustaste. === Mit VTK === Komplexer, aber auch mächtiger als VPython ist die Verwendung von VTK ('''V'''isualization '''T'''ool'''k'''it). Genauer gesagt des Python-Wrappers von VTK. Dieses externe Python-Modul muss vorab installiert werden (z.B. mittels YaST, pip oder in eine virtuelle Umgebung). VTK ist eine Softwarebibliothek zur 3D-Visualisierung und wurde ursprünglich in C++ geschrieben. Verbreitet eingesetzt wird diese Bibliothek in der Wissenschaft und Forschung, z.B. * in der medizinischen Bildgebung * für Strömungssimulationen * für Klimadaten Als einfaches Beispiel wird die Darstellung eines Zylinders gezeigt, der mit den Maustasten gedreht oder in der Größe geändert werden kann: import vtk # Zylinder erzeugen cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) # Geometrie in darstellbare Daten umwandeln mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) # Objekt in der Szene actor = vtk.vtkActor() actor.SetMapper(mapper) # Szene verwalten renderer = vtk.vtkRenderer() renderer.AddActor(actor) # Render-Fenster render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) # Maus/Tastatur-Steuerung interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) # Starten render_window.Render() interactor.Start() Ausgabe: [[Datei:PythonIng_VTK_1.png]] Gleiches Beispiel wie oben, aber mit einer Animationssequenz: import vtk import time cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) renderer = vtk.vtkRenderer() renderer.AddActor(actor) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) render_window.Render() time.sleep(0.01) Um den animierten Zylinder grün einzufärben, müssen Sie Folgendes im obigen Programm ergänzen (Farbnamen): colors = vtk.vtkNamedColors() actor.GetProperty().SetColor(colors.GetColor3d("Green")) Alternativ funktioniert auch das (RGB): actor.GetProperty().SetColor(0.0, 0.6, 0.0) Wie der Zylinder mit einer Textur versehen wird, zeigt folgendes Programm: import vtk import time cylinder = vtk.vtkCylinderSource() cylinder.SetResolution(30) cylinder.SetHeight(3.0) cylinder.SetRadius(1.0) cylinder.CappingOn() texture_coords = vtk.vtkTextureMapToCylinder() texture_coords.SetInputConnection(cylinder.GetOutputPort()) texture_coords.PreventSeamOn() reader = vtk.vtkJPEGReader() reader.SetFileName("PythonIng_textur.jpg") texture = vtk.vtkTexture() texture.SetInputConnection(reader.GetOutputPort()) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(texture_coords.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.SetTexture(texture) renderer = vtk.vtkRenderer() renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) renderer.AddActor(actor) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) renderWindow.Render() time.sleep(0.01) <gallery> PythonIng_textur.jpg | Textur-Datei PythonIng_VTK_2.png | Ausgabe (Screenshot) </gallery> Nun aber genug von VTK und der Erstellung von Grafiken, weiter geht es mit mathematischeren Themen. = Vektoren und Matrizen = == Zahlenfolgen == from numpy import * start = 0 stop = 10 step = 2 num = 10 r = arange(start, stop, step) l = linspace(start, stop, num) print("r = ", r) print("l = ", l) Ausgabe: r = [0 2 4 6 8] l = [ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556 6.66666667 7.77777778 8.88888889 10. ] == Vektoren == Vektoren sollten jedem aus der Linearen Algebra bekannt sein. === Arrays === In Python mit NumPy kann man Vektoren durch die Funktion array erzeugen. import numpy as np l1 = (-5, 3, 2) l2 = (1, 1, 4) a1 = np.array(l1) a2 = np.array(l2) a3 = a1 + a2 a4 = 2 * a2 print(a1) print(a2) print(a3) print(a3[2]) print(a4) Ausgabe: [-5 3 2] [1 1 4] [-4 4 6] 6 [2 2 8] === Zeilen- und Spaltenvektoren === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) print(z) print(s) Ausgabe: [ [-5 3 2] ] [[1] [1] [4]] === Skalarprodukt === import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) skalarprodukt = np.dot(a1, a2) print(skalarprodukt) Ausgabe: 6 === Vektorprodukt === <math>a\ast b=\left(\begin{array}{c} a_{1}\\ a_{2}\\ a_{3} \end{array}\right)\ast\left(\begin{array}{c} b_{1}\\ b_{2}\\ b_{3} \end{array}\right)=\left(\begin{array}{c} a_{2}b_{3}-a_{3}b_{2}\\ a_{3}b_{1}-a_{1}b_{3}\\ a_{1}b_{2}-a_{2}b_{1} \end{array}\right) </math> Python-Code: import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) vektorprodukt = np.cross(a1, a2) print(vektorprodukt) Ausgabe: [10 22 -8] === Transponierter Vektor === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) # transponierter Vektor z_tp = np.transpose(z) # transponierter Vektor s_tp = np.transpose(s) print(z_tp) print(s_tp) Ausgabe: [[-5] [ 3] [ 2]] [ [1 1 4] ] === Vektorfelder visualisieren === import matplotlib.pyplot as plt import numpy as np # Daten generieren x = np.arange(0, 10, 1) y = np.arange(0, 10, 1) X, Y = np.meshgrid(x, y) U = X * Y V = Y + X # Plotten fig, ax = plt.subplots() ax.quiver(X, Y, U, V, angles='xy') plt.show() Ausgabe: [[Datei:PythonIng_quiver1.png]] == Matrizen== import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) print(m1) Ausgabe: [[1 2 3] [4 5 6]] === Zugriff auf Matrizenelemente === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) # Element aus Zeile 2 und Spalte 3 (Achtung! Index startet bei Null) print(m1[1,2]) Ausgabe: 6 === Addition und Subtraktion von Matrizen === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) m2 = np.matrix([[0, 0, 2], [1, 3, 2]]) print(m1 + m2) print(m1 - m2) Ausgabe: [[1 2 5] [5 8 8]] [[1 2 1] [3 2 4]] === Transponierte Matrix === import numpy as np m = np.matrix([[1, 2, 3], [4, 5, 6]]) mt = np.transpose(m) print(m) print(mt) Ausgabe: [[1 2 3] [4 5 6]] [[1 4] [2 5] [3 6]] === Rang einer Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) rg = np.linalg.matrix_rank(m) print(rg) Ausgabe: 2 === Inverse Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) mi = np.linalg.inv(m) print(mi) Ausgabe: [[ 1. 0.6] [-0. -0.2]] === Multiplikation von Matrizen (falksches Schema) === import numpy as np m1 = np.matrix([[1, 3, 4], [0, -5, 1]]) m2 = np.matrix([[1, 2], [2, 3], [0, 2]]) print(m1 @ m2) Ausgabe: [[ 7 19] [-10 -13]] === Eigenwerte und Eigenvektoren === import numpy as np m = np.matrix([[5, 8], [1, 3]]) D,V = np.linalg.eig(m) # Eigenwerte print(D) # Eigenvektoren print(V) Ausgabe: [7. 1.] [[ 0.9701425 -0.89442719] [ 0.24253563 0.4472136 ]] === Teilmatrizen === import numpy as np m = np.matrix([[1, 3, 4], [0, -5, 1]]) print("m = ", m) # Erste Zeile extrahieren m1 = m[0,:] print("m1 = ", m1) # Das Element aus der 1. Zeile und der 2. Spalte extrahieren m2 = m[0,1] print("m2 = ", m2) # Zweite Spalte extrahieren m3 = m[:, 1] print("m3 = ", m3) Ausgabe: m = [[ 1 3 4] [ 0 -5 1]] m1 = [ [1 3 4] ] m2 = 3 m3 = [[ 3] [-5]] === Spezielle Matrizen === ==== Nullmatrix ==== import numpy as np z = np.zeros((3, 2)) print(z) Ausgabe: [[0. 0.] [0. 0.] [0. 0.]] ==== Einheitsmatrix ==== import numpy as np z = np.eye(3) print(z) Ausgabe: [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ==== Matrix mit lauter Einsen ==== import numpy as np z = np.ones((3, 2)) print(z) Ausgabe: [[1. 1.] [1. 1.] [1. 1.]] === Spärlich besetzte Matrizen === Das Thema spärlich besetzter Matrizen wird hier nur kurz angerissen. Nähere Details siehe unter dem Weblink [https://docs.scipy.org/doc/scipy/reference/sparse.html#module-scipy.sparse]. import numpy as np import scipy A = scipy.sparse.csr_array(np.eye(5)) print(A) Ausgabe: (0, 0) 1.0 (1, 1) 1.0 (2, 2) 1.0 (3, 3) 1.0 (4, 4) 1.0 = Lineare Gleichungssysteme = Sei <math>Ax = b</math> ein lineares Gleichungssystem. <math>A</math> sei die Koeffizientenmatrix, <math>x</math> der Lösungsvektor und <math>b</math> ein bekannter Vektor. Beispiel: import numpy as np A = np.array([[5, 1], [0, 2]]) b = np.array([1, 2]) x = np.linalg.solve(A, b) print(x) Ausgabe: [0. 1.] == Aufgabe == * Lösen Sie folgendes Gleichungssystem mittels Python (und zur Kontrolle auch händisch): 5x + 6y - 2z = 12 3x - y - 3z = 6 2x + 2y + 4z = 5 = Polynome = == Ein erstes einfaches Beispiel == Gegeben sei das Polynom <math>7x^3+5x^2+1</math>. In Python: import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p) Ausgabe: 3 2 7 x + 5 x + 1 == Einzelne Polynomwerte berechnen == import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p(1.5)) Ausgabe: 35.875 == Polynome integrieren und differenzieren == import numpy as np p = np.poly1d([7, 5, 0, 1]) # 1. Ableitung p1 = p.deriv() p2 = p.deriv(1) # 2. Ableitung p3 = p.deriv(2) # Integral p4 = p.integ() print(p1) print(p2) print(p3) print(p4) Ausgabe: 2 21 x + 10 x 2 21 x + 10 x 42 x + 10 4 3 1.75 x + 1.667 x + 1 x == Nullstellen bestimmen == import numpy as np p = np.poly1d([2, 5, 0, 4]) r = np.roots(p) print(r) Ausgabe: [-2.7621427 +0.j 0.13107135+0.84077099j 0.13107135-0.84077099j] == Aufgaben == * Berechnen Sie den Wert für x = 3 des Polynoms <math>y = 2x^4 - 3x^3 - x + 7</math>. * Differenzieren und integrieren Sie das Polynom <math>y = 2x^4 - 3x^3 - x + 7</math>. * Berechnen Sie die Nullstellen von <math>y = 7x^5 - 3x^2 + 12</math>. = Nichtlineare Gleichungen und Gleichungssysteme = == Nullstellenbestimmung == Löse eine beliebige Gleichung f(x) = 0, z.B. <math> f(x) = x^2 - 5\cos(x) - 10 = 0 </math>: import scipy import numpy as np def f(x): return x**2 - 5*np.cos(x) - 10 xstart = [-1, 1] # Startwerte xn = scipy.optimize.root(f, xstart) print(xn.x) Ausgabe: [-2.46813009 2.46813009] Funktionsgraph: [[Datei:octave_nichtlin2.jpg]] == Gleichungssysteme == SymPy ist ein externes Modul, das symbolisches Rechnen ('''Sym'''bolic '''Py'''thon) ermöglicht. Folgende Aufgabe ist dem Buch "Knorrenschild: Numerische Mathematik, Hanser, 2017, Seite 72" entnommen. Zu lösen ist das nichtlineare Gleichungssystem <math>f_1 = 2x_1 + 4x_2 = 0 </math> <math>f_2 = 4x_1 + 8x_2^3 = 0</math> Mit Python ist das so möglich: import sympy x1, x2 = sympy.symbols("x1 x2") f1 = 2*x1 + 4*x2 f2 = 4*x1 + 8*x2**3 s = sympy.solve((f1, f2), x1, x2) print(s) Ausgabe: [(-2, 1), (0, 0), (2, -1)] Plot: [[Datei:IngPython_nl_gleichung1.svg|500px]] = Komplexe Zahlen = Die imaginäre Einheit wird in Python durch den Buchstaben <code>j</code> symbolisiert. Darstellen kann man eine komplexe Zahl bekannterweise in mehreren Formen: * Kartesische Darstellung <math>z = \Re(z) + j \cdot \Im(z)</math> * Polardarstellungen <math>z = r \cdot (\cos(\phi) + j \cdot \sin(\phi)) = r \cdot e^{j\cdot \phi}</math> Die konjugiert komplexe Zahl ist <math>z^* = \Re(z) - j \cdot \Im(z)</math> Nachfolgend einige mathematische Operationen mit Python und NumPy. import numpy as np z1 = 2 + 5j # kartesische Darstellung z2 = 3 * np.exp(3j) # Polardarstellung # Addition res = z1 + z2 print("z1 + z2 = ", res) # Multiplikation res = z1 * z2 print("z1 * z2 = ", res) # Realteil res = np.real(z2) print("Realteil von z2 = ", res) # Imaginärteil res = np.imag(z2) print("Imaginaerteil von z2 = ", res) # Betrag res = np.abs(z1) print("Betrag von z1 = ", res) # Argument res = np.angle(z1) print("Argument von z1 = ", res) # Konjugiert komplexe Zahl res = np.conj(z1) print("Konjugiert komplexe Zahl von z1 = ", res) Ausgabe: z1 + z2 = (-0.9699774898013365+5.423360024179601j) z1 * z2 = (-8.05675510050068-14.003167400647481j) Realteil von z2 = -2.9699774898013365 Imaginaerteil von z2 = 0.4233600241796016 Betrag von z1 = 5.385164807134504 Argument von z1 = 1.1902899496825317 Konjugiert komplexe Zahl von z1 = (2-5j) = Interpolation = import numpy as np import scipy import matplotlib.pyplot as plt # Stützpunkte xp = np.arange(1, 6) yp = (0, -5, 2, 7, 6) ti = np.arange(1, 5, 0.01) i1 = scipy.interpolate.interp1d(xp, yp, kind = "linear") i2 = scipy.interpolate.interp1d(xp, yp, kind = "cubic") plt.plot(xp, yp, "rx") plt.plot(xp, i1(xp)) plt.plot(ti, i2(ti)) plt.show() Ausgabe: [[Datei:PythonIng_interpol1.png]] = Differenzialrechnung = == Numerisches Differenzieren == Als Beispiel differenzieren wir <math>y = 5x\sin{x}</math> und stellen das Ganze grafisch dar. from findiff import Diff import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) f = 5 * x * np.sin(x) dx = x[1] - x[0] # Ableitung d_dx = Diff(0, dx) df_dx = d_dx(f) # Grafik plt.plot(x, f, label = "y") plt.plot(x, df_dx, label = "y'") plt.grid() plt.legend(loc="best") plt.show() Ausgabe: [[Datei:octave_diff1.jpg]] <small>findiff ist ein externes Modul. Dieses muss installiert werden (z.B. so: ...\Python\Scripts\pip.exe install --upgrade findiff). Für die Vorgehensweise unter openSUSE Tumbleweed siehe das Kapitel VPython, nur dass das Ganze mit einer aktuelleren Python-Version exekutiert wird, z.B. mit Python 3.13. Das im Buch "Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler, Rheinwerk" verwendete Modul "scipy.misc" ist veraltet (deprecated ... missbilligt). Lt. [https://docs.scipy.org/doc/scipy-1.17.0/dev/roadmap-detailed.html#misc SciPy-Dokumentation für die Version 1.17.0] wurden alle entsprechenden Features schon entfernt.</small> == Symbolisches Differenzieren == Differenzieren Sie die Funktionen <math>f_1(x) = x^2</math> und <math>f_2(x) = \sin(x)\cos\left(\frac{x}{2}\right)</math>. import sympy x = sympy.symbols("x") f1 = x**2; f2 = sympy.sin(x) * sympy.cos(x/2.) d1 = sympy.diff(f1, x) d2 = sympy.diff(f2, x) print(d1) print(d2) Ausgabe: 2*x -0.5*sin(0.5*x)*sin(x) + cos(0.5*x)*cos(x) == Aufgaben == * Differenzieren Sie die Funktion <math>y = \log(x) + 10x</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. * Differenzieren Sie die Funktion <math>y = \frac{\sinh(x)}{(1+x)}</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. = Integralrechnung = == Numerisches Integrieren == Berechnen Sie das Integral <math>\int_{0}^{3}x^2 dx</math>. import scipy def f(x): return x**2 i = scipy.integrate.quad(f, 0, 3) print(i) Ausgabe: (9.000000000000002, 9.992007221626411e-14) Das trifft den exakten Wert 9.0 ziemlich genau. Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} dx</math>. import scipy import numpy as np def f(x): return 2**(-x) i = scipy.integrate.quad(f, 0, np.inf) print(i) Ausgabe: (1.4426950408889556, 4.486558477977586e-09) == Symbolisches Integrieren == Berechnen Sie <math>\int x^2 \text{d}x</math> und <math>\int \sin{x}\cos{\frac{x}{2}} \text{d}x</math>. import sympy x = sympy.symbols("x") f1 = x**2 f2 = sympy.sin(x) * sympy.cos(x/2.) i1 = sympy.integrate(f1, x) i2 = sympy.integrate(f2, x) print(i1) print(i2) Ausgabe: x**3/3 -0.666666666666667*sin(0.5*x)*sin(x) - 1.33333333333333*cos(0.5*x)*cos(x) Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} \text{d}x</math>. import sympy x = sympy.symbols("x") f = 2**(-x) i = sympy.integrate(f, (x, 0, sympy.oo)) print(i) Ausgabe: 1/log(2) Mit <code>sympy.pprint(i)</code> ließe sich letzere Ausgabe etwas schöner schreiben: 1 ────── log(2) Man beachtete, <code>log</code> steht hier für den natürlichen Logarithmus <code>ln</code>. == Aufgaben == * Integrieren Sie die Funktion <math>y = \log(x) + 10x</math> von 1 bis 5. * Integrieren Sie die Funktion <math>y = x^3</math> von 0 bis 4. * Integrieren Sie <math>\int x^x(\log (x) + 1)\mathrm dx</math> symbolisch. = Gewöhnliche Differenzialgleichungen = == DGL numerisch lösen == Für die Lösung von Differenzialgleichungen steht u.a. die Funktion scipy.integrate.solve_ivp() zur Verfügung. Diese Funktion implementiert auch das Runge-Kutta-Verfahren (RK45). {{Wikipedia | Runge-Kutta-Verfahren}} Beispiel <math>y' = x^2 + y^3</math>: import scipy import numpy as np import matplotlib.pyplot as plt def dy_dx(x, y): return x**2 + y**3 y0 = [1] xi = [0, 1] x = np.arange(0, 1, 0.01) z = scipy.integrate.solve_ivp(dy_dx, xi, y0, method="RK45", dense_output=True) y = z.sol(x) plt.plot(x, y.T) plt.grid() plt.show() [[Datei:PythonIng_dgl1.png]] == DGL symbolisch lösen == Beispiel <math>y' = x^2 + y^3</math>: import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) print(lsg) Ausgabe: [Eq(f(x), (-x**2)**(1/3)), Eq(f(x), (-x**2)**(1/3)*(-1 - sqrt(3)*I)/2), Eq(f(x), (-x**2)**(1/3)*(-1 + sqrt(3)*I)/2)] Mit <code>sympy.pprint</code> (pretty print) lässt sich die Ausgabe etwas übersichtlicher darstellen. import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) sympy.pprint(lsg) Ausgabe: ⎡ _____ _____ ⎤ ⎢ _____ 3 ╱ 2 3 ╱ 2 ⎥ ⎢ 3 ╱ 2 ╲╱ -x ⋅(-1 - √3⋅ⅈ) ╲╱ -x ⋅(-1 + √3⋅ⅈ)⎥ ⎢f(x) = ╲╱ -x , f(x) = ────────────────────, f(x) = ────────────────────⎥ ⎣ 2 2 ⎦ == Aufgaben == * Lösen Sie die Differenzialgleichung <math>y' = \frac{1}{x\cdot y}</math> mit Python. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>m' = -k\cdot m</math>. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>y' = \sqrt{|y|}</math>. =Rechnen mit wirklich großen Zahlen= Bekannt ist, dass Python kaum Einschränkungen beim Wertebereich von Ganzzahlen hat, z.B. print(10**300) Ausgabe (gekürzt): 100000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000 Ähnliches geht auch mit Gleitpunktzahlen, z.B. durch die Verwendung des Moduls mpmath: import mpmath print(mpmath.mpf(1500.4)**mpmath.mpf(300)) Ausgabe: 7.27975299218612e+952 Anderes Beispiel: from mpmath import mp, pi mp.dps = 100 print(pi) Ausgabe: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 mpmath kann noch einiges mehr, dazu sei aber auf die entsprechende Dokumentation auf der mpmath-Homepage verwiesen. mpmath ist Bestandteil von SymPy, kann aber auch separat installiert werden. =Regelungstechnische Aufgabenstellungen= Für regelungstechnische Aufgaben gibt es u.a. das externe Paket <code>control</code>. Hier soll nicht detailliert darauf eingegangen werden. Anhand eines Beispiels soll anschließend nur die Visualisierung in Form eines Bode-Diagramms und der Sprungantwort gezeigt werden. Gegeben sei ein P-Regler mit <math>R = \frac{5}{2}</math> und eine Strecke <math>S= \frac{1}{30s^3+20s^2+10s+1,5}</math>. Gesucht sei vorerst ein Bode-Diagramm für den offenen Regelkreis und das Führungsverhalten. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke # oder: G0 = ct.series(regler, strecke) Gw = ct.feedback(G0) ct.bode_plot(G0, label='G0') ct.bode_plot(Gw, label='Gw') plt.show() [[Datei:PythonIng_bode1.svg]] Nun noch für obiges Beispiel die Sprungantwort. Diese zeigt einige große Überschwinger, d.h. der Regler kann sicher noch optimiert werden. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke Gw = ct.feedback(G0) t, y = ct.step_response(Gw) plt.plot(t,y) plt.title('Sprungantwort') plt.xlabel('t') plt.ylabel('h(t)') plt.grid() plt.show() [[Datei:PythonIng_bode3.svg]] Einige weitere wichtige Daten (Phasenreserve, Amplitudenreserve, Durchtrittsfrequenz) lassen sich mittels der <code>control</code>-Funktion <code>margin()</code> ermitteln. Die Ortskurve lässt sich mit der Funktion <code>nyquist_plot()</code> zeichnen. Dies sei hier aber nicht weiter ausgeführt. ==Aufgaben== * Zeichen Sie mit Python die Ortskurve für obiges Beispiel. * Was passiert, wenn man die Reglerverstärkung weiter aufdreht (z.B. auf <math>R = \frac{25}{2}</math>)? * Wie sehen das Bode-Diagramm und die Sprungantwort aus, wenn ein PI-Regler verwendet wird? = Stereostatik etc. = Das Modul SymPy bietet einige Möglichkeiten einfache Bauwerke zu berechnen, z.B. Balken oder Fachwerke. Nachfolgend wird ein einfaches Fachwerk berechnet und gezeichnet. Python-Code: from sympy.physics.continuum_mechanics.truss import Truss t = Truss() # Knoten t.add_node(("A", -3, 0), ("B", 0, 0), ("C", 4, 0), ("D", 7, 0), ("E", 6, 1.5), ("F", 2, 3), ("G", -2, 1.5)) # Stäbe t.add_member(("AB","A","B"), ("BC","B","C"), ("CD","C","D")) t.add_member(("AG","A","G"), ("GB","G","B"), ("GF","G","F")) t.add_member(("BF","B","F"), ("FC","F","C"), ("CE","C","E")) t.add_member(("FE","F","E"), ("DE","D","E")) # Auflager; roller ... Loslager, pinned ... Festlager t.apply_support(("A","roller"), ("D","pinned")) # Einwirkende Kräfte t.apply_load(("G", 5, 270), ("E", 3, 90)) # Berechnung t.solve() print("Reaction Forces: ", t.reaction_loads) print("Internal Forces: ", t.internal_forces) # Fachwerk zeichnen p = t.draw() p.show() Ausgabe auf der Konsole: Reaction Forces: {'R_A_y': 4.20000000000000, 'R_D_x': 0, 'R_D_y': -2.20000000000000} Internal Forces: {'AB': 2.80000000000000, 'BC': 0.333333333333333, 'CD': -1.46666666666667, 'AG': -5.04777178564958, 'GB': -2.05555555555556, 'GF': -1.23413387432364, 'BF': 0.411111111111111*sqrt(13), 'FC': -0.3*sqrt(13), 'CE': 1.50000000000000, 'FE': 0.284800124843917, 'DE': 2.64407093534026} Zeichnung: [[File:PythonIng_fachwerk1.svg|300px]] Details zu diesem Thema siehe z.B. [https://docs.sympy.org/latest/modules/physics/continuum_mechanics/index.html Continuum Mechanics] oder [https://docs.sympy.org/latest/tutorials/physics/continuum_mechanics/index.html Continuum Mechanics Tutorials]. Auch andere mechanische Probleme werden von SymPy abgehandelt ([https://docs.sympy.org/latest/tutorials/physics/index.html Physics Tutorials]). == Aufgabe == Gegeben sei ein einseitig eingespannter Kragträger. Belastet wird er durch eine Einzellast am Trägerende. Für die Daten siehe folgende ASCII-Skizze: | 20 kN //|---> x | //| V //|---------------------- //| 10 m | Elastizitätsmodul E = 2,1*10⁵ N/mm² Flächenträgheitsmoment I = 0.001 m⁴ Berechnen Sie die Auflagerreaktionen, den Querkraft- und Biegemomentenverlauf, sowie die Verformungen. Stellen Sie dies mit Hilfe von SymPy graphisch und auch mittels Formeln dar. Verwenden Sie dazu auch pprint (pretty print) aus dem SymPy-Modul. Zwecks Lösungsansatz siehe die oben aufgeführte Seite "Continuum Mechanics Tutorials". Achten Sie auch auf die Einheiten! Kontrollieren Sie das Ganze mittels händischer Rechnung. In dem genannten Tutorial ist von "Singularity Functions" die Rede. Gemeint ist damit in diesem Kontext die {{W|Föppl-Klammer}}. Einige Python-Programme, vorrangig zu Maschinenelementen, finden sich auf [https://baymp.de/download_python.html BayMP für Python] (Balken, Zahnräder, Stabknickung usw.). = Stochastik = Die Stochastik ist ein sehr weites Feld. Hier werden nur einige wenige sehr einfache, aber wichtige Themen angerissen. Python stellt mit den Moduln math und statistics Software zu diesem Zwecke bereit. math und statistics sind bereits im Lieferumfang von Python enthalten. Aber auch mit den externen Modulen NumPy, SciPy und pandas kann man Stochastik in Python betreiben. Dies wird hier aber nicht gemacht. == Lageparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] m1 = statistics.mean(werte) m2 = statistics.mode(werte) m3 = statistics.median(werte) print("Arithmetischer Mittelwert = ", m1) print("Modalwert = ", m2) print("Median = ", m3) Ausgabe: Arithmetischer Mittelwert = 3.5 Modalwert = 1 Median = 3.0 == Streuungsparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] s = statistics.stdev(werte) print("Standardabweichung = ", s) Ausgabe: Standardabweichung = 2.6770630673681683 == Kombinatorik == import math n = 7 k = 5 print("n! = ", math.factorial(n)) print("Kombinationen (n über k) = ", math.comb(n, k)) Ausgabe: n! = 5040 Kombinationen (n über k) = 21 = Ein- und Ausgabe = == print == Die Anweisung print haben wir schon oft verwendet. Hier soll anhand von Beispielen kurz beschrieben werden, was der Befehl print leisten kann. print("Hallo", "Welt", 1, sep="-") print("Hallo", end=" ") print("Welt") Ausgabe: Hallo-Welt-1 Hallo Welt == input == a = int(input("Zahl 1: ")) b = int(input("Zahl 2: ")) print("a + b = ", a+b) Ausgabe (nach Eingabe der beiden Ganzzahlen): Zahl 1: 4 Zahl 2: 5 a + b = 9 == Aus Dateien lesen == Es seinen die datei.txt Hallo Welt. Wie geht es dir? ... und test1.py dat = open("datei.txt", mode = "r") print(dat.read()) dat.close() Ausgabe Hallo Welt. Wie geht es dir? ... Mit dem open()-Befehl wird die Datei datei.txt im Lesemodus geöffnet (r ... read). Mit dem read()-Befehl wird die Datei eingelesen und mittels print ausgegeben. == In Dateien schreiben == dat = open("datei.txt", mode = "a", encoding = "utf-8") dat.write("Hänge Zeile an\n") dat.close() Die Datei datei.txt sieht nach Abarbeitung des obigen Skripts nun so aus Hallo Welt. Wie geht es dir? ... Hänge Zeile an Es wird die Datei im Schreibmodus geöffnet (a ... append (anhängend), w ... write (überschreibend)). write() fügt hier also eine Zeile Text am Dateiende ein. close() schließt die Datei wieder. Das close() kann man sich mit der with-Anweisung auch sparen. with open("datei.txt", mode="a", encoding="utf-8") as dat: dat.write("Hänge Zeile an\n") = Benutzeroberflächen erstellen = == tkinter == {{Wikipedia | Tkinter}} Python bietet standardmäßig das Modul tkinter zur Programmierung von Benutzeroberflächen. Es müssen also bei der Verwendung von tkinter keine externen Module installiert werden. Hier wird eine (sehr) kurze Einführung in das Erstellen von grafischen Oberflächen mittels tkinter gegeben. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") win.minsize(300, 50) but = tk.Button(win, text = "Push the button") but.pack() win.mainloop() Ausgabe: [[Datei:PythonIng_gui1.jpg]] Ein etwas komplizierteres Beispiel sei nachfolgend gezeigt. Es sollen zwei Strings miteinander verknüpft und ausgegeben werden. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") def on_button_clicked(): str = ent1.get() + ent2.get() lab2["text"] = str ent1 = tk.Entry(win) ent2 = tk.Entry(win) lab1 = tk.Label(win, text="verknuepfen mit") lab2 = tk.Label(win, text="") but = tk.Button(win, text = "=", command=on_button_clicked) ent1.pack(side="left") lab1.pack(side="left") ent2.pack(side="left") but.pack(side="left") ent2.pack(side="left") lab2.pack(side="left") win.mainloop() Ausgabe (vor der Eingabe der Teilstrings): [[Datei:PythonIng_gui2.jpg]] Ausgabe (nach der Eingabe der Teilstrings und dem Drücken des =-Buttons): [[Datei:PythonIng_gui3.jpg]] == curses == {{Wikipedia | curses}} Mit dem curses-Modul lassen sich u.a. TUIs ('''T'''ext '''U'''ser '''I'''nterfaces) erstellen. Ein sehr einfaches Beispiel zur allgemeinen Funktionsweise wird nachstehend geliefert. import curses stdscr = curses.initscr() curses.start_color() curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) stdscr.clear() stdscr.addstr("Hallo Welt", curses.color_pair(1)) stdscr.refresh() stdscr.getch() curses.endwin() Als Ausgabe sollte <span style="color:#FF0000;">Hallo Welt</span> (rote Schrift auf weißem Hintergrund) auf dem Terminal/der Konsole erscheinen. Getestet wurde dies mit openSUSE Tumbleweed, Python-Version 3.13.12. Das entsprechende Python-curses-Package muss installiert sein. Allgemeine Informationen zur Terminal-/Konsolengröße und Cursorposition liefert folgendes Programm: import curses stdscr = curses.initscr() stdscr.addstr(3, 5, "LINES: %d" % curses.LINES) stdscr.addstr(4, 5, "COLS: %d" % curses.COLS) (y,x) = stdscr.getyx() stdscr.addstr(5, 5, "Momentane Cursorposition: [%d, %d]" % (y, x)) (y,x) = stdscr.getbegyx() stdscr.addstr(6, 5, "Koordinatenursprung: [%d, %d]" % (y, x)) (y,x) = stdscr.getmaxyx() stdscr.addstr(7, 5, "Fenstergröße: [%d, %d]" % (y, x)) stdscr.addstr(11, 2, "Taste drücken -> Ende") stdscr.refresh() stdscr.getch() curses.endwin() Es sollte sich in etwa folgende Ausgabe ergeben: LINES: 44 COLS: 110 Momentane Cursorposition: [4, 15] Koordinatenursprung: [0, 0] Fenstergröße: [44, 110] Taste drücken -> Ende Zur Funktionsweise von curses siehe auch das Wikibook [[ncurses]]. Zum Verständnis sind dort allerdings elementare Kenntnisse in der Programmiersprache C erforderlich. == Qt == {{Wikipedia | Qt (Bibliothek)}} Auch für das Qt-Framework gibt es eine Anbindung an Python. Nachfolgend ein einfaches Beispiel. import sys from PySide6.QtWidgets import QApplication, QLabel app = QApplication(sys.argv) label = QLabel("Hallo Welt!") label.show() sys.exit(app.exec()) Ausgabe: [[Datei:PythonIng_gui10.png]] == Gtk == {{Wikipedia | GTK (Programmbibliothek)}} Eine idente Ausgabe, wie oben für Qt gezeigt, erzeugt z.B. folgendes Gtk-Programm: import gi gi.require_version("Gtk", "4.0") from gi.repository import Gtk def on_activate(app): win = Gtk.ApplicationWindow(application=app) lab = Gtk.Label(label="Hallo Welt!") win.set_child(lab) win.present() app = Gtk.Application() app.connect('activate', on_activate) app.run(None) Auch für die Benutzung von Qt und Gtk müssen die jeweiligen Packages installiert sein. Getestet wurden die entsprechenden Python-Programme nur unter openSUSE Tumbleweed. Wie das GTK-Paket unter MS Windows 11 installiert wird, siehe z.B. [https://www.gtk.org/docs/installations/windows Setting up GTK for Windows]. Damit sei aber das Thema "Benutzeroberflächen erstellen" hier abgeschlossen, da dies schon ein sehr spezielles Aufgabengebiet ist, das eher Informatiker und nicht so sehr Ingenieure anspricht. Bei Bedarf siehe aber ggf. die entsprechenden Links unten in diesem Tutorial. Dort sind weiterführende Informationen zu finden. = Style Guide und flake8 = Wie man schönen und richtigen Python-Code schreibt, erfahren Sie in * [https://peps.python.org/pep-0008/ PEP 8 – Style Guide for Python Code] Ein Modul, das prüft, ob die Richtlinien im Style Guide eingehalten wurden, ist ''flake8'': * [https://flake8.pycqa.org/en/latest/ Flake8: Your Tool For Style Guide Enforcement] = Einige Integrierte Entwicklungsumgebungen (IDEs)= Werden Programmtexte größer und umfangreicher, so ist das Arbeiten mit der interaktiven Programmierumgebung bzw. das direkte Ausführen von Python-Skripten mühsam. Man wünscht sich z.B. Hilfen zum Debuggen oder die automatische Code-Vervollständigung. Zu diesem Zweck wurden IDEs (Integrated Development Environments) geschaffen. Von diesen seinen nachfolgend auszugsweise einige kurz beschrieben. Testen Sie einfach aus, welche davon für Sie bzw. für Ihr Python-Projekt geeignet sind. == IDLE == IDLE ist die mit dem Python-Programmpaket mitgelieferte IDE. Der Name leitet sich einerseits ab vom Monty-Python-Mitglied Eric Idle, andererseits steht es als Abkürzung für "'''I'''ntegrated '''D'''evelopment and '''L'''earning '''E'''nvironment. IDLE ist einfach zu bedienen, bietet aber schon einen beachtlichen Leistungsumfang. Nachfolgend wird ein Screenshot zu IDLE geliefert. Rechts ist das Editor-Fenster zu sehen, links die interaktive Programmierumgebung. Um das Beispiel selbst nachvollziehen zu können, starten Sie IDLE. Das geht ähnlich, wie Sie die interaktive Programmierumgebung von Python starten (nur, dass Sie eben das IDLE-Icon doppelklicken und nicht das Python-Icon. Unter Linux geben Sie einfach in einem Terminal <code>idle3.13</code> o. Ä. ein). Weiter geht es mit "File - Open - ...". Die auszuführende Datei auswählen (im konkreten Fall ein "Hallo-Welt"-Programm). Es erscheint das rechte Fenster. Dort "Run - Run Module" auswählen. Und schon wird im linken Fenster "Hallo Welt!" ausgegeben. [[Datei:PythonIng_idle1.jpg | 600px]] Siehe auch {{W|IDLE}}. == PyCharm == PyCharm ist ein kommerzielles Produkt. Es gab aber auch eine kostenlose Community Edition. Seit 2025 sind beide Varianten vereint. Für die ersten 30 Tage sind die Pro-Funktionen frei verfügbar, danach nur noch die Kernfunktionalitäten (oder man bezieht kostenpflichtig die Pro-Version). Zu beziehen ist PyCharm unter dem Weblink [https://www.jetbrains.com/pycharm/]. Nachfolgend ein etwas abgewandeltes "Hallo Welt"-Programm, editiert und ausgeführt mit PyCharm. [[Datei:PyCharm_IDE_2023_screenshot.png | 600px]] Siehe auch {{W|PyCharm}}. == Eric == Auch eric ist Open Source und steht unter der GNU General Public License Version 3 oder später. Zu beziehen ist diese Software unter [https://eric-ide.python-projects.org/]. [[Datei:Screenshot_Eric_4.png | 600px]] Siehe auch {{W|eric (Software)}}. <small> Unter openSUSE Tumbleweed sollte sich eric auch mit YaST installieren lassen. Bei mir gibt es aber dann beim Ausführen des eric-Programms eine Fehlermeldung (Stand März 2026): ... ModuleNotFoundError: No module named 'PyQt6.QtPdfWidgets' Umgehen kann man dieses Problem aber wieder mit dem Erstellen einer virtuellen Umgebung, in etwa so python3.13 -m venv ~/tmp/venv1 cd ~/tmp/venv1/bin ./python3.13 -m pip install --upgrade --prefer-binary eric-ide ./eric7_ide </small> == PyScripter == Vom Funktionsumfang vergleichbar mit den vorherigen IDEs ist PyScripter. Auch PyScripter ist Open Source. Die Projekt-Homepage findet sich auf [https://sourceforge.net/projects/pyscripter/]. PyScripter ist nur für MS Windows verfügbar. [[Datei:PythonIng_pyscripter1.jpg | 600px]] == Spyder IDE == Spyder enthält bereits eine stabile Python-Version und etliche Module (z.B. matplotlib, numpy, control). Ansonsten kann dieses Softwarepaket vom Funktionsumfang her mit den anderen genannten IDEs locker mithalten. Spyder wurde unter der MIT-Lizenz veröffentlicht. Diese Software findet sich auf [https://www.spyder-ide.org]. [[Datei:Spyder-windows-screenshot.png | 600px]] Siehe auch {{W|Spyder (Software)}} == Sonstige == Die genannten IDEs sind nicht die Einzigen. Es gibt, um dem Image Pythons als beliebteste Programmiersprache gerecht zu werden, noch einige andere. Sowohl Open Source-Programme als auch kommerzielle Programme sind im Web zu finden, z.B. Thonny oder {{W|Visual Studio Code}}. Braucht man den Umfang von ausgewachsenen IDEs nicht, so kann man auch normale Texteditoren verwenden (z.B. {{W|Geany}} oder {{W|Kate_(Texteditor)|Kate}}). = Debuggen und Testen = Das Debuggen und Testen von Programmen sind wichtige Bestandteile der Programmierung. Syntaxfehler lassen sich i.A. leicht beheben. Schwieriger ist das Eingrenzen von logischen Fehlern, die ev. nur in bestimmten Situationen auftreten und keine explizite Fehlermeldung hervorrufen. Das Programm liefert falsche Ergebnisse oder es stürzt aus heiterem Himmel ab. Um das zu verhindern gibt es verschiedene Werkzeuge, die bei der Fehlersuche behilflich sein können. Vorerst siehe aber zwecks Begriffsklärung noch folgende Links: * {{W|Debuggen}} * {{W|Debugger}} * {{W|Softwaretest}} <gallery> First Computer Bug, 1947.jpg Test ganzheitlich.png V-Modell.svg </gallery> == Das Modul pdb == Python bringt schon ein Modul zum Debuggen mit. Siehe z.B. [https://docs.python.org/3/library/pdb.html pdb — The Python Debugger]. Komfortabler lässt sich das aber mittels Integrierter Entwicklungsumgebungen (IDEs) angehen. == Debuggen mit IDEs == Für die IDEs IDLE und Spyder sei kurz auf die entsprechenden Webseiten verwiesen: * [https://www.cs.uky.edu/~keen/help/debug-tutorial/debug.html Debugging under IDLE]. * [https://docs.spyder-ide.org/current/panes/debugging.html Spyder Debugger] Dort wird die Vorgehensweise auch mittels Screenshots erläutert. == assert == assert ... behaupten, zusichern ({{W|Assertion (Informatik)}}) Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10., 0.) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10., 0.) File "/home/hr/Develop/test1.py", line 4, in print1 assert y != 0.0 ^^^^^^^^ AssertionError Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1("10.", "5.") File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Aber auch bei nachfolgendem Code gibt es eine Fehlermeldung: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10, 5) File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Damit letzteres funktioniert, kann man den Programmcode so umschreiben: def print1(x, y): assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 2.0 Und jetzt fangen wir den <code>AssertionError</code> auf: def print1(x, y): try: assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) except(AssertionError): print("Hallo") print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Hallo Ich hoffe, es ist wenigstens im Ansatz klar geworden, wofür <code>assert</code> gut sein kann. Ausschalten kann man die <code>assert</code>-Überprüfung übrigens mit dem Python-Schalter <code>-O</code>. == Doctests == Innerhalb eines Docstrings kann die Arbeit im interaktiven Modus simuliert werden. Nach den Promptzeichen (>>>) erfolgen dann bei unserem Beispiel innerhalb des Docstrings simulierte Aufrufe der Funktion <code>print1()</code>. Danach folgen jeweils die Sollresultate. Wird das Modul oder die Datei als Hauptprogramm aufgerufen, so wird die Funktion <code>doctest.testmode()</code> aufgerufen und ein Bericht auf der Konsole ausgegeben. Wird das Modul nicht als Hauptprogramm aufgerufen, sondern importiert, dann wird diese <code>testmod</code>-Funktion nicht aufgerufen. D.h. dieser Code kann sowohl für Testzwecke als auch für den produktiven Einsatz verwendet werden. Das ist auch sinnvoll, weil wenn man Teile der Datei immer löschen bzw. einfügen müsste, so würden sich Fehlerquellen auftun. Das würde den Sinn und Zweck von Doctests konterkarieren. def print1(x=0., y=1.): """ Dividiere zwei Zahlen Autor: Intruder Datum: 12.08.2025 >>> print1(2., 1.) 2.0 >>> print1(5., 2.) 2.5 >>> print1(5.) 5.0 """ print(x/y) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) Ausgabe: Trying: print1(2., 1.) Expecting: 2.0 ok Trying: print1(5., 2) Expecting: 2.5 ok Trying: print1(5.) Expecting: 5.0 ok 1 items had no tests: __main__ 1 items passed all tests: 3 tests in __main__.print1 3 tests in 2 items. 3 passed and 0 failed. Test passed. Das gezeigte Beispiel ist so ziemlich das einfachste, das es gibt. Für weiterführende Details siehe z.B.: * [https://peps.python.org/pep-0257/ PEP 257 – Docstring Conventions] * [https://docs.python.org/3/library/doctest.html doctest — Test interactive Python examples] == pytest == Siehe zu diesem Thema auch {{W|Modultest}}. pytest ist ein externes Modul und muss vorab installiert werden, z.B. mittels pip install -U pytest pip install -U pytest-html Python-Code, Datei test1.py: def add(x, y): return x + y def test_answer(): assert add(1, 1) == 3 Starten von pytest in der Konsole: pytest test1.py Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py F [100%] ========================================================= FAILURES ========================================================== ________________________________________________________ test_answer ________________________________________________________ def test_answer(): > assert add(1, 1) == 3 E assert 2 == 3 E + where 2 = add(1, 1) test1.py:6: AssertionError ================================================== short test summary info ================================================== FAILED test1.py::test_answer - assert 2 == 3 ===================================================== 1 failed in 0.09s ===================================================== Hier erhalten wir einen Fehler, da 1+1 eindeutig ungleich 3 ist. Aber aus irgendeinem Grund wollte der Programmierer oder Tester in diesem Fall, dass dies so ist. Testfälle werden übrigens mit dem Präfix <code>test_</code> eingeleitet. Python-Code: def add(x, y): return x + y + 1 def test_answer(): assert add(1, 1) == 3 Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py . [100%] ===================================================== 1 passed in 0.01s ===================================================== Jetzt ist alles in Ordnung. Weiterführendes siehe z.B. * [https://docs.pytest.org/en/stable/ pytest: helps you write better programs] == unittest == Auch unittest dient zur Durchführung von Testreihen, ist aber Bestandteil von Python. Hier wird vorerst nicht näher darauf eingegangen. Siehe z.B. * [https://docs.python.org/3/library/unittest.html unittest — Unit testing framework] Lt. ''Inden: Python Challenge; dpunkt, 2021, Seite 481'' soll unittest weniger komfortabel als pytest sein. Einen Vergleich von unittest mit pytest findet man in * [https://knapsackpro.com/testing_frameworks/difference_between/pytest/vs/unittest pytest vs unittest] = Ausblick = Dies war eine kurze Einführung in die Berechnungs- und Darstellungsmöglichkeiten mit Python. Es sollten etliche relevante Themen behandelt, oder zumindest kurz angesprochen worden sein. Wem dieser Text nicht ausreichend ist, der sei auf die entsprechenden weiterführenden Weblinks, Bücher und die Python-Hilfefunktion verwiesen. Python kennt noch viel mehr Befehle, als hier dargestellt wurden. Das Themenspektrum ist auch durch die Einbindung externer Module fast beliebig erweiterbar. = Weblinks= == Python allgemein == * [https://www.python.org/ Python Homepage] == Externe mathematische Module == * [https://numpy.org/ NumPy] * [https://numpy.org/doc/stable/user/numpy-for-matlab-users.html NumPy for MATLAB users] * [https://scipy.org/ SciPy] * [https://www.sympy.org/en/index.html SymPy] * [https://pandas.pydata.org/ pandas] * [https://github.com/maroba/findiff findiff] * [https://mpmath.org/ mpmath] == Externe Module für Grafiken == * [https://matplotlib.org/ Matplotlib] * [https://vpython.org/ VPython] * [https://docs.vtk.org/en/latest/api/python.html VTK] == Erstellung von User Interfaces == * [https://docs.python.org/3/library/tkinter.html tkinter - Python interface to Tcl/Tk] * [https://docs.python.org/3/library/curses.html curses - Terminal handling for character-cell displays] * [https://wiki.qt.io/Qt_for_Python Qt for Python] * [https://www.gtk.org/docs/language-bindings/python GTK and Python] == Erstellen virtueller Umgebungen == * [https://docs.python.org/3/library/venv.html venv - Creation of virtual environments] == Sonstige == * [https://python-control.readthedocs.io/en/stable/ Python Control Systems Library] * [https://pypi.org/project/regex/ regex - Regular Expressions] = Bücher = == Gedruckte Bücher, OpenBooks, Magazine == * Diverse: c't Python Lernen, Verstehen, Anwenden; Heise, 2022 * Ernesti, Kaiser: Python3 - das umfassende Handbuch; 5. Aufl., Rheinwerk, [https://openbook.rheinwerk-verlag.de/python/ OpenBook] * Inden: Python Challenge; dpunkt, 2021, ISBN 978-3-86490-809-5 * Klein: Numerisches Python; 2. Aufl., Hanser, 2023, ISBN 978-3-446-47170-2 * Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler; Rheinwerk, 2021, ISBN 978-3-8362-7316-9 * Weigend: Python 3 - Das umfassende Praxisbuch; 9. Aufl., mitp, 2022, ISBN 978-3-7475-0544-1 * Woyand: Python für Ingenieure und Naturwissenschaftler; 4. Aufl., Hanser, 2021, ISBN 978-3-446-46483-4 == Andere Wikibooks == * [[:en:Subject:Python_programming_language | Englische Wikibooks zum Thema Python]] * [[Python|Deutschsprachiges Python-Wikibook]] [[Bild:2von10.png|20%]] * [[Python unter Linux|Python 2.7 unter Linux]] [[Bild:10von10.png|100%]] {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} 5q5qotyq035yxk5nn90o47gwzp6ncij 1082856 1082852 2026-04-06T12:26:34Z Intruder 1513 /* Mit VTK */ 1082856 wikitext text/x-wiki {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} = Hallo Welt und allgemeine Hinweise = == Was ist Python == * Python ist eine universelle höhere Programmiersprache. * Python ist objektorientiert. * Python ist Open-Source (Python Software Foundation License). * Python ist für viele Betriebssysteme erhältlich (z.B. für Linux, MS Windows, macOS). * Python ist ein Interpreter. * Python ist durch Module fast beliebig erweiterbar. * Python als Programmiersprache ist case-sensitive - d.h. Groß- und Kleinschreibung ist relevant bei der Eingabe von Befehlen. {{Wikipedia | Python (Programmiersprache)}} == Python installieren == === MS Windows === Laden Sie das aktuelle Python-Paket von der Webseite [https://www.python.org/] herunter. Weiter geht es wie bei jedem anderen größeren zu installierenden Programm. Einfach das Installationsprogramm im Explorer doppelklicken und den Anweisungen des Setup-Programmes folgen. === Linux === Entweder ist Python bereits standardmäßig installiert, ansonsten ist die Installation mittels Paketmanagementsystem einfach möglich. Aber auch die Spyder-Entwicklungsumgebung ([https://www.spyder-ide.org]) bietet einen guten Einstieg mit Python (das gilt auch für MS Windows). Spyder bringt auch schon etliche wichtige Module standardmäßig mit. == Python starten == === MS Windows === Das Icon für das Python-Programm doppelklicken. Und schon startet das Programm. [[Datei:PythonIng_start1.jpg]] Python im interaktiven Modus präsentiert sich dann so: Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> Alternativ kann das Programm auch über die Eingabeaufforderung oder die PowerShell gestartet werden: c:\devel\Python>python.exe Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> === Linux === Tippen Sie einfach das Wort „python“ (oder unter openSUSE Tumbleweed z.B. auch „python3.11“ oder „python3.13“) in einem Linux-Terminal ein, schließen den Befehl mit der RETURN-Taste ab, und schon startet Python im interaktiven Modus: Python 3.13.12 (main, Feb 09 2026, 22:37:44) [GCC] on linux Type "help", "copyright", "credits" or "license" for more information. >>> Es gibt auch noch andere Möglichkeiten Python zwecks Programmausführung zu starten, z.&nbsp;B. den {{W|Shebang}} (<code>#!</code>) am Beginn eines Python-Scripts. Das Script sei als Script.py gespeichert. Dann kann das Script mit ./Script.py ausgeführt werden. Für openSUSE Tumbleweed sei nachfolgend ein lauffähiges "Hallo Welt!"-Script angegeben. Es wird in diesem Script der Python-Interpreter in der Version 3.13 verwendet : #!/usr/bin/python3.13 print("Hallo Welt!") Die Berechtigungen zum Ausführen der Datei müssen natürlich noch richtig gesetzt werden, z.B. mittels <code>chmod 777 Script.py</code>. <small>Oder es wird in einen Pfad verschoben, in dem sich ausführbare Programme generell befinden (<code>echo $PATH</code>). Das Script kann dann wie ein normales Programm ohne weitere Angaben mit Script.py gestartet werden. Alternativ wird nicht das Script an sich verschoben, sondern nur ein symbolischer Link angelegt, z.B. mit <code>ln -s ~/tmp/Script.py ~/.local/bin/Script.py</code>.<code>~/.local/bin</code> sei ein im PATH gelegenes Verzeichnis. Dies sind aber schon Features für fortgeschrittene Linux-Benutzer und werden am Anfang eher selten benötigt.</small> == Ein paar Worte zur Erklärung == Getestet wurden die Beispiele unter den Betriebssystemen * MS Windows 10 mit der Python-Version 3.12.0 (teilweise auch mit 3.12.2 und 3.13.1; nur die Inhalte die bis spätestens Juli 2025 erstellt wurden) * MS Windows 11 ab der Python-Version 3.13.4 (nur zum Teil; ab Juli 2025) * openSUSE Leap 15.6 mit der Python-Version 3.11.12 (Spyder, nur vereinzelt) und zum Teil mit 3.12.11 (ab Juli 2025 bis November 2025). * openSUSE Tumbleweed ab der Python-Version 3.13.9 (nur vereinzelt, ab November 2025) An Beliebtheit rangiert Python mit Stand März 2026 mit einem Rating von 21,25% an 1. Stelle vor C und C++ (lt. [https://www.tiobe.com/tiobe-index/ TPCI - TIOBE Programming Community Index]). Lt. [https://innovationgraph.github.com/global-metrics/programming-languages GitHub Top 50 Programming Languages Globally] lag Python im Q3/2025 auf Rang 2, vor TypeScript und hinter JavaScript. Der Name "Python" rührt von der Komikertruppe {{W|Monty Python}} her. Die Icons für Python (z.B. Python selbst, Eric IDE, IDLE) sind aber durch die Python-Schlangenart symbolisiert. <gallery> Python-logo-notext.svg|Python-Logo Guido van Rossum OSCON 2006.jpg|Guido van Rossum (geb. 1956), der Erfinder von Python </gallery> == Ein erstes Programm == Kommentare werden in Python mit der Raute (#) eingeleitet. Sie werden vom Python-Interpreter ignoriert. Text kann mit der print-Funktion ausgegeben werden. Starten Sie Python und geben sie folgende Anweisungen zeilenweise ein >>> # Das ist ein Kommentar >>> print("Hallo Welt!") Als Ergebnis erhalten Sie Hallo Welt! Der Prompt (>>>) ist selbstverständlich nicht einzutippen, sondern wird vom Python-System geliefert. Strings können in Python entweder in Anführungszeichen (") gesetzt werden oder in Hochkommatas('). In diesem Text wird die erste Variante bevorzugt eingesetzt. Im Gegensatz zu Julia ist es hier egal, ob zwischen <code>print</code> und der öffnenden Klammer Leerzeichen stehen. = Python als Taschenrechner = == Allgemeines == Wir wollen 3 * 5 berechnen. Dazu starten wir Python im interaktiven Modus. Geben Sie dann die Formel >>> 3 * 5 ein, drücken die Taste ENTER/RETURN ({{Taste|↵}}) und erhalten als Ergebnis 15 Auch kompliziertere Ausdrücke sind möglich. Beispielsweise mit Winkelfunktionen, Quadratwurzeln etc. Wir wollen nun den Ausdruck <math>\sin\sqrt{15}</math> berechnen : >>> import math >>> math.sin(math.sqrt(15)) -0.6679052983383519 Als erstes wird das math-Modul importiert. Dann wird der mathematische Ausdruck berechnet. Eine andere Variante, die dasselbe Ergebnis liefert, ist >>> from math import * >>> sin(sqrt(15)) -0.6679052983383519 Es wird also aus dem Modul <code>math</code> alles importiert (erkennbar am <code>*</code>). Will man nicht alles importieren, so kann man das auch einschränken: >>> from math import sin, sqrt Beenden lässt sich das Python-Programm durch Eingabe von <code>exit()</code> (und natürlich ist zur Bestätigung die RETURN-Taste zu drücken). == Die Hilfefunktion von Python == Bei Eingabe der Anweisung help() springt Python in den Hilfemodus. Eingabe: >>> help() Eingabe: help> math.sin Ausgabe: Help on built-in function sin in math: math.sin = sin(x, /) Return the sine of x (measured in radians). Für die komplette Python-Dokumentation siehe [https://docs.python.org/3/]. Verlassen kann man den Hilfemodus durch das Drücken von STRG-C. == Aufgaben == * Erkunden Sie die Tangensfunktion "tan" mittels Python-Hilfe (vergessen Sie nicht das math-Modul zu importieren und das <code>math.</code> vor <code>tan</code>) * Berechnen Sie mit Python den Ausdruck <math>\frac{1}{2}\cdot e^2 \cdot \tan(\pi/3)</math>. Siehe für die Exponentialfunktion im Python-Hilfesystem auch den Befehl <code>math.exp</code>. Alternativ kann auch die Konstante <code>math.e</code> eingesetzt werden. Potenzieren kann man bei Python mit dem **-Operator (z.B. 2**3 = 8). Für <math>\pi</math> gibt es <code>math.pi</code>. = Python als Scriptsprache = Häufig wird man aber kompliziertere Anweisungsfolgen verarbeiten müssen. Diese will man normalerweise nicht jedesmal neu eingeben, sondern in einer Datei speichern und diese Datei dann zur Ausführung bringen. Speichern Sie dazu folgenden Code in einer Textdatei, z.B. unter MS Windows als c:\tmp\test1.py # Das ist ein Kommentar print("Hallo Welt!") Python-Dateien werden mit der Dateiendung .py versehen. Achten Sie darauf, dass vor dem print keine Leerzeichen vorhanden sind. Das ist eine Python-Eigenheit. Wie wir später sehen werden, nutzt Python Einrückungen als syntaktisches Mittel, z.B. um bei Schleifen den Schleifenkörper zu kennzeichnen. Danach bringen Sie die Skriptdatei test1.py (sozusagen das Hauptprogramm) folgendermaßen zur Ausführung: 1) Starten Sie unter MS Windows die Eingabeaufforderung (oder alternativ auch die Windows PowerShell). Das sieht dann etwa so aus: Microsoft Windows [Version 10.0.19045.3693] (c) Microsoft Corporation. Alle Rechte vorbehalten. C:\Users\xyz> : <small>Falls jemand nicht weiß, wie man die Eingabeaufforderung startet: Eine Möglichkeit ist, einfach in der Taskleiste von Windows das "Start"-Symbol &nbsp;([[Image:Windows_logo_-_2021_(Black).svg|10px]])&nbsp; mit der rechten Maustaste anklicken. "Ausführen" auswählen (oder alternativ für die PowerShell unter Windows 10 den Eintrag "Windows PowerShell", unter Windows 11 den Eintrag "Terminal"). Im sich öffnenden Dialogfenster gibt man in die "Öffnen"-Zeile das Wort <code>cmd</code> ein und mit "OK" wird das Ganze bestätigt.</small> 2) Wechseln Sie mittels <code>cd c:\tmp</code> in das Verzeichnis c:\tmp 3) Angenommen, Sie haben Python unter dem Pfad <code>c:\devel\Python\</code> installiert. Starten Sie das Programm so (der Prompt <code>c:\tmp></code>ist natürlich nicht mit einzutippen): c:\tmp>c:\devel\Python\python.exe test1.py 4) Wie erwartet ergibt sich folgende Ausgabe am Bildschirm Hallo Welt! Die Vorgehensweise unter Linux ist prinzipiell gleich. Die kleinen Unterschiede, wie z.B. der Slash statt dem Backslash in Pfadangaben, sollten für Linux-Benutzer keine Hürde darstellen. == Variablen == Variablenbezeichner können aus Buchstaben (A-Za-z), Ziffern (0-9) und Underscores (_) bestehen, dürfen aber nicht mit einer Zahl beginnen. Führende Underscores haben u.a. im Kontext mit der Objektorientierten Programmierung eine spezielle Bedeutung und sollten nicht für "normale" Variablenbezeichner verwendet werden. Gültige Variablenbezeichner wären also: xyz x1 _wert name_anzahl Es gibt in Python etliche Schlüsselwörter (z.B. for, if oder return). Diese dürfen nicht als eigene Variablenbezeichner verwendet werden. Eine Liste aller Schlüsselwörter liefert das Script import keyword print(keyword.kwlist) <small>Übung: Speichern Sie dieses Script in eine Datei, z.B. in c:\tmp\test1.py. Führen Sie diese Datei aus, um die Liste der Schlüsselwörter auszugeben.</small> Da Python case-sensitiv ist, repräsentieren folgende Bezeichner verschiedene Variablen: xyz XYZ xYz Werte werden an Variablen mittels Gleich-Zeichen (=) zugewiesen. Im Folgenden wird der Code immer in der Datei c:\tmp\test1.py gespeichert. x = 5 y = 10 z = x*y print(z) Bringen Sie die Datei test1.py zur Ausführung so erhalten Sie folgende Bildschirmausgabe 50 Sie können auch mehrere Anweisungen in einer Zeile durch Semikolon getrennt schreiben. Dies führt aber zu unübersichtlichem Code. x = 5; y = 10; z = x*y; print(z) Ausgabe: 50 Auch aus der Programmiersprache C/C++ oder Java bekannte Konstrukte können Sie verwenden, z.B. x = 5 # x = x - 2 x -= 2 print(x) Bildschirmausgabe: 3 Beachten Sie, dass mit dem =-Zeichen eine Wertezuweisung durchgeführt wird. Dies ist nicht äquivalent zum mathematischen =-Zeichen, wie am vorigen Beispiel zu ersehen ist. Den Inkrement-/Dekrementoperator (z.B. x++ oder x--) aus C/C++ oder Java kennt Python aber nicht. Variablen sind nicht an einen bestimmten Datentyp gebunden, folgendes ist mit Python problemlos möglich: import math wert = 10 print(wert) wert = 35.5 print(wert) wert = "Hallo" print(wert) wert = math.pi print(wert) Ausgabe: 10 35.5 Hallo 3.141592653589793 == Physische und logische Zeilen == In Python muss eine Anweisung in einer logischen Zeile Platz finden. Wird eine Anweisung aber zu lang für eine Zeile, dann kann sie in mehrere physische Zeilen unterteilt werden. Dies kann einerseits durch einen Backslash am Ende einer Zeile geschehen, z.B. a = 2 + \ 5 Dies stellt eine logische Zeile dar, die in zwei physische Zeilen unterbrochen ist. Geklammerte Ausdrücke werden automatisch zu einer logischen Zeile verbunden, z.B. a = (2 + 5) Achtung: Im ersten Beispiel darf nach dem Backslash nichts mehr stehen, auch kein Kommentar. Dies trifft im zweiten Bespiel nicht zu, hier könnte noch ein Kommentar folgen, z.B. a = (2 + # Kommentar 5) Auch für Strings gibt es Möglichkeiten, diese auf mehrere Zeilen aufzuspalten. # Kurzer String str1 = "ABC" # Langer String str2 = """Hallo Welt, Grüetzi Schwyzer, Servus an alle""" # Backslash str3 = "UVW\ XYZ" print(str1) print(str2) print(str3) Ausgabe: ABC Hallo Welt, Grüetzi Schwyzer, Servus an alle UVWXYZ ==Hexadezimale, oktale, binäre und andere Zahlen== d = 1050 # Dezimalzahl h = 0xAA2 # Hexadezimalzahl o = 0o12 # Oktalzahl b = 0b100001101 # Binärzahl print(d) print(h) print(o) print(b) Ausgabe: 1050 2722 10 269 Groß- und Kleinbuchstaben sind in obigen Literalen übrigens egal. So kann man z.B. statt <code>0b1001</code> auch <code>0B1001</code> schreiben (siehe dazu [https://docs.python.org/3/reference/lexical_analysis.html#integer-literals]). Sie können auch dezimale in hexadezimale Zahlen umwandeln, usw.: h = hex(1050) # Dezimalzahl -> Hexadezimalzahl b = bin(1050) # Dezimalzahl -> Binärzahl o = oct(1050) # Dezimalzahl -> Oktalzahl print(h) print(b) print(o) Ausgabe: 0x41a 0b10000011010 0o2032 Gegeben sei die Zahl 121 zur Basis 3. Diese soll in eine Dezimalzahl umgewandelt werden. Das kann so geschehen: z = int("121", 3) print(z) Ausgabe: 16 Dass dies richtig ist, davon kann man sich folgendermaßen überzeugen: <math> 1 \cdot 3^2 + 2 \cdot 3^1 + 1 \cdot 3^0 = 9 + 6+ 1 = 16 </math> Zahlen übersichtlicher schreiben kann man auch mittels Underscore, z.B.: print("Eine Million (Variante 1) =", 1000000) print("Eine Million (Variante 2) =", 1_000_000) print("Eine Rechnung:", 2_000 * 400_000); Es ergibt sich bei beiden Varianten die gleiche Ausgabe. Variante 2 ist aber im Sourcecode leichter lesbar, detto die Zahlen in der Rechnung: Eine Million (Variante 1) = 1000000 Eine Million (Variante 2) = 1000000 Eine Rechnung: 800000000 == Strings und Platzhalter== Ein paar einfache Beispiele: print("Hallo {}" . format("Hugo")) print("Hallo {:s}" . format("Hugo")) print("Hallo %s" % "Hugo") Ausgabe: Hallo Hugo Hallo Hugo Hallo Hugo Python-Code (formatted string literals): str1 = "Hallo" str2 = "Hugo" print(f"{str1} {str2}") Ausgabe: Hallo Hugo Komplexere Beispiele: print("Hallo {} und {}" . format("Hugo", "Mike")) print("Hallo {name1} und {name2}" . format(name2="Hugo", name1="Mike")) # Füllzeichen: * # Bündigkeit: > (=rechts), < (=links), ^ (=zentriert) # Feldweite: 10 # Typ: s (=String), f (=Gleitkommazahl), d (=Dezimalzahl) etc. print("Hallo {:*>10s}" . format("Hugo")) print("Hallo {:*<10s}" . format("Hugo")) Ausgabe: Hallo Hugo und Mike Hallo Mike und Hugo Hallo ******Hugo Hallo Hugo****** Python-Code: str = "Hallo\t%s\t%7.2f\t%10.2e\t%i" % ("Hugo", 12.34567, 34.567, 264) print(str) Ausgabe: Hallo Hugo 12.35 3.46e+01 264 == Unicode == Neben den bekannten ASCII-Zeichen lassen sich Zeichen auch mittels Unicode beschreiben. Griechische Buchstaben oder komplexere mathematische Operatoren - all das sollte kein Problem sein. Siehe auch {{W|Unicode}}, {{W|Liste der Unicodeblöcke}} und {{W|Unicodeblock Mathematische Operatoren}}. Im Folgenden werden ein paar Zeichen (Allquantor, Nabla-Operator, Existenzquantor), die man aus der Mathematik kennt, erzeugt. ch1 = "\N{FOR ALL}" ch2 = "\N{NABLA}" ch3 = "\u2203" print(ch1, ch2, ch3) Ausgabe: ∀ ∇ ∃ <small>Diese Ausgabe ergibt sich z.B. mit der IDLE-Shell oder mit Cygwin. Beim Ausführen über die Windows-Eingabeaufforderung oder Windows PowerShell unter MS Windows 10 erfolgt keine korrekte Darstellung. IDLE ist die mit Python mitgelieferte IDE ('''I'''ntegrated '''D'''evelopment '''E'''nvironment, Integrierte Entwicklungsumgebung). Gegen Ende dieses Textes wird IDLE kurz beschrieben. Das Problem mit der Windows Eingabeaufforderung lässt sich aber umgehen. Man muss nur eine Schriftart auswählen, die die Zeichen kennt, z.B. "DejaVu Sans Mono". Dazu klicken Sie einfach bei der Eingabeaufforderung mit der rechten Maustaste oben auf die weiße Leiste und wählen im aufpoppenden Fenster den Menüpunkt "Eigenschaften". Es öffnet sich ein Dialogfenster. Über den Reiter "Schriftart" lässt sich nun die Schriftart einstellen. Unter MS Windows 11 oder openSUSE Leap 15.6 (bash-Konsole) gibt es dieses Problem ohnehin nicht.</small> == Reguläre Ausdrücke == Python kennt auch {{W|Regulärer Ausdruck|reguläre Ausdrücke}}. Dazu gibt es in Python das Modul <code>re</code>. Beipielsweise sollen alle Zahlen (<math>\text{zahl}\in\mathbb{N}_0</math>) in einem String gesucht und ausgegeben werden. Als String sei gegeben: <code>3x Grüße und 100 Kekse.</code> Das Muster (Pattern) ist <code>\d+</code>. <code>\d</code> steht für eine Dezimalziffer 0-9. Das Plus-Zeichen (+) steht symbolisch für ein oder mehrere Zeichen des vorherigen Ausdrucks. Hier also ein oder mehrere Dezimalziffern. Es wird die Funktion <code>findall</code> aus dem Modul <code>re</code>verwendet. Python-Code: from re import findall str = "3x Grüße und 100 Kekse." pat = "\\d+" # Doppel-Backslashes müssen verwendet werden, sonst gibt Python eine Warnung aus! # alternativ: pat = r"\d+" # oder: pat = "[0-9]+" numb = findall(pat, str) print(numb) Ausgabe: ['3', '100'] Python kennt noch viele weitere Möglichkeiten mittels regulärer Ausdrücke zu hantieren. Dies soll hier aber nicht vertieft werden, da das Thema schon ziemlich speziell und komplex ist. Bei Bedarf siehe aber z.B. die Bücher ''Weigend, Seite 380ff'' und ''Ernesti, Kaiser'' [https://openbook.rheinwerk-verlag.de/python/28_001.html] oder die Python-Dokumentation [https://docs.python.org/3/library/re.html]. Auch [[Python unter Linux: Reguläre Ausdrücke]] liefert ein umfangreiches und brauchbares Python-2-Kapitel zu den regulären Ausdrücken. Die dort gelisteten Beispiele müssten ggf. vor Verwendung auf Python-3 umgeschrieben werden. <small>Wie macht man das? Dazu siehe z.B. [https://openbook.rheinwerk-verlag.de/python/43_001.html], [https://portingguide.readthedocs.io/en/latest/] oder [https://www.digitalocean.com/community/tutorials/how-to-port-python-2-code-to-python-3]</small> <small>Es gibt auch ein externes Modul ''regex'', das bei Bedarf extra installiert werden muss ([https://pypi.org/project/regex/]). Es bietet zusätzliche Funktionalität und gründlicheren Unicode-Support. Dies sei hier aber nur der Vollständigkeit halber erwähnt.</small> == Verzweigungen == === if === Die IF-Verzweigung ist aus anderen Programmiersprachen bereits bekannt. In Pseudocode lässt sie sich folgendermaßen darstellen: WENN bedingung TRUE führe block1 aus SONST führe block2 aus ENDE In Python gibt es keinen expliziten ENDE-Kennzeichner. Stattdessen wird der Code durch Einrückungen strukturiert. Alles mit der gleichen Einrückungstiefe gehört zum selben Block. Dies zeichnet Python vor anderen Programmiersprachen aus. Die test1.py-Datei laute also wie folgt: x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: Der else-Zweig wird ausgefuehrt x ist groesser oder gleich 4 Man achte auch auf die Doppelpunkte in der if- und else-Zeile. Darauf vergisst man gerne, wenn man von anderen Programmiersprachen kommt. Folgendes wäre in Python ein Fehler (genauer gesagt ein IndentationError). x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Auch Nachstehendes würde nicht zum gewünschten Ergebnis führen (löst aber keine Fehlermeldung aus). Der letzte print-Befehl ist schon außerhalb der IF-ELSE-Verzweigung. x = 3 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: x ist kleiner als 4 x ist groesser oder gleich 4 Python kennt eine Reihe von Vergleichs- und Verknüpfungsoperatoren: <, <= ... kleiner (gleich) >, >= ... größer (gleich) == ... gleich != ... ungleich is ... identisch is not ... nicht identisch and ... AND or ... OR not ... NOT Beispielsweise: a = 5 b = 9 if a<=10 and b!=7: print("OK") else print("Nicht OK") Ausgabe: OK Der else-Block kann übrigens auch ersatzlos entfallen. Mehrfache Verzweigungen werden durch das elif-Konstrukt erstellt. a = 14 if a<=10: print("<=5") elif a>11 and a<15: print("11 bis 15") elif a>16 and a<20: print("16 bis 20") else: print(">=20") Ausgabe: 11 bis 15 In Python gibt es auch die Schlüsselwörter <code>True</code> (für wahr) und <code>False</code> (für falsch). Man beachte, dass sie mit Großbuchstaben beginnen. Andere Schreibweisen wären ein Fehler. Sie gehören zum Datentyp <code>bool</code>. Ihnen sind auch die Zahlen <code>1</code> und <code>0</code> zugewiesen. === match === Ab Python 3.10 gibt es auch die match-Anweisung. Dies ist das Python-Pendant für die switch-Anweisung in anderen Programmiersprachen, geht aber bei näherer Betrachtung weit darüber hinaus. Hier nur ein einfaches Beispiel: x = "Hello" match x: case "Servus" | "Ciao": # or print("Servus an alle") case "Grüetzi": print("Grüetzi Schwyzer") case _: # other, default, sonstiges ... print("Hallo Welt") Ausgabe: Hallo Welt Für nähere Details siehe z.B. [https://www.geeksforgeeks.org/python-match-case-statement/], [https://learnpython.com/blog/python-match-case-statement/], [https://docs.python.org/3/tutorial/controlflow.html#match-statements] und das Python Enhancement Proposal (PEP) 636 – Structural Pattern Matching: Tutorial [https://peps.python.org/pep-0636] und dort insbesondere den Anhang A - Quick Intro. <small><code>match, case, _</code> etc. sind sogenannte ''soft keywords''. Im Gegensatz zu den normalen Schlüsselwörtern dürfen ihnen auch Werte zugewiesen werden. Eine Liste der weichen Schlüsselwörter lässt sich durch <code>keyword.softkwlist</code> erstellen (die Anweisung gibt es seit Python 3.9). Siehe dazu auch [https://stackoverflow.com/questions/65800344/what-are-soft-keywords] und [https://docs.python.org/3/library/keyword.html#keyword.softkwlist].</small> == Schleifen == === while === Die WHILE-Schleife ist kopfgesteuert. Sie funktioniert wie aus anderen Programmiersprachen bekannt. In Pseudocode: SOLANGE bedingung TRUE führe block aus ENDE In Python: x = 0 while x <= 10: print(x) x += 1 Ausgabe: 0 1 2 3 4 5 6 7 8 9 10 === for === for x in range(6): print(x*2) Ausgabe: 0 2 4 6 8 10 Die Schleife läuft von 0 bis 5. Ausgegeben wird jeweils der Wert x*2. Aquivalent kann diese Schleife auch so geschrieben werden: for x in range(0, 11, 2): print(x) Die Ausgabe ist wie oben. Der Startwert sei 0, der Endwert ist 11-1 und die Schrittweite ist 2. Ein anderes Beispiel sei for x in "text": print(x) Ausgabe: t e x t == Schleifen abbrechen == === break === <code>break</code> bricht die Schleife ab und setzt mit dem nächsten Befehl außerhalb der Schleife fort. for var in range(100): print(var) if var == 5: break Ausgabe: 0 1 2 3 4 5 === continue === <code>continue</code> bricht den aktuellen Schleifendurchlauf ab und setzt mit dem nächsten Schleifendurchlauf fort. for var in range (11): if var == 5: continue print(var) Ausgabe: 0 1 2 3 4 6 7 8 9 10 == try - except == try: z1 = 12 / 0 print(z1) except ZeroDivisionError: print("Das Ergebnis ist unendlich") except: print("Kann nicht berechnet werden!") print("Bitte die Formel korrigieren!") Ausgabe: Das Ergebnis ist unendlich Es wird versucht, eine Zahl durch Null zu dividieren. Das ist nicht möglich, es wird eine Ausnahme ausgelöst. Das Programm springt daher in den except-ZeroDivisionError-Block und führt die dort gelisteten Anweisungen aus (in unserem Fall eine print-Anweisung). Würden wir dieses Programm ohne try-except ausführen, so ergibt sich aus z1 = 12 / 0 print(z1) folgende Fehlermeldung und ein unmittelbarer Programmabbruch Traceback (most recent call last): File "C:\tmp\test1.py", line 1, in <module> z1 = 12 / 0 ZeroDivisionError: division by zero Mit dem try-except-Mechanismus können also Ausnahmen oder Fehler aufgefangen und behandelt werden. In unserem Beispiel ist das eher trivial, aber bei größeren Programmen kann das durchaus Sinn machen. == pass == Ein leerer Block muss in Python mittels dem Schlüsselwort <code>pass</code> dargestellt werden. Z.B. x = 2 if x == 1: print("Wert ist ", x) else: pass Würde man das <code>pass</code> im else-Block weglassen, so würde man eine Fehlermeldung erhalten: IndentationError: expected an indented block after 'else' statement on line 5 = Funktionen = == Aufrufen von Funktionen == Funktionen sind uns im Rahmen dieses Kurses schon zuhauf begegnet. Sei es die print()-, die math.sin()- oder die hex()-Funktion. All diese Funktionen werden von Python zur Verfügung gestellt, ohne dass man sie explizit programmieren müsste. Aufgerufen werden diese Funktionen, indem man ihren Namen eintippt, gefolgt von runden Klammern. In diesen Klammern können noch Argumente übergeben werden. Auch Rückgabewerte sind möglich. == Funktionen selber schreiben == Funktionen werden mit dem def-Schlüsselwort (man definiert die Funktion) eingeleitet, danach folgt der Funktionsname, danach wiederum runde Klammern, in denen formale Argumente stehen können. Abgeschlossen wird die def-Zeile mit einem Doppelpunkt. Danach folgt der Funktionskörper. Dieser Funktionskörper muss wiederum eingerückt werden (wie von den Verzweigungen und Schleifen bekannt). Aufgerufen wird diese Funktion, indem man ihren Funktionsnamen eingibt, gefolgt von runden Klammern (ggf. mit den aktuellen Parametern). Z.B. # Funktion definieren def halloWelt(i): # i ... beliebige Ganzzahl print("Hallo " * i, end="") print("Welt!") # Funktion aufrufen halloWelt(3) Ausgabe: Hallo Hallo Hallo Welt! Unterschied zwischen formalen und aktuellen Parametern: [[Datei:PythonIng_func1.jpg]] <small>Aktuelle Parameter werden auch Argumente genannt.</small> Rückgabe von Funktionswerten: # Funktion definieren def mathFunc(a, b): r1 = a + b r2 = a * b return r1, r2 # Funktion aufrufen a, b = mathFunc(3, 5) # Ausgabe der zurückgegebenen Werte print(a) print(b) Ausgabe: 8 15 Vorgabeparameter, z.B.: def mathFunc(a=10, b=20): r1 = a + b r2 = a * b return r1, r2 a, b = mathFunc(3, 5) print(a) print(b) a, b = mathFunc(5) print(a) print(b) a, b = mathFunc(b=6) print(a) print(b) Ausgabe: 8 15 25 100 16 60 == Lambda-Funktionen == print((lambda a, b: a*b) (3, 5)) Ausgabe: 15 Eingeleitet wird eine Lambda-Funktion (auch Lambda-Form, Lambda-Operator oder anonyme Funktion genannt) mit dem Schlüsselwort <code>lambda</code>. Es folgen die formalen Argumente, danach ein Doppelpunkt, die Berechnungsvorschrift und ggf. abschliessend in Klammern die aktuellen Parameter. Man kann einer Lambda-Funktion auch einen Funktionsnamen geben und die Funktion über diesen Namen aufrufen, z.B. prod = lambda a, b: a*b print(prod(3, 5)) Als Ausgabe wird wieder die Zahl 15 geliefert. == Rekursive Funktionen == Funktionen können wiederum andere Funktionen aufrufen. Von einem rekursiven Funktionsaufruf spricht man, wenn die aufgerufene Funktion gleich der aufrufenden ist. def printFunc(i): if (i >= 5): return else: print("Hallo Welt") printFunc(i+1) printFunc(1) Ausgabe: Hallo Welt Hallo Welt Hallo Welt Hallo Welt == Funktionsannotationen == Python ist sehr flexibel, was Typen angeht. Im Vorhergehenden haben wir generell keine Typangaben gemacht. Will man Typen angeben, so bietet Python das Konzept der Funktionsannotation. def calcFunc(a:int, b:int) -> int: return a+b, a*b r1 = calcFunc(8, 9) r2 = calcFunc(8.0, 9.0) print(r1) print(r2) Ausgabe: (17, 72) (17.0, 72.0) Jetzt sieht man auf den ersten Blick, welche Typen der Programmierer im Sinn hatte, als er die Funktion erstellte. Das Problem dabei ist nur, dass es Python ziemlich egal ist, welche Typen man in Endeffekt eingibt. Im obigen Beispiel können statt Integer-Typen auch Float-Typen eingegeben werden. == Variadische Funktionen == Python-Code: def test1(a, *b): print(a); for c in b: print(c); test1("Hallo", "Welt", "Schweizer", "und alle anderen") Ausgabe: Hallo Welt Schweizer und alle anderen Mit dem Stern (auch als Splat-Operator bezeichnet) in der formalen Parameterliste bei der Funktion <code>test1</code> wird angezeigt, dass eine beliebige Anzahl von Argumenten übergeben wird. <small> Dies entspricht in etwa dem, was in anderen Programmiersprachen (PHP etc.) mittels Ellipse (<code>...</code>) angezeigt wird.</small> = Tupel, Listen und andere = [[Datei:Python 3. The standard type hierarchy.png|mini|hochkant=1.7|Datentypen und Strukturen]] Tupel, Listen und einige andere sind Datenstrukturen oder Sequenzen. Listen (z.B. eine Einkaufsliste) sind veränderbar (mutable). Ein Tupel kann dagegen nicht verändert werden (immutable). Listen werden beim Anlegen in eckige Klammern eingeschlossen, Tupel in runde Klammern. Beim Tupel können die Klammern auch weggelassen werden. Ein Tupel mit nur einem Element muss mit einem Beistrich abgeschlossen werden. Der Grund ist, dass Python sonst nicht entscheiden kann, ob ein Tupel angelegt werden soll, oder nur ein geklammerter Wert. Nachfolgend werden einige Operationen mit Listen und Tupel dargestellt. Als Gedächtnisstütze kann man sich den Unterschied zwischen Tupel und Liste ev. so leichter merken: : T'''u'''pel ... r'''u'''nde Klammern, '''u'''nveränderlich : L'''i'''ste ... eck'''i'''ge Klammern, veränderl'''i'''ch. # Liste und Tupel liste = [1, 2, "Hallo"] tupel = (1, 2, "Hallo") # Ausgabe von liste und tupel print(liste) print(tupel) # Ausgabe von Einzelelementen print(liste[1]) print(tupel[2]) # Element an Liste anhängen und einfügen liste.append(55) liste.insert(4, "Welt") print(liste) # Element aus Liste entfernen liste.remove(1) print(liste) # einige weitere Beispiele liste2 = [1,] tupel2 = 1, 2 tupel3 = (1,) print(liste2) print(tupel2) print(tupel3) Ausgabe: [1, 2, 'Hallo'] (1, 2, 'Hallo') 2 Hallo [1, 2, 'Hallo', 55, 'Welt'] [2, 'Hallo', 55, 'Welt'] [1] (1, 2) (1,) Zu den Datenstrukturen gehören weiters auch Mengen und Dictionaries. Mengen sind von der Mathematik bekannt, sie sind ungeordnet und es kommen keine mehrfachen Elemente vor. Dictionaries sind durch Schlüssel :Wert-Paare gekennzeichnet. Mengen werden beim Anlegen wie Dictionaries in geschweifte Klammern eingeschlossen. dict = {"vorname":"Hugo", "nachname":"Meister" } menge = {1, 1, 3, 4, 4, 4, "Hallo"} print(dict) print(menge) print(dict["vorname"]) Ausgabe: {'vorname': 'Hugo', 'nachname': 'Meister'} {1, 3, 4, 'Hallo'} Hugo Geschweifte Klammern ohne Inhalt stellen Dictionaries dar und keine Mengen: di = {} print(type(di)) Ausgabe: <class 'dict'> == List Comprehensions == Aus einer Eingabeliste soll eine Ausgabeliste erzeugt werden. Das kann folgendermaßen geschehen. Mathematische Schreibweise: <math>lc = \{2x|x\in\ \mathbb{N}, 1\le x < 11\}</math> Python-Code: lc = [x*2 for x in range(1,11)] print(lc) Ausgabe: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] Mathematische Schreibweise: <math>lc = \{2x | x \in \mathbb{N}, 1\le x < 11, x \bmod 2 = 0 \}</math> Python-Code: lc = [x*2 for x in range(1,11) if x%2 == 0] print(lc) Ausgabe: [4, 8, 12, 16, 20] Siehe auch {{W|List Comprehension}}. == Set Comprehensions == Dies ist sehr ähnlich wie im vorigen Abschnitt beschrieben. Es wird aber keine Liste, sondern eine Menge erzeugt. sc = {x*2 for x in range(1,11)} print(sc) Ausgabe: {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} == Listen zusammenführen - zip() == li1 = ["A", "B", "C", "D"] li2 = [1, 2, 3, 4] li3 = [5.5, 6.6, 7.7, 8.8] z = zip(li1, li2, li3) print(z) li4 = list(z) print(li4) Ausgabe: <zip object at 0x00000283B6C6AC80> [('A', 1, 5.5), ('B', 2, 6.6), ('C', 3, 7.7), ('D', 4, 8.8)] == Generatorausdruck == g = (i*2 for i in range(1,11)) print(g) t = tuple(g) print(t) print(t[1:3]) Ausgabe: <generator object <genexpr> at 0x00000241D2A4A5A0> (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) (4, 6) == Slicing == slice ... Scheibe, Teil, in Scheiben schneiden Beispiel: Zugriff auf Elemente eines geordneten sequentiellen Objekttyps (Liste, Tupel oder String): str1 = "Hallo" # Das erste Element wird mit dem Index 0 angesprochen # [start (inkl.) : stop (exkl.) : step (default=1)] str2 = str1[0:2] # Alternativ auch: str2 = str1[:2] print(str2) tup1 = (0,1,2,3) # Das letzte Element hat auch den Index -1, das vorletzte den Index -2 usw. tup2 = tup1[-3:-1] print(tup2) lst1 = [[1, 5, 10, 20], [30, 40, 50, 60]] lst2 = lst1[1][1] print(lst2) Ausgabe: Ha (1, 2) 40 Beispiel: Umdrehen von Strings str1 = "Hallo" str2 = str1[::-1] print(str2) Ausgabe: ollaH = Objektorientierte Programmierung = == Eine einfache Klasse == [[Datei:PythonIng_uml1.svg | 200px]] class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 fahr = Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die Klasse Fahrzeug wird durch das class-Schlüsselwort eingeleitet. raeder ist ein Klassenattribut und public. __init__ wird bei der Objekterzeugung automatisch aufgerufen. Man achte darauf, dass diese Methode immer mit zwei Unterstrichen eingeleitet und abgeschlossen wird. Instanzattributen wird das Wort self vorangestellt. Wir sehen uns z.B. das Attribut self.__geschwind an. Auch hier werden zwei Unterstriche verwendet. Das bedeutet, dass dieses Attribut private ist. Bei den Methoden wird immer self als erster Parameter angegeben. Beim Aufruf der entsprechenden Funktion wird das self aber nicht berücksichtigt. == Klassen importieren == Häufig ist es sinnvoll und übersichtlicher Klassen in eigenen Dateien zu speichern. Das sind dann eigene Module. Abgespeichert werden Sie mit der Endung py, wie bisher auch praktiziert. Aufgerufen werden Sie mit der import-Anweisung. Dann ist aber nur der Dateiname ohne Endung py zu verwenden. Klarer wird das mit einem Beispiel. Datei c:\tmp\fahrzeug.py class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 Datei c:\tmp\test1.py import fahrzeug fahr = fahrzeug.Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die üblichen import-Anweisungen lauten wie folgt: {| {{prettytable}} ! import-Befehl ! Instanz |- | import xyz || xyz.Klasse |- | import xyz as x || x.Klasse |- | from xyz import Klasse || Klasse |- | from xyz import * || Klasse |} Der Vorteil der ersten beiden import-Anweisungen ist, dass es kaum zu Namenskollisionen kommen kann. Dafür hat man bei den letzten beiden Varianten weniger Tipparbeit. == Vererbung == [[Datei:PythonIng_uml2.svg | 200px]] Datei fahrzeug.py: class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 class Luftfahrzeug(Fahrzeug): def __init__(self, geschwindigkeit, leistung, fluegel): super().__init__(geschwindigkeit, leistung) self.__flueg = fluegel def getFlueg(self): return self.__flueg Datei test1.py: import fahrzeug fahr = fahrzeug.Luftfahrzeug(150, 90, 4) print(fahr.getFlueg()) Ausgabe: 4 = Grafiken zeichnen = Für das Zeichnen von Grafiken wird hier das Modul <code>matplotlib</code> verwendet. <code>matplotlib</code> ist ein externes Modul und muss vor der ersten Verwendung installiert werden. Das geht so: # Starten Sie ein Terminal (bei Windows die Eingabeaufforderung). # Führen Sie darin folgenden Befehl aus <code>c:\devel\Python\Scripts\pip.exe install matplotlib</code> pip ist übrigens der Paketmanager von Python ({{W|Pip_(Python)}}). Optimalerweise installieren wir auch gleich das Modul <code>numpy</code> (Numerical Python). Wir werden es im Folgenden oft benötigen (nicht nur bei den Grafiken). Das funktioniert vom Prinzip her genauso, wie für <code>matplotlib</code> gezeigt. <small>Verwenden Sie Spyder, so sind diese Schritte nicht nötig. Spyder inkludiert diese Pakete standardmäßig. Unter openSUSE Tumbleweed lassen sich diese Pakete mittels YaST oder zypper installieren.</small> == 2D == === Graph einer Funktion === Es soll die cosh-Funktion im Intervall <math>x\in[-3,3]</math> gezeichnet werden. Der Programmcode lautet in der einfachsten Form: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh1.jpg]] Der Code ist quasi selbsterklärend. Das Untermodul pyplot des matplotlib-Moduls und das numpy-Modul werden importiert. x läuft von -3 bis +3. y wird für jeden x-Wert per Formel ausgerechnet. "plt.plot()" ist der Zeichenbefehl. "plt.show" ist notwendig, um das Fenster mit der Grafik anzuzeigen. Die Schrittweite 0.1 wurde so gewählt, um einen ausreichend glatten Verlauf des Graphen zu gewährleisten. Das ist immer ein Kompromiss zwischen Berechnungszeit und Ansehnlichkeit. Testen Sie einfach ein paar verschiedene Werte, um ein Gefühl dafür zu zu bekommen. "plt.grid()" zeichnet ein Gitter in die Grafik (kann auch weggelassen werden). Die Bezeichnungen plt und np könnten auch anders gewählt werden. Es ist aber Konvention, diese so wie hier gezeigt zu wählen. <small>Mit der im obigen Bild gezeigten Menüleiste kann die dargestellte Grafik nachträglich noch geändert werden (Zoom, Pan, Achsenparameter, Kurvenparameter etc.). Natürlich kann man das alles auch direkt programmieren. Wie das funktioniert wird ansatzweise etwas später gezeigt.</small> Ein etwas komplexeres Beispiel ist Folgendes: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) + 2**x plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh4.png]] Man beachte, dass im Gegensatz zu Octave und Julia der ominöse Punkt (.) bei 2**x mit Python nicht benötigt wird. Das macht das Programmiererleben etwas einfacher. === Graphen mehrerer Funktionen und weiteres === import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x") plt.plot(x, y2, label = "sin(x) * cos(x)") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh2.png]] Um die Linienstile etwas individueller zu gestalten, ist folgender Programmcode gedacht: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x", lw=5, ls="dotted") plt.plot(x, y2, label = "sin(x) * cos(x)", lw=3, ls="--") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh3.png]] === Funktion in Parameterdarstellung === Es soll die archimedische Spirale <math>x = t \cos(t), y = t \sin(t)</math> im Intervall <math>[0, 6\pi[</math> gezeichnet werden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.show() [[Datei:PythonIng_spirale1.png]] Diese Darstellung erscheint verzerrt. Will man gleiche Achsenskalierungen, so kann man den plt.axis()-Befehl verwenden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.axis("equal") plt.show() [[Datei:PythonIng_spirale2.png]] === Funktion in Polardarstellung === import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(projection="polar") r = np.arange(0, 1, 0.01) theta = r**3 line = ax.plot(theta, r) plt.show() [[Datei:PythonIng_polar1.png]] === Logarithmische Achsenskalierung === ==== Semilog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.semilogy() plt.show() Ausgabe: [[Datei:PythonIng_semilog1.png]] ==== LogLog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.loglog() plt.show() [[Datei:PythonIng_loglog1.png]] === Gefüllte Fläche === import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 3, 0.1) y1 = 3*x - 1 y2 = x**2 plt.plot(x, y1, x, y2, color='black') plt.fill_between(x, y1, y2, where=y1>=y2) plt.show() [[Datei:PythonIng_gefuellt.png]] === Linien, Pfeile, Rechtecke, Kreise und Texte === import matplotlib as mpl import matplotlib.pyplot as plt fig, ax = plt.subplots() r = mpl.patches.Rectangle((0, 0), 3, 3, angle=30, fill=False) c = mpl.patches.Circle((4, 4), 2, fill=False) ax.add_patch(r) ax.add_patch(c) ax.plot([-2, 7], [-2, 0], color="black") ax.arrow(0, 7, 5, 0, length_includes_head=True, head_width=0.5, head_length=1.5, color="black") ax.set_aspect("equal") plt.axis([-3, 8, -3, 8]) plt.show() [[Datei:PythonIng_linien_pfeile_etc.png]] Text kann mit <code>ax.text(x, y, "Text")</code> hinzugefügt werden, bspw. import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.text(0.1, 0.1, "Hallo") ax.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() Oder einfacher auch ohne <code>subplots</code> import matplotlib.pyplot as plt plt.text(0.1, 0.1, "Hallo") plt.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text1.png]] Auch Sonderzeichen (griechische Buchstaben etc.) können verwendet werden (siehe dazu auch [https://matplotlib.org/stable/users/explain/text/mathtext.html]). import matplotlib.pyplot as plt plt.text(.3, .5, r'$\Omega\ \psi\ \oint\ \nabla\ \dot a\ \frac{a}{b}\ a_b$', size="20") plt.show() [[Datei:PythonIng_text20.svg]] Jetzt wird noch gezeigt, wofür <code>subplots</code> sinnvoll eingesetzt werden können. import matplotlib.pyplot as plt fig, ax = plt.subplots(nrows=1, ncols=2) ax[0].text(0.1, 0.1, "Hallo") ax[1].text(0.1, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text2.png]] === Aufgaben === * Zeichnen Sie die Strophoide <math>x = \frac{a(t^2-1)}{t^2+1}, y = \frac{at(t^2-1)}{t^2+1}, a = 2, -3 \leq t \leq 3</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_strophoide.jpg]] * Zeichnen Sie die verschlungene Hypozykloide <math>x = (R-r)\cos t + c\cos\frac{R-r}{r}t, y = (R-r)\sin t - c\sin\frac{R-r}{r}t, c = 3, r = 2, R = 6, -15 \leq t \leq 15</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_hypozykloide.jpg]] * Testen Sie bei den obigen Übungsaufgaben verschiedene Linienstile und Farben. Farben können mit dem plt.plot()-Parameter color gewählt werden. * Testen Sie bei den obigen Übungsaufgaben verschiedene Werte für a, c, r und R. == 3D == === Räumliche Kurven === import matplotlib.pyplot as plt import numpy as np t = np.arange(0, 6*np.pi, 0.1) x = t * np.cos(t) y = t * np.sin(t) z = t fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot(x, y, z) plt.show() [[Datei:PythonIng_raumkurve1.png]] === Flächen === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z) plt.show() [[Datei:PythonIng_fläche1.png]] Das Ganze in Netzdarstellung läßt sich so programmieren: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.5) y = np.arange(0, 10, 0.5) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_wireframe(x, y, z) plt.show() [[Datei:PythonIng_fläche2.png]] Ein etwas komplexeres Beispiel: import matplotlib.pyplot as plt import numpy as np x = np.arange(0.1, 10, 0.1) y = np.arange(0.1, 10, 0.1) x, y = np.meshgrid(x, y) z1 = np.sin(x) + 3 * np.cos(y) z2 = np.sin(x) + np.log(y) z3 = x + np.cos(y) z4 = x**2 - y fig, ax = plt.subplots(subplot_kw={"projection": "3d"}, nrows=2, ncols=2) ax[0][0].plot_surface(x, y, z1) ax[0][1].plot_surface(x, y, z2) ax[1][0].plot_surface(x, y, z3) ax[1][1].plot_surface(x, y, z4) plt.show() [[Datei:PythonIng_subplot1.png]] Man beachte, dass man die Unterbilder im Bild nach dem Ausführen des Scripts z.B. mit der mittleren Maustaste einzeln drehen, oder über die Einträge in der Menüzeile einzeln bearbeiten kann. Mit ein paar Zeilen Programmtext lässt sich also eine Menge an Funktionalität generieren. Die Farbgebung lässt sich über <code>colormaps</code> variieren. import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm) plt.show() [[Datei:PythonIng_colormap1.png]] Es gibt eine Menge an Colormaps, z.B. <code>plasma, Greys, Dark2, ocean</code>. Zwecks detaillierterer Infos siehe die matplotlib-Dokumentation. <small>Verwendet man die IDE namens IDLE, so gibt es dort auch die automatische Codevervollständigung. D.h. es werden alle Möglichkeiten (in unserem Fall nach dem Eintippen von <code>cm.</code> alle verfügbaren Colormaps) angezeigt.</small> Die "edgecolor" und Linienbreite können auch frei gewählt werden: import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm, edgecolor="black", linewidth=1.0) plt.show() [[Datei:PythonIng_colormap2.png]] === Höhenlinien === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contour(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien1.png]] Etwas abgewandelt sieht das so aus: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() hl = ax.contour(x, y, z) ax.clabel(hl, inline = True) plt.show() [[Datei:PythonIng_höhenlinien2.png]] Und noch eine Variante sei gezeigt. import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contourf(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien3.png]] === Aufgaben === * Zeichnen Sie die räumliche Kurve <math>x = 2 \cdot \cosh(t)</math>, <math>y = 5 \cdot \sin(t)</math>, <math> z = t^{2} - t</math>, <math>0 \leq t \leq 3\pi</math>. * Zeichnen Sie die Fläche <math>z = \log(x) + \cos(y)</math>. == Animationen == === Mit matplotlib === Auch mit matplotlib sind Animationen möglich. Das ist ein bisschen komplizierter und wird deshalb hier nur mit einem sehr einfachen Beispiel dargestellt (bei Interesse siehe z.B. auch das [https://matplotlib.org/stable/users/explain/animations/animations.html#animations Animations using Matplotlib-Tutorial]). import matplotlib.pyplot as plt import matplotlib.animation as ani import matplotlib import numpy as np def update(frame): line.set_xdata(x[:frame]) line.set_ydata(y[:frame]) return (line) fig, ax = plt.subplots() x = np.arange(0, 10, .1) y = np.sin(x) line, = ax.plot(x[0], y[0]) ax.set(xlim=[0, 10], ylim=[-1, 1]) a = ani.FuncAnimation(fig=fig, func=update, frames=100, interval=20) plt.show() # Speichere die Animation in einem animierten GIF (optional) a.save(filename="c:/tmp/PythonIng_anim5.gif", writer="pillow") [[Datei:PythonIng_anim5.gif]] Es wird eine Sinuskurve auf den Bildschirm gezeichnet. In der letzten Zeile wird diese Animation in ein animiertes GIF gespeichert. Das ist natürlich optional und kann auch weggelassen werden. === Mit VPython === Aber auch mit dem Modul VPython lassen sich einfache 3D-Animationen erstellen. VPython ist ein externes Modul, das vorab installiert werden muss. Unter openSUSE Tumbleweed gibt es dzt. kein entsprechendes rpm-Paket. Die übliche Methode der Installation mittels YaST oder zypper ist somit nicht möglich. Auch eine direkte Verwendung von pip führt nur zu einer Fehlermeldung (<code>error: externally-managed-environment</code>). Es empfiehlt sich dort folgende Vorgehensweise: # Erstelle zuerst eine virtuelle Umgebung, z.B.: <code>python3.11 -m venv ~/tmp/venv1</code> # Wechsle das Verzeichnis: <code>cd ~/tmp/venv1/bin</code> # Installiere das entsprechende Paket: <code>./pip install vpython</code> # Führe das entsprechende Skript aus: <code>./python ~/tmp/test1.py</code> Aktuell (März 2026) ist dieses Programmpaket lt. der [https://vpython.org/presentation2018/install.html VPython-Homepage] nur für die Python-Versionen 3.8 bis 3.12 verfügbar. Ein Beispiel zu einer einfachen Animation wird nachfolgend geliefert. from vpython import * scene.width = 1200 scene.height = 600 scene.center = vector(20,0,0) scene.background = color.white cylinder(pos=vector(0,0,0), axis=vector(20,0,0), radius=5, color=color.blue) cone(pos=vector(0,0,0), axis=vector(-10,0,0), radius=5, color=color.blue) helix(pos=vector(20,0,0), axis=vector(40,0,0), radius=2, coils=10, thickness=0.5, color=color.blue) ball = sphere(pos=vector(20,0,0), color = color.green, radius = 1) ball.p = vector(0.15, 0, 0) toc = True while True: rate(200) if(ball.pos.x <= 60 and toc == True): ball.pos += ball.p else: toc = False ball.pos -= ball.p if(ball.pos.x <= 20 and toc == False): toc = True [[Datei:PythonIng_vpython_anim.JPG]] Idealerweise öffnet sich beim Ausführen des Scripts ein Browserfenster. Darin wird die programmierte Animation gezeigt (siehe auch den obigen Screenshot). Eine Größenänderung können Sie mit der mittleren Maustaste initiieren. Die Szenerie drehen können Sie mit der rechten Maustaste. === Mit VTK === Komplexer, aber auch mächtiger als VPython ist die Verwendung von VTK ('''V'''isualization '''T'''ool'''k'''it). Genauer gesagt des Python-Wrappers von VTK. Dieses externe Python-Modul muss vorab installiert werden (z.B. mittels YaST, pip oder in eine virtuelle Umgebung). VTK ist eine Softwarebibliothek zur 3D-Visualisierung und wurde ursprünglich in C++ geschrieben. Verbreitet eingesetzt wird diese Bibliothek in der Wissenschaft und Forschung, z.B. * in der medizinischen Bildgebung * für Strömungssimulationen * für Klimadaten Als einfaches Beispiel wird die Darstellung eines Zylinders gezeigt, der mit den Maustasten gedreht oder in der Größe geändert werden kann: import vtk # Zylinder erzeugen cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) # Geometrie in darstellbare Daten umwandeln mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) # Objekt in der Szene actor = vtk.vtkActor() actor.SetMapper(mapper) # Szene verwalten renderer = vtk.vtkRenderer() renderer.AddActor(actor) # Render-Fenster render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) # Maus/Tastatur-Steuerung interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) # Starten render_window.Render() interactor.Start() Ausgabe: [[Datei:PythonIng_VTK_1.png]] Gleiches Beispiel wie oben, aber mit einer Animationssequenz: import vtk import time cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) renderer = vtk.vtkRenderer() renderer.AddActor(actor) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) render_window.Render() time.sleep(0.01) Das Grafikfenster schließt sich nach Ablauf der Schleife. Das Fenster belibt geöffnet, wenn Sie am Programmende folgenden Befehl hinschreiben interactor.Start() Um den animierten Zylinder grün einzufärben, müssen Sie Folgendes im obigen Programm ergänzen (Farbnamen): colors = vtk.vtkNamedColors() actor.GetProperty().SetColor(colors.GetColor3d("Green")) Alternativ funktioniert auch das (RGB): actor.GetProperty().SetColor(0.0, 0.6, 0.0) Wie der Zylinder mit einer Textur versehen wird, zeigt folgendes Programm: import vtk import time cylinder = vtk.vtkCylinderSource() cylinder.SetResolution(30) cylinder.SetHeight(3.0) cylinder.SetRadius(1.0) cylinder.CappingOn() texture_coords = vtk.vtkTextureMapToCylinder() texture_coords.SetInputConnection(cylinder.GetOutputPort()) texture_coords.PreventSeamOn() reader = vtk.vtkJPEGReader() reader.SetFileName("PythonIng_textur.jpg") texture = vtk.vtkTexture() texture.SetInputConnection(reader.GetOutputPort()) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(texture_coords.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.SetTexture(texture) renderer = vtk.vtkRenderer() renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) renderer.AddActor(actor) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) renderWindow.Render() time.sleep(0.01) <gallery> PythonIng_textur.jpg | Textur-Datei PythonIng_VTK_2.png | Ausgabe (Screenshot) </gallery> Nun aber genug von VTK und der Erstellung von Grafiken, weiter geht es mit mathematischeren Themen. = Vektoren und Matrizen = == Zahlenfolgen == from numpy import * start = 0 stop = 10 step = 2 num = 10 r = arange(start, stop, step) l = linspace(start, stop, num) print("r = ", r) print("l = ", l) Ausgabe: r = [0 2 4 6 8] l = [ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556 6.66666667 7.77777778 8.88888889 10. ] == Vektoren == Vektoren sollten jedem aus der Linearen Algebra bekannt sein. === Arrays === In Python mit NumPy kann man Vektoren durch die Funktion array erzeugen. import numpy as np l1 = (-5, 3, 2) l2 = (1, 1, 4) a1 = np.array(l1) a2 = np.array(l2) a3 = a1 + a2 a4 = 2 * a2 print(a1) print(a2) print(a3) print(a3[2]) print(a4) Ausgabe: [-5 3 2] [1 1 4] [-4 4 6] 6 [2 2 8] === Zeilen- und Spaltenvektoren === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) print(z) print(s) Ausgabe: [ [-5 3 2] ] [[1] [1] [4]] === Skalarprodukt === import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) skalarprodukt = np.dot(a1, a2) print(skalarprodukt) Ausgabe: 6 === Vektorprodukt === <math>a\ast b=\left(\begin{array}{c} a_{1}\\ a_{2}\\ a_{3} \end{array}\right)\ast\left(\begin{array}{c} b_{1}\\ b_{2}\\ b_{3} \end{array}\right)=\left(\begin{array}{c} a_{2}b_{3}-a_{3}b_{2}\\ a_{3}b_{1}-a_{1}b_{3}\\ a_{1}b_{2}-a_{2}b_{1} \end{array}\right) </math> Python-Code: import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) vektorprodukt = np.cross(a1, a2) print(vektorprodukt) Ausgabe: [10 22 -8] === Transponierter Vektor === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) # transponierter Vektor z_tp = np.transpose(z) # transponierter Vektor s_tp = np.transpose(s) print(z_tp) print(s_tp) Ausgabe: [[-5] [ 3] [ 2]] [ [1 1 4] ] === Vektorfelder visualisieren === import matplotlib.pyplot as plt import numpy as np # Daten generieren x = np.arange(0, 10, 1) y = np.arange(0, 10, 1) X, Y = np.meshgrid(x, y) U = X * Y V = Y + X # Plotten fig, ax = plt.subplots() ax.quiver(X, Y, U, V, angles='xy') plt.show() Ausgabe: [[Datei:PythonIng_quiver1.png]] == Matrizen== import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) print(m1) Ausgabe: [[1 2 3] [4 5 6]] === Zugriff auf Matrizenelemente === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) # Element aus Zeile 2 und Spalte 3 (Achtung! Index startet bei Null) print(m1[1,2]) Ausgabe: 6 === Addition und Subtraktion von Matrizen === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) m2 = np.matrix([[0, 0, 2], [1, 3, 2]]) print(m1 + m2) print(m1 - m2) Ausgabe: [[1 2 5] [5 8 8]] [[1 2 1] [3 2 4]] === Transponierte Matrix === import numpy as np m = np.matrix([[1, 2, 3], [4, 5, 6]]) mt = np.transpose(m) print(m) print(mt) Ausgabe: [[1 2 3] [4 5 6]] [[1 4] [2 5] [3 6]] === Rang einer Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) rg = np.linalg.matrix_rank(m) print(rg) Ausgabe: 2 === Inverse Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) mi = np.linalg.inv(m) print(mi) Ausgabe: [[ 1. 0.6] [-0. -0.2]] === Multiplikation von Matrizen (falksches Schema) === import numpy as np m1 = np.matrix([[1, 3, 4], [0, -5, 1]]) m2 = np.matrix([[1, 2], [2, 3], [0, 2]]) print(m1 @ m2) Ausgabe: [[ 7 19] [-10 -13]] === Eigenwerte und Eigenvektoren === import numpy as np m = np.matrix([[5, 8], [1, 3]]) D,V = np.linalg.eig(m) # Eigenwerte print(D) # Eigenvektoren print(V) Ausgabe: [7. 1.] [[ 0.9701425 -0.89442719] [ 0.24253563 0.4472136 ]] === Teilmatrizen === import numpy as np m = np.matrix([[1, 3, 4], [0, -5, 1]]) print("m = ", m) # Erste Zeile extrahieren m1 = m[0,:] print("m1 = ", m1) # Das Element aus der 1. Zeile und der 2. Spalte extrahieren m2 = m[0,1] print("m2 = ", m2) # Zweite Spalte extrahieren m3 = m[:, 1] print("m3 = ", m3) Ausgabe: m = [[ 1 3 4] [ 0 -5 1]] m1 = [ [1 3 4] ] m2 = 3 m3 = [[ 3] [-5]] === Spezielle Matrizen === ==== Nullmatrix ==== import numpy as np z = np.zeros((3, 2)) print(z) Ausgabe: [[0. 0.] [0. 0.] [0. 0.]] ==== Einheitsmatrix ==== import numpy as np z = np.eye(3) print(z) Ausgabe: [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ==== Matrix mit lauter Einsen ==== import numpy as np z = np.ones((3, 2)) print(z) Ausgabe: [[1. 1.] [1. 1.] [1. 1.]] === Spärlich besetzte Matrizen === Das Thema spärlich besetzter Matrizen wird hier nur kurz angerissen. Nähere Details siehe unter dem Weblink [https://docs.scipy.org/doc/scipy/reference/sparse.html#module-scipy.sparse]. import numpy as np import scipy A = scipy.sparse.csr_array(np.eye(5)) print(A) Ausgabe: (0, 0) 1.0 (1, 1) 1.0 (2, 2) 1.0 (3, 3) 1.0 (4, 4) 1.0 = Lineare Gleichungssysteme = Sei <math>Ax = b</math> ein lineares Gleichungssystem. <math>A</math> sei die Koeffizientenmatrix, <math>x</math> der Lösungsvektor und <math>b</math> ein bekannter Vektor. Beispiel: import numpy as np A = np.array([[5, 1], [0, 2]]) b = np.array([1, 2]) x = np.linalg.solve(A, b) print(x) Ausgabe: [0. 1.] == Aufgabe == * Lösen Sie folgendes Gleichungssystem mittels Python (und zur Kontrolle auch händisch): 5x + 6y - 2z = 12 3x - y - 3z = 6 2x + 2y + 4z = 5 = Polynome = == Ein erstes einfaches Beispiel == Gegeben sei das Polynom <math>7x^3+5x^2+1</math>. In Python: import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p) Ausgabe: 3 2 7 x + 5 x + 1 == Einzelne Polynomwerte berechnen == import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p(1.5)) Ausgabe: 35.875 == Polynome integrieren und differenzieren == import numpy as np p = np.poly1d([7, 5, 0, 1]) # 1. Ableitung p1 = p.deriv() p2 = p.deriv(1) # 2. Ableitung p3 = p.deriv(2) # Integral p4 = p.integ() print(p1) print(p2) print(p3) print(p4) Ausgabe: 2 21 x + 10 x 2 21 x + 10 x 42 x + 10 4 3 1.75 x + 1.667 x + 1 x == Nullstellen bestimmen == import numpy as np p = np.poly1d([2, 5, 0, 4]) r = np.roots(p) print(r) Ausgabe: [-2.7621427 +0.j 0.13107135+0.84077099j 0.13107135-0.84077099j] == Aufgaben == * Berechnen Sie den Wert für x = 3 des Polynoms <math>y = 2x^4 - 3x^3 - x + 7</math>. * Differenzieren und integrieren Sie das Polynom <math>y = 2x^4 - 3x^3 - x + 7</math>. * Berechnen Sie die Nullstellen von <math>y = 7x^5 - 3x^2 + 12</math>. = Nichtlineare Gleichungen und Gleichungssysteme = == Nullstellenbestimmung == Löse eine beliebige Gleichung f(x) = 0, z.B. <math> f(x) = x^2 - 5\cos(x) - 10 = 0 </math>: import scipy import numpy as np def f(x): return x**2 - 5*np.cos(x) - 10 xstart = [-1, 1] # Startwerte xn = scipy.optimize.root(f, xstart) print(xn.x) Ausgabe: [-2.46813009 2.46813009] Funktionsgraph: [[Datei:octave_nichtlin2.jpg]] == Gleichungssysteme == SymPy ist ein externes Modul, das symbolisches Rechnen ('''Sym'''bolic '''Py'''thon) ermöglicht. Folgende Aufgabe ist dem Buch "Knorrenschild: Numerische Mathematik, Hanser, 2017, Seite 72" entnommen. Zu lösen ist das nichtlineare Gleichungssystem <math>f_1 = 2x_1 + 4x_2 = 0 </math> <math>f_2 = 4x_1 + 8x_2^3 = 0</math> Mit Python ist das so möglich: import sympy x1, x2 = sympy.symbols("x1 x2") f1 = 2*x1 + 4*x2 f2 = 4*x1 + 8*x2**3 s = sympy.solve((f1, f2), x1, x2) print(s) Ausgabe: [(-2, 1), (0, 0), (2, -1)] Plot: [[Datei:IngPython_nl_gleichung1.svg|500px]] = Komplexe Zahlen = Die imaginäre Einheit wird in Python durch den Buchstaben <code>j</code> symbolisiert. Darstellen kann man eine komplexe Zahl bekannterweise in mehreren Formen: * Kartesische Darstellung <math>z = \Re(z) + j \cdot \Im(z)</math> * Polardarstellungen <math>z = r \cdot (\cos(\phi) + j \cdot \sin(\phi)) = r \cdot e^{j\cdot \phi}</math> Die konjugiert komplexe Zahl ist <math>z^* = \Re(z) - j \cdot \Im(z)</math> Nachfolgend einige mathematische Operationen mit Python und NumPy. import numpy as np z1 = 2 + 5j # kartesische Darstellung z2 = 3 * np.exp(3j) # Polardarstellung # Addition res = z1 + z2 print("z1 + z2 = ", res) # Multiplikation res = z1 * z2 print("z1 * z2 = ", res) # Realteil res = np.real(z2) print("Realteil von z2 = ", res) # Imaginärteil res = np.imag(z2) print("Imaginaerteil von z2 = ", res) # Betrag res = np.abs(z1) print("Betrag von z1 = ", res) # Argument res = np.angle(z1) print("Argument von z1 = ", res) # Konjugiert komplexe Zahl res = np.conj(z1) print("Konjugiert komplexe Zahl von z1 = ", res) Ausgabe: z1 + z2 = (-0.9699774898013365+5.423360024179601j) z1 * z2 = (-8.05675510050068-14.003167400647481j) Realteil von z2 = -2.9699774898013365 Imaginaerteil von z2 = 0.4233600241796016 Betrag von z1 = 5.385164807134504 Argument von z1 = 1.1902899496825317 Konjugiert komplexe Zahl von z1 = (2-5j) = Interpolation = import numpy as np import scipy import matplotlib.pyplot as plt # Stützpunkte xp = np.arange(1, 6) yp = (0, -5, 2, 7, 6) ti = np.arange(1, 5, 0.01) i1 = scipy.interpolate.interp1d(xp, yp, kind = "linear") i2 = scipy.interpolate.interp1d(xp, yp, kind = "cubic") plt.plot(xp, yp, "rx") plt.plot(xp, i1(xp)) plt.plot(ti, i2(ti)) plt.show() Ausgabe: [[Datei:PythonIng_interpol1.png]] = Differenzialrechnung = == Numerisches Differenzieren == Als Beispiel differenzieren wir <math>y = 5x\sin{x}</math> und stellen das Ganze grafisch dar. from findiff import Diff import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) f = 5 * x * np.sin(x) dx = x[1] - x[0] # Ableitung d_dx = Diff(0, dx) df_dx = d_dx(f) # Grafik plt.plot(x, f, label = "y") plt.plot(x, df_dx, label = "y'") plt.grid() plt.legend(loc="best") plt.show() Ausgabe: [[Datei:octave_diff1.jpg]] <small>findiff ist ein externes Modul. Dieses muss installiert werden (z.B. so: ...\Python\Scripts\pip.exe install --upgrade findiff). Für die Vorgehensweise unter openSUSE Tumbleweed siehe das Kapitel VPython, nur dass das Ganze mit einer aktuelleren Python-Version exekutiert wird, z.B. mit Python 3.13. Das im Buch "Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler, Rheinwerk" verwendete Modul "scipy.misc" ist veraltet (deprecated ... missbilligt). Lt. [https://docs.scipy.org/doc/scipy-1.17.0/dev/roadmap-detailed.html#misc SciPy-Dokumentation für die Version 1.17.0] wurden alle entsprechenden Features schon entfernt.</small> == Symbolisches Differenzieren == Differenzieren Sie die Funktionen <math>f_1(x) = x^2</math> und <math>f_2(x) = \sin(x)\cos\left(\frac{x}{2}\right)</math>. import sympy x = sympy.symbols("x") f1 = x**2; f2 = sympy.sin(x) * sympy.cos(x/2.) d1 = sympy.diff(f1, x) d2 = sympy.diff(f2, x) print(d1) print(d2) Ausgabe: 2*x -0.5*sin(0.5*x)*sin(x) + cos(0.5*x)*cos(x) == Aufgaben == * Differenzieren Sie die Funktion <math>y = \log(x) + 10x</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. * Differenzieren Sie die Funktion <math>y = \frac{\sinh(x)}{(1+x)}</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. = Integralrechnung = == Numerisches Integrieren == Berechnen Sie das Integral <math>\int_{0}^{3}x^2 dx</math>. import scipy def f(x): return x**2 i = scipy.integrate.quad(f, 0, 3) print(i) Ausgabe: (9.000000000000002, 9.992007221626411e-14) Das trifft den exakten Wert 9.0 ziemlich genau. Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} dx</math>. import scipy import numpy as np def f(x): return 2**(-x) i = scipy.integrate.quad(f, 0, np.inf) print(i) Ausgabe: (1.4426950408889556, 4.486558477977586e-09) == Symbolisches Integrieren == Berechnen Sie <math>\int x^2 \text{d}x</math> und <math>\int \sin{x}\cos{\frac{x}{2}} \text{d}x</math>. import sympy x = sympy.symbols("x") f1 = x**2 f2 = sympy.sin(x) * sympy.cos(x/2.) i1 = sympy.integrate(f1, x) i2 = sympy.integrate(f2, x) print(i1) print(i2) Ausgabe: x**3/3 -0.666666666666667*sin(0.5*x)*sin(x) - 1.33333333333333*cos(0.5*x)*cos(x) Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} \text{d}x</math>. import sympy x = sympy.symbols("x") f = 2**(-x) i = sympy.integrate(f, (x, 0, sympy.oo)) print(i) Ausgabe: 1/log(2) Mit <code>sympy.pprint(i)</code> ließe sich letzere Ausgabe etwas schöner schreiben: 1 ────── log(2) Man beachtete, <code>log</code> steht hier für den natürlichen Logarithmus <code>ln</code>. == Aufgaben == * Integrieren Sie die Funktion <math>y = \log(x) + 10x</math> von 1 bis 5. * Integrieren Sie die Funktion <math>y = x^3</math> von 0 bis 4. * Integrieren Sie <math>\int x^x(\log (x) + 1)\mathrm dx</math> symbolisch. = Gewöhnliche Differenzialgleichungen = == DGL numerisch lösen == Für die Lösung von Differenzialgleichungen steht u.a. die Funktion scipy.integrate.solve_ivp() zur Verfügung. Diese Funktion implementiert auch das Runge-Kutta-Verfahren (RK45). {{Wikipedia | Runge-Kutta-Verfahren}} Beispiel <math>y' = x^2 + y^3</math>: import scipy import numpy as np import matplotlib.pyplot as plt def dy_dx(x, y): return x**2 + y**3 y0 = [1] xi = [0, 1] x = np.arange(0, 1, 0.01) z = scipy.integrate.solve_ivp(dy_dx, xi, y0, method="RK45", dense_output=True) y = z.sol(x) plt.plot(x, y.T) plt.grid() plt.show() [[Datei:PythonIng_dgl1.png]] == DGL symbolisch lösen == Beispiel <math>y' = x^2 + y^3</math>: import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) print(lsg) Ausgabe: [Eq(f(x), (-x**2)**(1/3)), Eq(f(x), (-x**2)**(1/3)*(-1 - sqrt(3)*I)/2), Eq(f(x), (-x**2)**(1/3)*(-1 + sqrt(3)*I)/2)] Mit <code>sympy.pprint</code> (pretty print) lässt sich die Ausgabe etwas übersichtlicher darstellen. import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) sympy.pprint(lsg) Ausgabe: ⎡ _____ _____ ⎤ ⎢ _____ 3 ╱ 2 3 ╱ 2 ⎥ ⎢ 3 ╱ 2 ╲╱ -x ⋅(-1 - √3⋅ⅈ) ╲╱ -x ⋅(-1 + √3⋅ⅈ)⎥ ⎢f(x) = ╲╱ -x , f(x) = ────────────────────, f(x) = ────────────────────⎥ ⎣ 2 2 ⎦ == Aufgaben == * Lösen Sie die Differenzialgleichung <math>y' = \frac{1}{x\cdot y}</math> mit Python. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>m' = -k\cdot m</math>. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>y' = \sqrt{|y|}</math>. =Rechnen mit wirklich großen Zahlen= Bekannt ist, dass Python kaum Einschränkungen beim Wertebereich von Ganzzahlen hat, z.B. print(10**300) Ausgabe (gekürzt): 100000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000 Ähnliches geht auch mit Gleitpunktzahlen, z.B. durch die Verwendung des Moduls mpmath: import mpmath print(mpmath.mpf(1500.4)**mpmath.mpf(300)) Ausgabe: 7.27975299218612e+952 Anderes Beispiel: from mpmath import mp, pi mp.dps = 100 print(pi) Ausgabe: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 mpmath kann noch einiges mehr, dazu sei aber auf die entsprechende Dokumentation auf der mpmath-Homepage verwiesen. mpmath ist Bestandteil von SymPy, kann aber auch separat installiert werden. =Regelungstechnische Aufgabenstellungen= Für regelungstechnische Aufgaben gibt es u.a. das externe Paket <code>control</code>. Hier soll nicht detailliert darauf eingegangen werden. Anhand eines Beispiels soll anschließend nur die Visualisierung in Form eines Bode-Diagramms und der Sprungantwort gezeigt werden. Gegeben sei ein P-Regler mit <math>R = \frac{5}{2}</math> und eine Strecke <math>S= \frac{1}{30s^3+20s^2+10s+1,5}</math>. Gesucht sei vorerst ein Bode-Diagramm für den offenen Regelkreis und das Führungsverhalten. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke # oder: G0 = ct.series(regler, strecke) Gw = ct.feedback(G0) ct.bode_plot(G0, label='G0') ct.bode_plot(Gw, label='Gw') plt.show() [[Datei:PythonIng_bode1.svg]] Nun noch für obiges Beispiel die Sprungantwort. Diese zeigt einige große Überschwinger, d.h. der Regler kann sicher noch optimiert werden. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke Gw = ct.feedback(G0) t, y = ct.step_response(Gw) plt.plot(t,y) plt.title('Sprungantwort') plt.xlabel('t') plt.ylabel('h(t)') plt.grid() plt.show() [[Datei:PythonIng_bode3.svg]] Einige weitere wichtige Daten (Phasenreserve, Amplitudenreserve, Durchtrittsfrequenz) lassen sich mittels der <code>control</code>-Funktion <code>margin()</code> ermitteln. Die Ortskurve lässt sich mit der Funktion <code>nyquist_plot()</code> zeichnen. Dies sei hier aber nicht weiter ausgeführt. ==Aufgaben== * Zeichen Sie mit Python die Ortskurve für obiges Beispiel. * Was passiert, wenn man die Reglerverstärkung weiter aufdreht (z.B. auf <math>R = \frac{25}{2}</math>)? * Wie sehen das Bode-Diagramm und die Sprungantwort aus, wenn ein PI-Regler verwendet wird? = Stereostatik etc. = Das Modul SymPy bietet einige Möglichkeiten einfache Bauwerke zu berechnen, z.B. Balken oder Fachwerke. Nachfolgend wird ein einfaches Fachwerk berechnet und gezeichnet. Python-Code: from sympy.physics.continuum_mechanics.truss import Truss t = Truss() # Knoten t.add_node(("A", -3, 0), ("B", 0, 0), ("C", 4, 0), ("D", 7, 0), ("E", 6, 1.5), ("F", 2, 3), ("G", -2, 1.5)) # Stäbe t.add_member(("AB","A","B"), ("BC","B","C"), ("CD","C","D")) t.add_member(("AG","A","G"), ("GB","G","B"), ("GF","G","F")) t.add_member(("BF","B","F"), ("FC","F","C"), ("CE","C","E")) t.add_member(("FE","F","E"), ("DE","D","E")) # Auflager; roller ... Loslager, pinned ... Festlager t.apply_support(("A","roller"), ("D","pinned")) # Einwirkende Kräfte t.apply_load(("G", 5, 270), ("E", 3, 90)) # Berechnung t.solve() print("Reaction Forces: ", t.reaction_loads) print("Internal Forces: ", t.internal_forces) # Fachwerk zeichnen p = t.draw() p.show() Ausgabe auf der Konsole: Reaction Forces: {'R_A_y': 4.20000000000000, 'R_D_x': 0, 'R_D_y': -2.20000000000000} Internal Forces: {'AB': 2.80000000000000, 'BC': 0.333333333333333, 'CD': -1.46666666666667, 'AG': -5.04777178564958, 'GB': -2.05555555555556, 'GF': -1.23413387432364, 'BF': 0.411111111111111*sqrt(13), 'FC': -0.3*sqrt(13), 'CE': 1.50000000000000, 'FE': 0.284800124843917, 'DE': 2.64407093534026} Zeichnung: [[File:PythonIng_fachwerk1.svg|300px]] Details zu diesem Thema siehe z.B. [https://docs.sympy.org/latest/modules/physics/continuum_mechanics/index.html Continuum Mechanics] oder [https://docs.sympy.org/latest/tutorials/physics/continuum_mechanics/index.html Continuum Mechanics Tutorials]. Auch andere mechanische Probleme werden von SymPy abgehandelt ([https://docs.sympy.org/latest/tutorials/physics/index.html Physics Tutorials]). == Aufgabe == Gegeben sei ein einseitig eingespannter Kragträger. Belastet wird er durch eine Einzellast am Trägerende. Für die Daten siehe folgende ASCII-Skizze: | 20 kN //|---> x | //| V //|---------------------- //| 10 m | Elastizitätsmodul E = 2,1*10⁵ N/mm² Flächenträgheitsmoment I = 0.001 m⁴ Berechnen Sie die Auflagerreaktionen, den Querkraft- und Biegemomentenverlauf, sowie die Verformungen. Stellen Sie dies mit Hilfe von SymPy graphisch und auch mittels Formeln dar. Verwenden Sie dazu auch pprint (pretty print) aus dem SymPy-Modul. Zwecks Lösungsansatz siehe die oben aufgeführte Seite "Continuum Mechanics Tutorials". Achten Sie auch auf die Einheiten! Kontrollieren Sie das Ganze mittels händischer Rechnung. In dem genannten Tutorial ist von "Singularity Functions" die Rede. Gemeint ist damit in diesem Kontext die {{W|Föppl-Klammer}}. Einige Python-Programme, vorrangig zu Maschinenelementen, finden sich auf [https://baymp.de/download_python.html BayMP für Python] (Balken, Zahnräder, Stabknickung usw.). = Stochastik = Die Stochastik ist ein sehr weites Feld. Hier werden nur einige wenige sehr einfache, aber wichtige Themen angerissen. Python stellt mit den Moduln math und statistics Software zu diesem Zwecke bereit. math und statistics sind bereits im Lieferumfang von Python enthalten. Aber auch mit den externen Modulen NumPy, SciPy und pandas kann man Stochastik in Python betreiben. Dies wird hier aber nicht gemacht. == Lageparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] m1 = statistics.mean(werte) m2 = statistics.mode(werte) m3 = statistics.median(werte) print("Arithmetischer Mittelwert = ", m1) print("Modalwert = ", m2) print("Median = ", m3) Ausgabe: Arithmetischer Mittelwert = 3.5 Modalwert = 1 Median = 3.0 == Streuungsparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] s = statistics.stdev(werte) print("Standardabweichung = ", s) Ausgabe: Standardabweichung = 2.6770630673681683 == Kombinatorik == import math n = 7 k = 5 print("n! = ", math.factorial(n)) print("Kombinationen (n über k) = ", math.comb(n, k)) Ausgabe: n! = 5040 Kombinationen (n über k) = 21 = Ein- und Ausgabe = == print == Die Anweisung print haben wir schon oft verwendet. Hier soll anhand von Beispielen kurz beschrieben werden, was der Befehl print leisten kann. print("Hallo", "Welt", 1, sep="-") print("Hallo", end=" ") print("Welt") Ausgabe: Hallo-Welt-1 Hallo Welt == input == a = int(input("Zahl 1: ")) b = int(input("Zahl 2: ")) print("a + b = ", a+b) Ausgabe (nach Eingabe der beiden Ganzzahlen): Zahl 1: 4 Zahl 2: 5 a + b = 9 == Aus Dateien lesen == Es seinen die datei.txt Hallo Welt. Wie geht es dir? ... und test1.py dat = open("datei.txt", mode = "r") print(dat.read()) dat.close() Ausgabe Hallo Welt. Wie geht es dir? ... Mit dem open()-Befehl wird die Datei datei.txt im Lesemodus geöffnet (r ... read). Mit dem read()-Befehl wird die Datei eingelesen und mittels print ausgegeben. == In Dateien schreiben == dat = open("datei.txt", mode = "a", encoding = "utf-8") dat.write("Hänge Zeile an\n") dat.close() Die Datei datei.txt sieht nach Abarbeitung des obigen Skripts nun so aus Hallo Welt. Wie geht es dir? ... Hänge Zeile an Es wird die Datei im Schreibmodus geöffnet (a ... append (anhängend), w ... write (überschreibend)). write() fügt hier also eine Zeile Text am Dateiende ein. close() schließt die Datei wieder. Das close() kann man sich mit der with-Anweisung auch sparen. with open("datei.txt", mode="a", encoding="utf-8") as dat: dat.write("Hänge Zeile an\n") = Benutzeroberflächen erstellen = == tkinter == {{Wikipedia | Tkinter}} Python bietet standardmäßig das Modul tkinter zur Programmierung von Benutzeroberflächen. Es müssen also bei der Verwendung von tkinter keine externen Module installiert werden. Hier wird eine (sehr) kurze Einführung in das Erstellen von grafischen Oberflächen mittels tkinter gegeben. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") win.minsize(300, 50) but = tk.Button(win, text = "Push the button") but.pack() win.mainloop() Ausgabe: [[Datei:PythonIng_gui1.jpg]] Ein etwas komplizierteres Beispiel sei nachfolgend gezeigt. Es sollen zwei Strings miteinander verknüpft und ausgegeben werden. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") def on_button_clicked(): str = ent1.get() + ent2.get() lab2["text"] = str ent1 = tk.Entry(win) ent2 = tk.Entry(win) lab1 = tk.Label(win, text="verknuepfen mit") lab2 = tk.Label(win, text="") but = tk.Button(win, text = "=", command=on_button_clicked) ent1.pack(side="left") lab1.pack(side="left") ent2.pack(side="left") but.pack(side="left") ent2.pack(side="left") lab2.pack(side="left") win.mainloop() Ausgabe (vor der Eingabe der Teilstrings): [[Datei:PythonIng_gui2.jpg]] Ausgabe (nach der Eingabe der Teilstrings und dem Drücken des =-Buttons): [[Datei:PythonIng_gui3.jpg]] == curses == {{Wikipedia | curses}} Mit dem curses-Modul lassen sich u.a. TUIs ('''T'''ext '''U'''ser '''I'''nterfaces) erstellen. Ein sehr einfaches Beispiel zur allgemeinen Funktionsweise wird nachstehend geliefert. import curses stdscr = curses.initscr() curses.start_color() curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) stdscr.clear() stdscr.addstr("Hallo Welt", curses.color_pair(1)) stdscr.refresh() stdscr.getch() curses.endwin() Als Ausgabe sollte <span style="color:#FF0000;">Hallo Welt</span> (rote Schrift auf weißem Hintergrund) auf dem Terminal/der Konsole erscheinen. Getestet wurde dies mit openSUSE Tumbleweed, Python-Version 3.13.12. Das entsprechende Python-curses-Package muss installiert sein. Allgemeine Informationen zur Terminal-/Konsolengröße und Cursorposition liefert folgendes Programm: import curses stdscr = curses.initscr() stdscr.addstr(3, 5, "LINES: %d" % curses.LINES) stdscr.addstr(4, 5, "COLS: %d" % curses.COLS) (y,x) = stdscr.getyx() stdscr.addstr(5, 5, "Momentane Cursorposition: [%d, %d]" % (y, x)) (y,x) = stdscr.getbegyx() stdscr.addstr(6, 5, "Koordinatenursprung: [%d, %d]" % (y, x)) (y,x) = stdscr.getmaxyx() stdscr.addstr(7, 5, "Fenstergröße: [%d, %d]" % (y, x)) stdscr.addstr(11, 2, "Taste drücken -> Ende") stdscr.refresh() stdscr.getch() curses.endwin() Es sollte sich in etwa folgende Ausgabe ergeben: LINES: 44 COLS: 110 Momentane Cursorposition: [4, 15] Koordinatenursprung: [0, 0] Fenstergröße: [44, 110] Taste drücken -> Ende Zur Funktionsweise von curses siehe auch das Wikibook [[ncurses]]. Zum Verständnis sind dort allerdings elementare Kenntnisse in der Programmiersprache C erforderlich. == Qt == {{Wikipedia | Qt (Bibliothek)}} Auch für das Qt-Framework gibt es eine Anbindung an Python. Nachfolgend ein einfaches Beispiel. import sys from PySide6.QtWidgets import QApplication, QLabel app = QApplication(sys.argv) label = QLabel("Hallo Welt!") label.show() sys.exit(app.exec()) Ausgabe: [[Datei:PythonIng_gui10.png]] == Gtk == {{Wikipedia | GTK (Programmbibliothek)}} Eine idente Ausgabe, wie oben für Qt gezeigt, erzeugt z.B. folgendes Gtk-Programm: import gi gi.require_version("Gtk", "4.0") from gi.repository import Gtk def on_activate(app): win = Gtk.ApplicationWindow(application=app) lab = Gtk.Label(label="Hallo Welt!") win.set_child(lab) win.present() app = Gtk.Application() app.connect('activate', on_activate) app.run(None) Auch für die Benutzung von Qt und Gtk müssen die jeweiligen Packages installiert sein. Getestet wurden die entsprechenden Python-Programme nur unter openSUSE Tumbleweed. Wie das GTK-Paket unter MS Windows 11 installiert wird, siehe z.B. [https://www.gtk.org/docs/installations/windows Setting up GTK for Windows]. Damit sei aber das Thema "Benutzeroberflächen erstellen" hier abgeschlossen, da dies schon ein sehr spezielles Aufgabengebiet ist, das eher Informatiker und nicht so sehr Ingenieure anspricht. Bei Bedarf siehe aber ggf. die entsprechenden Links unten in diesem Tutorial. Dort sind weiterführende Informationen zu finden. = Style Guide und flake8 = Wie man schönen und richtigen Python-Code schreibt, erfahren Sie in * [https://peps.python.org/pep-0008/ PEP 8 – Style Guide for Python Code] Ein Modul, das prüft, ob die Richtlinien im Style Guide eingehalten wurden, ist ''flake8'': * [https://flake8.pycqa.org/en/latest/ Flake8: Your Tool For Style Guide Enforcement] = Einige Integrierte Entwicklungsumgebungen (IDEs)= Werden Programmtexte größer und umfangreicher, so ist das Arbeiten mit der interaktiven Programmierumgebung bzw. das direkte Ausführen von Python-Skripten mühsam. Man wünscht sich z.B. Hilfen zum Debuggen oder die automatische Code-Vervollständigung. Zu diesem Zweck wurden IDEs (Integrated Development Environments) geschaffen. Von diesen seinen nachfolgend auszugsweise einige kurz beschrieben. Testen Sie einfach aus, welche davon für Sie bzw. für Ihr Python-Projekt geeignet sind. == IDLE == IDLE ist die mit dem Python-Programmpaket mitgelieferte IDE. Der Name leitet sich einerseits ab vom Monty-Python-Mitglied Eric Idle, andererseits steht es als Abkürzung für "'''I'''ntegrated '''D'''evelopment and '''L'''earning '''E'''nvironment. IDLE ist einfach zu bedienen, bietet aber schon einen beachtlichen Leistungsumfang. Nachfolgend wird ein Screenshot zu IDLE geliefert. Rechts ist das Editor-Fenster zu sehen, links die interaktive Programmierumgebung. Um das Beispiel selbst nachvollziehen zu können, starten Sie IDLE. Das geht ähnlich, wie Sie die interaktive Programmierumgebung von Python starten (nur, dass Sie eben das IDLE-Icon doppelklicken und nicht das Python-Icon. Unter Linux geben Sie einfach in einem Terminal <code>idle3.13</code> o. Ä. ein). Weiter geht es mit "File - Open - ...". Die auszuführende Datei auswählen (im konkreten Fall ein "Hallo-Welt"-Programm). Es erscheint das rechte Fenster. Dort "Run - Run Module" auswählen. Und schon wird im linken Fenster "Hallo Welt!" ausgegeben. [[Datei:PythonIng_idle1.jpg | 600px]] Siehe auch {{W|IDLE}}. == PyCharm == PyCharm ist ein kommerzielles Produkt. Es gab aber auch eine kostenlose Community Edition. Seit 2025 sind beide Varianten vereint. Für die ersten 30 Tage sind die Pro-Funktionen frei verfügbar, danach nur noch die Kernfunktionalitäten (oder man bezieht kostenpflichtig die Pro-Version). Zu beziehen ist PyCharm unter dem Weblink [https://www.jetbrains.com/pycharm/]. Nachfolgend ein etwas abgewandeltes "Hallo Welt"-Programm, editiert und ausgeführt mit PyCharm. [[Datei:PyCharm_IDE_2023_screenshot.png | 600px]] Siehe auch {{W|PyCharm}}. == Eric == Auch eric ist Open Source und steht unter der GNU General Public License Version 3 oder später. Zu beziehen ist diese Software unter [https://eric-ide.python-projects.org/]. [[Datei:Screenshot_Eric_4.png | 600px]] Siehe auch {{W|eric (Software)}}. <small> Unter openSUSE Tumbleweed sollte sich eric auch mit YaST installieren lassen. Bei mir gibt es aber dann beim Ausführen des eric-Programms eine Fehlermeldung (Stand März 2026): ... ModuleNotFoundError: No module named 'PyQt6.QtPdfWidgets' Umgehen kann man dieses Problem aber wieder mit dem Erstellen einer virtuellen Umgebung, in etwa so python3.13 -m venv ~/tmp/venv1 cd ~/tmp/venv1/bin ./python3.13 -m pip install --upgrade --prefer-binary eric-ide ./eric7_ide </small> == PyScripter == Vom Funktionsumfang vergleichbar mit den vorherigen IDEs ist PyScripter. Auch PyScripter ist Open Source. Die Projekt-Homepage findet sich auf [https://sourceforge.net/projects/pyscripter/]. PyScripter ist nur für MS Windows verfügbar. [[Datei:PythonIng_pyscripter1.jpg | 600px]] == Spyder IDE == Spyder enthält bereits eine stabile Python-Version und etliche Module (z.B. matplotlib, numpy, control). Ansonsten kann dieses Softwarepaket vom Funktionsumfang her mit den anderen genannten IDEs locker mithalten. Spyder wurde unter der MIT-Lizenz veröffentlicht. Diese Software findet sich auf [https://www.spyder-ide.org]. [[Datei:Spyder-windows-screenshot.png | 600px]] Siehe auch {{W|Spyder (Software)}} == Sonstige == Die genannten IDEs sind nicht die Einzigen. Es gibt, um dem Image Pythons als beliebteste Programmiersprache gerecht zu werden, noch einige andere. Sowohl Open Source-Programme als auch kommerzielle Programme sind im Web zu finden, z.B. Thonny oder {{W|Visual Studio Code}}. Braucht man den Umfang von ausgewachsenen IDEs nicht, so kann man auch normale Texteditoren verwenden (z.B. {{W|Geany}} oder {{W|Kate_(Texteditor)|Kate}}). = Debuggen und Testen = Das Debuggen und Testen von Programmen sind wichtige Bestandteile der Programmierung. Syntaxfehler lassen sich i.A. leicht beheben. Schwieriger ist das Eingrenzen von logischen Fehlern, die ev. nur in bestimmten Situationen auftreten und keine explizite Fehlermeldung hervorrufen. Das Programm liefert falsche Ergebnisse oder es stürzt aus heiterem Himmel ab. Um das zu verhindern gibt es verschiedene Werkzeuge, die bei der Fehlersuche behilflich sein können. Vorerst siehe aber zwecks Begriffsklärung noch folgende Links: * {{W|Debuggen}} * {{W|Debugger}} * {{W|Softwaretest}} <gallery> First Computer Bug, 1947.jpg Test ganzheitlich.png V-Modell.svg </gallery> == Das Modul pdb == Python bringt schon ein Modul zum Debuggen mit. Siehe z.B. [https://docs.python.org/3/library/pdb.html pdb — The Python Debugger]. Komfortabler lässt sich das aber mittels Integrierter Entwicklungsumgebungen (IDEs) angehen. == Debuggen mit IDEs == Für die IDEs IDLE und Spyder sei kurz auf die entsprechenden Webseiten verwiesen: * [https://www.cs.uky.edu/~keen/help/debug-tutorial/debug.html Debugging under IDLE]. * [https://docs.spyder-ide.org/current/panes/debugging.html Spyder Debugger] Dort wird die Vorgehensweise auch mittels Screenshots erläutert. == assert == assert ... behaupten, zusichern ({{W|Assertion (Informatik)}}) Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10., 0.) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10., 0.) File "/home/hr/Develop/test1.py", line 4, in print1 assert y != 0.0 ^^^^^^^^ AssertionError Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1("10.", "5.") File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Aber auch bei nachfolgendem Code gibt es eine Fehlermeldung: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10, 5) File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Damit letzteres funktioniert, kann man den Programmcode so umschreiben: def print1(x, y): assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 2.0 Und jetzt fangen wir den <code>AssertionError</code> auf: def print1(x, y): try: assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) except(AssertionError): print("Hallo") print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Hallo Ich hoffe, es ist wenigstens im Ansatz klar geworden, wofür <code>assert</code> gut sein kann. Ausschalten kann man die <code>assert</code>-Überprüfung übrigens mit dem Python-Schalter <code>-O</code>. == Doctests == Innerhalb eines Docstrings kann die Arbeit im interaktiven Modus simuliert werden. Nach den Promptzeichen (>>>) erfolgen dann bei unserem Beispiel innerhalb des Docstrings simulierte Aufrufe der Funktion <code>print1()</code>. Danach folgen jeweils die Sollresultate. Wird das Modul oder die Datei als Hauptprogramm aufgerufen, so wird die Funktion <code>doctest.testmode()</code> aufgerufen und ein Bericht auf der Konsole ausgegeben. Wird das Modul nicht als Hauptprogramm aufgerufen, sondern importiert, dann wird diese <code>testmod</code>-Funktion nicht aufgerufen. D.h. dieser Code kann sowohl für Testzwecke als auch für den produktiven Einsatz verwendet werden. Das ist auch sinnvoll, weil wenn man Teile der Datei immer löschen bzw. einfügen müsste, so würden sich Fehlerquellen auftun. Das würde den Sinn und Zweck von Doctests konterkarieren. def print1(x=0., y=1.): """ Dividiere zwei Zahlen Autor: Intruder Datum: 12.08.2025 >>> print1(2., 1.) 2.0 >>> print1(5., 2.) 2.5 >>> print1(5.) 5.0 """ print(x/y) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) Ausgabe: Trying: print1(2., 1.) Expecting: 2.0 ok Trying: print1(5., 2) Expecting: 2.5 ok Trying: print1(5.) Expecting: 5.0 ok 1 items had no tests: __main__ 1 items passed all tests: 3 tests in __main__.print1 3 tests in 2 items. 3 passed and 0 failed. Test passed. Das gezeigte Beispiel ist so ziemlich das einfachste, das es gibt. Für weiterführende Details siehe z.B.: * [https://peps.python.org/pep-0257/ PEP 257 – Docstring Conventions] * [https://docs.python.org/3/library/doctest.html doctest — Test interactive Python examples] == pytest == Siehe zu diesem Thema auch {{W|Modultest}}. pytest ist ein externes Modul und muss vorab installiert werden, z.B. mittels pip install -U pytest pip install -U pytest-html Python-Code, Datei test1.py: def add(x, y): return x + y def test_answer(): assert add(1, 1) == 3 Starten von pytest in der Konsole: pytest test1.py Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py F [100%] ========================================================= FAILURES ========================================================== ________________________________________________________ test_answer ________________________________________________________ def test_answer(): > assert add(1, 1) == 3 E assert 2 == 3 E + where 2 = add(1, 1) test1.py:6: AssertionError ================================================== short test summary info ================================================== FAILED test1.py::test_answer - assert 2 == 3 ===================================================== 1 failed in 0.09s ===================================================== Hier erhalten wir einen Fehler, da 1+1 eindeutig ungleich 3 ist. Aber aus irgendeinem Grund wollte der Programmierer oder Tester in diesem Fall, dass dies so ist. Testfälle werden übrigens mit dem Präfix <code>test_</code> eingeleitet. Python-Code: def add(x, y): return x + y + 1 def test_answer(): assert add(1, 1) == 3 Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py . [100%] ===================================================== 1 passed in 0.01s ===================================================== Jetzt ist alles in Ordnung. Weiterführendes siehe z.B. * [https://docs.pytest.org/en/stable/ pytest: helps you write better programs] == unittest == Auch unittest dient zur Durchführung von Testreihen, ist aber Bestandteil von Python. Hier wird vorerst nicht näher darauf eingegangen. Siehe z.B. * [https://docs.python.org/3/library/unittest.html unittest — Unit testing framework] Lt. ''Inden: Python Challenge; dpunkt, 2021, Seite 481'' soll unittest weniger komfortabel als pytest sein. Einen Vergleich von unittest mit pytest findet man in * [https://knapsackpro.com/testing_frameworks/difference_between/pytest/vs/unittest pytest vs unittest] = Ausblick = Dies war eine kurze Einführung in die Berechnungs- und Darstellungsmöglichkeiten mit Python. Es sollten etliche relevante Themen behandelt, oder zumindest kurz angesprochen worden sein. Wem dieser Text nicht ausreichend ist, der sei auf die entsprechenden weiterführenden Weblinks, Bücher und die Python-Hilfefunktion verwiesen. Python kennt noch viel mehr Befehle, als hier dargestellt wurden. Das Themenspektrum ist auch durch die Einbindung externer Module fast beliebig erweiterbar. = Weblinks= == Python allgemein == * [https://www.python.org/ Python Homepage] == Externe mathematische Module == * [https://numpy.org/ NumPy] * [https://numpy.org/doc/stable/user/numpy-for-matlab-users.html NumPy for MATLAB users] * [https://scipy.org/ SciPy] * [https://www.sympy.org/en/index.html SymPy] * [https://pandas.pydata.org/ pandas] * [https://github.com/maroba/findiff findiff] * [https://mpmath.org/ mpmath] == Externe Module für Grafiken == * [https://matplotlib.org/ Matplotlib] * [https://vpython.org/ VPython] * [https://docs.vtk.org/en/latest/api/python.html VTK] == Erstellung von User Interfaces == * [https://docs.python.org/3/library/tkinter.html tkinter - Python interface to Tcl/Tk] * [https://docs.python.org/3/library/curses.html curses - Terminal handling for character-cell displays] * [https://wiki.qt.io/Qt_for_Python Qt for Python] * [https://www.gtk.org/docs/language-bindings/python GTK and Python] == Erstellen virtueller Umgebungen == * [https://docs.python.org/3/library/venv.html venv - Creation of virtual environments] == Sonstige == * [https://python-control.readthedocs.io/en/stable/ Python Control Systems Library] * [https://pypi.org/project/regex/ regex - Regular Expressions] = Bücher = == Gedruckte Bücher, OpenBooks, Magazine == * Diverse: c't Python Lernen, Verstehen, Anwenden; Heise, 2022 * Ernesti, Kaiser: Python3 - das umfassende Handbuch; 5. Aufl., Rheinwerk, [https://openbook.rheinwerk-verlag.de/python/ OpenBook] * Inden: Python Challenge; dpunkt, 2021, ISBN 978-3-86490-809-5 * Klein: Numerisches Python; 2. Aufl., Hanser, 2023, ISBN 978-3-446-47170-2 * Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler; Rheinwerk, 2021, ISBN 978-3-8362-7316-9 * Weigend: Python 3 - Das umfassende Praxisbuch; 9. Aufl., mitp, 2022, ISBN 978-3-7475-0544-1 * Woyand: Python für Ingenieure und Naturwissenschaftler; 4. Aufl., Hanser, 2021, ISBN 978-3-446-46483-4 == Andere Wikibooks == * [[:en:Subject:Python_programming_language | Englische Wikibooks zum Thema Python]] * [[Python|Deutschsprachiges Python-Wikibook]] [[Bild:2von10.png|20%]] * [[Python unter Linux|Python 2.7 unter Linux]] [[Bild:10von10.png|100%]] {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} l86xi87bforh8rpp8kiyrh41s6aghe8 1082857 1082856 2026-04-06T12:27:56Z Intruder 1513 /* Mit VTK */ Tippf. korr. 1082857 wikitext text/x-wiki {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} = Hallo Welt und allgemeine Hinweise = == Was ist Python == * Python ist eine universelle höhere Programmiersprache. * Python ist objektorientiert. * Python ist Open-Source (Python Software Foundation License). * Python ist für viele Betriebssysteme erhältlich (z.B. für Linux, MS Windows, macOS). * Python ist ein Interpreter. * Python ist durch Module fast beliebig erweiterbar. * Python als Programmiersprache ist case-sensitive - d.h. Groß- und Kleinschreibung ist relevant bei der Eingabe von Befehlen. {{Wikipedia | Python (Programmiersprache)}} == Python installieren == === MS Windows === Laden Sie das aktuelle Python-Paket von der Webseite [https://www.python.org/] herunter. Weiter geht es wie bei jedem anderen größeren zu installierenden Programm. Einfach das Installationsprogramm im Explorer doppelklicken und den Anweisungen des Setup-Programmes folgen. === Linux === Entweder ist Python bereits standardmäßig installiert, ansonsten ist die Installation mittels Paketmanagementsystem einfach möglich. Aber auch die Spyder-Entwicklungsumgebung ([https://www.spyder-ide.org]) bietet einen guten Einstieg mit Python (das gilt auch für MS Windows). Spyder bringt auch schon etliche wichtige Module standardmäßig mit. == Python starten == === MS Windows === Das Icon für das Python-Programm doppelklicken. Und schon startet das Programm. [[Datei:PythonIng_start1.jpg]] Python im interaktiven Modus präsentiert sich dann so: Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> Alternativ kann das Programm auch über die Eingabeaufforderung oder die PowerShell gestartet werden: c:\devel\Python>python.exe Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> === Linux === Tippen Sie einfach das Wort „python“ (oder unter openSUSE Tumbleweed z.B. auch „python3.11“ oder „python3.13“) in einem Linux-Terminal ein, schließen den Befehl mit der RETURN-Taste ab, und schon startet Python im interaktiven Modus: Python 3.13.12 (main, Feb 09 2026, 22:37:44) [GCC] on linux Type "help", "copyright", "credits" or "license" for more information. >>> Es gibt auch noch andere Möglichkeiten Python zwecks Programmausführung zu starten, z.&nbsp;B. den {{W|Shebang}} (<code>#!</code>) am Beginn eines Python-Scripts. Das Script sei als Script.py gespeichert. Dann kann das Script mit ./Script.py ausgeführt werden. Für openSUSE Tumbleweed sei nachfolgend ein lauffähiges "Hallo Welt!"-Script angegeben. Es wird in diesem Script der Python-Interpreter in der Version 3.13 verwendet : #!/usr/bin/python3.13 print("Hallo Welt!") Die Berechtigungen zum Ausführen der Datei müssen natürlich noch richtig gesetzt werden, z.B. mittels <code>chmod 777 Script.py</code>. <small>Oder es wird in einen Pfad verschoben, in dem sich ausführbare Programme generell befinden (<code>echo $PATH</code>). Das Script kann dann wie ein normales Programm ohne weitere Angaben mit Script.py gestartet werden. Alternativ wird nicht das Script an sich verschoben, sondern nur ein symbolischer Link angelegt, z.B. mit <code>ln -s ~/tmp/Script.py ~/.local/bin/Script.py</code>.<code>~/.local/bin</code> sei ein im PATH gelegenes Verzeichnis. Dies sind aber schon Features für fortgeschrittene Linux-Benutzer und werden am Anfang eher selten benötigt.</small> == Ein paar Worte zur Erklärung == Getestet wurden die Beispiele unter den Betriebssystemen * MS Windows 10 mit der Python-Version 3.12.0 (teilweise auch mit 3.12.2 und 3.13.1; nur die Inhalte die bis spätestens Juli 2025 erstellt wurden) * MS Windows 11 ab der Python-Version 3.13.4 (nur zum Teil; ab Juli 2025) * openSUSE Leap 15.6 mit der Python-Version 3.11.12 (Spyder, nur vereinzelt) und zum Teil mit 3.12.11 (ab Juli 2025 bis November 2025). * openSUSE Tumbleweed ab der Python-Version 3.13.9 (nur vereinzelt, ab November 2025) An Beliebtheit rangiert Python mit Stand März 2026 mit einem Rating von 21,25% an 1. Stelle vor C und C++ (lt. [https://www.tiobe.com/tiobe-index/ TPCI - TIOBE Programming Community Index]). Lt. [https://innovationgraph.github.com/global-metrics/programming-languages GitHub Top 50 Programming Languages Globally] lag Python im Q3/2025 auf Rang 2, vor TypeScript und hinter JavaScript. Der Name "Python" rührt von der Komikertruppe {{W|Monty Python}} her. Die Icons für Python (z.B. Python selbst, Eric IDE, IDLE) sind aber durch die Python-Schlangenart symbolisiert. <gallery> Python-logo-notext.svg|Python-Logo Guido van Rossum OSCON 2006.jpg|Guido van Rossum (geb. 1956), der Erfinder von Python </gallery> == Ein erstes Programm == Kommentare werden in Python mit der Raute (#) eingeleitet. Sie werden vom Python-Interpreter ignoriert. Text kann mit der print-Funktion ausgegeben werden. Starten Sie Python und geben sie folgende Anweisungen zeilenweise ein >>> # Das ist ein Kommentar >>> print("Hallo Welt!") Als Ergebnis erhalten Sie Hallo Welt! Der Prompt (>>>) ist selbstverständlich nicht einzutippen, sondern wird vom Python-System geliefert. Strings können in Python entweder in Anführungszeichen (") gesetzt werden oder in Hochkommatas('). In diesem Text wird die erste Variante bevorzugt eingesetzt. Im Gegensatz zu Julia ist es hier egal, ob zwischen <code>print</code> und der öffnenden Klammer Leerzeichen stehen. = Python als Taschenrechner = == Allgemeines == Wir wollen 3 * 5 berechnen. Dazu starten wir Python im interaktiven Modus. Geben Sie dann die Formel >>> 3 * 5 ein, drücken die Taste ENTER/RETURN ({{Taste|↵}}) und erhalten als Ergebnis 15 Auch kompliziertere Ausdrücke sind möglich. Beispielsweise mit Winkelfunktionen, Quadratwurzeln etc. Wir wollen nun den Ausdruck <math>\sin\sqrt{15}</math> berechnen : >>> import math >>> math.sin(math.sqrt(15)) -0.6679052983383519 Als erstes wird das math-Modul importiert. Dann wird der mathematische Ausdruck berechnet. Eine andere Variante, die dasselbe Ergebnis liefert, ist >>> from math import * >>> sin(sqrt(15)) -0.6679052983383519 Es wird also aus dem Modul <code>math</code> alles importiert (erkennbar am <code>*</code>). Will man nicht alles importieren, so kann man das auch einschränken: >>> from math import sin, sqrt Beenden lässt sich das Python-Programm durch Eingabe von <code>exit()</code> (und natürlich ist zur Bestätigung die RETURN-Taste zu drücken). == Die Hilfefunktion von Python == Bei Eingabe der Anweisung help() springt Python in den Hilfemodus. Eingabe: >>> help() Eingabe: help> math.sin Ausgabe: Help on built-in function sin in math: math.sin = sin(x, /) Return the sine of x (measured in radians). Für die komplette Python-Dokumentation siehe [https://docs.python.org/3/]. Verlassen kann man den Hilfemodus durch das Drücken von STRG-C. == Aufgaben == * Erkunden Sie die Tangensfunktion "tan" mittels Python-Hilfe (vergessen Sie nicht das math-Modul zu importieren und das <code>math.</code> vor <code>tan</code>) * Berechnen Sie mit Python den Ausdruck <math>\frac{1}{2}\cdot e^2 \cdot \tan(\pi/3)</math>. Siehe für die Exponentialfunktion im Python-Hilfesystem auch den Befehl <code>math.exp</code>. Alternativ kann auch die Konstante <code>math.e</code> eingesetzt werden. Potenzieren kann man bei Python mit dem **-Operator (z.B. 2**3 = 8). Für <math>\pi</math> gibt es <code>math.pi</code>. = Python als Scriptsprache = Häufig wird man aber kompliziertere Anweisungsfolgen verarbeiten müssen. Diese will man normalerweise nicht jedesmal neu eingeben, sondern in einer Datei speichern und diese Datei dann zur Ausführung bringen. Speichern Sie dazu folgenden Code in einer Textdatei, z.B. unter MS Windows als c:\tmp\test1.py # Das ist ein Kommentar print("Hallo Welt!") Python-Dateien werden mit der Dateiendung .py versehen. Achten Sie darauf, dass vor dem print keine Leerzeichen vorhanden sind. Das ist eine Python-Eigenheit. Wie wir später sehen werden, nutzt Python Einrückungen als syntaktisches Mittel, z.B. um bei Schleifen den Schleifenkörper zu kennzeichnen. Danach bringen Sie die Skriptdatei test1.py (sozusagen das Hauptprogramm) folgendermaßen zur Ausführung: 1) Starten Sie unter MS Windows die Eingabeaufforderung (oder alternativ auch die Windows PowerShell). Das sieht dann etwa so aus: Microsoft Windows [Version 10.0.19045.3693] (c) Microsoft Corporation. Alle Rechte vorbehalten. C:\Users\xyz> : <small>Falls jemand nicht weiß, wie man die Eingabeaufforderung startet: Eine Möglichkeit ist, einfach in der Taskleiste von Windows das "Start"-Symbol &nbsp;([[Image:Windows_logo_-_2021_(Black).svg|10px]])&nbsp; mit der rechten Maustaste anklicken. "Ausführen" auswählen (oder alternativ für die PowerShell unter Windows 10 den Eintrag "Windows PowerShell", unter Windows 11 den Eintrag "Terminal"). Im sich öffnenden Dialogfenster gibt man in die "Öffnen"-Zeile das Wort <code>cmd</code> ein und mit "OK" wird das Ganze bestätigt.</small> 2) Wechseln Sie mittels <code>cd c:\tmp</code> in das Verzeichnis c:\tmp 3) Angenommen, Sie haben Python unter dem Pfad <code>c:\devel\Python\</code> installiert. Starten Sie das Programm so (der Prompt <code>c:\tmp></code>ist natürlich nicht mit einzutippen): c:\tmp>c:\devel\Python\python.exe test1.py 4) Wie erwartet ergibt sich folgende Ausgabe am Bildschirm Hallo Welt! Die Vorgehensweise unter Linux ist prinzipiell gleich. Die kleinen Unterschiede, wie z.B. der Slash statt dem Backslash in Pfadangaben, sollten für Linux-Benutzer keine Hürde darstellen. == Variablen == Variablenbezeichner können aus Buchstaben (A-Za-z), Ziffern (0-9) und Underscores (_) bestehen, dürfen aber nicht mit einer Zahl beginnen. Führende Underscores haben u.a. im Kontext mit der Objektorientierten Programmierung eine spezielle Bedeutung und sollten nicht für "normale" Variablenbezeichner verwendet werden. Gültige Variablenbezeichner wären also: xyz x1 _wert name_anzahl Es gibt in Python etliche Schlüsselwörter (z.B. for, if oder return). Diese dürfen nicht als eigene Variablenbezeichner verwendet werden. Eine Liste aller Schlüsselwörter liefert das Script import keyword print(keyword.kwlist) <small>Übung: Speichern Sie dieses Script in eine Datei, z.B. in c:\tmp\test1.py. Führen Sie diese Datei aus, um die Liste der Schlüsselwörter auszugeben.</small> Da Python case-sensitiv ist, repräsentieren folgende Bezeichner verschiedene Variablen: xyz XYZ xYz Werte werden an Variablen mittels Gleich-Zeichen (=) zugewiesen. Im Folgenden wird der Code immer in der Datei c:\tmp\test1.py gespeichert. x = 5 y = 10 z = x*y print(z) Bringen Sie die Datei test1.py zur Ausführung so erhalten Sie folgende Bildschirmausgabe 50 Sie können auch mehrere Anweisungen in einer Zeile durch Semikolon getrennt schreiben. Dies führt aber zu unübersichtlichem Code. x = 5; y = 10; z = x*y; print(z) Ausgabe: 50 Auch aus der Programmiersprache C/C++ oder Java bekannte Konstrukte können Sie verwenden, z.B. x = 5 # x = x - 2 x -= 2 print(x) Bildschirmausgabe: 3 Beachten Sie, dass mit dem =-Zeichen eine Wertezuweisung durchgeführt wird. Dies ist nicht äquivalent zum mathematischen =-Zeichen, wie am vorigen Beispiel zu ersehen ist. Den Inkrement-/Dekrementoperator (z.B. x++ oder x--) aus C/C++ oder Java kennt Python aber nicht. Variablen sind nicht an einen bestimmten Datentyp gebunden, folgendes ist mit Python problemlos möglich: import math wert = 10 print(wert) wert = 35.5 print(wert) wert = "Hallo" print(wert) wert = math.pi print(wert) Ausgabe: 10 35.5 Hallo 3.141592653589793 == Physische und logische Zeilen == In Python muss eine Anweisung in einer logischen Zeile Platz finden. Wird eine Anweisung aber zu lang für eine Zeile, dann kann sie in mehrere physische Zeilen unterteilt werden. Dies kann einerseits durch einen Backslash am Ende einer Zeile geschehen, z.B. a = 2 + \ 5 Dies stellt eine logische Zeile dar, die in zwei physische Zeilen unterbrochen ist. Geklammerte Ausdrücke werden automatisch zu einer logischen Zeile verbunden, z.B. a = (2 + 5) Achtung: Im ersten Beispiel darf nach dem Backslash nichts mehr stehen, auch kein Kommentar. Dies trifft im zweiten Bespiel nicht zu, hier könnte noch ein Kommentar folgen, z.B. a = (2 + # Kommentar 5) Auch für Strings gibt es Möglichkeiten, diese auf mehrere Zeilen aufzuspalten. # Kurzer String str1 = "ABC" # Langer String str2 = """Hallo Welt, Grüetzi Schwyzer, Servus an alle""" # Backslash str3 = "UVW\ XYZ" print(str1) print(str2) print(str3) Ausgabe: ABC Hallo Welt, Grüetzi Schwyzer, Servus an alle UVWXYZ ==Hexadezimale, oktale, binäre und andere Zahlen== d = 1050 # Dezimalzahl h = 0xAA2 # Hexadezimalzahl o = 0o12 # Oktalzahl b = 0b100001101 # Binärzahl print(d) print(h) print(o) print(b) Ausgabe: 1050 2722 10 269 Groß- und Kleinbuchstaben sind in obigen Literalen übrigens egal. So kann man z.B. statt <code>0b1001</code> auch <code>0B1001</code> schreiben (siehe dazu [https://docs.python.org/3/reference/lexical_analysis.html#integer-literals]). Sie können auch dezimale in hexadezimale Zahlen umwandeln, usw.: h = hex(1050) # Dezimalzahl -> Hexadezimalzahl b = bin(1050) # Dezimalzahl -> Binärzahl o = oct(1050) # Dezimalzahl -> Oktalzahl print(h) print(b) print(o) Ausgabe: 0x41a 0b10000011010 0o2032 Gegeben sei die Zahl 121 zur Basis 3. Diese soll in eine Dezimalzahl umgewandelt werden. Das kann so geschehen: z = int("121", 3) print(z) Ausgabe: 16 Dass dies richtig ist, davon kann man sich folgendermaßen überzeugen: <math> 1 \cdot 3^2 + 2 \cdot 3^1 + 1 \cdot 3^0 = 9 + 6+ 1 = 16 </math> Zahlen übersichtlicher schreiben kann man auch mittels Underscore, z.B.: print("Eine Million (Variante 1) =", 1000000) print("Eine Million (Variante 2) =", 1_000_000) print("Eine Rechnung:", 2_000 * 400_000); Es ergibt sich bei beiden Varianten die gleiche Ausgabe. Variante 2 ist aber im Sourcecode leichter lesbar, detto die Zahlen in der Rechnung: Eine Million (Variante 1) = 1000000 Eine Million (Variante 2) = 1000000 Eine Rechnung: 800000000 == Strings und Platzhalter== Ein paar einfache Beispiele: print("Hallo {}" . format("Hugo")) print("Hallo {:s}" . format("Hugo")) print("Hallo %s" % "Hugo") Ausgabe: Hallo Hugo Hallo Hugo Hallo Hugo Python-Code (formatted string literals): str1 = "Hallo" str2 = "Hugo" print(f"{str1} {str2}") Ausgabe: Hallo Hugo Komplexere Beispiele: print("Hallo {} und {}" . format("Hugo", "Mike")) print("Hallo {name1} und {name2}" . format(name2="Hugo", name1="Mike")) # Füllzeichen: * # Bündigkeit: > (=rechts), < (=links), ^ (=zentriert) # Feldweite: 10 # Typ: s (=String), f (=Gleitkommazahl), d (=Dezimalzahl) etc. print("Hallo {:*>10s}" . format("Hugo")) print("Hallo {:*<10s}" . format("Hugo")) Ausgabe: Hallo Hugo und Mike Hallo Mike und Hugo Hallo ******Hugo Hallo Hugo****** Python-Code: str = "Hallo\t%s\t%7.2f\t%10.2e\t%i" % ("Hugo", 12.34567, 34.567, 264) print(str) Ausgabe: Hallo Hugo 12.35 3.46e+01 264 == Unicode == Neben den bekannten ASCII-Zeichen lassen sich Zeichen auch mittels Unicode beschreiben. Griechische Buchstaben oder komplexere mathematische Operatoren - all das sollte kein Problem sein. Siehe auch {{W|Unicode}}, {{W|Liste der Unicodeblöcke}} und {{W|Unicodeblock Mathematische Operatoren}}. Im Folgenden werden ein paar Zeichen (Allquantor, Nabla-Operator, Existenzquantor), die man aus der Mathematik kennt, erzeugt. ch1 = "\N{FOR ALL}" ch2 = "\N{NABLA}" ch3 = "\u2203" print(ch1, ch2, ch3) Ausgabe: ∀ ∇ ∃ <small>Diese Ausgabe ergibt sich z.B. mit der IDLE-Shell oder mit Cygwin. Beim Ausführen über die Windows-Eingabeaufforderung oder Windows PowerShell unter MS Windows 10 erfolgt keine korrekte Darstellung. IDLE ist die mit Python mitgelieferte IDE ('''I'''ntegrated '''D'''evelopment '''E'''nvironment, Integrierte Entwicklungsumgebung). Gegen Ende dieses Textes wird IDLE kurz beschrieben. Das Problem mit der Windows Eingabeaufforderung lässt sich aber umgehen. Man muss nur eine Schriftart auswählen, die die Zeichen kennt, z.B. "DejaVu Sans Mono". Dazu klicken Sie einfach bei der Eingabeaufforderung mit der rechten Maustaste oben auf die weiße Leiste und wählen im aufpoppenden Fenster den Menüpunkt "Eigenschaften". Es öffnet sich ein Dialogfenster. Über den Reiter "Schriftart" lässt sich nun die Schriftart einstellen. Unter MS Windows 11 oder openSUSE Leap 15.6 (bash-Konsole) gibt es dieses Problem ohnehin nicht.</small> == Reguläre Ausdrücke == Python kennt auch {{W|Regulärer Ausdruck|reguläre Ausdrücke}}. Dazu gibt es in Python das Modul <code>re</code>. Beipielsweise sollen alle Zahlen (<math>\text{zahl}\in\mathbb{N}_0</math>) in einem String gesucht und ausgegeben werden. Als String sei gegeben: <code>3x Grüße und 100 Kekse.</code> Das Muster (Pattern) ist <code>\d+</code>. <code>\d</code> steht für eine Dezimalziffer 0-9. Das Plus-Zeichen (+) steht symbolisch für ein oder mehrere Zeichen des vorherigen Ausdrucks. Hier also ein oder mehrere Dezimalziffern. Es wird die Funktion <code>findall</code> aus dem Modul <code>re</code>verwendet. Python-Code: from re import findall str = "3x Grüße und 100 Kekse." pat = "\\d+" # Doppel-Backslashes müssen verwendet werden, sonst gibt Python eine Warnung aus! # alternativ: pat = r"\d+" # oder: pat = "[0-9]+" numb = findall(pat, str) print(numb) Ausgabe: ['3', '100'] Python kennt noch viele weitere Möglichkeiten mittels regulärer Ausdrücke zu hantieren. Dies soll hier aber nicht vertieft werden, da das Thema schon ziemlich speziell und komplex ist. Bei Bedarf siehe aber z.B. die Bücher ''Weigend, Seite 380ff'' und ''Ernesti, Kaiser'' [https://openbook.rheinwerk-verlag.de/python/28_001.html] oder die Python-Dokumentation [https://docs.python.org/3/library/re.html]. Auch [[Python unter Linux: Reguläre Ausdrücke]] liefert ein umfangreiches und brauchbares Python-2-Kapitel zu den regulären Ausdrücken. Die dort gelisteten Beispiele müssten ggf. vor Verwendung auf Python-3 umgeschrieben werden. <small>Wie macht man das? Dazu siehe z.B. [https://openbook.rheinwerk-verlag.de/python/43_001.html], [https://portingguide.readthedocs.io/en/latest/] oder [https://www.digitalocean.com/community/tutorials/how-to-port-python-2-code-to-python-3]</small> <small>Es gibt auch ein externes Modul ''regex'', das bei Bedarf extra installiert werden muss ([https://pypi.org/project/regex/]). Es bietet zusätzliche Funktionalität und gründlicheren Unicode-Support. Dies sei hier aber nur der Vollständigkeit halber erwähnt.</small> == Verzweigungen == === if === Die IF-Verzweigung ist aus anderen Programmiersprachen bereits bekannt. In Pseudocode lässt sie sich folgendermaßen darstellen: WENN bedingung TRUE führe block1 aus SONST führe block2 aus ENDE In Python gibt es keinen expliziten ENDE-Kennzeichner. Stattdessen wird der Code durch Einrückungen strukturiert. Alles mit der gleichen Einrückungstiefe gehört zum selben Block. Dies zeichnet Python vor anderen Programmiersprachen aus. Die test1.py-Datei laute also wie folgt: x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: Der else-Zweig wird ausgefuehrt x ist groesser oder gleich 4 Man achte auch auf die Doppelpunkte in der if- und else-Zeile. Darauf vergisst man gerne, wenn man von anderen Programmiersprachen kommt. Folgendes wäre in Python ein Fehler (genauer gesagt ein IndentationError). x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Auch Nachstehendes würde nicht zum gewünschten Ergebnis führen (löst aber keine Fehlermeldung aus). Der letzte print-Befehl ist schon außerhalb der IF-ELSE-Verzweigung. x = 3 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: x ist kleiner als 4 x ist groesser oder gleich 4 Python kennt eine Reihe von Vergleichs- und Verknüpfungsoperatoren: <, <= ... kleiner (gleich) >, >= ... größer (gleich) == ... gleich != ... ungleich is ... identisch is not ... nicht identisch and ... AND or ... OR not ... NOT Beispielsweise: a = 5 b = 9 if a<=10 and b!=7: print("OK") else print("Nicht OK") Ausgabe: OK Der else-Block kann übrigens auch ersatzlos entfallen. Mehrfache Verzweigungen werden durch das elif-Konstrukt erstellt. a = 14 if a<=10: print("<=5") elif a>11 and a<15: print("11 bis 15") elif a>16 and a<20: print("16 bis 20") else: print(">=20") Ausgabe: 11 bis 15 In Python gibt es auch die Schlüsselwörter <code>True</code> (für wahr) und <code>False</code> (für falsch). Man beachte, dass sie mit Großbuchstaben beginnen. Andere Schreibweisen wären ein Fehler. Sie gehören zum Datentyp <code>bool</code>. Ihnen sind auch die Zahlen <code>1</code> und <code>0</code> zugewiesen. === match === Ab Python 3.10 gibt es auch die match-Anweisung. Dies ist das Python-Pendant für die switch-Anweisung in anderen Programmiersprachen, geht aber bei näherer Betrachtung weit darüber hinaus. Hier nur ein einfaches Beispiel: x = "Hello" match x: case "Servus" | "Ciao": # or print("Servus an alle") case "Grüetzi": print("Grüetzi Schwyzer") case _: # other, default, sonstiges ... print("Hallo Welt") Ausgabe: Hallo Welt Für nähere Details siehe z.B. [https://www.geeksforgeeks.org/python-match-case-statement/], [https://learnpython.com/blog/python-match-case-statement/], [https://docs.python.org/3/tutorial/controlflow.html#match-statements] und das Python Enhancement Proposal (PEP) 636 – Structural Pattern Matching: Tutorial [https://peps.python.org/pep-0636] und dort insbesondere den Anhang A - Quick Intro. <small><code>match, case, _</code> etc. sind sogenannte ''soft keywords''. Im Gegensatz zu den normalen Schlüsselwörtern dürfen ihnen auch Werte zugewiesen werden. Eine Liste der weichen Schlüsselwörter lässt sich durch <code>keyword.softkwlist</code> erstellen (die Anweisung gibt es seit Python 3.9). Siehe dazu auch [https://stackoverflow.com/questions/65800344/what-are-soft-keywords] und [https://docs.python.org/3/library/keyword.html#keyword.softkwlist].</small> == Schleifen == === while === Die WHILE-Schleife ist kopfgesteuert. Sie funktioniert wie aus anderen Programmiersprachen bekannt. In Pseudocode: SOLANGE bedingung TRUE führe block aus ENDE In Python: x = 0 while x <= 10: print(x) x += 1 Ausgabe: 0 1 2 3 4 5 6 7 8 9 10 === for === for x in range(6): print(x*2) Ausgabe: 0 2 4 6 8 10 Die Schleife läuft von 0 bis 5. Ausgegeben wird jeweils der Wert x*2. Aquivalent kann diese Schleife auch so geschrieben werden: for x in range(0, 11, 2): print(x) Die Ausgabe ist wie oben. Der Startwert sei 0, der Endwert ist 11-1 und die Schrittweite ist 2. Ein anderes Beispiel sei for x in "text": print(x) Ausgabe: t e x t == Schleifen abbrechen == === break === <code>break</code> bricht die Schleife ab und setzt mit dem nächsten Befehl außerhalb der Schleife fort. for var in range(100): print(var) if var == 5: break Ausgabe: 0 1 2 3 4 5 === continue === <code>continue</code> bricht den aktuellen Schleifendurchlauf ab und setzt mit dem nächsten Schleifendurchlauf fort. for var in range (11): if var == 5: continue print(var) Ausgabe: 0 1 2 3 4 6 7 8 9 10 == try - except == try: z1 = 12 / 0 print(z1) except ZeroDivisionError: print("Das Ergebnis ist unendlich") except: print("Kann nicht berechnet werden!") print("Bitte die Formel korrigieren!") Ausgabe: Das Ergebnis ist unendlich Es wird versucht, eine Zahl durch Null zu dividieren. Das ist nicht möglich, es wird eine Ausnahme ausgelöst. Das Programm springt daher in den except-ZeroDivisionError-Block und führt die dort gelisteten Anweisungen aus (in unserem Fall eine print-Anweisung). Würden wir dieses Programm ohne try-except ausführen, so ergibt sich aus z1 = 12 / 0 print(z1) folgende Fehlermeldung und ein unmittelbarer Programmabbruch Traceback (most recent call last): File "C:\tmp\test1.py", line 1, in <module> z1 = 12 / 0 ZeroDivisionError: division by zero Mit dem try-except-Mechanismus können also Ausnahmen oder Fehler aufgefangen und behandelt werden. In unserem Beispiel ist das eher trivial, aber bei größeren Programmen kann das durchaus Sinn machen. == pass == Ein leerer Block muss in Python mittels dem Schlüsselwort <code>pass</code> dargestellt werden. Z.B. x = 2 if x == 1: print("Wert ist ", x) else: pass Würde man das <code>pass</code> im else-Block weglassen, so würde man eine Fehlermeldung erhalten: IndentationError: expected an indented block after 'else' statement on line 5 = Funktionen = == Aufrufen von Funktionen == Funktionen sind uns im Rahmen dieses Kurses schon zuhauf begegnet. Sei es die print()-, die math.sin()- oder die hex()-Funktion. All diese Funktionen werden von Python zur Verfügung gestellt, ohne dass man sie explizit programmieren müsste. Aufgerufen werden diese Funktionen, indem man ihren Namen eintippt, gefolgt von runden Klammern. In diesen Klammern können noch Argumente übergeben werden. Auch Rückgabewerte sind möglich. == Funktionen selber schreiben == Funktionen werden mit dem def-Schlüsselwort (man definiert die Funktion) eingeleitet, danach folgt der Funktionsname, danach wiederum runde Klammern, in denen formale Argumente stehen können. Abgeschlossen wird die def-Zeile mit einem Doppelpunkt. Danach folgt der Funktionskörper. Dieser Funktionskörper muss wiederum eingerückt werden (wie von den Verzweigungen und Schleifen bekannt). Aufgerufen wird diese Funktion, indem man ihren Funktionsnamen eingibt, gefolgt von runden Klammern (ggf. mit den aktuellen Parametern). Z.B. # Funktion definieren def halloWelt(i): # i ... beliebige Ganzzahl print("Hallo " * i, end="") print("Welt!") # Funktion aufrufen halloWelt(3) Ausgabe: Hallo Hallo Hallo Welt! Unterschied zwischen formalen und aktuellen Parametern: [[Datei:PythonIng_func1.jpg]] <small>Aktuelle Parameter werden auch Argumente genannt.</small> Rückgabe von Funktionswerten: # Funktion definieren def mathFunc(a, b): r1 = a + b r2 = a * b return r1, r2 # Funktion aufrufen a, b = mathFunc(3, 5) # Ausgabe der zurückgegebenen Werte print(a) print(b) Ausgabe: 8 15 Vorgabeparameter, z.B.: def mathFunc(a=10, b=20): r1 = a + b r2 = a * b return r1, r2 a, b = mathFunc(3, 5) print(a) print(b) a, b = mathFunc(5) print(a) print(b) a, b = mathFunc(b=6) print(a) print(b) Ausgabe: 8 15 25 100 16 60 == Lambda-Funktionen == print((lambda a, b: a*b) (3, 5)) Ausgabe: 15 Eingeleitet wird eine Lambda-Funktion (auch Lambda-Form, Lambda-Operator oder anonyme Funktion genannt) mit dem Schlüsselwort <code>lambda</code>. Es folgen die formalen Argumente, danach ein Doppelpunkt, die Berechnungsvorschrift und ggf. abschliessend in Klammern die aktuellen Parameter. Man kann einer Lambda-Funktion auch einen Funktionsnamen geben und die Funktion über diesen Namen aufrufen, z.B. prod = lambda a, b: a*b print(prod(3, 5)) Als Ausgabe wird wieder die Zahl 15 geliefert. == Rekursive Funktionen == Funktionen können wiederum andere Funktionen aufrufen. Von einem rekursiven Funktionsaufruf spricht man, wenn die aufgerufene Funktion gleich der aufrufenden ist. def printFunc(i): if (i >= 5): return else: print("Hallo Welt") printFunc(i+1) printFunc(1) Ausgabe: Hallo Welt Hallo Welt Hallo Welt Hallo Welt == Funktionsannotationen == Python ist sehr flexibel, was Typen angeht. Im Vorhergehenden haben wir generell keine Typangaben gemacht. Will man Typen angeben, so bietet Python das Konzept der Funktionsannotation. def calcFunc(a:int, b:int) -> int: return a+b, a*b r1 = calcFunc(8, 9) r2 = calcFunc(8.0, 9.0) print(r1) print(r2) Ausgabe: (17, 72) (17.0, 72.0) Jetzt sieht man auf den ersten Blick, welche Typen der Programmierer im Sinn hatte, als er die Funktion erstellte. Das Problem dabei ist nur, dass es Python ziemlich egal ist, welche Typen man in Endeffekt eingibt. Im obigen Beispiel können statt Integer-Typen auch Float-Typen eingegeben werden. == Variadische Funktionen == Python-Code: def test1(a, *b): print(a); for c in b: print(c); test1("Hallo", "Welt", "Schweizer", "und alle anderen") Ausgabe: Hallo Welt Schweizer und alle anderen Mit dem Stern (auch als Splat-Operator bezeichnet) in der formalen Parameterliste bei der Funktion <code>test1</code> wird angezeigt, dass eine beliebige Anzahl von Argumenten übergeben wird. <small> Dies entspricht in etwa dem, was in anderen Programmiersprachen (PHP etc.) mittels Ellipse (<code>...</code>) angezeigt wird.</small> = Tupel, Listen und andere = [[Datei:Python 3. The standard type hierarchy.png|mini|hochkant=1.7|Datentypen und Strukturen]] Tupel, Listen und einige andere sind Datenstrukturen oder Sequenzen. Listen (z.B. eine Einkaufsliste) sind veränderbar (mutable). Ein Tupel kann dagegen nicht verändert werden (immutable). Listen werden beim Anlegen in eckige Klammern eingeschlossen, Tupel in runde Klammern. Beim Tupel können die Klammern auch weggelassen werden. Ein Tupel mit nur einem Element muss mit einem Beistrich abgeschlossen werden. Der Grund ist, dass Python sonst nicht entscheiden kann, ob ein Tupel angelegt werden soll, oder nur ein geklammerter Wert. Nachfolgend werden einige Operationen mit Listen und Tupel dargestellt. Als Gedächtnisstütze kann man sich den Unterschied zwischen Tupel und Liste ev. so leichter merken: : T'''u'''pel ... r'''u'''nde Klammern, '''u'''nveränderlich : L'''i'''ste ... eck'''i'''ge Klammern, veränderl'''i'''ch. # Liste und Tupel liste = [1, 2, "Hallo"] tupel = (1, 2, "Hallo") # Ausgabe von liste und tupel print(liste) print(tupel) # Ausgabe von Einzelelementen print(liste[1]) print(tupel[2]) # Element an Liste anhängen und einfügen liste.append(55) liste.insert(4, "Welt") print(liste) # Element aus Liste entfernen liste.remove(1) print(liste) # einige weitere Beispiele liste2 = [1,] tupel2 = 1, 2 tupel3 = (1,) print(liste2) print(tupel2) print(tupel3) Ausgabe: [1, 2, 'Hallo'] (1, 2, 'Hallo') 2 Hallo [1, 2, 'Hallo', 55, 'Welt'] [2, 'Hallo', 55, 'Welt'] [1] (1, 2) (1,) Zu den Datenstrukturen gehören weiters auch Mengen und Dictionaries. Mengen sind von der Mathematik bekannt, sie sind ungeordnet und es kommen keine mehrfachen Elemente vor. Dictionaries sind durch Schlüssel :Wert-Paare gekennzeichnet. Mengen werden beim Anlegen wie Dictionaries in geschweifte Klammern eingeschlossen. dict = {"vorname":"Hugo", "nachname":"Meister" } menge = {1, 1, 3, 4, 4, 4, "Hallo"} print(dict) print(menge) print(dict["vorname"]) Ausgabe: {'vorname': 'Hugo', 'nachname': 'Meister'} {1, 3, 4, 'Hallo'} Hugo Geschweifte Klammern ohne Inhalt stellen Dictionaries dar und keine Mengen: di = {} print(type(di)) Ausgabe: <class 'dict'> == List Comprehensions == Aus einer Eingabeliste soll eine Ausgabeliste erzeugt werden. Das kann folgendermaßen geschehen. Mathematische Schreibweise: <math>lc = \{2x|x\in\ \mathbb{N}, 1\le x < 11\}</math> Python-Code: lc = [x*2 for x in range(1,11)] print(lc) Ausgabe: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] Mathematische Schreibweise: <math>lc = \{2x | x \in \mathbb{N}, 1\le x < 11, x \bmod 2 = 0 \}</math> Python-Code: lc = [x*2 for x in range(1,11) if x%2 == 0] print(lc) Ausgabe: [4, 8, 12, 16, 20] Siehe auch {{W|List Comprehension}}. == Set Comprehensions == Dies ist sehr ähnlich wie im vorigen Abschnitt beschrieben. Es wird aber keine Liste, sondern eine Menge erzeugt. sc = {x*2 for x in range(1,11)} print(sc) Ausgabe: {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} == Listen zusammenführen - zip() == li1 = ["A", "B", "C", "D"] li2 = [1, 2, 3, 4] li3 = [5.5, 6.6, 7.7, 8.8] z = zip(li1, li2, li3) print(z) li4 = list(z) print(li4) Ausgabe: <zip object at 0x00000283B6C6AC80> [('A', 1, 5.5), ('B', 2, 6.6), ('C', 3, 7.7), ('D', 4, 8.8)] == Generatorausdruck == g = (i*2 for i in range(1,11)) print(g) t = tuple(g) print(t) print(t[1:3]) Ausgabe: <generator object <genexpr> at 0x00000241D2A4A5A0> (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) (4, 6) == Slicing == slice ... Scheibe, Teil, in Scheiben schneiden Beispiel: Zugriff auf Elemente eines geordneten sequentiellen Objekttyps (Liste, Tupel oder String): str1 = "Hallo" # Das erste Element wird mit dem Index 0 angesprochen # [start (inkl.) : stop (exkl.) : step (default=1)] str2 = str1[0:2] # Alternativ auch: str2 = str1[:2] print(str2) tup1 = (0,1,2,3) # Das letzte Element hat auch den Index -1, das vorletzte den Index -2 usw. tup2 = tup1[-3:-1] print(tup2) lst1 = [[1, 5, 10, 20], [30, 40, 50, 60]] lst2 = lst1[1][1] print(lst2) Ausgabe: Ha (1, 2) 40 Beispiel: Umdrehen von Strings str1 = "Hallo" str2 = str1[::-1] print(str2) Ausgabe: ollaH = Objektorientierte Programmierung = == Eine einfache Klasse == [[Datei:PythonIng_uml1.svg | 200px]] class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 fahr = Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die Klasse Fahrzeug wird durch das class-Schlüsselwort eingeleitet. raeder ist ein Klassenattribut und public. __init__ wird bei der Objekterzeugung automatisch aufgerufen. Man achte darauf, dass diese Methode immer mit zwei Unterstrichen eingeleitet und abgeschlossen wird. Instanzattributen wird das Wort self vorangestellt. Wir sehen uns z.B. das Attribut self.__geschwind an. Auch hier werden zwei Unterstriche verwendet. Das bedeutet, dass dieses Attribut private ist. Bei den Methoden wird immer self als erster Parameter angegeben. Beim Aufruf der entsprechenden Funktion wird das self aber nicht berücksichtigt. == Klassen importieren == Häufig ist es sinnvoll und übersichtlicher Klassen in eigenen Dateien zu speichern. Das sind dann eigene Module. Abgespeichert werden Sie mit der Endung py, wie bisher auch praktiziert. Aufgerufen werden Sie mit der import-Anweisung. Dann ist aber nur der Dateiname ohne Endung py zu verwenden. Klarer wird das mit einem Beispiel. Datei c:\tmp\fahrzeug.py class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 Datei c:\tmp\test1.py import fahrzeug fahr = fahrzeug.Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die üblichen import-Anweisungen lauten wie folgt: {| {{prettytable}} ! import-Befehl ! Instanz |- | import xyz || xyz.Klasse |- | import xyz as x || x.Klasse |- | from xyz import Klasse || Klasse |- | from xyz import * || Klasse |} Der Vorteil der ersten beiden import-Anweisungen ist, dass es kaum zu Namenskollisionen kommen kann. Dafür hat man bei den letzten beiden Varianten weniger Tipparbeit. == Vererbung == [[Datei:PythonIng_uml2.svg | 200px]] Datei fahrzeug.py: class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 class Luftfahrzeug(Fahrzeug): def __init__(self, geschwindigkeit, leistung, fluegel): super().__init__(geschwindigkeit, leistung) self.__flueg = fluegel def getFlueg(self): return self.__flueg Datei test1.py: import fahrzeug fahr = fahrzeug.Luftfahrzeug(150, 90, 4) print(fahr.getFlueg()) Ausgabe: 4 = Grafiken zeichnen = Für das Zeichnen von Grafiken wird hier das Modul <code>matplotlib</code> verwendet. <code>matplotlib</code> ist ein externes Modul und muss vor der ersten Verwendung installiert werden. Das geht so: # Starten Sie ein Terminal (bei Windows die Eingabeaufforderung). # Führen Sie darin folgenden Befehl aus <code>c:\devel\Python\Scripts\pip.exe install matplotlib</code> pip ist übrigens der Paketmanager von Python ({{W|Pip_(Python)}}). Optimalerweise installieren wir auch gleich das Modul <code>numpy</code> (Numerical Python). Wir werden es im Folgenden oft benötigen (nicht nur bei den Grafiken). Das funktioniert vom Prinzip her genauso, wie für <code>matplotlib</code> gezeigt. <small>Verwenden Sie Spyder, so sind diese Schritte nicht nötig. Spyder inkludiert diese Pakete standardmäßig. Unter openSUSE Tumbleweed lassen sich diese Pakete mittels YaST oder zypper installieren.</small> == 2D == === Graph einer Funktion === Es soll die cosh-Funktion im Intervall <math>x\in[-3,3]</math> gezeichnet werden. Der Programmcode lautet in der einfachsten Form: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh1.jpg]] Der Code ist quasi selbsterklärend. Das Untermodul pyplot des matplotlib-Moduls und das numpy-Modul werden importiert. x läuft von -3 bis +3. y wird für jeden x-Wert per Formel ausgerechnet. "plt.plot()" ist der Zeichenbefehl. "plt.show" ist notwendig, um das Fenster mit der Grafik anzuzeigen. Die Schrittweite 0.1 wurde so gewählt, um einen ausreichend glatten Verlauf des Graphen zu gewährleisten. Das ist immer ein Kompromiss zwischen Berechnungszeit und Ansehnlichkeit. Testen Sie einfach ein paar verschiedene Werte, um ein Gefühl dafür zu zu bekommen. "plt.grid()" zeichnet ein Gitter in die Grafik (kann auch weggelassen werden). Die Bezeichnungen plt und np könnten auch anders gewählt werden. Es ist aber Konvention, diese so wie hier gezeigt zu wählen. <small>Mit der im obigen Bild gezeigten Menüleiste kann die dargestellte Grafik nachträglich noch geändert werden (Zoom, Pan, Achsenparameter, Kurvenparameter etc.). Natürlich kann man das alles auch direkt programmieren. Wie das funktioniert wird ansatzweise etwas später gezeigt.</small> Ein etwas komplexeres Beispiel ist Folgendes: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) + 2**x plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh4.png]] Man beachte, dass im Gegensatz zu Octave und Julia der ominöse Punkt (.) bei 2**x mit Python nicht benötigt wird. Das macht das Programmiererleben etwas einfacher. === Graphen mehrerer Funktionen und weiteres === import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x") plt.plot(x, y2, label = "sin(x) * cos(x)") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh2.png]] Um die Linienstile etwas individueller zu gestalten, ist folgender Programmcode gedacht: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x", lw=5, ls="dotted") plt.plot(x, y2, label = "sin(x) * cos(x)", lw=3, ls="--") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh3.png]] === Funktion in Parameterdarstellung === Es soll die archimedische Spirale <math>x = t \cos(t), y = t \sin(t)</math> im Intervall <math>[0, 6\pi[</math> gezeichnet werden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.show() [[Datei:PythonIng_spirale1.png]] Diese Darstellung erscheint verzerrt. Will man gleiche Achsenskalierungen, so kann man den plt.axis()-Befehl verwenden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.axis("equal") plt.show() [[Datei:PythonIng_spirale2.png]] === Funktion in Polardarstellung === import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(projection="polar") r = np.arange(0, 1, 0.01) theta = r**3 line = ax.plot(theta, r) plt.show() [[Datei:PythonIng_polar1.png]] === Logarithmische Achsenskalierung === ==== Semilog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.semilogy() plt.show() Ausgabe: [[Datei:PythonIng_semilog1.png]] ==== LogLog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.loglog() plt.show() [[Datei:PythonIng_loglog1.png]] === Gefüllte Fläche === import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 3, 0.1) y1 = 3*x - 1 y2 = x**2 plt.plot(x, y1, x, y2, color='black') plt.fill_between(x, y1, y2, where=y1>=y2) plt.show() [[Datei:PythonIng_gefuellt.png]] === Linien, Pfeile, Rechtecke, Kreise und Texte === import matplotlib as mpl import matplotlib.pyplot as plt fig, ax = plt.subplots() r = mpl.patches.Rectangle((0, 0), 3, 3, angle=30, fill=False) c = mpl.patches.Circle((4, 4), 2, fill=False) ax.add_patch(r) ax.add_patch(c) ax.plot([-2, 7], [-2, 0], color="black") ax.arrow(0, 7, 5, 0, length_includes_head=True, head_width=0.5, head_length=1.5, color="black") ax.set_aspect("equal") plt.axis([-3, 8, -3, 8]) plt.show() [[Datei:PythonIng_linien_pfeile_etc.png]] Text kann mit <code>ax.text(x, y, "Text")</code> hinzugefügt werden, bspw. import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.text(0.1, 0.1, "Hallo") ax.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() Oder einfacher auch ohne <code>subplots</code> import matplotlib.pyplot as plt plt.text(0.1, 0.1, "Hallo") plt.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text1.png]] Auch Sonderzeichen (griechische Buchstaben etc.) können verwendet werden (siehe dazu auch [https://matplotlib.org/stable/users/explain/text/mathtext.html]). import matplotlib.pyplot as plt plt.text(.3, .5, r'$\Omega\ \psi\ \oint\ \nabla\ \dot a\ \frac{a}{b}\ a_b$', size="20") plt.show() [[Datei:PythonIng_text20.svg]] Jetzt wird noch gezeigt, wofür <code>subplots</code> sinnvoll eingesetzt werden können. import matplotlib.pyplot as plt fig, ax = plt.subplots(nrows=1, ncols=2) ax[0].text(0.1, 0.1, "Hallo") ax[1].text(0.1, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text2.png]] === Aufgaben === * Zeichnen Sie die Strophoide <math>x = \frac{a(t^2-1)}{t^2+1}, y = \frac{at(t^2-1)}{t^2+1}, a = 2, -3 \leq t \leq 3</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_strophoide.jpg]] * Zeichnen Sie die verschlungene Hypozykloide <math>x = (R-r)\cos t + c\cos\frac{R-r}{r}t, y = (R-r)\sin t - c\sin\frac{R-r}{r}t, c = 3, r = 2, R = 6, -15 \leq t \leq 15</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_hypozykloide.jpg]] * Testen Sie bei den obigen Übungsaufgaben verschiedene Linienstile und Farben. Farben können mit dem plt.plot()-Parameter color gewählt werden. * Testen Sie bei den obigen Übungsaufgaben verschiedene Werte für a, c, r und R. == 3D == === Räumliche Kurven === import matplotlib.pyplot as plt import numpy as np t = np.arange(0, 6*np.pi, 0.1) x = t * np.cos(t) y = t * np.sin(t) z = t fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot(x, y, z) plt.show() [[Datei:PythonIng_raumkurve1.png]] === Flächen === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z) plt.show() [[Datei:PythonIng_fläche1.png]] Das Ganze in Netzdarstellung läßt sich so programmieren: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.5) y = np.arange(0, 10, 0.5) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_wireframe(x, y, z) plt.show() [[Datei:PythonIng_fläche2.png]] Ein etwas komplexeres Beispiel: import matplotlib.pyplot as plt import numpy as np x = np.arange(0.1, 10, 0.1) y = np.arange(0.1, 10, 0.1) x, y = np.meshgrid(x, y) z1 = np.sin(x) + 3 * np.cos(y) z2 = np.sin(x) + np.log(y) z3 = x + np.cos(y) z4 = x**2 - y fig, ax = plt.subplots(subplot_kw={"projection": "3d"}, nrows=2, ncols=2) ax[0][0].plot_surface(x, y, z1) ax[0][1].plot_surface(x, y, z2) ax[1][0].plot_surface(x, y, z3) ax[1][1].plot_surface(x, y, z4) plt.show() [[Datei:PythonIng_subplot1.png]] Man beachte, dass man die Unterbilder im Bild nach dem Ausführen des Scripts z.B. mit der mittleren Maustaste einzeln drehen, oder über die Einträge in der Menüzeile einzeln bearbeiten kann. Mit ein paar Zeilen Programmtext lässt sich also eine Menge an Funktionalität generieren. Die Farbgebung lässt sich über <code>colormaps</code> variieren. import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm) plt.show() [[Datei:PythonIng_colormap1.png]] Es gibt eine Menge an Colormaps, z.B. <code>plasma, Greys, Dark2, ocean</code>. Zwecks detaillierterer Infos siehe die matplotlib-Dokumentation. <small>Verwendet man die IDE namens IDLE, so gibt es dort auch die automatische Codevervollständigung. D.h. es werden alle Möglichkeiten (in unserem Fall nach dem Eintippen von <code>cm.</code> alle verfügbaren Colormaps) angezeigt.</small> Die "edgecolor" und Linienbreite können auch frei gewählt werden: import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm, edgecolor="black", linewidth=1.0) plt.show() [[Datei:PythonIng_colormap2.png]] === Höhenlinien === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contour(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien1.png]] Etwas abgewandelt sieht das so aus: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() hl = ax.contour(x, y, z) ax.clabel(hl, inline = True) plt.show() [[Datei:PythonIng_höhenlinien2.png]] Und noch eine Variante sei gezeigt. import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contourf(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien3.png]] === Aufgaben === * Zeichnen Sie die räumliche Kurve <math>x = 2 \cdot \cosh(t)</math>, <math>y = 5 \cdot \sin(t)</math>, <math> z = t^{2} - t</math>, <math>0 \leq t \leq 3\pi</math>. * Zeichnen Sie die Fläche <math>z = \log(x) + \cos(y)</math>. == Animationen == === Mit matplotlib === Auch mit matplotlib sind Animationen möglich. Das ist ein bisschen komplizierter und wird deshalb hier nur mit einem sehr einfachen Beispiel dargestellt (bei Interesse siehe z.B. auch das [https://matplotlib.org/stable/users/explain/animations/animations.html#animations Animations using Matplotlib-Tutorial]). import matplotlib.pyplot as plt import matplotlib.animation as ani import matplotlib import numpy as np def update(frame): line.set_xdata(x[:frame]) line.set_ydata(y[:frame]) return (line) fig, ax = plt.subplots() x = np.arange(0, 10, .1) y = np.sin(x) line, = ax.plot(x[0], y[0]) ax.set(xlim=[0, 10], ylim=[-1, 1]) a = ani.FuncAnimation(fig=fig, func=update, frames=100, interval=20) plt.show() # Speichere die Animation in einem animierten GIF (optional) a.save(filename="c:/tmp/PythonIng_anim5.gif", writer="pillow") [[Datei:PythonIng_anim5.gif]] Es wird eine Sinuskurve auf den Bildschirm gezeichnet. In der letzten Zeile wird diese Animation in ein animiertes GIF gespeichert. Das ist natürlich optional und kann auch weggelassen werden. === Mit VPython === Aber auch mit dem Modul VPython lassen sich einfache 3D-Animationen erstellen. VPython ist ein externes Modul, das vorab installiert werden muss. Unter openSUSE Tumbleweed gibt es dzt. kein entsprechendes rpm-Paket. Die übliche Methode der Installation mittels YaST oder zypper ist somit nicht möglich. Auch eine direkte Verwendung von pip führt nur zu einer Fehlermeldung (<code>error: externally-managed-environment</code>). Es empfiehlt sich dort folgende Vorgehensweise: # Erstelle zuerst eine virtuelle Umgebung, z.B.: <code>python3.11 -m venv ~/tmp/venv1</code> # Wechsle das Verzeichnis: <code>cd ~/tmp/venv1/bin</code> # Installiere das entsprechende Paket: <code>./pip install vpython</code> # Führe das entsprechende Skript aus: <code>./python ~/tmp/test1.py</code> Aktuell (März 2026) ist dieses Programmpaket lt. der [https://vpython.org/presentation2018/install.html VPython-Homepage] nur für die Python-Versionen 3.8 bis 3.12 verfügbar. Ein Beispiel zu einer einfachen Animation wird nachfolgend geliefert. from vpython import * scene.width = 1200 scene.height = 600 scene.center = vector(20,0,0) scene.background = color.white cylinder(pos=vector(0,0,0), axis=vector(20,0,0), radius=5, color=color.blue) cone(pos=vector(0,0,0), axis=vector(-10,0,0), radius=5, color=color.blue) helix(pos=vector(20,0,0), axis=vector(40,0,0), radius=2, coils=10, thickness=0.5, color=color.blue) ball = sphere(pos=vector(20,0,0), color = color.green, radius = 1) ball.p = vector(0.15, 0, 0) toc = True while True: rate(200) if(ball.pos.x <= 60 and toc == True): ball.pos += ball.p else: toc = False ball.pos -= ball.p if(ball.pos.x <= 20 and toc == False): toc = True [[Datei:PythonIng_vpython_anim.JPG]] Idealerweise öffnet sich beim Ausführen des Scripts ein Browserfenster. Darin wird die programmierte Animation gezeigt (siehe auch den obigen Screenshot). Eine Größenänderung können Sie mit der mittleren Maustaste initiieren. Die Szenerie drehen können Sie mit der rechten Maustaste. === Mit VTK === Komplexer, aber auch mächtiger als VPython ist die Verwendung von VTK ('''V'''isualization '''T'''ool'''k'''it). Genauer gesagt des Python-Wrappers von VTK. Dieses externe Python-Modul muss vorab installiert werden (z.B. mittels YaST, pip oder in eine virtuelle Umgebung). VTK ist eine Softwarebibliothek zur 3D-Visualisierung und wurde ursprünglich in C++ geschrieben. Verbreitet eingesetzt wird diese Bibliothek in der Wissenschaft und Forschung, z.B. * in der medizinischen Bildgebung * für Strömungssimulationen * für Klimadaten Als einfaches Beispiel wird die Darstellung eines Zylinders gezeigt, der mit den Maustasten gedreht oder in der Größe geändert werden kann: import vtk # Zylinder erzeugen cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) # Geometrie in darstellbare Daten umwandeln mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) # Objekt in der Szene actor = vtk.vtkActor() actor.SetMapper(mapper) # Szene verwalten renderer = vtk.vtkRenderer() renderer.AddActor(actor) # Render-Fenster render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) # Maus/Tastatur-Steuerung interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) # Starten render_window.Render() interactor.Start() Ausgabe: [[Datei:PythonIng_VTK_1.png]] Gleiches Beispiel wie oben, aber mit einer Animationssequenz: import vtk import time cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) renderer = vtk.vtkRenderer() renderer.AddActor(actor) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) render_window.Render() time.sleep(0.01) Das Grafikfenster schließt sich nach Ablauf der Schleife. Das Fenster bleibt geöffnet, wenn Sie am Programmende folgenden Befehl hinschreiben interactor.Start() Um den animierten Zylinder grün einzufärben, müssen Sie Folgendes im obigen Programm ergänzen (Farbnamen): colors = vtk.vtkNamedColors() actor.GetProperty().SetColor(colors.GetColor3d("Green")) Alternativ funktioniert auch das (RGB): actor.GetProperty().SetColor(0.0, 0.6, 0.0) Wie der Zylinder mit einer Textur versehen wird, zeigt folgendes Programm: import vtk import time cylinder = vtk.vtkCylinderSource() cylinder.SetResolution(30) cylinder.SetHeight(3.0) cylinder.SetRadius(1.0) cylinder.CappingOn() texture_coords = vtk.vtkTextureMapToCylinder() texture_coords.SetInputConnection(cylinder.GetOutputPort()) texture_coords.PreventSeamOn() reader = vtk.vtkJPEGReader() reader.SetFileName("PythonIng_textur.jpg") texture = vtk.vtkTexture() texture.SetInputConnection(reader.GetOutputPort()) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(texture_coords.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.SetTexture(texture) renderer = vtk.vtkRenderer() renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) renderer.AddActor(actor) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) renderWindow.Render() time.sleep(0.01) <gallery> PythonIng_textur.jpg | Textur-Datei PythonIng_VTK_2.png | Ausgabe (Screenshot) </gallery> Nun aber genug von VTK und der Erstellung von Grafiken, weiter geht es mit mathematischeren Themen. = Vektoren und Matrizen = == Zahlenfolgen == from numpy import * start = 0 stop = 10 step = 2 num = 10 r = arange(start, stop, step) l = linspace(start, stop, num) print("r = ", r) print("l = ", l) Ausgabe: r = [0 2 4 6 8] l = [ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556 6.66666667 7.77777778 8.88888889 10. ] == Vektoren == Vektoren sollten jedem aus der Linearen Algebra bekannt sein. === Arrays === In Python mit NumPy kann man Vektoren durch die Funktion array erzeugen. import numpy as np l1 = (-5, 3, 2) l2 = (1, 1, 4) a1 = np.array(l1) a2 = np.array(l2) a3 = a1 + a2 a4 = 2 * a2 print(a1) print(a2) print(a3) print(a3[2]) print(a4) Ausgabe: [-5 3 2] [1 1 4] [-4 4 6] 6 [2 2 8] === Zeilen- und Spaltenvektoren === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) print(z) print(s) Ausgabe: [ [-5 3 2] ] [[1] [1] [4]] === Skalarprodukt === import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) skalarprodukt = np.dot(a1, a2) print(skalarprodukt) Ausgabe: 6 === Vektorprodukt === <math>a\ast b=\left(\begin{array}{c} a_{1}\\ a_{2}\\ a_{3} \end{array}\right)\ast\left(\begin{array}{c} b_{1}\\ b_{2}\\ b_{3} \end{array}\right)=\left(\begin{array}{c} a_{2}b_{3}-a_{3}b_{2}\\ a_{3}b_{1}-a_{1}b_{3}\\ a_{1}b_{2}-a_{2}b_{1} \end{array}\right) </math> Python-Code: import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) vektorprodukt = np.cross(a1, a2) print(vektorprodukt) Ausgabe: [10 22 -8] === Transponierter Vektor === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) # transponierter Vektor z_tp = np.transpose(z) # transponierter Vektor s_tp = np.transpose(s) print(z_tp) print(s_tp) Ausgabe: [[-5] [ 3] [ 2]] [ [1 1 4] ] === Vektorfelder visualisieren === import matplotlib.pyplot as plt import numpy as np # Daten generieren x = np.arange(0, 10, 1) y = np.arange(0, 10, 1) X, Y = np.meshgrid(x, y) U = X * Y V = Y + X # Plotten fig, ax = plt.subplots() ax.quiver(X, Y, U, V, angles='xy') plt.show() Ausgabe: [[Datei:PythonIng_quiver1.png]] == Matrizen== import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) print(m1) Ausgabe: [[1 2 3] [4 5 6]] === Zugriff auf Matrizenelemente === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) # Element aus Zeile 2 und Spalte 3 (Achtung! Index startet bei Null) print(m1[1,2]) Ausgabe: 6 === Addition und Subtraktion von Matrizen === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) m2 = np.matrix([[0, 0, 2], [1, 3, 2]]) print(m1 + m2) print(m1 - m2) Ausgabe: [[1 2 5] [5 8 8]] [[1 2 1] [3 2 4]] === Transponierte Matrix === import numpy as np m = np.matrix([[1, 2, 3], [4, 5, 6]]) mt = np.transpose(m) print(m) print(mt) Ausgabe: [[1 2 3] [4 5 6]] [[1 4] [2 5] [3 6]] === Rang einer Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) rg = np.linalg.matrix_rank(m) print(rg) Ausgabe: 2 === Inverse Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) mi = np.linalg.inv(m) print(mi) Ausgabe: [[ 1. 0.6] [-0. -0.2]] === Multiplikation von Matrizen (falksches Schema) === import numpy as np m1 = np.matrix([[1, 3, 4], [0, -5, 1]]) m2 = np.matrix([[1, 2], [2, 3], [0, 2]]) print(m1 @ m2) Ausgabe: [[ 7 19] [-10 -13]] === Eigenwerte und Eigenvektoren === import numpy as np m = np.matrix([[5, 8], [1, 3]]) D,V = np.linalg.eig(m) # Eigenwerte print(D) # Eigenvektoren print(V) Ausgabe: [7. 1.] [[ 0.9701425 -0.89442719] [ 0.24253563 0.4472136 ]] === Teilmatrizen === import numpy as np m = np.matrix([[1, 3, 4], [0, -5, 1]]) print("m = ", m) # Erste Zeile extrahieren m1 = m[0,:] print("m1 = ", m1) # Das Element aus der 1. Zeile und der 2. Spalte extrahieren m2 = m[0,1] print("m2 = ", m2) # Zweite Spalte extrahieren m3 = m[:, 1] print("m3 = ", m3) Ausgabe: m = [[ 1 3 4] [ 0 -5 1]] m1 = [ [1 3 4] ] m2 = 3 m3 = [[ 3] [-5]] === Spezielle Matrizen === ==== Nullmatrix ==== import numpy as np z = np.zeros((3, 2)) print(z) Ausgabe: [[0. 0.] [0. 0.] [0. 0.]] ==== Einheitsmatrix ==== import numpy as np z = np.eye(3) print(z) Ausgabe: [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ==== Matrix mit lauter Einsen ==== import numpy as np z = np.ones((3, 2)) print(z) Ausgabe: [[1. 1.] [1. 1.] [1. 1.]] === Spärlich besetzte Matrizen === Das Thema spärlich besetzter Matrizen wird hier nur kurz angerissen. Nähere Details siehe unter dem Weblink [https://docs.scipy.org/doc/scipy/reference/sparse.html#module-scipy.sparse]. import numpy as np import scipy A = scipy.sparse.csr_array(np.eye(5)) print(A) Ausgabe: (0, 0) 1.0 (1, 1) 1.0 (2, 2) 1.0 (3, 3) 1.0 (4, 4) 1.0 = Lineare Gleichungssysteme = Sei <math>Ax = b</math> ein lineares Gleichungssystem. <math>A</math> sei die Koeffizientenmatrix, <math>x</math> der Lösungsvektor und <math>b</math> ein bekannter Vektor. Beispiel: import numpy as np A = np.array([[5, 1], [0, 2]]) b = np.array([1, 2]) x = np.linalg.solve(A, b) print(x) Ausgabe: [0. 1.] == Aufgabe == * Lösen Sie folgendes Gleichungssystem mittels Python (und zur Kontrolle auch händisch): 5x + 6y - 2z = 12 3x - y - 3z = 6 2x + 2y + 4z = 5 = Polynome = == Ein erstes einfaches Beispiel == Gegeben sei das Polynom <math>7x^3+5x^2+1</math>. In Python: import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p) Ausgabe: 3 2 7 x + 5 x + 1 == Einzelne Polynomwerte berechnen == import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p(1.5)) Ausgabe: 35.875 == Polynome integrieren und differenzieren == import numpy as np p = np.poly1d([7, 5, 0, 1]) # 1. Ableitung p1 = p.deriv() p2 = p.deriv(1) # 2. Ableitung p3 = p.deriv(2) # Integral p4 = p.integ() print(p1) print(p2) print(p3) print(p4) Ausgabe: 2 21 x + 10 x 2 21 x + 10 x 42 x + 10 4 3 1.75 x + 1.667 x + 1 x == Nullstellen bestimmen == import numpy as np p = np.poly1d([2, 5, 0, 4]) r = np.roots(p) print(r) Ausgabe: [-2.7621427 +0.j 0.13107135+0.84077099j 0.13107135-0.84077099j] == Aufgaben == * Berechnen Sie den Wert für x = 3 des Polynoms <math>y = 2x^4 - 3x^3 - x + 7</math>. * Differenzieren und integrieren Sie das Polynom <math>y = 2x^4 - 3x^3 - x + 7</math>. * Berechnen Sie die Nullstellen von <math>y = 7x^5 - 3x^2 + 12</math>. = Nichtlineare Gleichungen und Gleichungssysteme = == Nullstellenbestimmung == Löse eine beliebige Gleichung f(x) = 0, z.B. <math> f(x) = x^2 - 5\cos(x) - 10 = 0 </math>: import scipy import numpy as np def f(x): return x**2 - 5*np.cos(x) - 10 xstart = [-1, 1] # Startwerte xn = scipy.optimize.root(f, xstart) print(xn.x) Ausgabe: [-2.46813009 2.46813009] Funktionsgraph: [[Datei:octave_nichtlin2.jpg]] == Gleichungssysteme == SymPy ist ein externes Modul, das symbolisches Rechnen ('''Sym'''bolic '''Py'''thon) ermöglicht. Folgende Aufgabe ist dem Buch "Knorrenschild: Numerische Mathematik, Hanser, 2017, Seite 72" entnommen. Zu lösen ist das nichtlineare Gleichungssystem <math>f_1 = 2x_1 + 4x_2 = 0 </math> <math>f_2 = 4x_1 + 8x_2^3 = 0</math> Mit Python ist das so möglich: import sympy x1, x2 = sympy.symbols("x1 x2") f1 = 2*x1 + 4*x2 f2 = 4*x1 + 8*x2**3 s = sympy.solve((f1, f2), x1, x2) print(s) Ausgabe: [(-2, 1), (0, 0), (2, -1)] Plot: [[Datei:IngPython_nl_gleichung1.svg|500px]] = Komplexe Zahlen = Die imaginäre Einheit wird in Python durch den Buchstaben <code>j</code> symbolisiert. Darstellen kann man eine komplexe Zahl bekannterweise in mehreren Formen: * Kartesische Darstellung <math>z = \Re(z) + j \cdot \Im(z)</math> * Polardarstellungen <math>z = r \cdot (\cos(\phi) + j \cdot \sin(\phi)) = r \cdot e^{j\cdot \phi}</math> Die konjugiert komplexe Zahl ist <math>z^* = \Re(z) - j \cdot \Im(z)</math> Nachfolgend einige mathematische Operationen mit Python und NumPy. import numpy as np z1 = 2 + 5j # kartesische Darstellung z2 = 3 * np.exp(3j) # Polardarstellung # Addition res = z1 + z2 print("z1 + z2 = ", res) # Multiplikation res = z1 * z2 print("z1 * z2 = ", res) # Realteil res = np.real(z2) print("Realteil von z2 = ", res) # Imaginärteil res = np.imag(z2) print("Imaginaerteil von z2 = ", res) # Betrag res = np.abs(z1) print("Betrag von z1 = ", res) # Argument res = np.angle(z1) print("Argument von z1 = ", res) # Konjugiert komplexe Zahl res = np.conj(z1) print("Konjugiert komplexe Zahl von z1 = ", res) Ausgabe: z1 + z2 = (-0.9699774898013365+5.423360024179601j) z1 * z2 = (-8.05675510050068-14.003167400647481j) Realteil von z2 = -2.9699774898013365 Imaginaerteil von z2 = 0.4233600241796016 Betrag von z1 = 5.385164807134504 Argument von z1 = 1.1902899496825317 Konjugiert komplexe Zahl von z1 = (2-5j) = Interpolation = import numpy as np import scipy import matplotlib.pyplot as plt # Stützpunkte xp = np.arange(1, 6) yp = (0, -5, 2, 7, 6) ti = np.arange(1, 5, 0.01) i1 = scipy.interpolate.interp1d(xp, yp, kind = "linear") i2 = scipy.interpolate.interp1d(xp, yp, kind = "cubic") plt.plot(xp, yp, "rx") plt.plot(xp, i1(xp)) plt.plot(ti, i2(ti)) plt.show() Ausgabe: [[Datei:PythonIng_interpol1.png]] = Differenzialrechnung = == Numerisches Differenzieren == Als Beispiel differenzieren wir <math>y = 5x\sin{x}</math> und stellen das Ganze grafisch dar. from findiff import Diff import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) f = 5 * x * np.sin(x) dx = x[1] - x[0] # Ableitung d_dx = Diff(0, dx) df_dx = d_dx(f) # Grafik plt.plot(x, f, label = "y") plt.plot(x, df_dx, label = "y'") plt.grid() plt.legend(loc="best") plt.show() Ausgabe: [[Datei:octave_diff1.jpg]] <small>findiff ist ein externes Modul. Dieses muss installiert werden (z.B. so: ...\Python\Scripts\pip.exe install --upgrade findiff). Für die Vorgehensweise unter openSUSE Tumbleweed siehe das Kapitel VPython, nur dass das Ganze mit einer aktuelleren Python-Version exekutiert wird, z.B. mit Python 3.13. Das im Buch "Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler, Rheinwerk" verwendete Modul "scipy.misc" ist veraltet (deprecated ... missbilligt). Lt. [https://docs.scipy.org/doc/scipy-1.17.0/dev/roadmap-detailed.html#misc SciPy-Dokumentation für die Version 1.17.0] wurden alle entsprechenden Features schon entfernt.</small> == Symbolisches Differenzieren == Differenzieren Sie die Funktionen <math>f_1(x) = x^2</math> und <math>f_2(x) = \sin(x)\cos\left(\frac{x}{2}\right)</math>. import sympy x = sympy.symbols("x") f1 = x**2; f2 = sympy.sin(x) * sympy.cos(x/2.) d1 = sympy.diff(f1, x) d2 = sympy.diff(f2, x) print(d1) print(d2) Ausgabe: 2*x -0.5*sin(0.5*x)*sin(x) + cos(0.5*x)*cos(x) == Aufgaben == * Differenzieren Sie die Funktion <math>y = \log(x) + 10x</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. * Differenzieren Sie die Funktion <math>y = \frac{\sinh(x)}{(1+x)}</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. = Integralrechnung = == Numerisches Integrieren == Berechnen Sie das Integral <math>\int_{0}^{3}x^2 dx</math>. import scipy def f(x): return x**2 i = scipy.integrate.quad(f, 0, 3) print(i) Ausgabe: (9.000000000000002, 9.992007221626411e-14) Das trifft den exakten Wert 9.0 ziemlich genau. Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} dx</math>. import scipy import numpy as np def f(x): return 2**(-x) i = scipy.integrate.quad(f, 0, np.inf) print(i) Ausgabe: (1.4426950408889556, 4.486558477977586e-09) == Symbolisches Integrieren == Berechnen Sie <math>\int x^2 \text{d}x</math> und <math>\int \sin{x}\cos{\frac{x}{2}} \text{d}x</math>. import sympy x = sympy.symbols("x") f1 = x**2 f2 = sympy.sin(x) * sympy.cos(x/2.) i1 = sympy.integrate(f1, x) i2 = sympy.integrate(f2, x) print(i1) print(i2) Ausgabe: x**3/3 -0.666666666666667*sin(0.5*x)*sin(x) - 1.33333333333333*cos(0.5*x)*cos(x) Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} \text{d}x</math>. import sympy x = sympy.symbols("x") f = 2**(-x) i = sympy.integrate(f, (x, 0, sympy.oo)) print(i) Ausgabe: 1/log(2) Mit <code>sympy.pprint(i)</code> ließe sich letzere Ausgabe etwas schöner schreiben: 1 ────── log(2) Man beachtete, <code>log</code> steht hier für den natürlichen Logarithmus <code>ln</code>. == Aufgaben == * Integrieren Sie die Funktion <math>y = \log(x) + 10x</math> von 1 bis 5. * Integrieren Sie die Funktion <math>y = x^3</math> von 0 bis 4. * Integrieren Sie <math>\int x^x(\log (x) + 1)\mathrm dx</math> symbolisch. = Gewöhnliche Differenzialgleichungen = == DGL numerisch lösen == Für die Lösung von Differenzialgleichungen steht u.a. die Funktion scipy.integrate.solve_ivp() zur Verfügung. Diese Funktion implementiert auch das Runge-Kutta-Verfahren (RK45). {{Wikipedia | Runge-Kutta-Verfahren}} Beispiel <math>y' = x^2 + y^3</math>: import scipy import numpy as np import matplotlib.pyplot as plt def dy_dx(x, y): return x**2 + y**3 y0 = [1] xi = [0, 1] x = np.arange(0, 1, 0.01) z = scipy.integrate.solve_ivp(dy_dx, xi, y0, method="RK45", dense_output=True) y = z.sol(x) plt.plot(x, y.T) plt.grid() plt.show() [[Datei:PythonIng_dgl1.png]] == DGL symbolisch lösen == Beispiel <math>y' = x^2 + y^3</math>: import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) print(lsg) Ausgabe: [Eq(f(x), (-x**2)**(1/3)), Eq(f(x), (-x**2)**(1/3)*(-1 - sqrt(3)*I)/2), Eq(f(x), (-x**2)**(1/3)*(-1 + sqrt(3)*I)/2)] Mit <code>sympy.pprint</code> (pretty print) lässt sich die Ausgabe etwas übersichtlicher darstellen. import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) sympy.pprint(lsg) Ausgabe: ⎡ _____ _____ ⎤ ⎢ _____ 3 ╱ 2 3 ╱ 2 ⎥ ⎢ 3 ╱ 2 ╲╱ -x ⋅(-1 - √3⋅ⅈ) ╲╱ -x ⋅(-1 + √3⋅ⅈ)⎥ ⎢f(x) = ╲╱ -x , f(x) = ────────────────────, f(x) = ────────────────────⎥ ⎣ 2 2 ⎦ == Aufgaben == * Lösen Sie die Differenzialgleichung <math>y' = \frac{1}{x\cdot y}</math> mit Python. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>m' = -k\cdot m</math>. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>y' = \sqrt{|y|}</math>. =Rechnen mit wirklich großen Zahlen= Bekannt ist, dass Python kaum Einschränkungen beim Wertebereich von Ganzzahlen hat, z.B. print(10**300) Ausgabe (gekürzt): 100000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000 Ähnliches geht auch mit Gleitpunktzahlen, z.B. durch die Verwendung des Moduls mpmath: import mpmath print(mpmath.mpf(1500.4)**mpmath.mpf(300)) Ausgabe: 7.27975299218612e+952 Anderes Beispiel: from mpmath import mp, pi mp.dps = 100 print(pi) Ausgabe: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 mpmath kann noch einiges mehr, dazu sei aber auf die entsprechende Dokumentation auf der mpmath-Homepage verwiesen. mpmath ist Bestandteil von SymPy, kann aber auch separat installiert werden. =Regelungstechnische Aufgabenstellungen= Für regelungstechnische Aufgaben gibt es u.a. das externe Paket <code>control</code>. Hier soll nicht detailliert darauf eingegangen werden. Anhand eines Beispiels soll anschließend nur die Visualisierung in Form eines Bode-Diagramms und der Sprungantwort gezeigt werden. Gegeben sei ein P-Regler mit <math>R = \frac{5}{2}</math> und eine Strecke <math>S= \frac{1}{30s^3+20s^2+10s+1,5}</math>. Gesucht sei vorerst ein Bode-Diagramm für den offenen Regelkreis und das Führungsverhalten. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke # oder: G0 = ct.series(regler, strecke) Gw = ct.feedback(G0) ct.bode_plot(G0, label='G0') ct.bode_plot(Gw, label='Gw') plt.show() [[Datei:PythonIng_bode1.svg]] Nun noch für obiges Beispiel die Sprungantwort. Diese zeigt einige große Überschwinger, d.h. der Regler kann sicher noch optimiert werden. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke Gw = ct.feedback(G0) t, y = ct.step_response(Gw) plt.plot(t,y) plt.title('Sprungantwort') plt.xlabel('t') plt.ylabel('h(t)') plt.grid() plt.show() [[Datei:PythonIng_bode3.svg]] Einige weitere wichtige Daten (Phasenreserve, Amplitudenreserve, Durchtrittsfrequenz) lassen sich mittels der <code>control</code>-Funktion <code>margin()</code> ermitteln. Die Ortskurve lässt sich mit der Funktion <code>nyquist_plot()</code> zeichnen. Dies sei hier aber nicht weiter ausgeführt. ==Aufgaben== * Zeichen Sie mit Python die Ortskurve für obiges Beispiel. * Was passiert, wenn man die Reglerverstärkung weiter aufdreht (z.B. auf <math>R = \frac{25}{2}</math>)? * Wie sehen das Bode-Diagramm und die Sprungantwort aus, wenn ein PI-Regler verwendet wird? = Stereostatik etc. = Das Modul SymPy bietet einige Möglichkeiten einfache Bauwerke zu berechnen, z.B. Balken oder Fachwerke. Nachfolgend wird ein einfaches Fachwerk berechnet und gezeichnet. Python-Code: from sympy.physics.continuum_mechanics.truss import Truss t = Truss() # Knoten t.add_node(("A", -3, 0), ("B", 0, 0), ("C", 4, 0), ("D", 7, 0), ("E", 6, 1.5), ("F", 2, 3), ("G", -2, 1.5)) # Stäbe t.add_member(("AB","A","B"), ("BC","B","C"), ("CD","C","D")) t.add_member(("AG","A","G"), ("GB","G","B"), ("GF","G","F")) t.add_member(("BF","B","F"), ("FC","F","C"), ("CE","C","E")) t.add_member(("FE","F","E"), ("DE","D","E")) # Auflager; roller ... Loslager, pinned ... Festlager t.apply_support(("A","roller"), ("D","pinned")) # Einwirkende Kräfte t.apply_load(("G", 5, 270), ("E", 3, 90)) # Berechnung t.solve() print("Reaction Forces: ", t.reaction_loads) print("Internal Forces: ", t.internal_forces) # Fachwerk zeichnen p = t.draw() p.show() Ausgabe auf der Konsole: Reaction Forces: {'R_A_y': 4.20000000000000, 'R_D_x': 0, 'R_D_y': -2.20000000000000} Internal Forces: {'AB': 2.80000000000000, 'BC': 0.333333333333333, 'CD': -1.46666666666667, 'AG': -5.04777178564958, 'GB': -2.05555555555556, 'GF': -1.23413387432364, 'BF': 0.411111111111111*sqrt(13), 'FC': -0.3*sqrt(13), 'CE': 1.50000000000000, 'FE': 0.284800124843917, 'DE': 2.64407093534026} Zeichnung: [[File:PythonIng_fachwerk1.svg|300px]] Details zu diesem Thema siehe z.B. [https://docs.sympy.org/latest/modules/physics/continuum_mechanics/index.html Continuum Mechanics] oder [https://docs.sympy.org/latest/tutorials/physics/continuum_mechanics/index.html Continuum Mechanics Tutorials]. Auch andere mechanische Probleme werden von SymPy abgehandelt ([https://docs.sympy.org/latest/tutorials/physics/index.html Physics Tutorials]). == Aufgabe == Gegeben sei ein einseitig eingespannter Kragträger. Belastet wird er durch eine Einzellast am Trägerende. Für die Daten siehe folgende ASCII-Skizze: | 20 kN //|---> x | //| V //|---------------------- //| 10 m | Elastizitätsmodul E = 2,1*10⁵ N/mm² Flächenträgheitsmoment I = 0.001 m⁴ Berechnen Sie die Auflagerreaktionen, den Querkraft- und Biegemomentenverlauf, sowie die Verformungen. Stellen Sie dies mit Hilfe von SymPy graphisch und auch mittels Formeln dar. Verwenden Sie dazu auch pprint (pretty print) aus dem SymPy-Modul. Zwecks Lösungsansatz siehe die oben aufgeführte Seite "Continuum Mechanics Tutorials". Achten Sie auch auf die Einheiten! Kontrollieren Sie das Ganze mittels händischer Rechnung. In dem genannten Tutorial ist von "Singularity Functions" die Rede. Gemeint ist damit in diesem Kontext die {{W|Föppl-Klammer}}. Einige Python-Programme, vorrangig zu Maschinenelementen, finden sich auf [https://baymp.de/download_python.html BayMP für Python] (Balken, Zahnräder, Stabknickung usw.). = Stochastik = Die Stochastik ist ein sehr weites Feld. Hier werden nur einige wenige sehr einfache, aber wichtige Themen angerissen. Python stellt mit den Moduln math und statistics Software zu diesem Zwecke bereit. math und statistics sind bereits im Lieferumfang von Python enthalten. Aber auch mit den externen Modulen NumPy, SciPy und pandas kann man Stochastik in Python betreiben. Dies wird hier aber nicht gemacht. == Lageparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] m1 = statistics.mean(werte) m2 = statistics.mode(werte) m3 = statistics.median(werte) print("Arithmetischer Mittelwert = ", m1) print("Modalwert = ", m2) print("Median = ", m3) Ausgabe: Arithmetischer Mittelwert = 3.5 Modalwert = 1 Median = 3.0 == Streuungsparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] s = statistics.stdev(werte) print("Standardabweichung = ", s) Ausgabe: Standardabweichung = 2.6770630673681683 == Kombinatorik == import math n = 7 k = 5 print("n! = ", math.factorial(n)) print("Kombinationen (n über k) = ", math.comb(n, k)) Ausgabe: n! = 5040 Kombinationen (n über k) = 21 = Ein- und Ausgabe = == print == Die Anweisung print haben wir schon oft verwendet. Hier soll anhand von Beispielen kurz beschrieben werden, was der Befehl print leisten kann. print("Hallo", "Welt", 1, sep="-") print("Hallo", end=" ") print("Welt") Ausgabe: Hallo-Welt-1 Hallo Welt == input == a = int(input("Zahl 1: ")) b = int(input("Zahl 2: ")) print("a + b = ", a+b) Ausgabe (nach Eingabe der beiden Ganzzahlen): Zahl 1: 4 Zahl 2: 5 a + b = 9 == Aus Dateien lesen == Es seinen die datei.txt Hallo Welt. Wie geht es dir? ... und test1.py dat = open("datei.txt", mode = "r") print(dat.read()) dat.close() Ausgabe Hallo Welt. Wie geht es dir? ... Mit dem open()-Befehl wird die Datei datei.txt im Lesemodus geöffnet (r ... read). Mit dem read()-Befehl wird die Datei eingelesen und mittels print ausgegeben. == In Dateien schreiben == dat = open("datei.txt", mode = "a", encoding = "utf-8") dat.write("Hänge Zeile an\n") dat.close() Die Datei datei.txt sieht nach Abarbeitung des obigen Skripts nun so aus Hallo Welt. Wie geht es dir? ... Hänge Zeile an Es wird die Datei im Schreibmodus geöffnet (a ... append (anhängend), w ... write (überschreibend)). write() fügt hier also eine Zeile Text am Dateiende ein. close() schließt die Datei wieder. Das close() kann man sich mit der with-Anweisung auch sparen. with open("datei.txt", mode="a", encoding="utf-8") as dat: dat.write("Hänge Zeile an\n") = Benutzeroberflächen erstellen = == tkinter == {{Wikipedia | Tkinter}} Python bietet standardmäßig das Modul tkinter zur Programmierung von Benutzeroberflächen. Es müssen also bei der Verwendung von tkinter keine externen Module installiert werden. Hier wird eine (sehr) kurze Einführung in das Erstellen von grafischen Oberflächen mittels tkinter gegeben. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") win.minsize(300, 50) but = tk.Button(win, text = "Push the button") but.pack() win.mainloop() Ausgabe: [[Datei:PythonIng_gui1.jpg]] Ein etwas komplizierteres Beispiel sei nachfolgend gezeigt. Es sollen zwei Strings miteinander verknüpft und ausgegeben werden. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") def on_button_clicked(): str = ent1.get() + ent2.get() lab2["text"] = str ent1 = tk.Entry(win) ent2 = tk.Entry(win) lab1 = tk.Label(win, text="verknuepfen mit") lab2 = tk.Label(win, text="") but = tk.Button(win, text = "=", command=on_button_clicked) ent1.pack(side="left") lab1.pack(side="left") ent2.pack(side="left") but.pack(side="left") ent2.pack(side="left") lab2.pack(side="left") win.mainloop() Ausgabe (vor der Eingabe der Teilstrings): [[Datei:PythonIng_gui2.jpg]] Ausgabe (nach der Eingabe der Teilstrings und dem Drücken des =-Buttons): [[Datei:PythonIng_gui3.jpg]] == curses == {{Wikipedia | curses}} Mit dem curses-Modul lassen sich u.a. TUIs ('''T'''ext '''U'''ser '''I'''nterfaces) erstellen. Ein sehr einfaches Beispiel zur allgemeinen Funktionsweise wird nachstehend geliefert. import curses stdscr = curses.initscr() curses.start_color() curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) stdscr.clear() stdscr.addstr("Hallo Welt", curses.color_pair(1)) stdscr.refresh() stdscr.getch() curses.endwin() Als Ausgabe sollte <span style="color:#FF0000;">Hallo Welt</span> (rote Schrift auf weißem Hintergrund) auf dem Terminal/der Konsole erscheinen. Getestet wurde dies mit openSUSE Tumbleweed, Python-Version 3.13.12. Das entsprechende Python-curses-Package muss installiert sein. Allgemeine Informationen zur Terminal-/Konsolengröße und Cursorposition liefert folgendes Programm: import curses stdscr = curses.initscr() stdscr.addstr(3, 5, "LINES: %d" % curses.LINES) stdscr.addstr(4, 5, "COLS: %d" % curses.COLS) (y,x) = stdscr.getyx() stdscr.addstr(5, 5, "Momentane Cursorposition: [%d, %d]" % (y, x)) (y,x) = stdscr.getbegyx() stdscr.addstr(6, 5, "Koordinatenursprung: [%d, %d]" % (y, x)) (y,x) = stdscr.getmaxyx() stdscr.addstr(7, 5, "Fenstergröße: [%d, %d]" % (y, x)) stdscr.addstr(11, 2, "Taste drücken -> Ende") stdscr.refresh() stdscr.getch() curses.endwin() Es sollte sich in etwa folgende Ausgabe ergeben: LINES: 44 COLS: 110 Momentane Cursorposition: [4, 15] Koordinatenursprung: [0, 0] Fenstergröße: [44, 110] Taste drücken -> Ende Zur Funktionsweise von curses siehe auch das Wikibook [[ncurses]]. Zum Verständnis sind dort allerdings elementare Kenntnisse in der Programmiersprache C erforderlich. == Qt == {{Wikipedia | Qt (Bibliothek)}} Auch für das Qt-Framework gibt es eine Anbindung an Python. Nachfolgend ein einfaches Beispiel. import sys from PySide6.QtWidgets import QApplication, QLabel app = QApplication(sys.argv) label = QLabel("Hallo Welt!") label.show() sys.exit(app.exec()) Ausgabe: [[Datei:PythonIng_gui10.png]] == Gtk == {{Wikipedia | GTK (Programmbibliothek)}} Eine idente Ausgabe, wie oben für Qt gezeigt, erzeugt z.B. folgendes Gtk-Programm: import gi gi.require_version("Gtk", "4.0") from gi.repository import Gtk def on_activate(app): win = Gtk.ApplicationWindow(application=app) lab = Gtk.Label(label="Hallo Welt!") win.set_child(lab) win.present() app = Gtk.Application() app.connect('activate', on_activate) app.run(None) Auch für die Benutzung von Qt und Gtk müssen die jeweiligen Packages installiert sein. Getestet wurden die entsprechenden Python-Programme nur unter openSUSE Tumbleweed. Wie das GTK-Paket unter MS Windows 11 installiert wird, siehe z.B. [https://www.gtk.org/docs/installations/windows Setting up GTK for Windows]. Damit sei aber das Thema "Benutzeroberflächen erstellen" hier abgeschlossen, da dies schon ein sehr spezielles Aufgabengebiet ist, das eher Informatiker und nicht so sehr Ingenieure anspricht. Bei Bedarf siehe aber ggf. die entsprechenden Links unten in diesem Tutorial. Dort sind weiterführende Informationen zu finden. = Style Guide und flake8 = Wie man schönen und richtigen Python-Code schreibt, erfahren Sie in * [https://peps.python.org/pep-0008/ PEP 8 – Style Guide for Python Code] Ein Modul, das prüft, ob die Richtlinien im Style Guide eingehalten wurden, ist ''flake8'': * [https://flake8.pycqa.org/en/latest/ Flake8: Your Tool For Style Guide Enforcement] = Einige Integrierte Entwicklungsumgebungen (IDEs)= Werden Programmtexte größer und umfangreicher, so ist das Arbeiten mit der interaktiven Programmierumgebung bzw. das direkte Ausführen von Python-Skripten mühsam. Man wünscht sich z.B. Hilfen zum Debuggen oder die automatische Code-Vervollständigung. Zu diesem Zweck wurden IDEs (Integrated Development Environments) geschaffen. Von diesen seinen nachfolgend auszugsweise einige kurz beschrieben. Testen Sie einfach aus, welche davon für Sie bzw. für Ihr Python-Projekt geeignet sind. == IDLE == IDLE ist die mit dem Python-Programmpaket mitgelieferte IDE. Der Name leitet sich einerseits ab vom Monty-Python-Mitglied Eric Idle, andererseits steht es als Abkürzung für "'''I'''ntegrated '''D'''evelopment and '''L'''earning '''E'''nvironment. IDLE ist einfach zu bedienen, bietet aber schon einen beachtlichen Leistungsumfang. Nachfolgend wird ein Screenshot zu IDLE geliefert. Rechts ist das Editor-Fenster zu sehen, links die interaktive Programmierumgebung. Um das Beispiel selbst nachvollziehen zu können, starten Sie IDLE. Das geht ähnlich, wie Sie die interaktive Programmierumgebung von Python starten (nur, dass Sie eben das IDLE-Icon doppelklicken und nicht das Python-Icon. Unter Linux geben Sie einfach in einem Terminal <code>idle3.13</code> o. Ä. ein). Weiter geht es mit "File - Open - ...". Die auszuführende Datei auswählen (im konkreten Fall ein "Hallo-Welt"-Programm). Es erscheint das rechte Fenster. Dort "Run - Run Module" auswählen. Und schon wird im linken Fenster "Hallo Welt!" ausgegeben. [[Datei:PythonIng_idle1.jpg | 600px]] Siehe auch {{W|IDLE}}. == PyCharm == PyCharm ist ein kommerzielles Produkt. Es gab aber auch eine kostenlose Community Edition. Seit 2025 sind beide Varianten vereint. Für die ersten 30 Tage sind die Pro-Funktionen frei verfügbar, danach nur noch die Kernfunktionalitäten (oder man bezieht kostenpflichtig die Pro-Version). Zu beziehen ist PyCharm unter dem Weblink [https://www.jetbrains.com/pycharm/]. Nachfolgend ein etwas abgewandeltes "Hallo Welt"-Programm, editiert und ausgeführt mit PyCharm. [[Datei:PyCharm_IDE_2023_screenshot.png | 600px]] Siehe auch {{W|PyCharm}}. == Eric == Auch eric ist Open Source und steht unter der GNU General Public License Version 3 oder später. Zu beziehen ist diese Software unter [https://eric-ide.python-projects.org/]. [[Datei:Screenshot_Eric_4.png | 600px]] Siehe auch {{W|eric (Software)}}. <small> Unter openSUSE Tumbleweed sollte sich eric auch mit YaST installieren lassen. Bei mir gibt es aber dann beim Ausführen des eric-Programms eine Fehlermeldung (Stand März 2026): ... ModuleNotFoundError: No module named 'PyQt6.QtPdfWidgets' Umgehen kann man dieses Problem aber wieder mit dem Erstellen einer virtuellen Umgebung, in etwa so python3.13 -m venv ~/tmp/venv1 cd ~/tmp/venv1/bin ./python3.13 -m pip install --upgrade --prefer-binary eric-ide ./eric7_ide </small> == PyScripter == Vom Funktionsumfang vergleichbar mit den vorherigen IDEs ist PyScripter. Auch PyScripter ist Open Source. Die Projekt-Homepage findet sich auf [https://sourceforge.net/projects/pyscripter/]. PyScripter ist nur für MS Windows verfügbar. [[Datei:PythonIng_pyscripter1.jpg | 600px]] == Spyder IDE == Spyder enthält bereits eine stabile Python-Version und etliche Module (z.B. matplotlib, numpy, control). Ansonsten kann dieses Softwarepaket vom Funktionsumfang her mit den anderen genannten IDEs locker mithalten. Spyder wurde unter der MIT-Lizenz veröffentlicht. Diese Software findet sich auf [https://www.spyder-ide.org]. [[Datei:Spyder-windows-screenshot.png | 600px]] Siehe auch {{W|Spyder (Software)}} == Sonstige == Die genannten IDEs sind nicht die Einzigen. Es gibt, um dem Image Pythons als beliebteste Programmiersprache gerecht zu werden, noch einige andere. Sowohl Open Source-Programme als auch kommerzielle Programme sind im Web zu finden, z.B. Thonny oder {{W|Visual Studio Code}}. Braucht man den Umfang von ausgewachsenen IDEs nicht, so kann man auch normale Texteditoren verwenden (z.B. {{W|Geany}} oder {{W|Kate_(Texteditor)|Kate}}). = Debuggen und Testen = Das Debuggen und Testen von Programmen sind wichtige Bestandteile der Programmierung. Syntaxfehler lassen sich i.A. leicht beheben. Schwieriger ist das Eingrenzen von logischen Fehlern, die ev. nur in bestimmten Situationen auftreten und keine explizite Fehlermeldung hervorrufen. Das Programm liefert falsche Ergebnisse oder es stürzt aus heiterem Himmel ab. Um das zu verhindern gibt es verschiedene Werkzeuge, die bei der Fehlersuche behilflich sein können. Vorerst siehe aber zwecks Begriffsklärung noch folgende Links: * {{W|Debuggen}} * {{W|Debugger}} * {{W|Softwaretest}} <gallery> First Computer Bug, 1947.jpg Test ganzheitlich.png V-Modell.svg </gallery> == Das Modul pdb == Python bringt schon ein Modul zum Debuggen mit. Siehe z.B. [https://docs.python.org/3/library/pdb.html pdb — The Python Debugger]. Komfortabler lässt sich das aber mittels Integrierter Entwicklungsumgebungen (IDEs) angehen. == Debuggen mit IDEs == Für die IDEs IDLE und Spyder sei kurz auf die entsprechenden Webseiten verwiesen: * [https://www.cs.uky.edu/~keen/help/debug-tutorial/debug.html Debugging under IDLE]. * [https://docs.spyder-ide.org/current/panes/debugging.html Spyder Debugger] Dort wird die Vorgehensweise auch mittels Screenshots erläutert. == assert == assert ... behaupten, zusichern ({{W|Assertion (Informatik)}}) Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10., 0.) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10., 0.) File "/home/hr/Develop/test1.py", line 4, in print1 assert y != 0.0 ^^^^^^^^ AssertionError Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1("10.", "5.") File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Aber auch bei nachfolgendem Code gibt es eine Fehlermeldung: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10, 5) File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Damit letzteres funktioniert, kann man den Programmcode so umschreiben: def print1(x, y): assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 2.0 Und jetzt fangen wir den <code>AssertionError</code> auf: def print1(x, y): try: assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) except(AssertionError): print("Hallo") print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Hallo Ich hoffe, es ist wenigstens im Ansatz klar geworden, wofür <code>assert</code> gut sein kann. Ausschalten kann man die <code>assert</code>-Überprüfung übrigens mit dem Python-Schalter <code>-O</code>. == Doctests == Innerhalb eines Docstrings kann die Arbeit im interaktiven Modus simuliert werden. Nach den Promptzeichen (>>>) erfolgen dann bei unserem Beispiel innerhalb des Docstrings simulierte Aufrufe der Funktion <code>print1()</code>. Danach folgen jeweils die Sollresultate. Wird das Modul oder die Datei als Hauptprogramm aufgerufen, so wird die Funktion <code>doctest.testmode()</code> aufgerufen und ein Bericht auf der Konsole ausgegeben. Wird das Modul nicht als Hauptprogramm aufgerufen, sondern importiert, dann wird diese <code>testmod</code>-Funktion nicht aufgerufen. D.h. dieser Code kann sowohl für Testzwecke als auch für den produktiven Einsatz verwendet werden. Das ist auch sinnvoll, weil wenn man Teile der Datei immer löschen bzw. einfügen müsste, so würden sich Fehlerquellen auftun. Das würde den Sinn und Zweck von Doctests konterkarieren. def print1(x=0., y=1.): """ Dividiere zwei Zahlen Autor: Intruder Datum: 12.08.2025 >>> print1(2., 1.) 2.0 >>> print1(5., 2.) 2.5 >>> print1(5.) 5.0 """ print(x/y) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) Ausgabe: Trying: print1(2., 1.) Expecting: 2.0 ok Trying: print1(5., 2) Expecting: 2.5 ok Trying: print1(5.) Expecting: 5.0 ok 1 items had no tests: __main__ 1 items passed all tests: 3 tests in __main__.print1 3 tests in 2 items. 3 passed and 0 failed. Test passed. Das gezeigte Beispiel ist so ziemlich das einfachste, das es gibt. Für weiterführende Details siehe z.B.: * [https://peps.python.org/pep-0257/ PEP 257 – Docstring Conventions] * [https://docs.python.org/3/library/doctest.html doctest — Test interactive Python examples] == pytest == Siehe zu diesem Thema auch {{W|Modultest}}. pytest ist ein externes Modul und muss vorab installiert werden, z.B. mittels pip install -U pytest pip install -U pytest-html Python-Code, Datei test1.py: def add(x, y): return x + y def test_answer(): assert add(1, 1) == 3 Starten von pytest in der Konsole: pytest test1.py Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py F [100%] ========================================================= FAILURES ========================================================== ________________________________________________________ test_answer ________________________________________________________ def test_answer(): > assert add(1, 1) == 3 E assert 2 == 3 E + where 2 = add(1, 1) test1.py:6: AssertionError ================================================== short test summary info ================================================== FAILED test1.py::test_answer - assert 2 == 3 ===================================================== 1 failed in 0.09s ===================================================== Hier erhalten wir einen Fehler, da 1+1 eindeutig ungleich 3 ist. Aber aus irgendeinem Grund wollte der Programmierer oder Tester in diesem Fall, dass dies so ist. Testfälle werden übrigens mit dem Präfix <code>test_</code> eingeleitet. Python-Code: def add(x, y): return x + y + 1 def test_answer(): assert add(1, 1) == 3 Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py . [100%] ===================================================== 1 passed in 0.01s ===================================================== Jetzt ist alles in Ordnung. Weiterführendes siehe z.B. * [https://docs.pytest.org/en/stable/ pytest: helps you write better programs] == unittest == Auch unittest dient zur Durchführung von Testreihen, ist aber Bestandteil von Python. Hier wird vorerst nicht näher darauf eingegangen. Siehe z.B. * [https://docs.python.org/3/library/unittest.html unittest — Unit testing framework] Lt. ''Inden: Python Challenge; dpunkt, 2021, Seite 481'' soll unittest weniger komfortabel als pytest sein. Einen Vergleich von unittest mit pytest findet man in * [https://knapsackpro.com/testing_frameworks/difference_between/pytest/vs/unittest pytest vs unittest] = Ausblick = Dies war eine kurze Einführung in die Berechnungs- und Darstellungsmöglichkeiten mit Python. Es sollten etliche relevante Themen behandelt, oder zumindest kurz angesprochen worden sein. Wem dieser Text nicht ausreichend ist, der sei auf die entsprechenden weiterführenden Weblinks, Bücher und die Python-Hilfefunktion verwiesen. Python kennt noch viel mehr Befehle, als hier dargestellt wurden. Das Themenspektrum ist auch durch die Einbindung externer Module fast beliebig erweiterbar. = Weblinks= == Python allgemein == * [https://www.python.org/ Python Homepage] == Externe mathematische Module == * [https://numpy.org/ NumPy] * [https://numpy.org/doc/stable/user/numpy-for-matlab-users.html NumPy for MATLAB users] * [https://scipy.org/ SciPy] * [https://www.sympy.org/en/index.html SymPy] * [https://pandas.pydata.org/ pandas] * [https://github.com/maroba/findiff findiff] * [https://mpmath.org/ mpmath] == Externe Module für Grafiken == * [https://matplotlib.org/ Matplotlib] * [https://vpython.org/ VPython] * [https://docs.vtk.org/en/latest/api/python.html VTK] == Erstellung von User Interfaces == * [https://docs.python.org/3/library/tkinter.html tkinter - Python interface to Tcl/Tk] * [https://docs.python.org/3/library/curses.html curses - Terminal handling for character-cell displays] * [https://wiki.qt.io/Qt_for_Python Qt for Python] * [https://www.gtk.org/docs/language-bindings/python GTK and Python] == Erstellen virtueller Umgebungen == * [https://docs.python.org/3/library/venv.html venv - Creation of virtual environments] == Sonstige == * [https://python-control.readthedocs.io/en/stable/ Python Control Systems Library] * [https://pypi.org/project/regex/ regex - Regular Expressions] = Bücher = == Gedruckte Bücher, OpenBooks, Magazine == * Diverse: c't Python Lernen, Verstehen, Anwenden; Heise, 2022 * Ernesti, Kaiser: Python3 - das umfassende Handbuch; 5. Aufl., Rheinwerk, [https://openbook.rheinwerk-verlag.de/python/ OpenBook] * Inden: Python Challenge; dpunkt, 2021, ISBN 978-3-86490-809-5 * Klein: Numerisches Python; 2. Aufl., Hanser, 2023, ISBN 978-3-446-47170-2 * Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler; Rheinwerk, 2021, ISBN 978-3-8362-7316-9 * Weigend: Python 3 - Das umfassende Praxisbuch; 9. Aufl., mitp, 2022, ISBN 978-3-7475-0544-1 * Woyand: Python für Ingenieure und Naturwissenschaftler; 4. Aufl., Hanser, 2021, ISBN 978-3-446-46483-4 == Andere Wikibooks == * [[:en:Subject:Python_programming_language | Englische Wikibooks zum Thema Python]] * [[Python|Deutschsprachiges Python-Wikibook]] [[Bild:2von10.png|20%]] * [[Python unter Linux|Python 2.7 unter Linux]] [[Bild:10von10.png|100%]] {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} b7mac1ks3c4a994xt35s5d4wxgnphjv 1082858 1082857 2026-04-06T12:48:00Z Intruder 1513 /* Mit VTK */ 1082858 wikitext text/x-wiki {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} = Hallo Welt und allgemeine Hinweise = == Was ist Python == * Python ist eine universelle höhere Programmiersprache. * Python ist objektorientiert. * Python ist Open-Source (Python Software Foundation License). * Python ist für viele Betriebssysteme erhältlich (z.B. für Linux, MS Windows, macOS). * Python ist ein Interpreter. * Python ist durch Module fast beliebig erweiterbar. * Python als Programmiersprache ist case-sensitive - d.h. Groß- und Kleinschreibung ist relevant bei der Eingabe von Befehlen. {{Wikipedia | Python (Programmiersprache)}} == Python installieren == === MS Windows === Laden Sie das aktuelle Python-Paket von der Webseite [https://www.python.org/] herunter. Weiter geht es wie bei jedem anderen größeren zu installierenden Programm. Einfach das Installationsprogramm im Explorer doppelklicken und den Anweisungen des Setup-Programmes folgen. === Linux === Entweder ist Python bereits standardmäßig installiert, ansonsten ist die Installation mittels Paketmanagementsystem einfach möglich. Aber auch die Spyder-Entwicklungsumgebung ([https://www.spyder-ide.org]) bietet einen guten Einstieg mit Python (das gilt auch für MS Windows). Spyder bringt auch schon etliche wichtige Module standardmäßig mit. == Python starten == === MS Windows === Das Icon für das Python-Programm doppelklicken. Und schon startet das Programm. [[Datei:PythonIng_start1.jpg]] Python im interaktiven Modus präsentiert sich dann so: Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> Alternativ kann das Programm auch über die Eingabeaufforderung oder die PowerShell gestartet werden: c:\devel\Python>python.exe Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> === Linux === Tippen Sie einfach das Wort „python“ (oder unter openSUSE Tumbleweed z.B. auch „python3.11“ oder „python3.13“) in einem Linux-Terminal ein, schließen den Befehl mit der RETURN-Taste ab, und schon startet Python im interaktiven Modus: Python 3.13.12 (main, Feb 09 2026, 22:37:44) [GCC] on linux Type "help", "copyright", "credits" or "license" for more information. >>> Es gibt auch noch andere Möglichkeiten Python zwecks Programmausführung zu starten, z.&nbsp;B. den {{W|Shebang}} (<code>#!</code>) am Beginn eines Python-Scripts. Das Script sei als Script.py gespeichert. Dann kann das Script mit ./Script.py ausgeführt werden. Für openSUSE Tumbleweed sei nachfolgend ein lauffähiges "Hallo Welt!"-Script angegeben. Es wird in diesem Script der Python-Interpreter in der Version 3.13 verwendet : #!/usr/bin/python3.13 print("Hallo Welt!") Die Berechtigungen zum Ausführen der Datei müssen natürlich noch richtig gesetzt werden, z.B. mittels <code>chmod 777 Script.py</code>. <small>Oder es wird in einen Pfad verschoben, in dem sich ausführbare Programme generell befinden (<code>echo $PATH</code>). Das Script kann dann wie ein normales Programm ohne weitere Angaben mit Script.py gestartet werden. Alternativ wird nicht das Script an sich verschoben, sondern nur ein symbolischer Link angelegt, z.B. mit <code>ln -s ~/tmp/Script.py ~/.local/bin/Script.py</code>.<code>~/.local/bin</code> sei ein im PATH gelegenes Verzeichnis. Dies sind aber schon Features für fortgeschrittene Linux-Benutzer und werden am Anfang eher selten benötigt.</small> == Ein paar Worte zur Erklärung == Getestet wurden die Beispiele unter den Betriebssystemen * MS Windows 10 mit der Python-Version 3.12.0 (teilweise auch mit 3.12.2 und 3.13.1; nur die Inhalte die bis spätestens Juli 2025 erstellt wurden) * MS Windows 11 ab der Python-Version 3.13.4 (nur zum Teil; ab Juli 2025) * openSUSE Leap 15.6 mit der Python-Version 3.11.12 (Spyder, nur vereinzelt) und zum Teil mit 3.12.11 (ab Juli 2025 bis November 2025). * openSUSE Tumbleweed ab der Python-Version 3.13.9 (nur vereinzelt, ab November 2025) An Beliebtheit rangiert Python mit Stand März 2026 mit einem Rating von 21,25% an 1. Stelle vor C und C++ (lt. [https://www.tiobe.com/tiobe-index/ TPCI - TIOBE Programming Community Index]). Lt. [https://innovationgraph.github.com/global-metrics/programming-languages GitHub Top 50 Programming Languages Globally] lag Python im Q3/2025 auf Rang 2, vor TypeScript und hinter JavaScript. Der Name "Python" rührt von der Komikertruppe {{W|Monty Python}} her. Die Icons für Python (z.B. Python selbst, Eric IDE, IDLE) sind aber durch die Python-Schlangenart symbolisiert. <gallery> Python-logo-notext.svg|Python-Logo Guido van Rossum OSCON 2006.jpg|Guido van Rossum (geb. 1956), der Erfinder von Python </gallery> == Ein erstes Programm == Kommentare werden in Python mit der Raute (#) eingeleitet. Sie werden vom Python-Interpreter ignoriert. Text kann mit der print-Funktion ausgegeben werden. Starten Sie Python und geben sie folgende Anweisungen zeilenweise ein >>> # Das ist ein Kommentar >>> print("Hallo Welt!") Als Ergebnis erhalten Sie Hallo Welt! Der Prompt (>>>) ist selbstverständlich nicht einzutippen, sondern wird vom Python-System geliefert. Strings können in Python entweder in Anführungszeichen (") gesetzt werden oder in Hochkommatas('). In diesem Text wird die erste Variante bevorzugt eingesetzt. Im Gegensatz zu Julia ist es hier egal, ob zwischen <code>print</code> und der öffnenden Klammer Leerzeichen stehen. = Python als Taschenrechner = == Allgemeines == Wir wollen 3 * 5 berechnen. Dazu starten wir Python im interaktiven Modus. Geben Sie dann die Formel >>> 3 * 5 ein, drücken die Taste ENTER/RETURN ({{Taste|↵}}) und erhalten als Ergebnis 15 Auch kompliziertere Ausdrücke sind möglich. Beispielsweise mit Winkelfunktionen, Quadratwurzeln etc. Wir wollen nun den Ausdruck <math>\sin\sqrt{15}</math> berechnen : >>> import math >>> math.sin(math.sqrt(15)) -0.6679052983383519 Als erstes wird das math-Modul importiert. Dann wird der mathematische Ausdruck berechnet. Eine andere Variante, die dasselbe Ergebnis liefert, ist >>> from math import * >>> sin(sqrt(15)) -0.6679052983383519 Es wird also aus dem Modul <code>math</code> alles importiert (erkennbar am <code>*</code>). Will man nicht alles importieren, so kann man das auch einschränken: >>> from math import sin, sqrt Beenden lässt sich das Python-Programm durch Eingabe von <code>exit()</code> (und natürlich ist zur Bestätigung die RETURN-Taste zu drücken). == Die Hilfefunktion von Python == Bei Eingabe der Anweisung help() springt Python in den Hilfemodus. Eingabe: >>> help() Eingabe: help> math.sin Ausgabe: Help on built-in function sin in math: math.sin = sin(x, /) Return the sine of x (measured in radians). Für die komplette Python-Dokumentation siehe [https://docs.python.org/3/]. Verlassen kann man den Hilfemodus durch das Drücken von STRG-C. == Aufgaben == * Erkunden Sie die Tangensfunktion "tan" mittels Python-Hilfe (vergessen Sie nicht das math-Modul zu importieren und das <code>math.</code> vor <code>tan</code>) * Berechnen Sie mit Python den Ausdruck <math>\frac{1}{2}\cdot e^2 \cdot \tan(\pi/3)</math>. Siehe für die Exponentialfunktion im Python-Hilfesystem auch den Befehl <code>math.exp</code>. Alternativ kann auch die Konstante <code>math.e</code> eingesetzt werden. Potenzieren kann man bei Python mit dem **-Operator (z.B. 2**3 = 8). Für <math>\pi</math> gibt es <code>math.pi</code>. = Python als Scriptsprache = Häufig wird man aber kompliziertere Anweisungsfolgen verarbeiten müssen. Diese will man normalerweise nicht jedesmal neu eingeben, sondern in einer Datei speichern und diese Datei dann zur Ausführung bringen. Speichern Sie dazu folgenden Code in einer Textdatei, z.B. unter MS Windows als c:\tmp\test1.py # Das ist ein Kommentar print("Hallo Welt!") Python-Dateien werden mit der Dateiendung .py versehen. Achten Sie darauf, dass vor dem print keine Leerzeichen vorhanden sind. Das ist eine Python-Eigenheit. Wie wir später sehen werden, nutzt Python Einrückungen als syntaktisches Mittel, z.B. um bei Schleifen den Schleifenkörper zu kennzeichnen. Danach bringen Sie die Skriptdatei test1.py (sozusagen das Hauptprogramm) folgendermaßen zur Ausführung: 1) Starten Sie unter MS Windows die Eingabeaufforderung (oder alternativ auch die Windows PowerShell). Das sieht dann etwa so aus: Microsoft Windows [Version 10.0.19045.3693] (c) Microsoft Corporation. Alle Rechte vorbehalten. C:\Users\xyz> : <small>Falls jemand nicht weiß, wie man die Eingabeaufforderung startet: Eine Möglichkeit ist, einfach in der Taskleiste von Windows das "Start"-Symbol &nbsp;([[Image:Windows_logo_-_2021_(Black).svg|10px]])&nbsp; mit der rechten Maustaste anklicken. "Ausführen" auswählen (oder alternativ für die PowerShell unter Windows 10 den Eintrag "Windows PowerShell", unter Windows 11 den Eintrag "Terminal"). Im sich öffnenden Dialogfenster gibt man in die "Öffnen"-Zeile das Wort <code>cmd</code> ein und mit "OK" wird das Ganze bestätigt.</small> 2) Wechseln Sie mittels <code>cd c:\tmp</code> in das Verzeichnis c:\tmp 3) Angenommen, Sie haben Python unter dem Pfad <code>c:\devel\Python\</code> installiert. Starten Sie das Programm so (der Prompt <code>c:\tmp></code>ist natürlich nicht mit einzutippen): c:\tmp>c:\devel\Python\python.exe test1.py 4) Wie erwartet ergibt sich folgende Ausgabe am Bildschirm Hallo Welt! Die Vorgehensweise unter Linux ist prinzipiell gleich. Die kleinen Unterschiede, wie z.B. der Slash statt dem Backslash in Pfadangaben, sollten für Linux-Benutzer keine Hürde darstellen. == Variablen == Variablenbezeichner können aus Buchstaben (A-Za-z), Ziffern (0-9) und Underscores (_) bestehen, dürfen aber nicht mit einer Zahl beginnen. Führende Underscores haben u.a. im Kontext mit der Objektorientierten Programmierung eine spezielle Bedeutung und sollten nicht für "normale" Variablenbezeichner verwendet werden. Gültige Variablenbezeichner wären also: xyz x1 _wert name_anzahl Es gibt in Python etliche Schlüsselwörter (z.B. for, if oder return). Diese dürfen nicht als eigene Variablenbezeichner verwendet werden. Eine Liste aller Schlüsselwörter liefert das Script import keyword print(keyword.kwlist) <small>Übung: Speichern Sie dieses Script in eine Datei, z.B. in c:\tmp\test1.py. Führen Sie diese Datei aus, um die Liste der Schlüsselwörter auszugeben.</small> Da Python case-sensitiv ist, repräsentieren folgende Bezeichner verschiedene Variablen: xyz XYZ xYz Werte werden an Variablen mittels Gleich-Zeichen (=) zugewiesen. Im Folgenden wird der Code immer in der Datei c:\tmp\test1.py gespeichert. x = 5 y = 10 z = x*y print(z) Bringen Sie die Datei test1.py zur Ausführung so erhalten Sie folgende Bildschirmausgabe 50 Sie können auch mehrere Anweisungen in einer Zeile durch Semikolon getrennt schreiben. Dies führt aber zu unübersichtlichem Code. x = 5; y = 10; z = x*y; print(z) Ausgabe: 50 Auch aus der Programmiersprache C/C++ oder Java bekannte Konstrukte können Sie verwenden, z.B. x = 5 # x = x - 2 x -= 2 print(x) Bildschirmausgabe: 3 Beachten Sie, dass mit dem =-Zeichen eine Wertezuweisung durchgeführt wird. Dies ist nicht äquivalent zum mathematischen =-Zeichen, wie am vorigen Beispiel zu ersehen ist. Den Inkrement-/Dekrementoperator (z.B. x++ oder x--) aus C/C++ oder Java kennt Python aber nicht. Variablen sind nicht an einen bestimmten Datentyp gebunden, folgendes ist mit Python problemlos möglich: import math wert = 10 print(wert) wert = 35.5 print(wert) wert = "Hallo" print(wert) wert = math.pi print(wert) Ausgabe: 10 35.5 Hallo 3.141592653589793 == Physische und logische Zeilen == In Python muss eine Anweisung in einer logischen Zeile Platz finden. Wird eine Anweisung aber zu lang für eine Zeile, dann kann sie in mehrere physische Zeilen unterteilt werden. Dies kann einerseits durch einen Backslash am Ende einer Zeile geschehen, z.B. a = 2 + \ 5 Dies stellt eine logische Zeile dar, die in zwei physische Zeilen unterbrochen ist. Geklammerte Ausdrücke werden automatisch zu einer logischen Zeile verbunden, z.B. a = (2 + 5) Achtung: Im ersten Beispiel darf nach dem Backslash nichts mehr stehen, auch kein Kommentar. Dies trifft im zweiten Bespiel nicht zu, hier könnte noch ein Kommentar folgen, z.B. a = (2 + # Kommentar 5) Auch für Strings gibt es Möglichkeiten, diese auf mehrere Zeilen aufzuspalten. # Kurzer String str1 = "ABC" # Langer String str2 = """Hallo Welt, Grüetzi Schwyzer, Servus an alle""" # Backslash str3 = "UVW\ XYZ" print(str1) print(str2) print(str3) Ausgabe: ABC Hallo Welt, Grüetzi Schwyzer, Servus an alle UVWXYZ ==Hexadezimale, oktale, binäre und andere Zahlen== d = 1050 # Dezimalzahl h = 0xAA2 # Hexadezimalzahl o = 0o12 # Oktalzahl b = 0b100001101 # Binärzahl print(d) print(h) print(o) print(b) Ausgabe: 1050 2722 10 269 Groß- und Kleinbuchstaben sind in obigen Literalen übrigens egal. So kann man z.B. statt <code>0b1001</code> auch <code>0B1001</code> schreiben (siehe dazu [https://docs.python.org/3/reference/lexical_analysis.html#integer-literals]). Sie können auch dezimale in hexadezimale Zahlen umwandeln, usw.: h = hex(1050) # Dezimalzahl -> Hexadezimalzahl b = bin(1050) # Dezimalzahl -> Binärzahl o = oct(1050) # Dezimalzahl -> Oktalzahl print(h) print(b) print(o) Ausgabe: 0x41a 0b10000011010 0o2032 Gegeben sei die Zahl 121 zur Basis 3. Diese soll in eine Dezimalzahl umgewandelt werden. Das kann so geschehen: z = int("121", 3) print(z) Ausgabe: 16 Dass dies richtig ist, davon kann man sich folgendermaßen überzeugen: <math> 1 \cdot 3^2 + 2 \cdot 3^1 + 1 \cdot 3^0 = 9 + 6+ 1 = 16 </math> Zahlen übersichtlicher schreiben kann man auch mittels Underscore, z.B.: print("Eine Million (Variante 1) =", 1000000) print("Eine Million (Variante 2) =", 1_000_000) print("Eine Rechnung:", 2_000 * 400_000); Es ergibt sich bei beiden Varianten die gleiche Ausgabe. Variante 2 ist aber im Sourcecode leichter lesbar, detto die Zahlen in der Rechnung: Eine Million (Variante 1) = 1000000 Eine Million (Variante 2) = 1000000 Eine Rechnung: 800000000 == Strings und Platzhalter== Ein paar einfache Beispiele: print("Hallo {}" . format("Hugo")) print("Hallo {:s}" . format("Hugo")) print("Hallo %s" % "Hugo") Ausgabe: Hallo Hugo Hallo Hugo Hallo Hugo Python-Code (formatted string literals): str1 = "Hallo" str2 = "Hugo" print(f"{str1} {str2}") Ausgabe: Hallo Hugo Komplexere Beispiele: print("Hallo {} und {}" . format("Hugo", "Mike")) print("Hallo {name1} und {name2}" . format(name2="Hugo", name1="Mike")) # Füllzeichen: * # Bündigkeit: > (=rechts), < (=links), ^ (=zentriert) # Feldweite: 10 # Typ: s (=String), f (=Gleitkommazahl), d (=Dezimalzahl) etc. print("Hallo {:*>10s}" . format("Hugo")) print("Hallo {:*<10s}" . format("Hugo")) Ausgabe: Hallo Hugo und Mike Hallo Mike und Hugo Hallo ******Hugo Hallo Hugo****** Python-Code: str = "Hallo\t%s\t%7.2f\t%10.2e\t%i" % ("Hugo", 12.34567, 34.567, 264) print(str) Ausgabe: Hallo Hugo 12.35 3.46e+01 264 == Unicode == Neben den bekannten ASCII-Zeichen lassen sich Zeichen auch mittels Unicode beschreiben. Griechische Buchstaben oder komplexere mathematische Operatoren - all das sollte kein Problem sein. Siehe auch {{W|Unicode}}, {{W|Liste der Unicodeblöcke}} und {{W|Unicodeblock Mathematische Operatoren}}. Im Folgenden werden ein paar Zeichen (Allquantor, Nabla-Operator, Existenzquantor), die man aus der Mathematik kennt, erzeugt. ch1 = "\N{FOR ALL}" ch2 = "\N{NABLA}" ch3 = "\u2203" print(ch1, ch2, ch3) Ausgabe: ∀ ∇ ∃ <small>Diese Ausgabe ergibt sich z.B. mit der IDLE-Shell oder mit Cygwin. Beim Ausführen über die Windows-Eingabeaufforderung oder Windows PowerShell unter MS Windows 10 erfolgt keine korrekte Darstellung. IDLE ist die mit Python mitgelieferte IDE ('''I'''ntegrated '''D'''evelopment '''E'''nvironment, Integrierte Entwicklungsumgebung). Gegen Ende dieses Textes wird IDLE kurz beschrieben. Das Problem mit der Windows Eingabeaufforderung lässt sich aber umgehen. Man muss nur eine Schriftart auswählen, die die Zeichen kennt, z.B. "DejaVu Sans Mono". Dazu klicken Sie einfach bei der Eingabeaufforderung mit der rechten Maustaste oben auf die weiße Leiste und wählen im aufpoppenden Fenster den Menüpunkt "Eigenschaften". Es öffnet sich ein Dialogfenster. Über den Reiter "Schriftart" lässt sich nun die Schriftart einstellen. Unter MS Windows 11 oder openSUSE Leap 15.6 (bash-Konsole) gibt es dieses Problem ohnehin nicht.</small> == Reguläre Ausdrücke == Python kennt auch {{W|Regulärer Ausdruck|reguläre Ausdrücke}}. Dazu gibt es in Python das Modul <code>re</code>. Beipielsweise sollen alle Zahlen (<math>\text{zahl}\in\mathbb{N}_0</math>) in einem String gesucht und ausgegeben werden. Als String sei gegeben: <code>3x Grüße und 100 Kekse.</code> Das Muster (Pattern) ist <code>\d+</code>. <code>\d</code> steht für eine Dezimalziffer 0-9. Das Plus-Zeichen (+) steht symbolisch für ein oder mehrere Zeichen des vorherigen Ausdrucks. Hier also ein oder mehrere Dezimalziffern. Es wird die Funktion <code>findall</code> aus dem Modul <code>re</code>verwendet. Python-Code: from re import findall str = "3x Grüße und 100 Kekse." pat = "\\d+" # Doppel-Backslashes müssen verwendet werden, sonst gibt Python eine Warnung aus! # alternativ: pat = r"\d+" # oder: pat = "[0-9]+" numb = findall(pat, str) print(numb) Ausgabe: ['3', '100'] Python kennt noch viele weitere Möglichkeiten mittels regulärer Ausdrücke zu hantieren. Dies soll hier aber nicht vertieft werden, da das Thema schon ziemlich speziell und komplex ist. Bei Bedarf siehe aber z.B. die Bücher ''Weigend, Seite 380ff'' und ''Ernesti, Kaiser'' [https://openbook.rheinwerk-verlag.de/python/28_001.html] oder die Python-Dokumentation [https://docs.python.org/3/library/re.html]. Auch [[Python unter Linux: Reguläre Ausdrücke]] liefert ein umfangreiches und brauchbares Python-2-Kapitel zu den regulären Ausdrücken. Die dort gelisteten Beispiele müssten ggf. vor Verwendung auf Python-3 umgeschrieben werden. <small>Wie macht man das? Dazu siehe z.B. [https://openbook.rheinwerk-verlag.de/python/43_001.html], [https://portingguide.readthedocs.io/en/latest/] oder [https://www.digitalocean.com/community/tutorials/how-to-port-python-2-code-to-python-3]</small> <small>Es gibt auch ein externes Modul ''regex'', das bei Bedarf extra installiert werden muss ([https://pypi.org/project/regex/]). Es bietet zusätzliche Funktionalität und gründlicheren Unicode-Support. Dies sei hier aber nur der Vollständigkeit halber erwähnt.</small> == Verzweigungen == === if === Die IF-Verzweigung ist aus anderen Programmiersprachen bereits bekannt. In Pseudocode lässt sie sich folgendermaßen darstellen: WENN bedingung TRUE führe block1 aus SONST führe block2 aus ENDE In Python gibt es keinen expliziten ENDE-Kennzeichner. Stattdessen wird der Code durch Einrückungen strukturiert. Alles mit der gleichen Einrückungstiefe gehört zum selben Block. Dies zeichnet Python vor anderen Programmiersprachen aus. Die test1.py-Datei laute also wie folgt: x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: Der else-Zweig wird ausgefuehrt x ist groesser oder gleich 4 Man achte auch auf die Doppelpunkte in der if- und else-Zeile. Darauf vergisst man gerne, wenn man von anderen Programmiersprachen kommt. Folgendes wäre in Python ein Fehler (genauer gesagt ein IndentationError). x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Auch Nachstehendes würde nicht zum gewünschten Ergebnis führen (löst aber keine Fehlermeldung aus). Der letzte print-Befehl ist schon außerhalb der IF-ELSE-Verzweigung. x = 3 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: x ist kleiner als 4 x ist groesser oder gleich 4 Python kennt eine Reihe von Vergleichs- und Verknüpfungsoperatoren: <, <= ... kleiner (gleich) >, >= ... größer (gleich) == ... gleich != ... ungleich is ... identisch is not ... nicht identisch and ... AND or ... OR not ... NOT Beispielsweise: a = 5 b = 9 if a<=10 and b!=7: print("OK") else print("Nicht OK") Ausgabe: OK Der else-Block kann übrigens auch ersatzlos entfallen. Mehrfache Verzweigungen werden durch das elif-Konstrukt erstellt. a = 14 if a<=10: print("<=5") elif a>11 and a<15: print("11 bis 15") elif a>16 and a<20: print("16 bis 20") else: print(">=20") Ausgabe: 11 bis 15 In Python gibt es auch die Schlüsselwörter <code>True</code> (für wahr) und <code>False</code> (für falsch). Man beachte, dass sie mit Großbuchstaben beginnen. Andere Schreibweisen wären ein Fehler. Sie gehören zum Datentyp <code>bool</code>. Ihnen sind auch die Zahlen <code>1</code> und <code>0</code> zugewiesen. === match === Ab Python 3.10 gibt es auch die match-Anweisung. Dies ist das Python-Pendant für die switch-Anweisung in anderen Programmiersprachen, geht aber bei näherer Betrachtung weit darüber hinaus. Hier nur ein einfaches Beispiel: x = "Hello" match x: case "Servus" | "Ciao": # or print("Servus an alle") case "Grüetzi": print("Grüetzi Schwyzer") case _: # other, default, sonstiges ... print("Hallo Welt") Ausgabe: Hallo Welt Für nähere Details siehe z.B. [https://www.geeksforgeeks.org/python-match-case-statement/], [https://learnpython.com/blog/python-match-case-statement/], [https://docs.python.org/3/tutorial/controlflow.html#match-statements] und das Python Enhancement Proposal (PEP) 636 – Structural Pattern Matching: Tutorial [https://peps.python.org/pep-0636] und dort insbesondere den Anhang A - Quick Intro. <small><code>match, case, _</code> etc. sind sogenannte ''soft keywords''. Im Gegensatz zu den normalen Schlüsselwörtern dürfen ihnen auch Werte zugewiesen werden. Eine Liste der weichen Schlüsselwörter lässt sich durch <code>keyword.softkwlist</code> erstellen (die Anweisung gibt es seit Python 3.9). Siehe dazu auch [https://stackoverflow.com/questions/65800344/what-are-soft-keywords] und [https://docs.python.org/3/library/keyword.html#keyword.softkwlist].</small> == Schleifen == === while === Die WHILE-Schleife ist kopfgesteuert. Sie funktioniert wie aus anderen Programmiersprachen bekannt. In Pseudocode: SOLANGE bedingung TRUE führe block aus ENDE In Python: x = 0 while x <= 10: print(x) x += 1 Ausgabe: 0 1 2 3 4 5 6 7 8 9 10 === for === for x in range(6): print(x*2) Ausgabe: 0 2 4 6 8 10 Die Schleife läuft von 0 bis 5. Ausgegeben wird jeweils der Wert x*2. Aquivalent kann diese Schleife auch so geschrieben werden: for x in range(0, 11, 2): print(x) Die Ausgabe ist wie oben. Der Startwert sei 0, der Endwert ist 11-1 und die Schrittweite ist 2. Ein anderes Beispiel sei for x in "text": print(x) Ausgabe: t e x t == Schleifen abbrechen == === break === <code>break</code> bricht die Schleife ab und setzt mit dem nächsten Befehl außerhalb der Schleife fort. for var in range(100): print(var) if var == 5: break Ausgabe: 0 1 2 3 4 5 === continue === <code>continue</code> bricht den aktuellen Schleifendurchlauf ab und setzt mit dem nächsten Schleifendurchlauf fort. for var in range (11): if var == 5: continue print(var) Ausgabe: 0 1 2 3 4 6 7 8 9 10 == try - except == try: z1 = 12 / 0 print(z1) except ZeroDivisionError: print("Das Ergebnis ist unendlich") except: print("Kann nicht berechnet werden!") print("Bitte die Formel korrigieren!") Ausgabe: Das Ergebnis ist unendlich Es wird versucht, eine Zahl durch Null zu dividieren. Das ist nicht möglich, es wird eine Ausnahme ausgelöst. Das Programm springt daher in den except-ZeroDivisionError-Block und führt die dort gelisteten Anweisungen aus (in unserem Fall eine print-Anweisung). Würden wir dieses Programm ohne try-except ausführen, so ergibt sich aus z1 = 12 / 0 print(z1) folgende Fehlermeldung und ein unmittelbarer Programmabbruch Traceback (most recent call last): File "C:\tmp\test1.py", line 1, in <module> z1 = 12 / 0 ZeroDivisionError: division by zero Mit dem try-except-Mechanismus können also Ausnahmen oder Fehler aufgefangen und behandelt werden. In unserem Beispiel ist das eher trivial, aber bei größeren Programmen kann das durchaus Sinn machen. == pass == Ein leerer Block muss in Python mittels dem Schlüsselwort <code>pass</code> dargestellt werden. Z.B. x = 2 if x == 1: print("Wert ist ", x) else: pass Würde man das <code>pass</code> im else-Block weglassen, so würde man eine Fehlermeldung erhalten: IndentationError: expected an indented block after 'else' statement on line 5 = Funktionen = == Aufrufen von Funktionen == Funktionen sind uns im Rahmen dieses Kurses schon zuhauf begegnet. Sei es die print()-, die math.sin()- oder die hex()-Funktion. All diese Funktionen werden von Python zur Verfügung gestellt, ohne dass man sie explizit programmieren müsste. Aufgerufen werden diese Funktionen, indem man ihren Namen eintippt, gefolgt von runden Klammern. In diesen Klammern können noch Argumente übergeben werden. Auch Rückgabewerte sind möglich. == Funktionen selber schreiben == Funktionen werden mit dem def-Schlüsselwort (man definiert die Funktion) eingeleitet, danach folgt der Funktionsname, danach wiederum runde Klammern, in denen formale Argumente stehen können. Abgeschlossen wird die def-Zeile mit einem Doppelpunkt. Danach folgt der Funktionskörper. Dieser Funktionskörper muss wiederum eingerückt werden (wie von den Verzweigungen und Schleifen bekannt). Aufgerufen wird diese Funktion, indem man ihren Funktionsnamen eingibt, gefolgt von runden Klammern (ggf. mit den aktuellen Parametern). Z.B. # Funktion definieren def halloWelt(i): # i ... beliebige Ganzzahl print("Hallo " * i, end="") print("Welt!") # Funktion aufrufen halloWelt(3) Ausgabe: Hallo Hallo Hallo Welt! Unterschied zwischen formalen und aktuellen Parametern: [[Datei:PythonIng_func1.jpg]] <small>Aktuelle Parameter werden auch Argumente genannt.</small> Rückgabe von Funktionswerten: # Funktion definieren def mathFunc(a, b): r1 = a + b r2 = a * b return r1, r2 # Funktion aufrufen a, b = mathFunc(3, 5) # Ausgabe der zurückgegebenen Werte print(a) print(b) Ausgabe: 8 15 Vorgabeparameter, z.B.: def mathFunc(a=10, b=20): r1 = a + b r2 = a * b return r1, r2 a, b = mathFunc(3, 5) print(a) print(b) a, b = mathFunc(5) print(a) print(b) a, b = mathFunc(b=6) print(a) print(b) Ausgabe: 8 15 25 100 16 60 == Lambda-Funktionen == print((lambda a, b: a*b) (3, 5)) Ausgabe: 15 Eingeleitet wird eine Lambda-Funktion (auch Lambda-Form, Lambda-Operator oder anonyme Funktion genannt) mit dem Schlüsselwort <code>lambda</code>. Es folgen die formalen Argumente, danach ein Doppelpunkt, die Berechnungsvorschrift und ggf. abschliessend in Klammern die aktuellen Parameter. Man kann einer Lambda-Funktion auch einen Funktionsnamen geben und die Funktion über diesen Namen aufrufen, z.B. prod = lambda a, b: a*b print(prod(3, 5)) Als Ausgabe wird wieder die Zahl 15 geliefert. == Rekursive Funktionen == Funktionen können wiederum andere Funktionen aufrufen. Von einem rekursiven Funktionsaufruf spricht man, wenn die aufgerufene Funktion gleich der aufrufenden ist. def printFunc(i): if (i >= 5): return else: print("Hallo Welt") printFunc(i+1) printFunc(1) Ausgabe: Hallo Welt Hallo Welt Hallo Welt Hallo Welt == Funktionsannotationen == Python ist sehr flexibel, was Typen angeht. Im Vorhergehenden haben wir generell keine Typangaben gemacht. Will man Typen angeben, so bietet Python das Konzept der Funktionsannotation. def calcFunc(a:int, b:int) -> int: return a+b, a*b r1 = calcFunc(8, 9) r2 = calcFunc(8.0, 9.0) print(r1) print(r2) Ausgabe: (17, 72) (17.0, 72.0) Jetzt sieht man auf den ersten Blick, welche Typen der Programmierer im Sinn hatte, als er die Funktion erstellte. Das Problem dabei ist nur, dass es Python ziemlich egal ist, welche Typen man in Endeffekt eingibt. Im obigen Beispiel können statt Integer-Typen auch Float-Typen eingegeben werden. == Variadische Funktionen == Python-Code: def test1(a, *b): print(a); for c in b: print(c); test1("Hallo", "Welt", "Schweizer", "und alle anderen") Ausgabe: Hallo Welt Schweizer und alle anderen Mit dem Stern (auch als Splat-Operator bezeichnet) in der formalen Parameterliste bei der Funktion <code>test1</code> wird angezeigt, dass eine beliebige Anzahl von Argumenten übergeben wird. <small> Dies entspricht in etwa dem, was in anderen Programmiersprachen (PHP etc.) mittels Ellipse (<code>...</code>) angezeigt wird.</small> = Tupel, Listen und andere = [[Datei:Python 3. The standard type hierarchy.png|mini|hochkant=1.7|Datentypen und Strukturen]] Tupel, Listen und einige andere sind Datenstrukturen oder Sequenzen. Listen (z.B. eine Einkaufsliste) sind veränderbar (mutable). Ein Tupel kann dagegen nicht verändert werden (immutable). Listen werden beim Anlegen in eckige Klammern eingeschlossen, Tupel in runde Klammern. Beim Tupel können die Klammern auch weggelassen werden. Ein Tupel mit nur einem Element muss mit einem Beistrich abgeschlossen werden. Der Grund ist, dass Python sonst nicht entscheiden kann, ob ein Tupel angelegt werden soll, oder nur ein geklammerter Wert. Nachfolgend werden einige Operationen mit Listen und Tupel dargestellt. Als Gedächtnisstütze kann man sich den Unterschied zwischen Tupel und Liste ev. so leichter merken: : T'''u'''pel ... r'''u'''nde Klammern, '''u'''nveränderlich : L'''i'''ste ... eck'''i'''ge Klammern, veränderl'''i'''ch. # Liste und Tupel liste = [1, 2, "Hallo"] tupel = (1, 2, "Hallo") # Ausgabe von liste und tupel print(liste) print(tupel) # Ausgabe von Einzelelementen print(liste[1]) print(tupel[2]) # Element an Liste anhängen und einfügen liste.append(55) liste.insert(4, "Welt") print(liste) # Element aus Liste entfernen liste.remove(1) print(liste) # einige weitere Beispiele liste2 = [1,] tupel2 = 1, 2 tupel3 = (1,) print(liste2) print(tupel2) print(tupel3) Ausgabe: [1, 2, 'Hallo'] (1, 2, 'Hallo') 2 Hallo [1, 2, 'Hallo', 55, 'Welt'] [2, 'Hallo', 55, 'Welt'] [1] (1, 2) (1,) Zu den Datenstrukturen gehören weiters auch Mengen und Dictionaries. Mengen sind von der Mathematik bekannt, sie sind ungeordnet und es kommen keine mehrfachen Elemente vor. Dictionaries sind durch Schlüssel :Wert-Paare gekennzeichnet. Mengen werden beim Anlegen wie Dictionaries in geschweifte Klammern eingeschlossen. dict = {"vorname":"Hugo", "nachname":"Meister" } menge = {1, 1, 3, 4, 4, 4, "Hallo"} print(dict) print(menge) print(dict["vorname"]) Ausgabe: {'vorname': 'Hugo', 'nachname': 'Meister'} {1, 3, 4, 'Hallo'} Hugo Geschweifte Klammern ohne Inhalt stellen Dictionaries dar und keine Mengen: di = {} print(type(di)) Ausgabe: <class 'dict'> == List Comprehensions == Aus einer Eingabeliste soll eine Ausgabeliste erzeugt werden. Das kann folgendermaßen geschehen. Mathematische Schreibweise: <math>lc = \{2x|x\in\ \mathbb{N}, 1\le x < 11\}</math> Python-Code: lc = [x*2 for x in range(1,11)] print(lc) Ausgabe: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] Mathematische Schreibweise: <math>lc = \{2x | x \in \mathbb{N}, 1\le x < 11, x \bmod 2 = 0 \}</math> Python-Code: lc = [x*2 for x in range(1,11) if x%2 == 0] print(lc) Ausgabe: [4, 8, 12, 16, 20] Siehe auch {{W|List Comprehension}}. == Set Comprehensions == Dies ist sehr ähnlich wie im vorigen Abschnitt beschrieben. Es wird aber keine Liste, sondern eine Menge erzeugt. sc = {x*2 for x in range(1,11)} print(sc) Ausgabe: {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} == Listen zusammenführen - zip() == li1 = ["A", "B", "C", "D"] li2 = [1, 2, 3, 4] li3 = [5.5, 6.6, 7.7, 8.8] z = zip(li1, li2, li3) print(z) li4 = list(z) print(li4) Ausgabe: <zip object at 0x00000283B6C6AC80> [('A', 1, 5.5), ('B', 2, 6.6), ('C', 3, 7.7), ('D', 4, 8.8)] == Generatorausdruck == g = (i*2 for i in range(1,11)) print(g) t = tuple(g) print(t) print(t[1:3]) Ausgabe: <generator object <genexpr> at 0x00000241D2A4A5A0> (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) (4, 6) == Slicing == slice ... Scheibe, Teil, in Scheiben schneiden Beispiel: Zugriff auf Elemente eines geordneten sequentiellen Objekttyps (Liste, Tupel oder String): str1 = "Hallo" # Das erste Element wird mit dem Index 0 angesprochen # [start (inkl.) : stop (exkl.) : step (default=1)] str2 = str1[0:2] # Alternativ auch: str2 = str1[:2] print(str2) tup1 = (0,1,2,3) # Das letzte Element hat auch den Index -1, das vorletzte den Index -2 usw. tup2 = tup1[-3:-1] print(tup2) lst1 = [[1, 5, 10, 20], [30, 40, 50, 60]] lst2 = lst1[1][1] print(lst2) Ausgabe: Ha (1, 2) 40 Beispiel: Umdrehen von Strings str1 = "Hallo" str2 = str1[::-1] print(str2) Ausgabe: ollaH = Objektorientierte Programmierung = == Eine einfache Klasse == [[Datei:PythonIng_uml1.svg | 200px]] class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 fahr = Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die Klasse Fahrzeug wird durch das class-Schlüsselwort eingeleitet. raeder ist ein Klassenattribut und public. __init__ wird bei der Objekterzeugung automatisch aufgerufen. Man achte darauf, dass diese Methode immer mit zwei Unterstrichen eingeleitet und abgeschlossen wird. Instanzattributen wird das Wort self vorangestellt. Wir sehen uns z.B. das Attribut self.__geschwind an. Auch hier werden zwei Unterstriche verwendet. Das bedeutet, dass dieses Attribut private ist. Bei den Methoden wird immer self als erster Parameter angegeben. Beim Aufruf der entsprechenden Funktion wird das self aber nicht berücksichtigt. == Klassen importieren == Häufig ist es sinnvoll und übersichtlicher Klassen in eigenen Dateien zu speichern. Das sind dann eigene Module. Abgespeichert werden Sie mit der Endung py, wie bisher auch praktiziert. Aufgerufen werden Sie mit der import-Anweisung. Dann ist aber nur der Dateiname ohne Endung py zu verwenden. Klarer wird das mit einem Beispiel. Datei c:\tmp\fahrzeug.py class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 Datei c:\tmp\test1.py import fahrzeug fahr = fahrzeug.Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die üblichen import-Anweisungen lauten wie folgt: {| {{prettytable}} ! import-Befehl ! Instanz |- | import xyz || xyz.Klasse |- | import xyz as x || x.Klasse |- | from xyz import Klasse || Klasse |- | from xyz import * || Klasse |} Der Vorteil der ersten beiden import-Anweisungen ist, dass es kaum zu Namenskollisionen kommen kann. Dafür hat man bei den letzten beiden Varianten weniger Tipparbeit. == Vererbung == [[Datei:PythonIng_uml2.svg | 200px]] Datei fahrzeug.py: class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 class Luftfahrzeug(Fahrzeug): def __init__(self, geschwindigkeit, leistung, fluegel): super().__init__(geschwindigkeit, leistung) self.__flueg = fluegel def getFlueg(self): return self.__flueg Datei test1.py: import fahrzeug fahr = fahrzeug.Luftfahrzeug(150, 90, 4) print(fahr.getFlueg()) Ausgabe: 4 = Grafiken zeichnen = Für das Zeichnen von Grafiken wird hier das Modul <code>matplotlib</code> verwendet. <code>matplotlib</code> ist ein externes Modul und muss vor der ersten Verwendung installiert werden. Das geht so: # Starten Sie ein Terminal (bei Windows die Eingabeaufforderung). # Führen Sie darin folgenden Befehl aus <code>c:\devel\Python\Scripts\pip.exe install matplotlib</code> pip ist übrigens der Paketmanager von Python ({{W|Pip_(Python)}}). Optimalerweise installieren wir auch gleich das Modul <code>numpy</code> (Numerical Python). Wir werden es im Folgenden oft benötigen (nicht nur bei den Grafiken). Das funktioniert vom Prinzip her genauso, wie für <code>matplotlib</code> gezeigt. <small>Verwenden Sie Spyder, so sind diese Schritte nicht nötig. Spyder inkludiert diese Pakete standardmäßig. Unter openSUSE Tumbleweed lassen sich diese Pakete mittels YaST oder zypper installieren.</small> == 2D == === Graph einer Funktion === Es soll die cosh-Funktion im Intervall <math>x\in[-3,3]</math> gezeichnet werden. Der Programmcode lautet in der einfachsten Form: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh1.jpg]] Der Code ist quasi selbsterklärend. Das Untermodul pyplot des matplotlib-Moduls und das numpy-Modul werden importiert. x läuft von -3 bis +3. y wird für jeden x-Wert per Formel ausgerechnet. "plt.plot()" ist der Zeichenbefehl. "plt.show" ist notwendig, um das Fenster mit der Grafik anzuzeigen. Die Schrittweite 0.1 wurde so gewählt, um einen ausreichend glatten Verlauf des Graphen zu gewährleisten. Das ist immer ein Kompromiss zwischen Berechnungszeit und Ansehnlichkeit. Testen Sie einfach ein paar verschiedene Werte, um ein Gefühl dafür zu zu bekommen. "plt.grid()" zeichnet ein Gitter in die Grafik (kann auch weggelassen werden). Die Bezeichnungen plt und np könnten auch anders gewählt werden. Es ist aber Konvention, diese so wie hier gezeigt zu wählen. <small>Mit der im obigen Bild gezeigten Menüleiste kann die dargestellte Grafik nachträglich noch geändert werden (Zoom, Pan, Achsenparameter, Kurvenparameter etc.). Natürlich kann man das alles auch direkt programmieren. Wie das funktioniert wird ansatzweise etwas später gezeigt.</small> Ein etwas komplexeres Beispiel ist Folgendes: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) + 2**x plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh4.png]] Man beachte, dass im Gegensatz zu Octave und Julia der ominöse Punkt (.) bei 2**x mit Python nicht benötigt wird. Das macht das Programmiererleben etwas einfacher. === Graphen mehrerer Funktionen und weiteres === import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x") plt.plot(x, y2, label = "sin(x) * cos(x)") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh2.png]] Um die Linienstile etwas individueller zu gestalten, ist folgender Programmcode gedacht: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x", lw=5, ls="dotted") plt.plot(x, y2, label = "sin(x) * cos(x)", lw=3, ls="--") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh3.png]] === Funktion in Parameterdarstellung === Es soll die archimedische Spirale <math>x = t \cos(t), y = t \sin(t)</math> im Intervall <math>[0, 6\pi[</math> gezeichnet werden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.show() [[Datei:PythonIng_spirale1.png]] Diese Darstellung erscheint verzerrt. Will man gleiche Achsenskalierungen, so kann man den plt.axis()-Befehl verwenden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.axis("equal") plt.show() [[Datei:PythonIng_spirale2.png]] === Funktion in Polardarstellung === import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(projection="polar") r = np.arange(0, 1, 0.01) theta = r**3 line = ax.plot(theta, r) plt.show() [[Datei:PythonIng_polar1.png]] === Logarithmische Achsenskalierung === ==== Semilog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.semilogy() plt.show() Ausgabe: [[Datei:PythonIng_semilog1.png]] ==== LogLog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.loglog() plt.show() [[Datei:PythonIng_loglog1.png]] === Gefüllte Fläche === import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 3, 0.1) y1 = 3*x - 1 y2 = x**2 plt.plot(x, y1, x, y2, color='black') plt.fill_between(x, y1, y2, where=y1>=y2) plt.show() [[Datei:PythonIng_gefuellt.png]] === Linien, Pfeile, Rechtecke, Kreise und Texte === import matplotlib as mpl import matplotlib.pyplot as plt fig, ax = plt.subplots() r = mpl.patches.Rectangle((0, 0), 3, 3, angle=30, fill=False) c = mpl.patches.Circle((4, 4), 2, fill=False) ax.add_patch(r) ax.add_patch(c) ax.plot([-2, 7], [-2, 0], color="black") ax.arrow(0, 7, 5, 0, length_includes_head=True, head_width=0.5, head_length=1.5, color="black") ax.set_aspect("equal") plt.axis([-3, 8, -3, 8]) plt.show() [[Datei:PythonIng_linien_pfeile_etc.png]] Text kann mit <code>ax.text(x, y, "Text")</code> hinzugefügt werden, bspw. import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.text(0.1, 0.1, "Hallo") ax.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() Oder einfacher auch ohne <code>subplots</code> import matplotlib.pyplot as plt plt.text(0.1, 0.1, "Hallo") plt.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text1.png]] Auch Sonderzeichen (griechische Buchstaben etc.) können verwendet werden (siehe dazu auch [https://matplotlib.org/stable/users/explain/text/mathtext.html]). import matplotlib.pyplot as plt plt.text(.3, .5, r'$\Omega\ \psi\ \oint\ \nabla\ \dot a\ \frac{a}{b}\ a_b$', size="20") plt.show() [[Datei:PythonIng_text20.svg]] Jetzt wird noch gezeigt, wofür <code>subplots</code> sinnvoll eingesetzt werden können. import matplotlib.pyplot as plt fig, ax = plt.subplots(nrows=1, ncols=2) ax[0].text(0.1, 0.1, "Hallo") ax[1].text(0.1, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text2.png]] === Aufgaben === * Zeichnen Sie die Strophoide <math>x = \frac{a(t^2-1)}{t^2+1}, y = \frac{at(t^2-1)}{t^2+1}, a = 2, -3 \leq t \leq 3</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_strophoide.jpg]] * Zeichnen Sie die verschlungene Hypozykloide <math>x = (R-r)\cos t + c\cos\frac{R-r}{r}t, y = (R-r)\sin t - c\sin\frac{R-r}{r}t, c = 3, r = 2, R = 6, -15 \leq t \leq 15</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_hypozykloide.jpg]] * Testen Sie bei den obigen Übungsaufgaben verschiedene Linienstile und Farben. Farben können mit dem plt.plot()-Parameter color gewählt werden. * Testen Sie bei den obigen Übungsaufgaben verschiedene Werte für a, c, r und R. == 3D == === Räumliche Kurven === import matplotlib.pyplot as plt import numpy as np t = np.arange(0, 6*np.pi, 0.1) x = t * np.cos(t) y = t * np.sin(t) z = t fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot(x, y, z) plt.show() [[Datei:PythonIng_raumkurve1.png]] === Flächen === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z) plt.show() [[Datei:PythonIng_fläche1.png]] Das Ganze in Netzdarstellung läßt sich so programmieren: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.5) y = np.arange(0, 10, 0.5) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_wireframe(x, y, z) plt.show() [[Datei:PythonIng_fläche2.png]] Ein etwas komplexeres Beispiel: import matplotlib.pyplot as plt import numpy as np x = np.arange(0.1, 10, 0.1) y = np.arange(0.1, 10, 0.1) x, y = np.meshgrid(x, y) z1 = np.sin(x) + 3 * np.cos(y) z2 = np.sin(x) + np.log(y) z3 = x + np.cos(y) z4 = x**2 - y fig, ax = plt.subplots(subplot_kw={"projection": "3d"}, nrows=2, ncols=2) ax[0][0].plot_surface(x, y, z1) ax[0][1].plot_surface(x, y, z2) ax[1][0].plot_surface(x, y, z3) ax[1][1].plot_surface(x, y, z4) plt.show() [[Datei:PythonIng_subplot1.png]] Man beachte, dass man die Unterbilder im Bild nach dem Ausführen des Scripts z.B. mit der mittleren Maustaste einzeln drehen, oder über die Einträge in der Menüzeile einzeln bearbeiten kann. Mit ein paar Zeilen Programmtext lässt sich also eine Menge an Funktionalität generieren. Die Farbgebung lässt sich über <code>colormaps</code> variieren. import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm) plt.show() [[Datei:PythonIng_colormap1.png]] Es gibt eine Menge an Colormaps, z.B. <code>plasma, Greys, Dark2, ocean</code>. Zwecks detaillierterer Infos siehe die matplotlib-Dokumentation. <small>Verwendet man die IDE namens IDLE, so gibt es dort auch die automatische Codevervollständigung. D.h. es werden alle Möglichkeiten (in unserem Fall nach dem Eintippen von <code>cm.</code> alle verfügbaren Colormaps) angezeigt.</small> Die "edgecolor" und Linienbreite können auch frei gewählt werden: import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm, edgecolor="black", linewidth=1.0) plt.show() [[Datei:PythonIng_colormap2.png]] === Höhenlinien === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contour(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien1.png]] Etwas abgewandelt sieht das so aus: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() hl = ax.contour(x, y, z) ax.clabel(hl, inline = True) plt.show() [[Datei:PythonIng_höhenlinien2.png]] Und noch eine Variante sei gezeigt. import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contourf(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien3.png]] === Aufgaben === * Zeichnen Sie die räumliche Kurve <math>x = 2 \cdot \cosh(t)</math>, <math>y = 5 \cdot \sin(t)</math>, <math> z = t^{2} - t</math>, <math>0 \leq t \leq 3\pi</math>. * Zeichnen Sie die Fläche <math>z = \log(x) + \cos(y)</math>. == Animationen == === Mit matplotlib === Auch mit matplotlib sind Animationen möglich. Das ist ein bisschen komplizierter und wird deshalb hier nur mit einem sehr einfachen Beispiel dargestellt (bei Interesse siehe z.B. auch das [https://matplotlib.org/stable/users/explain/animations/animations.html#animations Animations using Matplotlib-Tutorial]). import matplotlib.pyplot as plt import matplotlib.animation as ani import matplotlib import numpy as np def update(frame): line.set_xdata(x[:frame]) line.set_ydata(y[:frame]) return (line) fig, ax = plt.subplots() x = np.arange(0, 10, .1) y = np.sin(x) line, = ax.plot(x[0], y[0]) ax.set(xlim=[0, 10], ylim=[-1, 1]) a = ani.FuncAnimation(fig=fig, func=update, frames=100, interval=20) plt.show() # Speichere die Animation in einem animierten GIF (optional) a.save(filename="c:/tmp/PythonIng_anim5.gif", writer="pillow") [[Datei:PythonIng_anim5.gif]] Es wird eine Sinuskurve auf den Bildschirm gezeichnet. In der letzten Zeile wird diese Animation in ein animiertes GIF gespeichert. Das ist natürlich optional und kann auch weggelassen werden. === Mit VPython === Aber auch mit dem Modul VPython lassen sich einfache 3D-Animationen erstellen. VPython ist ein externes Modul, das vorab installiert werden muss. Unter openSUSE Tumbleweed gibt es dzt. kein entsprechendes rpm-Paket. Die übliche Methode der Installation mittels YaST oder zypper ist somit nicht möglich. Auch eine direkte Verwendung von pip führt nur zu einer Fehlermeldung (<code>error: externally-managed-environment</code>). Es empfiehlt sich dort folgende Vorgehensweise: # Erstelle zuerst eine virtuelle Umgebung, z.B.: <code>python3.11 -m venv ~/tmp/venv1</code> # Wechsle das Verzeichnis: <code>cd ~/tmp/venv1/bin</code> # Installiere das entsprechende Paket: <code>./pip install vpython</code> # Führe das entsprechende Skript aus: <code>./python ~/tmp/test1.py</code> Aktuell (März 2026) ist dieses Programmpaket lt. der [https://vpython.org/presentation2018/install.html VPython-Homepage] nur für die Python-Versionen 3.8 bis 3.12 verfügbar. Ein Beispiel zu einer einfachen Animation wird nachfolgend geliefert. from vpython import * scene.width = 1200 scene.height = 600 scene.center = vector(20,0,0) scene.background = color.white cylinder(pos=vector(0,0,0), axis=vector(20,0,0), radius=5, color=color.blue) cone(pos=vector(0,0,0), axis=vector(-10,0,0), radius=5, color=color.blue) helix(pos=vector(20,0,0), axis=vector(40,0,0), radius=2, coils=10, thickness=0.5, color=color.blue) ball = sphere(pos=vector(20,0,0), color = color.green, radius = 1) ball.p = vector(0.15, 0, 0) toc = True while True: rate(200) if(ball.pos.x <= 60 and toc == True): ball.pos += ball.p else: toc = False ball.pos -= ball.p if(ball.pos.x <= 20 and toc == False): toc = True [[Datei:PythonIng_vpython_anim.JPG]] Idealerweise öffnet sich beim Ausführen des Scripts ein Browserfenster. Darin wird die programmierte Animation gezeigt (siehe auch den obigen Screenshot). Eine Größenänderung können Sie mit der mittleren Maustaste initiieren. Die Szenerie drehen können Sie mit der rechten Maustaste. === Mit VTK === Komplexer, aber auch mächtiger als VPython ist die Verwendung von VTK ('''V'''isualization '''T'''ool'''k'''it). Genauer gesagt des Python-Wrappers von VTK. Dieses externe Python-Modul muss vorab installiert werden (z.B. mittels YaST, pip oder in eine virtuelle Umgebung). VTK ist eine Softwarebibliothek zur 3D-Visualisierung und wurde ursprünglich in C++ geschrieben. Verbreitet eingesetzt wird diese Bibliothek in der Wissenschaft und Forschung, z.B. * in der medizinischen Bildgebung * für Strömungssimulationen * für Klimadaten Als einfaches Beispiel wird die Darstellung eines Zylinders gezeigt, der mit den Maustasten gedreht oder in der Größe geändert werden kann: import vtk # Zylinder erzeugen cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) # Geometrie in darstellbare Daten umwandeln mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) # Objekt in der Szene actor = vtk.vtkActor() actor.SetMapper(mapper) # Szene verwalten renderer = vtk.vtkRenderer() renderer.AddActor(actor) # Render-Fenster render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) # Maus/Tastatur-Steuerung interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) # Starten render_window.Render() interactor.Start() Ausgabe: [[Datei:PythonIng_VTK_1.png]] Gleiches Beispiel wie oben, aber mit einer Animationssequenz: import vtk import time cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) renderer = vtk.vtkRenderer() renderer.AddActor(actor) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) render_window.Render() time.sleep(0.01) Das Grafikfenster schließt sich nach Ablauf der Schleife. Das Fenster bleibt geöffnet, wenn Sie am Programmende folgenden Befehl hinschreiben interactor.Start() Um den animierten Zylinder grün einzufärben, müssen Sie Folgendes im obigen Programm ergänzen (Farbnamen): colors = vtk.vtkNamedColors() actor.GetProperty().SetColor(colors.GetColor3d("Green")) Als Namen können Sie u.a. die CSS3 Web-Farben verwenden (siehe z.B. [https://wiki.selfhtml.org/wiki/Farbe/Farbangaben]). Alternativ funktioniert auch das (RGB): actor.GetProperty().SetColor(0.0, 0.6, 0.0) Wie der Zylinder mit einer Textur versehen wird, zeigt folgendes Programm: import vtk import time cylinder = vtk.vtkCylinderSource() cylinder.SetResolution(30) cylinder.SetHeight(3.0) cylinder.SetRadius(1.0) cylinder.CappingOn() texture_coords = vtk.vtkTextureMapToCylinder() texture_coords.SetInputConnection(cylinder.GetOutputPort()) texture_coords.PreventSeamOn() reader = vtk.vtkJPEGReader() reader.SetFileName("PythonIng_textur.jpg") texture = vtk.vtkTexture() texture.SetInputConnection(reader.GetOutputPort()) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(texture_coords.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.SetTexture(texture) renderer = vtk.vtkRenderer() renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) renderer.AddActor(actor) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) renderWindow.Render() time.sleep(0.01) <gallery> PythonIng_textur.jpg | Textur-Datei PythonIng_VTK_2.png | Ausgabe (Screenshot) </gallery> Nun aber genug von VTK und der Erstellung von Grafiken, weiter geht es mit mathematischeren Themen. = Vektoren und Matrizen = == Zahlenfolgen == from numpy import * start = 0 stop = 10 step = 2 num = 10 r = arange(start, stop, step) l = linspace(start, stop, num) print("r = ", r) print("l = ", l) Ausgabe: r = [0 2 4 6 8] l = [ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556 6.66666667 7.77777778 8.88888889 10. ] == Vektoren == Vektoren sollten jedem aus der Linearen Algebra bekannt sein. === Arrays === In Python mit NumPy kann man Vektoren durch die Funktion array erzeugen. import numpy as np l1 = (-5, 3, 2) l2 = (1, 1, 4) a1 = np.array(l1) a2 = np.array(l2) a3 = a1 + a2 a4 = 2 * a2 print(a1) print(a2) print(a3) print(a3[2]) print(a4) Ausgabe: [-5 3 2] [1 1 4] [-4 4 6] 6 [2 2 8] === Zeilen- und Spaltenvektoren === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) print(z) print(s) Ausgabe: [ [-5 3 2] ] [[1] [1] [4]] === Skalarprodukt === import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) skalarprodukt = np.dot(a1, a2) print(skalarprodukt) Ausgabe: 6 === Vektorprodukt === <math>a\ast b=\left(\begin{array}{c} a_{1}\\ a_{2}\\ a_{3} \end{array}\right)\ast\left(\begin{array}{c} b_{1}\\ b_{2}\\ b_{3} \end{array}\right)=\left(\begin{array}{c} a_{2}b_{3}-a_{3}b_{2}\\ a_{3}b_{1}-a_{1}b_{3}\\ a_{1}b_{2}-a_{2}b_{1} \end{array}\right) </math> Python-Code: import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) vektorprodukt = np.cross(a1, a2) print(vektorprodukt) Ausgabe: [10 22 -8] === Transponierter Vektor === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) # transponierter Vektor z_tp = np.transpose(z) # transponierter Vektor s_tp = np.transpose(s) print(z_tp) print(s_tp) Ausgabe: [[-5] [ 3] [ 2]] [ [1 1 4] ] === Vektorfelder visualisieren === import matplotlib.pyplot as plt import numpy as np # Daten generieren x = np.arange(0, 10, 1) y = np.arange(0, 10, 1) X, Y = np.meshgrid(x, y) U = X * Y V = Y + X # Plotten fig, ax = plt.subplots() ax.quiver(X, Y, U, V, angles='xy') plt.show() Ausgabe: [[Datei:PythonIng_quiver1.png]] == Matrizen== import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) print(m1) Ausgabe: [[1 2 3] [4 5 6]] === Zugriff auf Matrizenelemente === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) # Element aus Zeile 2 und Spalte 3 (Achtung! Index startet bei Null) print(m1[1,2]) Ausgabe: 6 === Addition und Subtraktion von Matrizen === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) m2 = np.matrix([[0, 0, 2], [1, 3, 2]]) print(m1 + m2) print(m1 - m2) Ausgabe: [[1 2 5] [5 8 8]] [[1 2 1] [3 2 4]] === Transponierte Matrix === import numpy as np m = np.matrix([[1, 2, 3], [4, 5, 6]]) mt = np.transpose(m) print(m) print(mt) Ausgabe: [[1 2 3] [4 5 6]] [[1 4] [2 5] [3 6]] === Rang einer Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) rg = np.linalg.matrix_rank(m) print(rg) Ausgabe: 2 === Inverse Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) mi = np.linalg.inv(m) print(mi) Ausgabe: [[ 1. 0.6] [-0. -0.2]] === Multiplikation von Matrizen (falksches Schema) === import numpy as np m1 = np.matrix([[1, 3, 4], [0, -5, 1]]) m2 = np.matrix([[1, 2], [2, 3], [0, 2]]) print(m1 @ m2) Ausgabe: [[ 7 19] [-10 -13]] === Eigenwerte und Eigenvektoren === import numpy as np m = np.matrix([[5, 8], [1, 3]]) D,V = np.linalg.eig(m) # Eigenwerte print(D) # Eigenvektoren print(V) Ausgabe: [7. 1.] [[ 0.9701425 -0.89442719] [ 0.24253563 0.4472136 ]] === Teilmatrizen === import numpy as np m = np.matrix([[1, 3, 4], [0, -5, 1]]) print("m = ", m) # Erste Zeile extrahieren m1 = m[0,:] print("m1 = ", m1) # Das Element aus der 1. Zeile und der 2. Spalte extrahieren m2 = m[0,1] print("m2 = ", m2) # Zweite Spalte extrahieren m3 = m[:, 1] print("m3 = ", m3) Ausgabe: m = [[ 1 3 4] [ 0 -5 1]] m1 = [ [1 3 4] ] m2 = 3 m3 = [[ 3] [-5]] === Spezielle Matrizen === ==== Nullmatrix ==== import numpy as np z = np.zeros((3, 2)) print(z) Ausgabe: [[0. 0.] [0. 0.] [0. 0.]] ==== Einheitsmatrix ==== import numpy as np z = np.eye(3) print(z) Ausgabe: [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ==== Matrix mit lauter Einsen ==== import numpy as np z = np.ones((3, 2)) print(z) Ausgabe: [[1. 1.] [1. 1.] [1. 1.]] === Spärlich besetzte Matrizen === Das Thema spärlich besetzter Matrizen wird hier nur kurz angerissen. Nähere Details siehe unter dem Weblink [https://docs.scipy.org/doc/scipy/reference/sparse.html#module-scipy.sparse]. import numpy as np import scipy A = scipy.sparse.csr_array(np.eye(5)) print(A) Ausgabe: (0, 0) 1.0 (1, 1) 1.0 (2, 2) 1.0 (3, 3) 1.0 (4, 4) 1.0 = Lineare Gleichungssysteme = Sei <math>Ax = b</math> ein lineares Gleichungssystem. <math>A</math> sei die Koeffizientenmatrix, <math>x</math> der Lösungsvektor und <math>b</math> ein bekannter Vektor. Beispiel: import numpy as np A = np.array([[5, 1], [0, 2]]) b = np.array([1, 2]) x = np.linalg.solve(A, b) print(x) Ausgabe: [0. 1.] == Aufgabe == * Lösen Sie folgendes Gleichungssystem mittels Python (und zur Kontrolle auch händisch): 5x + 6y - 2z = 12 3x - y - 3z = 6 2x + 2y + 4z = 5 = Polynome = == Ein erstes einfaches Beispiel == Gegeben sei das Polynom <math>7x^3+5x^2+1</math>. In Python: import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p) Ausgabe: 3 2 7 x + 5 x + 1 == Einzelne Polynomwerte berechnen == import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p(1.5)) Ausgabe: 35.875 == Polynome integrieren und differenzieren == import numpy as np p = np.poly1d([7, 5, 0, 1]) # 1. Ableitung p1 = p.deriv() p2 = p.deriv(1) # 2. Ableitung p3 = p.deriv(2) # Integral p4 = p.integ() print(p1) print(p2) print(p3) print(p4) Ausgabe: 2 21 x + 10 x 2 21 x + 10 x 42 x + 10 4 3 1.75 x + 1.667 x + 1 x == Nullstellen bestimmen == import numpy as np p = np.poly1d([2, 5, 0, 4]) r = np.roots(p) print(r) Ausgabe: [-2.7621427 +0.j 0.13107135+0.84077099j 0.13107135-0.84077099j] == Aufgaben == * Berechnen Sie den Wert für x = 3 des Polynoms <math>y = 2x^4 - 3x^3 - x + 7</math>. * Differenzieren und integrieren Sie das Polynom <math>y = 2x^4 - 3x^3 - x + 7</math>. * Berechnen Sie die Nullstellen von <math>y = 7x^5 - 3x^2 + 12</math>. = Nichtlineare Gleichungen und Gleichungssysteme = == Nullstellenbestimmung == Löse eine beliebige Gleichung f(x) = 0, z.B. <math> f(x) = x^2 - 5\cos(x) - 10 = 0 </math>: import scipy import numpy as np def f(x): return x**2 - 5*np.cos(x) - 10 xstart = [-1, 1] # Startwerte xn = scipy.optimize.root(f, xstart) print(xn.x) Ausgabe: [-2.46813009 2.46813009] Funktionsgraph: [[Datei:octave_nichtlin2.jpg]] == Gleichungssysteme == SymPy ist ein externes Modul, das symbolisches Rechnen ('''Sym'''bolic '''Py'''thon) ermöglicht. Folgende Aufgabe ist dem Buch "Knorrenschild: Numerische Mathematik, Hanser, 2017, Seite 72" entnommen. Zu lösen ist das nichtlineare Gleichungssystem <math>f_1 = 2x_1 + 4x_2 = 0 </math> <math>f_2 = 4x_1 + 8x_2^3 = 0</math> Mit Python ist das so möglich: import sympy x1, x2 = sympy.symbols("x1 x2") f1 = 2*x1 + 4*x2 f2 = 4*x1 + 8*x2**3 s = sympy.solve((f1, f2), x1, x2) print(s) Ausgabe: [(-2, 1), (0, 0), (2, -1)] Plot: [[Datei:IngPython_nl_gleichung1.svg|500px]] = Komplexe Zahlen = Die imaginäre Einheit wird in Python durch den Buchstaben <code>j</code> symbolisiert. Darstellen kann man eine komplexe Zahl bekannterweise in mehreren Formen: * Kartesische Darstellung <math>z = \Re(z) + j \cdot \Im(z)</math> * Polardarstellungen <math>z = r \cdot (\cos(\phi) + j \cdot \sin(\phi)) = r \cdot e^{j\cdot \phi}</math> Die konjugiert komplexe Zahl ist <math>z^* = \Re(z) - j \cdot \Im(z)</math> Nachfolgend einige mathematische Operationen mit Python und NumPy. import numpy as np z1 = 2 + 5j # kartesische Darstellung z2 = 3 * np.exp(3j) # Polardarstellung # Addition res = z1 + z2 print("z1 + z2 = ", res) # Multiplikation res = z1 * z2 print("z1 * z2 = ", res) # Realteil res = np.real(z2) print("Realteil von z2 = ", res) # Imaginärteil res = np.imag(z2) print("Imaginaerteil von z2 = ", res) # Betrag res = np.abs(z1) print("Betrag von z1 = ", res) # Argument res = np.angle(z1) print("Argument von z1 = ", res) # Konjugiert komplexe Zahl res = np.conj(z1) print("Konjugiert komplexe Zahl von z1 = ", res) Ausgabe: z1 + z2 = (-0.9699774898013365+5.423360024179601j) z1 * z2 = (-8.05675510050068-14.003167400647481j) Realteil von z2 = -2.9699774898013365 Imaginaerteil von z2 = 0.4233600241796016 Betrag von z1 = 5.385164807134504 Argument von z1 = 1.1902899496825317 Konjugiert komplexe Zahl von z1 = (2-5j) = Interpolation = import numpy as np import scipy import matplotlib.pyplot as plt # Stützpunkte xp = np.arange(1, 6) yp = (0, -5, 2, 7, 6) ti = np.arange(1, 5, 0.01) i1 = scipy.interpolate.interp1d(xp, yp, kind = "linear") i2 = scipy.interpolate.interp1d(xp, yp, kind = "cubic") plt.plot(xp, yp, "rx") plt.plot(xp, i1(xp)) plt.plot(ti, i2(ti)) plt.show() Ausgabe: [[Datei:PythonIng_interpol1.png]] = Differenzialrechnung = == Numerisches Differenzieren == Als Beispiel differenzieren wir <math>y = 5x\sin{x}</math> und stellen das Ganze grafisch dar. from findiff import Diff import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) f = 5 * x * np.sin(x) dx = x[1] - x[0] # Ableitung d_dx = Diff(0, dx) df_dx = d_dx(f) # Grafik plt.plot(x, f, label = "y") plt.plot(x, df_dx, label = "y'") plt.grid() plt.legend(loc="best") plt.show() Ausgabe: [[Datei:octave_diff1.jpg]] <small>findiff ist ein externes Modul. Dieses muss installiert werden (z.B. so: ...\Python\Scripts\pip.exe install --upgrade findiff). Für die Vorgehensweise unter openSUSE Tumbleweed siehe das Kapitel VPython, nur dass das Ganze mit einer aktuelleren Python-Version exekutiert wird, z.B. mit Python 3.13. Das im Buch "Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler, Rheinwerk" verwendete Modul "scipy.misc" ist veraltet (deprecated ... missbilligt). Lt. [https://docs.scipy.org/doc/scipy-1.17.0/dev/roadmap-detailed.html#misc SciPy-Dokumentation für die Version 1.17.0] wurden alle entsprechenden Features schon entfernt.</small> == Symbolisches Differenzieren == Differenzieren Sie die Funktionen <math>f_1(x) = x^2</math> und <math>f_2(x) = \sin(x)\cos\left(\frac{x}{2}\right)</math>. import sympy x = sympy.symbols("x") f1 = x**2; f2 = sympy.sin(x) * sympy.cos(x/2.) d1 = sympy.diff(f1, x) d2 = sympy.diff(f2, x) print(d1) print(d2) Ausgabe: 2*x -0.5*sin(0.5*x)*sin(x) + cos(0.5*x)*cos(x) == Aufgaben == * Differenzieren Sie die Funktion <math>y = \log(x) + 10x</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. * Differenzieren Sie die Funktion <math>y = \frac{\sinh(x)}{(1+x)}</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. = Integralrechnung = == Numerisches Integrieren == Berechnen Sie das Integral <math>\int_{0}^{3}x^2 dx</math>. import scipy def f(x): return x**2 i = scipy.integrate.quad(f, 0, 3) print(i) Ausgabe: (9.000000000000002, 9.992007221626411e-14) Das trifft den exakten Wert 9.0 ziemlich genau. Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} dx</math>. import scipy import numpy as np def f(x): return 2**(-x) i = scipy.integrate.quad(f, 0, np.inf) print(i) Ausgabe: (1.4426950408889556, 4.486558477977586e-09) == Symbolisches Integrieren == Berechnen Sie <math>\int x^2 \text{d}x</math> und <math>\int \sin{x}\cos{\frac{x}{2}} \text{d}x</math>. import sympy x = sympy.symbols("x") f1 = x**2 f2 = sympy.sin(x) * sympy.cos(x/2.) i1 = sympy.integrate(f1, x) i2 = sympy.integrate(f2, x) print(i1) print(i2) Ausgabe: x**3/3 -0.666666666666667*sin(0.5*x)*sin(x) - 1.33333333333333*cos(0.5*x)*cos(x) Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} \text{d}x</math>. import sympy x = sympy.symbols("x") f = 2**(-x) i = sympy.integrate(f, (x, 0, sympy.oo)) print(i) Ausgabe: 1/log(2) Mit <code>sympy.pprint(i)</code> ließe sich letzere Ausgabe etwas schöner schreiben: 1 ────── log(2) Man beachtete, <code>log</code> steht hier für den natürlichen Logarithmus <code>ln</code>. == Aufgaben == * Integrieren Sie die Funktion <math>y = \log(x) + 10x</math> von 1 bis 5. * Integrieren Sie die Funktion <math>y = x^3</math> von 0 bis 4. * Integrieren Sie <math>\int x^x(\log (x) + 1)\mathrm dx</math> symbolisch. = Gewöhnliche Differenzialgleichungen = == DGL numerisch lösen == Für die Lösung von Differenzialgleichungen steht u.a. die Funktion scipy.integrate.solve_ivp() zur Verfügung. Diese Funktion implementiert auch das Runge-Kutta-Verfahren (RK45). {{Wikipedia | Runge-Kutta-Verfahren}} Beispiel <math>y' = x^2 + y^3</math>: import scipy import numpy as np import matplotlib.pyplot as plt def dy_dx(x, y): return x**2 + y**3 y0 = [1] xi = [0, 1] x = np.arange(0, 1, 0.01) z = scipy.integrate.solve_ivp(dy_dx, xi, y0, method="RK45", dense_output=True) y = z.sol(x) plt.plot(x, y.T) plt.grid() plt.show() [[Datei:PythonIng_dgl1.png]] == DGL symbolisch lösen == Beispiel <math>y' = x^2 + y^3</math>: import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) print(lsg) Ausgabe: [Eq(f(x), (-x**2)**(1/3)), Eq(f(x), (-x**2)**(1/3)*(-1 - sqrt(3)*I)/2), Eq(f(x), (-x**2)**(1/3)*(-1 + sqrt(3)*I)/2)] Mit <code>sympy.pprint</code> (pretty print) lässt sich die Ausgabe etwas übersichtlicher darstellen. import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) sympy.pprint(lsg) Ausgabe: ⎡ _____ _____ ⎤ ⎢ _____ 3 ╱ 2 3 ╱ 2 ⎥ ⎢ 3 ╱ 2 ╲╱ -x ⋅(-1 - √3⋅ⅈ) ╲╱ -x ⋅(-1 + √3⋅ⅈ)⎥ ⎢f(x) = ╲╱ -x , f(x) = ────────────────────, f(x) = ────────────────────⎥ ⎣ 2 2 ⎦ == Aufgaben == * Lösen Sie die Differenzialgleichung <math>y' = \frac{1}{x\cdot y}</math> mit Python. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>m' = -k\cdot m</math>. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>y' = \sqrt{|y|}</math>. =Rechnen mit wirklich großen Zahlen= Bekannt ist, dass Python kaum Einschränkungen beim Wertebereich von Ganzzahlen hat, z.B. print(10**300) Ausgabe (gekürzt): 100000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000 Ähnliches geht auch mit Gleitpunktzahlen, z.B. durch die Verwendung des Moduls mpmath: import mpmath print(mpmath.mpf(1500.4)**mpmath.mpf(300)) Ausgabe: 7.27975299218612e+952 Anderes Beispiel: from mpmath import mp, pi mp.dps = 100 print(pi) Ausgabe: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 mpmath kann noch einiges mehr, dazu sei aber auf die entsprechende Dokumentation auf der mpmath-Homepage verwiesen. mpmath ist Bestandteil von SymPy, kann aber auch separat installiert werden. =Regelungstechnische Aufgabenstellungen= Für regelungstechnische Aufgaben gibt es u.a. das externe Paket <code>control</code>. Hier soll nicht detailliert darauf eingegangen werden. Anhand eines Beispiels soll anschließend nur die Visualisierung in Form eines Bode-Diagramms und der Sprungantwort gezeigt werden. Gegeben sei ein P-Regler mit <math>R = \frac{5}{2}</math> und eine Strecke <math>S= \frac{1}{30s^3+20s^2+10s+1,5}</math>. Gesucht sei vorerst ein Bode-Diagramm für den offenen Regelkreis und das Führungsverhalten. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke # oder: G0 = ct.series(regler, strecke) Gw = ct.feedback(G0) ct.bode_plot(G0, label='G0') ct.bode_plot(Gw, label='Gw') plt.show() [[Datei:PythonIng_bode1.svg]] Nun noch für obiges Beispiel die Sprungantwort. Diese zeigt einige große Überschwinger, d.h. der Regler kann sicher noch optimiert werden. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke Gw = ct.feedback(G0) t, y = ct.step_response(Gw) plt.plot(t,y) plt.title('Sprungantwort') plt.xlabel('t') plt.ylabel('h(t)') plt.grid() plt.show() [[Datei:PythonIng_bode3.svg]] Einige weitere wichtige Daten (Phasenreserve, Amplitudenreserve, Durchtrittsfrequenz) lassen sich mittels der <code>control</code>-Funktion <code>margin()</code> ermitteln. Die Ortskurve lässt sich mit der Funktion <code>nyquist_plot()</code> zeichnen. Dies sei hier aber nicht weiter ausgeführt. ==Aufgaben== * Zeichen Sie mit Python die Ortskurve für obiges Beispiel. * Was passiert, wenn man die Reglerverstärkung weiter aufdreht (z.B. auf <math>R = \frac{25}{2}</math>)? * Wie sehen das Bode-Diagramm und die Sprungantwort aus, wenn ein PI-Regler verwendet wird? = Stereostatik etc. = Das Modul SymPy bietet einige Möglichkeiten einfache Bauwerke zu berechnen, z.B. Balken oder Fachwerke. Nachfolgend wird ein einfaches Fachwerk berechnet und gezeichnet. Python-Code: from sympy.physics.continuum_mechanics.truss import Truss t = Truss() # Knoten t.add_node(("A", -3, 0), ("B", 0, 0), ("C", 4, 0), ("D", 7, 0), ("E", 6, 1.5), ("F", 2, 3), ("G", -2, 1.5)) # Stäbe t.add_member(("AB","A","B"), ("BC","B","C"), ("CD","C","D")) t.add_member(("AG","A","G"), ("GB","G","B"), ("GF","G","F")) t.add_member(("BF","B","F"), ("FC","F","C"), ("CE","C","E")) t.add_member(("FE","F","E"), ("DE","D","E")) # Auflager; roller ... Loslager, pinned ... Festlager t.apply_support(("A","roller"), ("D","pinned")) # Einwirkende Kräfte t.apply_load(("G", 5, 270), ("E", 3, 90)) # Berechnung t.solve() print("Reaction Forces: ", t.reaction_loads) print("Internal Forces: ", t.internal_forces) # Fachwerk zeichnen p = t.draw() p.show() Ausgabe auf der Konsole: Reaction Forces: {'R_A_y': 4.20000000000000, 'R_D_x': 0, 'R_D_y': -2.20000000000000} Internal Forces: {'AB': 2.80000000000000, 'BC': 0.333333333333333, 'CD': -1.46666666666667, 'AG': -5.04777178564958, 'GB': -2.05555555555556, 'GF': -1.23413387432364, 'BF': 0.411111111111111*sqrt(13), 'FC': -0.3*sqrt(13), 'CE': 1.50000000000000, 'FE': 0.284800124843917, 'DE': 2.64407093534026} Zeichnung: [[File:PythonIng_fachwerk1.svg|300px]] Details zu diesem Thema siehe z.B. [https://docs.sympy.org/latest/modules/physics/continuum_mechanics/index.html Continuum Mechanics] oder [https://docs.sympy.org/latest/tutorials/physics/continuum_mechanics/index.html Continuum Mechanics Tutorials]. Auch andere mechanische Probleme werden von SymPy abgehandelt ([https://docs.sympy.org/latest/tutorials/physics/index.html Physics Tutorials]). == Aufgabe == Gegeben sei ein einseitig eingespannter Kragträger. Belastet wird er durch eine Einzellast am Trägerende. Für die Daten siehe folgende ASCII-Skizze: | 20 kN //|---> x | //| V //|---------------------- //| 10 m | Elastizitätsmodul E = 2,1*10⁵ N/mm² Flächenträgheitsmoment I = 0.001 m⁴ Berechnen Sie die Auflagerreaktionen, den Querkraft- und Biegemomentenverlauf, sowie die Verformungen. Stellen Sie dies mit Hilfe von SymPy graphisch und auch mittels Formeln dar. Verwenden Sie dazu auch pprint (pretty print) aus dem SymPy-Modul. Zwecks Lösungsansatz siehe die oben aufgeführte Seite "Continuum Mechanics Tutorials". Achten Sie auch auf die Einheiten! Kontrollieren Sie das Ganze mittels händischer Rechnung. In dem genannten Tutorial ist von "Singularity Functions" die Rede. Gemeint ist damit in diesem Kontext die {{W|Föppl-Klammer}}. Einige Python-Programme, vorrangig zu Maschinenelementen, finden sich auf [https://baymp.de/download_python.html BayMP für Python] (Balken, Zahnräder, Stabknickung usw.). = Stochastik = Die Stochastik ist ein sehr weites Feld. Hier werden nur einige wenige sehr einfache, aber wichtige Themen angerissen. Python stellt mit den Moduln math und statistics Software zu diesem Zwecke bereit. math und statistics sind bereits im Lieferumfang von Python enthalten. Aber auch mit den externen Modulen NumPy, SciPy und pandas kann man Stochastik in Python betreiben. Dies wird hier aber nicht gemacht. == Lageparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] m1 = statistics.mean(werte) m2 = statistics.mode(werte) m3 = statistics.median(werte) print("Arithmetischer Mittelwert = ", m1) print("Modalwert = ", m2) print("Median = ", m3) Ausgabe: Arithmetischer Mittelwert = 3.5 Modalwert = 1 Median = 3.0 == Streuungsparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] s = statistics.stdev(werte) print("Standardabweichung = ", s) Ausgabe: Standardabweichung = 2.6770630673681683 == Kombinatorik == import math n = 7 k = 5 print("n! = ", math.factorial(n)) print("Kombinationen (n über k) = ", math.comb(n, k)) Ausgabe: n! = 5040 Kombinationen (n über k) = 21 = Ein- und Ausgabe = == print == Die Anweisung print haben wir schon oft verwendet. Hier soll anhand von Beispielen kurz beschrieben werden, was der Befehl print leisten kann. print("Hallo", "Welt", 1, sep="-") print("Hallo", end=" ") print("Welt") Ausgabe: Hallo-Welt-1 Hallo Welt == input == a = int(input("Zahl 1: ")) b = int(input("Zahl 2: ")) print("a + b = ", a+b) Ausgabe (nach Eingabe der beiden Ganzzahlen): Zahl 1: 4 Zahl 2: 5 a + b = 9 == Aus Dateien lesen == Es seinen die datei.txt Hallo Welt. Wie geht es dir? ... und test1.py dat = open("datei.txt", mode = "r") print(dat.read()) dat.close() Ausgabe Hallo Welt. Wie geht es dir? ... Mit dem open()-Befehl wird die Datei datei.txt im Lesemodus geöffnet (r ... read). Mit dem read()-Befehl wird die Datei eingelesen und mittels print ausgegeben. == In Dateien schreiben == dat = open("datei.txt", mode = "a", encoding = "utf-8") dat.write("Hänge Zeile an\n") dat.close() Die Datei datei.txt sieht nach Abarbeitung des obigen Skripts nun so aus Hallo Welt. Wie geht es dir? ... Hänge Zeile an Es wird die Datei im Schreibmodus geöffnet (a ... append (anhängend), w ... write (überschreibend)). write() fügt hier also eine Zeile Text am Dateiende ein. close() schließt die Datei wieder. Das close() kann man sich mit der with-Anweisung auch sparen. with open("datei.txt", mode="a", encoding="utf-8") as dat: dat.write("Hänge Zeile an\n") = Benutzeroberflächen erstellen = == tkinter == {{Wikipedia | Tkinter}} Python bietet standardmäßig das Modul tkinter zur Programmierung von Benutzeroberflächen. Es müssen also bei der Verwendung von tkinter keine externen Module installiert werden. Hier wird eine (sehr) kurze Einführung in das Erstellen von grafischen Oberflächen mittels tkinter gegeben. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") win.minsize(300, 50) but = tk.Button(win, text = "Push the button") but.pack() win.mainloop() Ausgabe: [[Datei:PythonIng_gui1.jpg]] Ein etwas komplizierteres Beispiel sei nachfolgend gezeigt. Es sollen zwei Strings miteinander verknüpft und ausgegeben werden. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") def on_button_clicked(): str = ent1.get() + ent2.get() lab2["text"] = str ent1 = tk.Entry(win) ent2 = tk.Entry(win) lab1 = tk.Label(win, text="verknuepfen mit") lab2 = tk.Label(win, text="") but = tk.Button(win, text = "=", command=on_button_clicked) ent1.pack(side="left") lab1.pack(side="left") ent2.pack(side="left") but.pack(side="left") ent2.pack(side="left") lab2.pack(side="left") win.mainloop() Ausgabe (vor der Eingabe der Teilstrings): [[Datei:PythonIng_gui2.jpg]] Ausgabe (nach der Eingabe der Teilstrings und dem Drücken des =-Buttons): [[Datei:PythonIng_gui3.jpg]] == curses == {{Wikipedia | curses}} Mit dem curses-Modul lassen sich u.a. TUIs ('''T'''ext '''U'''ser '''I'''nterfaces) erstellen. Ein sehr einfaches Beispiel zur allgemeinen Funktionsweise wird nachstehend geliefert. import curses stdscr = curses.initscr() curses.start_color() curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) stdscr.clear() stdscr.addstr("Hallo Welt", curses.color_pair(1)) stdscr.refresh() stdscr.getch() curses.endwin() Als Ausgabe sollte <span style="color:#FF0000;">Hallo Welt</span> (rote Schrift auf weißem Hintergrund) auf dem Terminal/der Konsole erscheinen. Getestet wurde dies mit openSUSE Tumbleweed, Python-Version 3.13.12. Das entsprechende Python-curses-Package muss installiert sein. Allgemeine Informationen zur Terminal-/Konsolengröße und Cursorposition liefert folgendes Programm: import curses stdscr = curses.initscr() stdscr.addstr(3, 5, "LINES: %d" % curses.LINES) stdscr.addstr(4, 5, "COLS: %d" % curses.COLS) (y,x) = stdscr.getyx() stdscr.addstr(5, 5, "Momentane Cursorposition: [%d, %d]" % (y, x)) (y,x) = stdscr.getbegyx() stdscr.addstr(6, 5, "Koordinatenursprung: [%d, %d]" % (y, x)) (y,x) = stdscr.getmaxyx() stdscr.addstr(7, 5, "Fenstergröße: [%d, %d]" % (y, x)) stdscr.addstr(11, 2, "Taste drücken -> Ende") stdscr.refresh() stdscr.getch() curses.endwin() Es sollte sich in etwa folgende Ausgabe ergeben: LINES: 44 COLS: 110 Momentane Cursorposition: [4, 15] Koordinatenursprung: [0, 0] Fenstergröße: [44, 110] Taste drücken -> Ende Zur Funktionsweise von curses siehe auch das Wikibook [[ncurses]]. Zum Verständnis sind dort allerdings elementare Kenntnisse in der Programmiersprache C erforderlich. == Qt == {{Wikipedia | Qt (Bibliothek)}} Auch für das Qt-Framework gibt es eine Anbindung an Python. Nachfolgend ein einfaches Beispiel. import sys from PySide6.QtWidgets import QApplication, QLabel app = QApplication(sys.argv) label = QLabel("Hallo Welt!") label.show() sys.exit(app.exec()) Ausgabe: [[Datei:PythonIng_gui10.png]] == Gtk == {{Wikipedia | GTK (Programmbibliothek)}} Eine idente Ausgabe, wie oben für Qt gezeigt, erzeugt z.B. folgendes Gtk-Programm: import gi gi.require_version("Gtk", "4.0") from gi.repository import Gtk def on_activate(app): win = Gtk.ApplicationWindow(application=app) lab = Gtk.Label(label="Hallo Welt!") win.set_child(lab) win.present() app = Gtk.Application() app.connect('activate', on_activate) app.run(None) Auch für die Benutzung von Qt und Gtk müssen die jeweiligen Packages installiert sein. Getestet wurden die entsprechenden Python-Programme nur unter openSUSE Tumbleweed. Wie das GTK-Paket unter MS Windows 11 installiert wird, siehe z.B. [https://www.gtk.org/docs/installations/windows Setting up GTK for Windows]. Damit sei aber das Thema "Benutzeroberflächen erstellen" hier abgeschlossen, da dies schon ein sehr spezielles Aufgabengebiet ist, das eher Informatiker und nicht so sehr Ingenieure anspricht. Bei Bedarf siehe aber ggf. die entsprechenden Links unten in diesem Tutorial. Dort sind weiterführende Informationen zu finden. = Style Guide und flake8 = Wie man schönen und richtigen Python-Code schreibt, erfahren Sie in * [https://peps.python.org/pep-0008/ PEP 8 – Style Guide for Python Code] Ein Modul, das prüft, ob die Richtlinien im Style Guide eingehalten wurden, ist ''flake8'': * [https://flake8.pycqa.org/en/latest/ Flake8: Your Tool For Style Guide Enforcement] = Einige Integrierte Entwicklungsumgebungen (IDEs)= Werden Programmtexte größer und umfangreicher, so ist das Arbeiten mit der interaktiven Programmierumgebung bzw. das direkte Ausführen von Python-Skripten mühsam. Man wünscht sich z.B. Hilfen zum Debuggen oder die automatische Code-Vervollständigung. Zu diesem Zweck wurden IDEs (Integrated Development Environments) geschaffen. Von diesen seinen nachfolgend auszugsweise einige kurz beschrieben. Testen Sie einfach aus, welche davon für Sie bzw. für Ihr Python-Projekt geeignet sind. == IDLE == IDLE ist die mit dem Python-Programmpaket mitgelieferte IDE. Der Name leitet sich einerseits ab vom Monty-Python-Mitglied Eric Idle, andererseits steht es als Abkürzung für "'''I'''ntegrated '''D'''evelopment and '''L'''earning '''E'''nvironment. IDLE ist einfach zu bedienen, bietet aber schon einen beachtlichen Leistungsumfang. Nachfolgend wird ein Screenshot zu IDLE geliefert. Rechts ist das Editor-Fenster zu sehen, links die interaktive Programmierumgebung. Um das Beispiel selbst nachvollziehen zu können, starten Sie IDLE. Das geht ähnlich, wie Sie die interaktive Programmierumgebung von Python starten (nur, dass Sie eben das IDLE-Icon doppelklicken und nicht das Python-Icon. Unter Linux geben Sie einfach in einem Terminal <code>idle3.13</code> o. Ä. ein). Weiter geht es mit "File - Open - ...". Die auszuführende Datei auswählen (im konkreten Fall ein "Hallo-Welt"-Programm). Es erscheint das rechte Fenster. Dort "Run - Run Module" auswählen. Und schon wird im linken Fenster "Hallo Welt!" ausgegeben. [[Datei:PythonIng_idle1.jpg | 600px]] Siehe auch {{W|IDLE}}. == PyCharm == PyCharm ist ein kommerzielles Produkt. Es gab aber auch eine kostenlose Community Edition. Seit 2025 sind beide Varianten vereint. Für die ersten 30 Tage sind die Pro-Funktionen frei verfügbar, danach nur noch die Kernfunktionalitäten (oder man bezieht kostenpflichtig die Pro-Version). Zu beziehen ist PyCharm unter dem Weblink [https://www.jetbrains.com/pycharm/]. Nachfolgend ein etwas abgewandeltes "Hallo Welt"-Programm, editiert und ausgeführt mit PyCharm. [[Datei:PyCharm_IDE_2023_screenshot.png | 600px]] Siehe auch {{W|PyCharm}}. == Eric == Auch eric ist Open Source und steht unter der GNU General Public License Version 3 oder später. Zu beziehen ist diese Software unter [https://eric-ide.python-projects.org/]. [[Datei:Screenshot_Eric_4.png | 600px]] Siehe auch {{W|eric (Software)}}. <small> Unter openSUSE Tumbleweed sollte sich eric auch mit YaST installieren lassen. Bei mir gibt es aber dann beim Ausführen des eric-Programms eine Fehlermeldung (Stand März 2026): ... ModuleNotFoundError: No module named 'PyQt6.QtPdfWidgets' Umgehen kann man dieses Problem aber wieder mit dem Erstellen einer virtuellen Umgebung, in etwa so python3.13 -m venv ~/tmp/venv1 cd ~/tmp/venv1/bin ./python3.13 -m pip install --upgrade --prefer-binary eric-ide ./eric7_ide </small> == PyScripter == Vom Funktionsumfang vergleichbar mit den vorherigen IDEs ist PyScripter. Auch PyScripter ist Open Source. Die Projekt-Homepage findet sich auf [https://sourceforge.net/projects/pyscripter/]. PyScripter ist nur für MS Windows verfügbar. [[Datei:PythonIng_pyscripter1.jpg | 600px]] == Spyder IDE == Spyder enthält bereits eine stabile Python-Version und etliche Module (z.B. matplotlib, numpy, control). Ansonsten kann dieses Softwarepaket vom Funktionsumfang her mit den anderen genannten IDEs locker mithalten. Spyder wurde unter der MIT-Lizenz veröffentlicht. Diese Software findet sich auf [https://www.spyder-ide.org]. [[Datei:Spyder-windows-screenshot.png | 600px]] Siehe auch {{W|Spyder (Software)}} == Sonstige == Die genannten IDEs sind nicht die Einzigen. Es gibt, um dem Image Pythons als beliebteste Programmiersprache gerecht zu werden, noch einige andere. Sowohl Open Source-Programme als auch kommerzielle Programme sind im Web zu finden, z.B. Thonny oder {{W|Visual Studio Code}}. Braucht man den Umfang von ausgewachsenen IDEs nicht, so kann man auch normale Texteditoren verwenden (z.B. {{W|Geany}} oder {{W|Kate_(Texteditor)|Kate}}). = Debuggen und Testen = Das Debuggen und Testen von Programmen sind wichtige Bestandteile der Programmierung. Syntaxfehler lassen sich i.A. leicht beheben. Schwieriger ist das Eingrenzen von logischen Fehlern, die ev. nur in bestimmten Situationen auftreten und keine explizite Fehlermeldung hervorrufen. Das Programm liefert falsche Ergebnisse oder es stürzt aus heiterem Himmel ab. Um das zu verhindern gibt es verschiedene Werkzeuge, die bei der Fehlersuche behilflich sein können. Vorerst siehe aber zwecks Begriffsklärung noch folgende Links: * {{W|Debuggen}} * {{W|Debugger}} * {{W|Softwaretest}} <gallery> First Computer Bug, 1947.jpg Test ganzheitlich.png V-Modell.svg </gallery> == Das Modul pdb == Python bringt schon ein Modul zum Debuggen mit. Siehe z.B. [https://docs.python.org/3/library/pdb.html pdb — The Python Debugger]. Komfortabler lässt sich das aber mittels Integrierter Entwicklungsumgebungen (IDEs) angehen. == Debuggen mit IDEs == Für die IDEs IDLE und Spyder sei kurz auf die entsprechenden Webseiten verwiesen: * [https://www.cs.uky.edu/~keen/help/debug-tutorial/debug.html Debugging under IDLE]. * [https://docs.spyder-ide.org/current/panes/debugging.html Spyder Debugger] Dort wird die Vorgehensweise auch mittels Screenshots erläutert. == assert == assert ... behaupten, zusichern ({{W|Assertion (Informatik)}}) Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10., 0.) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10., 0.) File "/home/hr/Develop/test1.py", line 4, in print1 assert y != 0.0 ^^^^^^^^ AssertionError Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1("10.", "5.") File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Aber auch bei nachfolgendem Code gibt es eine Fehlermeldung: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10, 5) File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Damit letzteres funktioniert, kann man den Programmcode so umschreiben: def print1(x, y): assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 2.0 Und jetzt fangen wir den <code>AssertionError</code> auf: def print1(x, y): try: assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) except(AssertionError): print("Hallo") print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Hallo Ich hoffe, es ist wenigstens im Ansatz klar geworden, wofür <code>assert</code> gut sein kann. Ausschalten kann man die <code>assert</code>-Überprüfung übrigens mit dem Python-Schalter <code>-O</code>. == Doctests == Innerhalb eines Docstrings kann die Arbeit im interaktiven Modus simuliert werden. Nach den Promptzeichen (>>>) erfolgen dann bei unserem Beispiel innerhalb des Docstrings simulierte Aufrufe der Funktion <code>print1()</code>. Danach folgen jeweils die Sollresultate. Wird das Modul oder die Datei als Hauptprogramm aufgerufen, so wird die Funktion <code>doctest.testmode()</code> aufgerufen und ein Bericht auf der Konsole ausgegeben. Wird das Modul nicht als Hauptprogramm aufgerufen, sondern importiert, dann wird diese <code>testmod</code>-Funktion nicht aufgerufen. D.h. dieser Code kann sowohl für Testzwecke als auch für den produktiven Einsatz verwendet werden. Das ist auch sinnvoll, weil wenn man Teile der Datei immer löschen bzw. einfügen müsste, so würden sich Fehlerquellen auftun. Das würde den Sinn und Zweck von Doctests konterkarieren. def print1(x=0., y=1.): """ Dividiere zwei Zahlen Autor: Intruder Datum: 12.08.2025 >>> print1(2., 1.) 2.0 >>> print1(5., 2.) 2.5 >>> print1(5.) 5.0 """ print(x/y) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) Ausgabe: Trying: print1(2., 1.) Expecting: 2.0 ok Trying: print1(5., 2) Expecting: 2.5 ok Trying: print1(5.) Expecting: 5.0 ok 1 items had no tests: __main__ 1 items passed all tests: 3 tests in __main__.print1 3 tests in 2 items. 3 passed and 0 failed. Test passed. Das gezeigte Beispiel ist so ziemlich das einfachste, das es gibt. Für weiterführende Details siehe z.B.: * [https://peps.python.org/pep-0257/ PEP 257 – Docstring Conventions] * [https://docs.python.org/3/library/doctest.html doctest — Test interactive Python examples] == pytest == Siehe zu diesem Thema auch {{W|Modultest}}. pytest ist ein externes Modul und muss vorab installiert werden, z.B. mittels pip install -U pytest pip install -U pytest-html Python-Code, Datei test1.py: def add(x, y): return x + y def test_answer(): assert add(1, 1) == 3 Starten von pytest in der Konsole: pytest test1.py Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py F [100%] ========================================================= FAILURES ========================================================== ________________________________________________________ test_answer ________________________________________________________ def test_answer(): > assert add(1, 1) == 3 E assert 2 == 3 E + where 2 = add(1, 1) test1.py:6: AssertionError ================================================== short test summary info ================================================== FAILED test1.py::test_answer - assert 2 == 3 ===================================================== 1 failed in 0.09s ===================================================== Hier erhalten wir einen Fehler, da 1+1 eindeutig ungleich 3 ist. Aber aus irgendeinem Grund wollte der Programmierer oder Tester in diesem Fall, dass dies so ist. Testfälle werden übrigens mit dem Präfix <code>test_</code> eingeleitet. Python-Code: def add(x, y): return x + y + 1 def test_answer(): assert add(1, 1) == 3 Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py . [100%] ===================================================== 1 passed in 0.01s ===================================================== Jetzt ist alles in Ordnung. Weiterführendes siehe z.B. * [https://docs.pytest.org/en/stable/ pytest: helps you write better programs] == unittest == Auch unittest dient zur Durchführung von Testreihen, ist aber Bestandteil von Python. Hier wird vorerst nicht näher darauf eingegangen. Siehe z.B. * [https://docs.python.org/3/library/unittest.html unittest — Unit testing framework] Lt. ''Inden: Python Challenge; dpunkt, 2021, Seite 481'' soll unittest weniger komfortabel als pytest sein. Einen Vergleich von unittest mit pytest findet man in * [https://knapsackpro.com/testing_frameworks/difference_between/pytest/vs/unittest pytest vs unittest] = Ausblick = Dies war eine kurze Einführung in die Berechnungs- und Darstellungsmöglichkeiten mit Python. Es sollten etliche relevante Themen behandelt, oder zumindest kurz angesprochen worden sein. Wem dieser Text nicht ausreichend ist, der sei auf die entsprechenden weiterführenden Weblinks, Bücher und die Python-Hilfefunktion verwiesen. Python kennt noch viel mehr Befehle, als hier dargestellt wurden. Das Themenspektrum ist auch durch die Einbindung externer Module fast beliebig erweiterbar. = Weblinks= == Python allgemein == * [https://www.python.org/ Python Homepage] == Externe mathematische Module == * [https://numpy.org/ NumPy] * [https://numpy.org/doc/stable/user/numpy-for-matlab-users.html NumPy for MATLAB users] * [https://scipy.org/ SciPy] * [https://www.sympy.org/en/index.html SymPy] * [https://pandas.pydata.org/ pandas] * [https://github.com/maroba/findiff findiff] * [https://mpmath.org/ mpmath] == Externe Module für Grafiken == * [https://matplotlib.org/ Matplotlib] * [https://vpython.org/ VPython] * [https://docs.vtk.org/en/latest/api/python.html VTK] == Erstellung von User Interfaces == * [https://docs.python.org/3/library/tkinter.html tkinter - Python interface to Tcl/Tk] * [https://docs.python.org/3/library/curses.html curses - Terminal handling for character-cell displays] * [https://wiki.qt.io/Qt_for_Python Qt for Python] * [https://www.gtk.org/docs/language-bindings/python GTK and Python] == Erstellen virtueller Umgebungen == * [https://docs.python.org/3/library/venv.html venv - Creation of virtual environments] == Sonstige == * [https://python-control.readthedocs.io/en/stable/ Python Control Systems Library] * [https://pypi.org/project/regex/ regex - Regular Expressions] = Bücher = == Gedruckte Bücher, OpenBooks, Magazine == * Diverse: c't Python Lernen, Verstehen, Anwenden; Heise, 2022 * Ernesti, Kaiser: Python3 - das umfassende Handbuch; 5. Aufl., Rheinwerk, [https://openbook.rheinwerk-verlag.de/python/ OpenBook] * Inden: Python Challenge; dpunkt, 2021, ISBN 978-3-86490-809-5 * Klein: Numerisches Python; 2. Aufl., Hanser, 2023, ISBN 978-3-446-47170-2 * Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler; Rheinwerk, 2021, ISBN 978-3-8362-7316-9 * Weigend: Python 3 - Das umfassende Praxisbuch; 9. Aufl., mitp, 2022, ISBN 978-3-7475-0544-1 * Woyand: Python für Ingenieure und Naturwissenschaftler; 4. Aufl., Hanser, 2021, ISBN 978-3-446-46483-4 == Andere Wikibooks == * [[:en:Subject:Python_programming_language | Englische Wikibooks zum Thema Python]] * [[Python|Deutschsprachiges Python-Wikibook]] [[Bild:2von10.png|20%]] * [[Python unter Linux|Python 2.7 unter Linux]] [[Bild:10von10.png|100%]] {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} dko7t88uz5si6nvhnn3azwla8ctu0oc 1082859 1082858 2026-04-06T13:27:48Z Intruder 1513 /* Mit VTK */ interactor.Start() zum Textur-Bsp. hinzu 1082859 wikitext text/x-wiki {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} = Hallo Welt und allgemeine Hinweise = == Was ist Python == * Python ist eine universelle höhere Programmiersprache. * Python ist objektorientiert. * Python ist Open-Source (Python Software Foundation License). * Python ist für viele Betriebssysteme erhältlich (z.B. für Linux, MS Windows, macOS). * Python ist ein Interpreter. * Python ist durch Module fast beliebig erweiterbar. * Python als Programmiersprache ist case-sensitive - d.h. Groß- und Kleinschreibung ist relevant bei der Eingabe von Befehlen. {{Wikipedia | Python (Programmiersprache)}} == Python installieren == === MS Windows === Laden Sie das aktuelle Python-Paket von der Webseite [https://www.python.org/] herunter. Weiter geht es wie bei jedem anderen größeren zu installierenden Programm. Einfach das Installationsprogramm im Explorer doppelklicken und den Anweisungen des Setup-Programmes folgen. === Linux === Entweder ist Python bereits standardmäßig installiert, ansonsten ist die Installation mittels Paketmanagementsystem einfach möglich. Aber auch die Spyder-Entwicklungsumgebung ([https://www.spyder-ide.org]) bietet einen guten Einstieg mit Python (das gilt auch für MS Windows). Spyder bringt auch schon etliche wichtige Module standardmäßig mit. == Python starten == === MS Windows === Das Icon für das Python-Programm doppelklicken. Und schon startet das Programm. [[Datei:PythonIng_start1.jpg]] Python im interaktiven Modus präsentiert sich dann so: Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> Alternativ kann das Programm auch über die Eingabeaufforderung oder die PowerShell gestartet werden: c:\devel\Python>python.exe Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> === Linux === Tippen Sie einfach das Wort „python“ (oder unter openSUSE Tumbleweed z.B. auch „python3.11“ oder „python3.13“) in einem Linux-Terminal ein, schließen den Befehl mit der RETURN-Taste ab, und schon startet Python im interaktiven Modus: Python 3.13.12 (main, Feb 09 2026, 22:37:44) [GCC] on linux Type "help", "copyright", "credits" or "license" for more information. >>> Es gibt auch noch andere Möglichkeiten Python zwecks Programmausführung zu starten, z.&nbsp;B. den {{W|Shebang}} (<code>#!</code>) am Beginn eines Python-Scripts. Das Script sei als Script.py gespeichert. Dann kann das Script mit ./Script.py ausgeführt werden. Für openSUSE Tumbleweed sei nachfolgend ein lauffähiges "Hallo Welt!"-Script angegeben. Es wird in diesem Script der Python-Interpreter in der Version 3.13 verwendet : #!/usr/bin/python3.13 print("Hallo Welt!") Die Berechtigungen zum Ausführen der Datei müssen natürlich noch richtig gesetzt werden, z.B. mittels <code>chmod 777 Script.py</code>. <small>Oder es wird in einen Pfad verschoben, in dem sich ausführbare Programme generell befinden (<code>echo $PATH</code>). Das Script kann dann wie ein normales Programm ohne weitere Angaben mit Script.py gestartet werden. Alternativ wird nicht das Script an sich verschoben, sondern nur ein symbolischer Link angelegt, z.B. mit <code>ln -s ~/tmp/Script.py ~/.local/bin/Script.py</code>.<code>~/.local/bin</code> sei ein im PATH gelegenes Verzeichnis. Dies sind aber schon Features für fortgeschrittene Linux-Benutzer und werden am Anfang eher selten benötigt.</small> == Ein paar Worte zur Erklärung == Getestet wurden die Beispiele unter den Betriebssystemen * MS Windows 10 mit der Python-Version 3.12.0 (teilweise auch mit 3.12.2 und 3.13.1; nur die Inhalte die bis spätestens Juli 2025 erstellt wurden) * MS Windows 11 ab der Python-Version 3.13.4 (nur zum Teil; ab Juli 2025) * openSUSE Leap 15.6 mit der Python-Version 3.11.12 (Spyder, nur vereinzelt) und zum Teil mit 3.12.11 (ab Juli 2025 bis November 2025). * openSUSE Tumbleweed ab der Python-Version 3.13.9 (nur vereinzelt, ab November 2025) An Beliebtheit rangiert Python mit Stand März 2026 mit einem Rating von 21,25% an 1. Stelle vor C und C++ (lt. [https://www.tiobe.com/tiobe-index/ TPCI - TIOBE Programming Community Index]). Lt. [https://innovationgraph.github.com/global-metrics/programming-languages GitHub Top 50 Programming Languages Globally] lag Python im Q3/2025 auf Rang 2, vor TypeScript und hinter JavaScript. Der Name "Python" rührt von der Komikertruppe {{W|Monty Python}} her. Die Icons für Python (z.B. Python selbst, Eric IDE, IDLE) sind aber durch die Python-Schlangenart symbolisiert. <gallery> Python-logo-notext.svg|Python-Logo Guido van Rossum OSCON 2006.jpg|Guido van Rossum (geb. 1956), der Erfinder von Python </gallery> == Ein erstes Programm == Kommentare werden in Python mit der Raute (#) eingeleitet. Sie werden vom Python-Interpreter ignoriert. Text kann mit der print-Funktion ausgegeben werden. Starten Sie Python und geben sie folgende Anweisungen zeilenweise ein >>> # Das ist ein Kommentar >>> print("Hallo Welt!") Als Ergebnis erhalten Sie Hallo Welt! Der Prompt (>>>) ist selbstverständlich nicht einzutippen, sondern wird vom Python-System geliefert. Strings können in Python entweder in Anführungszeichen (") gesetzt werden oder in Hochkommatas('). In diesem Text wird die erste Variante bevorzugt eingesetzt. Im Gegensatz zu Julia ist es hier egal, ob zwischen <code>print</code> und der öffnenden Klammer Leerzeichen stehen. = Python als Taschenrechner = == Allgemeines == Wir wollen 3 * 5 berechnen. Dazu starten wir Python im interaktiven Modus. Geben Sie dann die Formel >>> 3 * 5 ein, drücken die Taste ENTER/RETURN ({{Taste|↵}}) und erhalten als Ergebnis 15 Auch kompliziertere Ausdrücke sind möglich. Beispielsweise mit Winkelfunktionen, Quadratwurzeln etc. Wir wollen nun den Ausdruck <math>\sin\sqrt{15}</math> berechnen : >>> import math >>> math.sin(math.sqrt(15)) -0.6679052983383519 Als erstes wird das math-Modul importiert. Dann wird der mathematische Ausdruck berechnet. Eine andere Variante, die dasselbe Ergebnis liefert, ist >>> from math import * >>> sin(sqrt(15)) -0.6679052983383519 Es wird also aus dem Modul <code>math</code> alles importiert (erkennbar am <code>*</code>). Will man nicht alles importieren, so kann man das auch einschränken: >>> from math import sin, sqrt Beenden lässt sich das Python-Programm durch Eingabe von <code>exit()</code> (und natürlich ist zur Bestätigung die RETURN-Taste zu drücken). == Die Hilfefunktion von Python == Bei Eingabe der Anweisung help() springt Python in den Hilfemodus. Eingabe: >>> help() Eingabe: help> math.sin Ausgabe: Help on built-in function sin in math: math.sin = sin(x, /) Return the sine of x (measured in radians). Für die komplette Python-Dokumentation siehe [https://docs.python.org/3/]. Verlassen kann man den Hilfemodus durch das Drücken von STRG-C. == Aufgaben == * Erkunden Sie die Tangensfunktion "tan" mittels Python-Hilfe (vergessen Sie nicht das math-Modul zu importieren und das <code>math.</code> vor <code>tan</code>) * Berechnen Sie mit Python den Ausdruck <math>\frac{1}{2}\cdot e^2 \cdot \tan(\pi/3)</math>. Siehe für die Exponentialfunktion im Python-Hilfesystem auch den Befehl <code>math.exp</code>. Alternativ kann auch die Konstante <code>math.e</code> eingesetzt werden. Potenzieren kann man bei Python mit dem **-Operator (z.B. 2**3 = 8). Für <math>\pi</math> gibt es <code>math.pi</code>. = Python als Scriptsprache = Häufig wird man aber kompliziertere Anweisungsfolgen verarbeiten müssen. Diese will man normalerweise nicht jedesmal neu eingeben, sondern in einer Datei speichern und diese Datei dann zur Ausführung bringen. Speichern Sie dazu folgenden Code in einer Textdatei, z.B. unter MS Windows als c:\tmp\test1.py # Das ist ein Kommentar print("Hallo Welt!") Python-Dateien werden mit der Dateiendung .py versehen. Achten Sie darauf, dass vor dem print keine Leerzeichen vorhanden sind. Das ist eine Python-Eigenheit. Wie wir später sehen werden, nutzt Python Einrückungen als syntaktisches Mittel, z.B. um bei Schleifen den Schleifenkörper zu kennzeichnen. Danach bringen Sie die Skriptdatei test1.py (sozusagen das Hauptprogramm) folgendermaßen zur Ausführung: 1) Starten Sie unter MS Windows die Eingabeaufforderung (oder alternativ auch die Windows PowerShell). Das sieht dann etwa so aus: Microsoft Windows [Version 10.0.19045.3693] (c) Microsoft Corporation. Alle Rechte vorbehalten. C:\Users\xyz> : <small>Falls jemand nicht weiß, wie man die Eingabeaufforderung startet: Eine Möglichkeit ist, einfach in der Taskleiste von Windows das "Start"-Symbol &nbsp;([[Image:Windows_logo_-_2021_(Black).svg|10px]])&nbsp; mit der rechten Maustaste anklicken. "Ausführen" auswählen (oder alternativ für die PowerShell unter Windows 10 den Eintrag "Windows PowerShell", unter Windows 11 den Eintrag "Terminal"). Im sich öffnenden Dialogfenster gibt man in die "Öffnen"-Zeile das Wort <code>cmd</code> ein und mit "OK" wird das Ganze bestätigt.</small> 2) Wechseln Sie mittels <code>cd c:\tmp</code> in das Verzeichnis c:\tmp 3) Angenommen, Sie haben Python unter dem Pfad <code>c:\devel\Python\</code> installiert. Starten Sie das Programm so (der Prompt <code>c:\tmp></code>ist natürlich nicht mit einzutippen): c:\tmp>c:\devel\Python\python.exe test1.py 4) Wie erwartet ergibt sich folgende Ausgabe am Bildschirm Hallo Welt! Die Vorgehensweise unter Linux ist prinzipiell gleich. Die kleinen Unterschiede, wie z.B. der Slash statt dem Backslash in Pfadangaben, sollten für Linux-Benutzer keine Hürde darstellen. == Variablen == Variablenbezeichner können aus Buchstaben (A-Za-z), Ziffern (0-9) und Underscores (_) bestehen, dürfen aber nicht mit einer Zahl beginnen. Führende Underscores haben u.a. im Kontext mit der Objektorientierten Programmierung eine spezielle Bedeutung und sollten nicht für "normale" Variablenbezeichner verwendet werden. Gültige Variablenbezeichner wären also: xyz x1 _wert name_anzahl Es gibt in Python etliche Schlüsselwörter (z.B. for, if oder return). Diese dürfen nicht als eigene Variablenbezeichner verwendet werden. Eine Liste aller Schlüsselwörter liefert das Script import keyword print(keyword.kwlist) <small>Übung: Speichern Sie dieses Script in eine Datei, z.B. in c:\tmp\test1.py. Führen Sie diese Datei aus, um die Liste der Schlüsselwörter auszugeben.</small> Da Python case-sensitiv ist, repräsentieren folgende Bezeichner verschiedene Variablen: xyz XYZ xYz Werte werden an Variablen mittels Gleich-Zeichen (=) zugewiesen. Im Folgenden wird der Code immer in der Datei c:\tmp\test1.py gespeichert. x = 5 y = 10 z = x*y print(z) Bringen Sie die Datei test1.py zur Ausführung so erhalten Sie folgende Bildschirmausgabe 50 Sie können auch mehrere Anweisungen in einer Zeile durch Semikolon getrennt schreiben. Dies führt aber zu unübersichtlichem Code. x = 5; y = 10; z = x*y; print(z) Ausgabe: 50 Auch aus der Programmiersprache C/C++ oder Java bekannte Konstrukte können Sie verwenden, z.B. x = 5 # x = x - 2 x -= 2 print(x) Bildschirmausgabe: 3 Beachten Sie, dass mit dem =-Zeichen eine Wertezuweisung durchgeführt wird. Dies ist nicht äquivalent zum mathematischen =-Zeichen, wie am vorigen Beispiel zu ersehen ist. Den Inkrement-/Dekrementoperator (z.B. x++ oder x--) aus C/C++ oder Java kennt Python aber nicht. Variablen sind nicht an einen bestimmten Datentyp gebunden, folgendes ist mit Python problemlos möglich: import math wert = 10 print(wert) wert = 35.5 print(wert) wert = "Hallo" print(wert) wert = math.pi print(wert) Ausgabe: 10 35.5 Hallo 3.141592653589793 == Physische und logische Zeilen == In Python muss eine Anweisung in einer logischen Zeile Platz finden. Wird eine Anweisung aber zu lang für eine Zeile, dann kann sie in mehrere physische Zeilen unterteilt werden. Dies kann einerseits durch einen Backslash am Ende einer Zeile geschehen, z.B. a = 2 + \ 5 Dies stellt eine logische Zeile dar, die in zwei physische Zeilen unterbrochen ist. Geklammerte Ausdrücke werden automatisch zu einer logischen Zeile verbunden, z.B. a = (2 + 5) Achtung: Im ersten Beispiel darf nach dem Backslash nichts mehr stehen, auch kein Kommentar. Dies trifft im zweiten Bespiel nicht zu, hier könnte noch ein Kommentar folgen, z.B. a = (2 + # Kommentar 5) Auch für Strings gibt es Möglichkeiten, diese auf mehrere Zeilen aufzuspalten. # Kurzer String str1 = "ABC" # Langer String str2 = """Hallo Welt, Grüetzi Schwyzer, Servus an alle""" # Backslash str3 = "UVW\ XYZ" print(str1) print(str2) print(str3) Ausgabe: ABC Hallo Welt, Grüetzi Schwyzer, Servus an alle UVWXYZ ==Hexadezimale, oktale, binäre und andere Zahlen== d = 1050 # Dezimalzahl h = 0xAA2 # Hexadezimalzahl o = 0o12 # Oktalzahl b = 0b100001101 # Binärzahl print(d) print(h) print(o) print(b) Ausgabe: 1050 2722 10 269 Groß- und Kleinbuchstaben sind in obigen Literalen übrigens egal. So kann man z.B. statt <code>0b1001</code> auch <code>0B1001</code> schreiben (siehe dazu [https://docs.python.org/3/reference/lexical_analysis.html#integer-literals]). Sie können auch dezimale in hexadezimale Zahlen umwandeln, usw.: h = hex(1050) # Dezimalzahl -> Hexadezimalzahl b = bin(1050) # Dezimalzahl -> Binärzahl o = oct(1050) # Dezimalzahl -> Oktalzahl print(h) print(b) print(o) Ausgabe: 0x41a 0b10000011010 0o2032 Gegeben sei die Zahl 121 zur Basis 3. Diese soll in eine Dezimalzahl umgewandelt werden. Das kann so geschehen: z = int("121", 3) print(z) Ausgabe: 16 Dass dies richtig ist, davon kann man sich folgendermaßen überzeugen: <math> 1 \cdot 3^2 + 2 \cdot 3^1 + 1 \cdot 3^0 = 9 + 6+ 1 = 16 </math> Zahlen übersichtlicher schreiben kann man auch mittels Underscore, z.B.: print("Eine Million (Variante 1) =", 1000000) print("Eine Million (Variante 2) =", 1_000_000) print("Eine Rechnung:", 2_000 * 400_000); Es ergibt sich bei beiden Varianten die gleiche Ausgabe. Variante 2 ist aber im Sourcecode leichter lesbar, detto die Zahlen in der Rechnung: Eine Million (Variante 1) = 1000000 Eine Million (Variante 2) = 1000000 Eine Rechnung: 800000000 == Strings und Platzhalter== Ein paar einfache Beispiele: print("Hallo {}" . format("Hugo")) print("Hallo {:s}" . format("Hugo")) print("Hallo %s" % "Hugo") Ausgabe: Hallo Hugo Hallo Hugo Hallo Hugo Python-Code (formatted string literals): str1 = "Hallo" str2 = "Hugo" print(f"{str1} {str2}") Ausgabe: Hallo Hugo Komplexere Beispiele: print("Hallo {} und {}" . format("Hugo", "Mike")) print("Hallo {name1} und {name2}" . format(name2="Hugo", name1="Mike")) # Füllzeichen: * # Bündigkeit: > (=rechts), < (=links), ^ (=zentriert) # Feldweite: 10 # Typ: s (=String), f (=Gleitkommazahl), d (=Dezimalzahl) etc. print("Hallo {:*>10s}" . format("Hugo")) print("Hallo {:*<10s}" . format("Hugo")) Ausgabe: Hallo Hugo und Mike Hallo Mike und Hugo Hallo ******Hugo Hallo Hugo****** Python-Code: str = "Hallo\t%s\t%7.2f\t%10.2e\t%i" % ("Hugo", 12.34567, 34.567, 264) print(str) Ausgabe: Hallo Hugo 12.35 3.46e+01 264 == Unicode == Neben den bekannten ASCII-Zeichen lassen sich Zeichen auch mittels Unicode beschreiben. Griechische Buchstaben oder komplexere mathematische Operatoren - all das sollte kein Problem sein. Siehe auch {{W|Unicode}}, {{W|Liste der Unicodeblöcke}} und {{W|Unicodeblock Mathematische Operatoren}}. Im Folgenden werden ein paar Zeichen (Allquantor, Nabla-Operator, Existenzquantor), die man aus der Mathematik kennt, erzeugt. ch1 = "\N{FOR ALL}" ch2 = "\N{NABLA}" ch3 = "\u2203" print(ch1, ch2, ch3) Ausgabe: ∀ ∇ ∃ <small>Diese Ausgabe ergibt sich z.B. mit der IDLE-Shell oder mit Cygwin. Beim Ausführen über die Windows-Eingabeaufforderung oder Windows PowerShell unter MS Windows 10 erfolgt keine korrekte Darstellung. IDLE ist die mit Python mitgelieferte IDE ('''I'''ntegrated '''D'''evelopment '''E'''nvironment, Integrierte Entwicklungsumgebung). Gegen Ende dieses Textes wird IDLE kurz beschrieben. Das Problem mit der Windows Eingabeaufforderung lässt sich aber umgehen. Man muss nur eine Schriftart auswählen, die die Zeichen kennt, z.B. "DejaVu Sans Mono". Dazu klicken Sie einfach bei der Eingabeaufforderung mit der rechten Maustaste oben auf die weiße Leiste und wählen im aufpoppenden Fenster den Menüpunkt "Eigenschaften". Es öffnet sich ein Dialogfenster. Über den Reiter "Schriftart" lässt sich nun die Schriftart einstellen. Unter MS Windows 11 oder openSUSE Leap 15.6 (bash-Konsole) gibt es dieses Problem ohnehin nicht.</small> == Reguläre Ausdrücke == Python kennt auch {{W|Regulärer Ausdruck|reguläre Ausdrücke}}. Dazu gibt es in Python das Modul <code>re</code>. Beipielsweise sollen alle Zahlen (<math>\text{zahl}\in\mathbb{N}_0</math>) in einem String gesucht und ausgegeben werden. Als String sei gegeben: <code>3x Grüße und 100 Kekse.</code> Das Muster (Pattern) ist <code>\d+</code>. <code>\d</code> steht für eine Dezimalziffer 0-9. Das Plus-Zeichen (+) steht symbolisch für ein oder mehrere Zeichen des vorherigen Ausdrucks. Hier also ein oder mehrere Dezimalziffern. Es wird die Funktion <code>findall</code> aus dem Modul <code>re</code>verwendet. Python-Code: from re import findall str = "3x Grüße und 100 Kekse." pat = "\\d+" # Doppel-Backslashes müssen verwendet werden, sonst gibt Python eine Warnung aus! # alternativ: pat = r"\d+" # oder: pat = "[0-9]+" numb = findall(pat, str) print(numb) Ausgabe: ['3', '100'] Python kennt noch viele weitere Möglichkeiten mittels regulärer Ausdrücke zu hantieren. Dies soll hier aber nicht vertieft werden, da das Thema schon ziemlich speziell und komplex ist. Bei Bedarf siehe aber z.B. die Bücher ''Weigend, Seite 380ff'' und ''Ernesti, Kaiser'' [https://openbook.rheinwerk-verlag.de/python/28_001.html] oder die Python-Dokumentation [https://docs.python.org/3/library/re.html]. Auch [[Python unter Linux: Reguläre Ausdrücke]] liefert ein umfangreiches und brauchbares Python-2-Kapitel zu den regulären Ausdrücken. Die dort gelisteten Beispiele müssten ggf. vor Verwendung auf Python-3 umgeschrieben werden. <small>Wie macht man das? Dazu siehe z.B. [https://openbook.rheinwerk-verlag.de/python/43_001.html], [https://portingguide.readthedocs.io/en/latest/] oder [https://www.digitalocean.com/community/tutorials/how-to-port-python-2-code-to-python-3]</small> <small>Es gibt auch ein externes Modul ''regex'', das bei Bedarf extra installiert werden muss ([https://pypi.org/project/regex/]). Es bietet zusätzliche Funktionalität und gründlicheren Unicode-Support. Dies sei hier aber nur der Vollständigkeit halber erwähnt.</small> == Verzweigungen == === if === Die IF-Verzweigung ist aus anderen Programmiersprachen bereits bekannt. In Pseudocode lässt sie sich folgendermaßen darstellen: WENN bedingung TRUE führe block1 aus SONST führe block2 aus ENDE In Python gibt es keinen expliziten ENDE-Kennzeichner. Stattdessen wird der Code durch Einrückungen strukturiert. Alles mit der gleichen Einrückungstiefe gehört zum selben Block. Dies zeichnet Python vor anderen Programmiersprachen aus. Die test1.py-Datei laute also wie folgt: x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: Der else-Zweig wird ausgefuehrt x ist groesser oder gleich 4 Man achte auch auf die Doppelpunkte in der if- und else-Zeile. Darauf vergisst man gerne, wenn man von anderen Programmiersprachen kommt. Folgendes wäre in Python ein Fehler (genauer gesagt ein IndentationError). x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Auch Nachstehendes würde nicht zum gewünschten Ergebnis führen (löst aber keine Fehlermeldung aus). Der letzte print-Befehl ist schon außerhalb der IF-ELSE-Verzweigung. x = 3 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: x ist kleiner als 4 x ist groesser oder gleich 4 Python kennt eine Reihe von Vergleichs- und Verknüpfungsoperatoren: <, <= ... kleiner (gleich) >, >= ... größer (gleich) == ... gleich != ... ungleich is ... identisch is not ... nicht identisch and ... AND or ... OR not ... NOT Beispielsweise: a = 5 b = 9 if a<=10 and b!=7: print("OK") else print("Nicht OK") Ausgabe: OK Der else-Block kann übrigens auch ersatzlos entfallen. Mehrfache Verzweigungen werden durch das elif-Konstrukt erstellt. a = 14 if a<=10: print("<=5") elif a>11 and a<15: print("11 bis 15") elif a>16 and a<20: print("16 bis 20") else: print(">=20") Ausgabe: 11 bis 15 In Python gibt es auch die Schlüsselwörter <code>True</code> (für wahr) und <code>False</code> (für falsch). Man beachte, dass sie mit Großbuchstaben beginnen. Andere Schreibweisen wären ein Fehler. Sie gehören zum Datentyp <code>bool</code>. Ihnen sind auch die Zahlen <code>1</code> und <code>0</code> zugewiesen. === match === Ab Python 3.10 gibt es auch die match-Anweisung. Dies ist das Python-Pendant für die switch-Anweisung in anderen Programmiersprachen, geht aber bei näherer Betrachtung weit darüber hinaus. Hier nur ein einfaches Beispiel: x = "Hello" match x: case "Servus" | "Ciao": # or print("Servus an alle") case "Grüetzi": print("Grüetzi Schwyzer") case _: # other, default, sonstiges ... print("Hallo Welt") Ausgabe: Hallo Welt Für nähere Details siehe z.B. [https://www.geeksforgeeks.org/python-match-case-statement/], [https://learnpython.com/blog/python-match-case-statement/], [https://docs.python.org/3/tutorial/controlflow.html#match-statements] und das Python Enhancement Proposal (PEP) 636 – Structural Pattern Matching: Tutorial [https://peps.python.org/pep-0636] und dort insbesondere den Anhang A - Quick Intro. <small><code>match, case, _</code> etc. sind sogenannte ''soft keywords''. Im Gegensatz zu den normalen Schlüsselwörtern dürfen ihnen auch Werte zugewiesen werden. Eine Liste der weichen Schlüsselwörter lässt sich durch <code>keyword.softkwlist</code> erstellen (die Anweisung gibt es seit Python 3.9). Siehe dazu auch [https://stackoverflow.com/questions/65800344/what-are-soft-keywords] und [https://docs.python.org/3/library/keyword.html#keyword.softkwlist].</small> == Schleifen == === while === Die WHILE-Schleife ist kopfgesteuert. Sie funktioniert wie aus anderen Programmiersprachen bekannt. In Pseudocode: SOLANGE bedingung TRUE führe block aus ENDE In Python: x = 0 while x <= 10: print(x) x += 1 Ausgabe: 0 1 2 3 4 5 6 7 8 9 10 === for === for x in range(6): print(x*2) Ausgabe: 0 2 4 6 8 10 Die Schleife läuft von 0 bis 5. Ausgegeben wird jeweils der Wert x*2. Aquivalent kann diese Schleife auch so geschrieben werden: for x in range(0, 11, 2): print(x) Die Ausgabe ist wie oben. Der Startwert sei 0, der Endwert ist 11-1 und die Schrittweite ist 2. Ein anderes Beispiel sei for x in "text": print(x) Ausgabe: t e x t == Schleifen abbrechen == === break === <code>break</code> bricht die Schleife ab und setzt mit dem nächsten Befehl außerhalb der Schleife fort. for var in range(100): print(var) if var == 5: break Ausgabe: 0 1 2 3 4 5 === continue === <code>continue</code> bricht den aktuellen Schleifendurchlauf ab und setzt mit dem nächsten Schleifendurchlauf fort. for var in range (11): if var == 5: continue print(var) Ausgabe: 0 1 2 3 4 6 7 8 9 10 == try - except == try: z1 = 12 / 0 print(z1) except ZeroDivisionError: print("Das Ergebnis ist unendlich") except: print("Kann nicht berechnet werden!") print("Bitte die Formel korrigieren!") Ausgabe: Das Ergebnis ist unendlich Es wird versucht, eine Zahl durch Null zu dividieren. Das ist nicht möglich, es wird eine Ausnahme ausgelöst. Das Programm springt daher in den except-ZeroDivisionError-Block und führt die dort gelisteten Anweisungen aus (in unserem Fall eine print-Anweisung). Würden wir dieses Programm ohne try-except ausführen, so ergibt sich aus z1 = 12 / 0 print(z1) folgende Fehlermeldung und ein unmittelbarer Programmabbruch Traceback (most recent call last): File "C:\tmp\test1.py", line 1, in <module> z1 = 12 / 0 ZeroDivisionError: division by zero Mit dem try-except-Mechanismus können also Ausnahmen oder Fehler aufgefangen und behandelt werden. In unserem Beispiel ist das eher trivial, aber bei größeren Programmen kann das durchaus Sinn machen. == pass == Ein leerer Block muss in Python mittels dem Schlüsselwort <code>pass</code> dargestellt werden. Z.B. x = 2 if x == 1: print("Wert ist ", x) else: pass Würde man das <code>pass</code> im else-Block weglassen, so würde man eine Fehlermeldung erhalten: IndentationError: expected an indented block after 'else' statement on line 5 = Funktionen = == Aufrufen von Funktionen == Funktionen sind uns im Rahmen dieses Kurses schon zuhauf begegnet. Sei es die print()-, die math.sin()- oder die hex()-Funktion. All diese Funktionen werden von Python zur Verfügung gestellt, ohne dass man sie explizit programmieren müsste. Aufgerufen werden diese Funktionen, indem man ihren Namen eintippt, gefolgt von runden Klammern. In diesen Klammern können noch Argumente übergeben werden. Auch Rückgabewerte sind möglich. == Funktionen selber schreiben == Funktionen werden mit dem def-Schlüsselwort (man definiert die Funktion) eingeleitet, danach folgt der Funktionsname, danach wiederum runde Klammern, in denen formale Argumente stehen können. Abgeschlossen wird die def-Zeile mit einem Doppelpunkt. Danach folgt der Funktionskörper. Dieser Funktionskörper muss wiederum eingerückt werden (wie von den Verzweigungen und Schleifen bekannt). Aufgerufen wird diese Funktion, indem man ihren Funktionsnamen eingibt, gefolgt von runden Klammern (ggf. mit den aktuellen Parametern). Z.B. # Funktion definieren def halloWelt(i): # i ... beliebige Ganzzahl print("Hallo " * i, end="") print("Welt!") # Funktion aufrufen halloWelt(3) Ausgabe: Hallo Hallo Hallo Welt! Unterschied zwischen formalen und aktuellen Parametern: [[Datei:PythonIng_func1.jpg]] <small>Aktuelle Parameter werden auch Argumente genannt.</small> Rückgabe von Funktionswerten: # Funktion definieren def mathFunc(a, b): r1 = a + b r2 = a * b return r1, r2 # Funktion aufrufen a, b = mathFunc(3, 5) # Ausgabe der zurückgegebenen Werte print(a) print(b) Ausgabe: 8 15 Vorgabeparameter, z.B.: def mathFunc(a=10, b=20): r1 = a + b r2 = a * b return r1, r2 a, b = mathFunc(3, 5) print(a) print(b) a, b = mathFunc(5) print(a) print(b) a, b = mathFunc(b=6) print(a) print(b) Ausgabe: 8 15 25 100 16 60 == Lambda-Funktionen == print((lambda a, b: a*b) (3, 5)) Ausgabe: 15 Eingeleitet wird eine Lambda-Funktion (auch Lambda-Form, Lambda-Operator oder anonyme Funktion genannt) mit dem Schlüsselwort <code>lambda</code>. Es folgen die formalen Argumente, danach ein Doppelpunkt, die Berechnungsvorschrift und ggf. abschliessend in Klammern die aktuellen Parameter. Man kann einer Lambda-Funktion auch einen Funktionsnamen geben und die Funktion über diesen Namen aufrufen, z.B. prod = lambda a, b: a*b print(prod(3, 5)) Als Ausgabe wird wieder die Zahl 15 geliefert. == Rekursive Funktionen == Funktionen können wiederum andere Funktionen aufrufen. Von einem rekursiven Funktionsaufruf spricht man, wenn die aufgerufene Funktion gleich der aufrufenden ist. def printFunc(i): if (i >= 5): return else: print("Hallo Welt") printFunc(i+1) printFunc(1) Ausgabe: Hallo Welt Hallo Welt Hallo Welt Hallo Welt == Funktionsannotationen == Python ist sehr flexibel, was Typen angeht. Im Vorhergehenden haben wir generell keine Typangaben gemacht. Will man Typen angeben, so bietet Python das Konzept der Funktionsannotation. def calcFunc(a:int, b:int) -> int: return a+b, a*b r1 = calcFunc(8, 9) r2 = calcFunc(8.0, 9.0) print(r1) print(r2) Ausgabe: (17, 72) (17.0, 72.0) Jetzt sieht man auf den ersten Blick, welche Typen der Programmierer im Sinn hatte, als er die Funktion erstellte. Das Problem dabei ist nur, dass es Python ziemlich egal ist, welche Typen man in Endeffekt eingibt. Im obigen Beispiel können statt Integer-Typen auch Float-Typen eingegeben werden. == Variadische Funktionen == Python-Code: def test1(a, *b): print(a); for c in b: print(c); test1("Hallo", "Welt", "Schweizer", "und alle anderen") Ausgabe: Hallo Welt Schweizer und alle anderen Mit dem Stern (auch als Splat-Operator bezeichnet) in der formalen Parameterliste bei der Funktion <code>test1</code> wird angezeigt, dass eine beliebige Anzahl von Argumenten übergeben wird. <small> Dies entspricht in etwa dem, was in anderen Programmiersprachen (PHP etc.) mittels Ellipse (<code>...</code>) angezeigt wird.</small> = Tupel, Listen und andere = [[Datei:Python 3. The standard type hierarchy.png|mini|hochkant=1.7|Datentypen und Strukturen]] Tupel, Listen und einige andere sind Datenstrukturen oder Sequenzen. Listen (z.B. eine Einkaufsliste) sind veränderbar (mutable). Ein Tupel kann dagegen nicht verändert werden (immutable). Listen werden beim Anlegen in eckige Klammern eingeschlossen, Tupel in runde Klammern. Beim Tupel können die Klammern auch weggelassen werden. Ein Tupel mit nur einem Element muss mit einem Beistrich abgeschlossen werden. Der Grund ist, dass Python sonst nicht entscheiden kann, ob ein Tupel angelegt werden soll, oder nur ein geklammerter Wert. Nachfolgend werden einige Operationen mit Listen und Tupel dargestellt. Als Gedächtnisstütze kann man sich den Unterschied zwischen Tupel und Liste ev. so leichter merken: : T'''u'''pel ... r'''u'''nde Klammern, '''u'''nveränderlich : L'''i'''ste ... eck'''i'''ge Klammern, veränderl'''i'''ch. # Liste und Tupel liste = [1, 2, "Hallo"] tupel = (1, 2, "Hallo") # Ausgabe von liste und tupel print(liste) print(tupel) # Ausgabe von Einzelelementen print(liste[1]) print(tupel[2]) # Element an Liste anhängen und einfügen liste.append(55) liste.insert(4, "Welt") print(liste) # Element aus Liste entfernen liste.remove(1) print(liste) # einige weitere Beispiele liste2 = [1,] tupel2 = 1, 2 tupel3 = (1,) print(liste2) print(tupel2) print(tupel3) Ausgabe: [1, 2, 'Hallo'] (1, 2, 'Hallo') 2 Hallo [1, 2, 'Hallo', 55, 'Welt'] [2, 'Hallo', 55, 'Welt'] [1] (1, 2) (1,) Zu den Datenstrukturen gehören weiters auch Mengen und Dictionaries. Mengen sind von der Mathematik bekannt, sie sind ungeordnet und es kommen keine mehrfachen Elemente vor. Dictionaries sind durch Schlüssel :Wert-Paare gekennzeichnet. Mengen werden beim Anlegen wie Dictionaries in geschweifte Klammern eingeschlossen. dict = {"vorname":"Hugo", "nachname":"Meister" } menge = {1, 1, 3, 4, 4, 4, "Hallo"} print(dict) print(menge) print(dict["vorname"]) Ausgabe: {'vorname': 'Hugo', 'nachname': 'Meister'} {1, 3, 4, 'Hallo'} Hugo Geschweifte Klammern ohne Inhalt stellen Dictionaries dar und keine Mengen: di = {} print(type(di)) Ausgabe: <class 'dict'> == List Comprehensions == Aus einer Eingabeliste soll eine Ausgabeliste erzeugt werden. Das kann folgendermaßen geschehen. Mathematische Schreibweise: <math>lc = \{2x|x\in\ \mathbb{N}, 1\le x < 11\}</math> Python-Code: lc = [x*2 for x in range(1,11)] print(lc) Ausgabe: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] Mathematische Schreibweise: <math>lc = \{2x | x \in \mathbb{N}, 1\le x < 11, x \bmod 2 = 0 \}</math> Python-Code: lc = [x*2 for x in range(1,11) if x%2 == 0] print(lc) Ausgabe: [4, 8, 12, 16, 20] Siehe auch {{W|List Comprehension}}. == Set Comprehensions == Dies ist sehr ähnlich wie im vorigen Abschnitt beschrieben. Es wird aber keine Liste, sondern eine Menge erzeugt. sc = {x*2 for x in range(1,11)} print(sc) Ausgabe: {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} == Listen zusammenführen - zip() == li1 = ["A", "B", "C", "D"] li2 = [1, 2, 3, 4] li3 = [5.5, 6.6, 7.7, 8.8] z = zip(li1, li2, li3) print(z) li4 = list(z) print(li4) Ausgabe: <zip object at 0x00000283B6C6AC80> [('A', 1, 5.5), ('B', 2, 6.6), ('C', 3, 7.7), ('D', 4, 8.8)] == Generatorausdruck == g = (i*2 for i in range(1,11)) print(g) t = tuple(g) print(t) print(t[1:3]) Ausgabe: <generator object <genexpr> at 0x00000241D2A4A5A0> (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) (4, 6) == Slicing == slice ... Scheibe, Teil, in Scheiben schneiden Beispiel: Zugriff auf Elemente eines geordneten sequentiellen Objekttyps (Liste, Tupel oder String): str1 = "Hallo" # Das erste Element wird mit dem Index 0 angesprochen # [start (inkl.) : stop (exkl.) : step (default=1)] str2 = str1[0:2] # Alternativ auch: str2 = str1[:2] print(str2) tup1 = (0,1,2,3) # Das letzte Element hat auch den Index -1, das vorletzte den Index -2 usw. tup2 = tup1[-3:-1] print(tup2) lst1 = [[1, 5, 10, 20], [30, 40, 50, 60]] lst2 = lst1[1][1] print(lst2) Ausgabe: Ha (1, 2) 40 Beispiel: Umdrehen von Strings str1 = "Hallo" str2 = str1[::-1] print(str2) Ausgabe: ollaH = Objektorientierte Programmierung = == Eine einfache Klasse == [[Datei:PythonIng_uml1.svg | 200px]] class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 fahr = Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die Klasse Fahrzeug wird durch das class-Schlüsselwort eingeleitet. raeder ist ein Klassenattribut und public. __init__ wird bei der Objekterzeugung automatisch aufgerufen. Man achte darauf, dass diese Methode immer mit zwei Unterstrichen eingeleitet und abgeschlossen wird. Instanzattributen wird das Wort self vorangestellt. Wir sehen uns z.B. das Attribut self.__geschwind an. Auch hier werden zwei Unterstriche verwendet. Das bedeutet, dass dieses Attribut private ist. Bei den Methoden wird immer self als erster Parameter angegeben. Beim Aufruf der entsprechenden Funktion wird das self aber nicht berücksichtigt. == Klassen importieren == Häufig ist es sinnvoll und übersichtlicher Klassen in eigenen Dateien zu speichern. Das sind dann eigene Module. Abgespeichert werden Sie mit der Endung py, wie bisher auch praktiziert. Aufgerufen werden Sie mit der import-Anweisung. Dann ist aber nur der Dateiname ohne Endung py zu verwenden. Klarer wird das mit einem Beispiel. Datei c:\tmp\fahrzeug.py class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 Datei c:\tmp\test1.py import fahrzeug fahr = fahrzeug.Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die üblichen import-Anweisungen lauten wie folgt: {| {{prettytable}} ! import-Befehl ! Instanz |- | import xyz || xyz.Klasse |- | import xyz as x || x.Klasse |- | from xyz import Klasse || Klasse |- | from xyz import * || Klasse |} Der Vorteil der ersten beiden import-Anweisungen ist, dass es kaum zu Namenskollisionen kommen kann. Dafür hat man bei den letzten beiden Varianten weniger Tipparbeit. == Vererbung == [[Datei:PythonIng_uml2.svg | 200px]] Datei fahrzeug.py: class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 class Luftfahrzeug(Fahrzeug): def __init__(self, geschwindigkeit, leistung, fluegel): super().__init__(geschwindigkeit, leistung) self.__flueg = fluegel def getFlueg(self): return self.__flueg Datei test1.py: import fahrzeug fahr = fahrzeug.Luftfahrzeug(150, 90, 4) print(fahr.getFlueg()) Ausgabe: 4 = Grafiken zeichnen = Für das Zeichnen von Grafiken wird hier das Modul <code>matplotlib</code> verwendet. <code>matplotlib</code> ist ein externes Modul und muss vor der ersten Verwendung installiert werden. Das geht so: # Starten Sie ein Terminal (bei Windows die Eingabeaufforderung). # Führen Sie darin folgenden Befehl aus <code>c:\devel\Python\Scripts\pip.exe install matplotlib</code> pip ist übrigens der Paketmanager von Python ({{W|Pip_(Python)}}). Optimalerweise installieren wir auch gleich das Modul <code>numpy</code> (Numerical Python). Wir werden es im Folgenden oft benötigen (nicht nur bei den Grafiken). Das funktioniert vom Prinzip her genauso, wie für <code>matplotlib</code> gezeigt. <small>Verwenden Sie Spyder, so sind diese Schritte nicht nötig. Spyder inkludiert diese Pakete standardmäßig. Unter openSUSE Tumbleweed lassen sich diese Pakete mittels YaST oder zypper installieren.</small> == 2D == === Graph einer Funktion === Es soll die cosh-Funktion im Intervall <math>x\in[-3,3]</math> gezeichnet werden. Der Programmcode lautet in der einfachsten Form: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh1.jpg]] Der Code ist quasi selbsterklärend. Das Untermodul pyplot des matplotlib-Moduls und das numpy-Modul werden importiert. x läuft von -3 bis +3. y wird für jeden x-Wert per Formel ausgerechnet. "plt.plot()" ist der Zeichenbefehl. "plt.show" ist notwendig, um das Fenster mit der Grafik anzuzeigen. Die Schrittweite 0.1 wurde so gewählt, um einen ausreichend glatten Verlauf des Graphen zu gewährleisten. Das ist immer ein Kompromiss zwischen Berechnungszeit und Ansehnlichkeit. Testen Sie einfach ein paar verschiedene Werte, um ein Gefühl dafür zu zu bekommen. "plt.grid()" zeichnet ein Gitter in die Grafik (kann auch weggelassen werden). Die Bezeichnungen plt und np könnten auch anders gewählt werden. Es ist aber Konvention, diese so wie hier gezeigt zu wählen. <small>Mit der im obigen Bild gezeigten Menüleiste kann die dargestellte Grafik nachträglich noch geändert werden (Zoom, Pan, Achsenparameter, Kurvenparameter etc.). Natürlich kann man das alles auch direkt programmieren. Wie das funktioniert wird ansatzweise etwas später gezeigt.</small> Ein etwas komplexeres Beispiel ist Folgendes: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) + 2**x plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh4.png]] Man beachte, dass im Gegensatz zu Octave und Julia der ominöse Punkt (.) bei 2**x mit Python nicht benötigt wird. Das macht das Programmiererleben etwas einfacher. === Graphen mehrerer Funktionen und weiteres === import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x") plt.plot(x, y2, label = "sin(x) * cos(x)") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh2.png]] Um die Linienstile etwas individueller zu gestalten, ist folgender Programmcode gedacht: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x", lw=5, ls="dotted") plt.plot(x, y2, label = "sin(x) * cos(x)", lw=3, ls="--") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh3.png]] === Funktion in Parameterdarstellung === Es soll die archimedische Spirale <math>x = t \cos(t), y = t \sin(t)</math> im Intervall <math>[0, 6\pi[</math> gezeichnet werden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.show() [[Datei:PythonIng_spirale1.png]] Diese Darstellung erscheint verzerrt. Will man gleiche Achsenskalierungen, so kann man den plt.axis()-Befehl verwenden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.axis("equal") plt.show() [[Datei:PythonIng_spirale2.png]] === Funktion in Polardarstellung === import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(projection="polar") r = np.arange(0, 1, 0.01) theta = r**3 line = ax.plot(theta, r) plt.show() [[Datei:PythonIng_polar1.png]] === Logarithmische Achsenskalierung === ==== Semilog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.semilogy() plt.show() Ausgabe: [[Datei:PythonIng_semilog1.png]] ==== LogLog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.loglog() plt.show() [[Datei:PythonIng_loglog1.png]] === Gefüllte Fläche === import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 3, 0.1) y1 = 3*x - 1 y2 = x**2 plt.plot(x, y1, x, y2, color='black') plt.fill_between(x, y1, y2, where=y1>=y2) plt.show() [[Datei:PythonIng_gefuellt.png]] === Linien, Pfeile, Rechtecke, Kreise und Texte === import matplotlib as mpl import matplotlib.pyplot as plt fig, ax = plt.subplots() r = mpl.patches.Rectangle((0, 0), 3, 3, angle=30, fill=False) c = mpl.patches.Circle((4, 4), 2, fill=False) ax.add_patch(r) ax.add_patch(c) ax.plot([-2, 7], [-2, 0], color="black") ax.arrow(0, 7, 5, 0, length_includes_head=True, head_width=0.5, head_length=1.5, color="black") ax.set_aspect("equal") plt.axis([-3, 8, -3, 8]) plt.show() [[Datei:PythonIng_linien_pfeile_etc.png]] Text kann mit <code>ax.text(x, y, "Text")</code> hinzugefügt werden, bspw. import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.text(0.1, 0.1, "Hallo") ax.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() Oder einfacher auch ohne <code>subplots</code> import matplotlib.pyplot as plt plt.text(0.1, 0.1, "Hallo") plt.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text1.png]] Auch Sonderzeichen (griechische Buchstaben etc.) können verwendet werden (siehe dazu auch [https://matplotlib.org/stable/users/explain/text/mathtext.html]). import matplotlib.pyplot as plt plt.text(.3, .5, r'$\Omega\ \psi\ \oint\ \nabla\ \dot a\ \frac{a}{b}\ a_b$', size="20") plt.show() [[Datei:PythonIng_text20.svg]] Jetzt wird noch gezeigt, wofür <code>subplots</code> sinnvoll eingesetzt werden können. import matplotlib.pyplot as plt fig, ax = plt.subplots(nrows=1, ncols=2) ax[0].text(0.1, 0.1, "Hallo") ax[1].text(0.1, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text2.png]] === Aufgaben === * Zeichnen Sie die Strophoide <math>x = \frac{a(t^2-1)}{t^2+1}, y = \frac{at(t^2-1)}{t^2+1}, a = 2, -3 \leq t \leq 3</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_strophoide.jpg]] * Zeichnen Sie die verschlungene Hypozykloide <math>x = (R-r)\cos t + c\cos\frac{R-r}{r}t, y = (R-r)\sin t - c\sin\frac{R-r}{r}t, c = 3, r = 2, R = 6, -15 \leq t \leq 15</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_hypozykloide.jpg]] * Testen Sie bei den obigen Übungsaufgaben verschiedene Linienstile und Farben. Farben können mit dem plt.plot()-Parameter color gewählt werden. * Testen Sie bei den obigen Übungsaufgaben verschiedene Werte für a, c, r und R. == 3D == === Räumliche Kurven === import matplotlib.pyplot as plt import numpy as np t = np.arange(0, 6*np.pi, 0.1) x = t * np.cos(t) y = t * np.sin(t) z = t fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot(x, y, z) plt.show() [[Datei:PythonIng_raumkurve1.png]] === Flächen === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z) plt.show() [[Datei:PythonIng_fläche1.png]] Das Ganze in Netzdarstellung läßt sich so programmieren: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.5) y = np.arange(0, 10, 0.5) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_wireframe(x, y, z) plt.show() [[Datei:PythonIng_fläche2.png]] Ein etwas komplexeres Beispiel: import matplotlib.pyplot as plt import numpy as np x = np.arange(0.1, 10, 0.1) y = np.arange(0.1, 10, 0.1) x, y = np.meshgrid(x, y) z1 = np.sin(x) + 3 * np.cos(y) z2 = np.sin(x) + np.log(y) z3 = x + np.cos(y) z4 = x**2 - y fig, ax = plt.subplots(subplot_kw={"projection": "3d"}, nrows=2, ncols=2) ax[0][0].plot_surface(x, y, z1) ax[0][1].plot_surface(x, y, z2) ax[1][0].plot_surface(x, y, z3) ax[1][1].plot_surface(x, y, z4) plt.show() [[Datei:PythonIng_subplot1.png]] Man beachte, dass man die Unterbilder im Bild nach dem Ausführen des Scripts z.B. mit der mittleren Maustaste einzeln drehen, oder über die Einträge in der Menüzeile einzeln bearbeiten kann. Mit ein paar Zeilen Programmtext lässt sich also eine Menge an Funktionalität generieren. Die Farbgebung lässt sich über <code>colormaps</code> variieren. import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm) plt.show() [[Datei:PythonIng_colormap1.png]] Es gibt eine Menge an Colormaps, z.B. <code>plasma, Greys, Dark2, ocean</code>. Zwecks detaillierterer Infos siehe die matplotlib-Dokumentation. <small>Verwendet man die IDE namens IDLE, so gibt es dort auch die automatische Codevervollständigung. D.h. es werden alle Möglichkeiten (in unserem Fall nach dem Eintippen von <code>cm.</code> alle verfügbaren Colormaps) angezeigt.</small> Die "edgecolor" und Linienbreite können auch frei gewählt werden: import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm, edgecolor="black", linewidth=1.0) plt.show() [[Datei:PythonIng_colormap2.png]] === Höhenlinien === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contour(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien1.png]] Etwas abgewandelt sieht das so aus: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() hl = ax.contour(x, y, z) ax.clabel(hl, inline = True) plt.show() [[Datei:PythonIng_höhenlinien2.png]] Und noch eine Variante sei gezeigt. import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contourf(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien3.png]] === Aufgaben === * Zeichnen Sie die räumliche Kurve <math>x = 2 \cdot \cosh(t)</math>, <math>y = 5 \cdot \sin(t)</math>, <math> z = t^{2} - t</math>, <math>0 \leq t \leq 3\pi</math>. * Zeichnen Sie die Fläche <math>z = \log(x) + \cos(y)</math>. == Animationen == === Mit matplotlib === Auch mit matplotlib sind Animationen möglich. Das ist ein bisschen komplizierter und wird deshalb hier nur mit einem sehr einfachen Beispiel dargestellt (bei Interesse siehe z.B. auch das [https://matplotlib.org/stable/users/explain/animations/animations.html#animations Animations using Matplotlib-Tutorial]). import matplotlib.pyplot as plt import matplotlib.animation as ani import matplotlib import numpy as np def update(frame): line.set_xdata(x[:frame]) line.set_ydata(y[:frame]) return (line) fig, ax = plt.subplots() x = np.arange(0, 10, .1) y = np.sin(x) line, = ax.plot(x[0], y[0]) ax.set(xlim=[0, 10], ylim=[-1, 1]) a = ani.FuncAnimation(fig=fig, func=update, frames=100, interval=20) plt.show() # Speichere die Animation in einem animierten GIF (optional) a.save(filename="c:/tmp/PythonIng_anim5.gif", writer="pillow") [[Datei:PythonIng_anim5.gif]] Es wird eine Sinuskurve auf den Bildschirm gezeichnet. In der letzten Zeile wird diese Animation in ein animiertes GIF gespeichert. Das ist natürlich optional und kann auch weggelassen werden. === Mit VPython === Aber auch mit dem Modul VPython lassen sich einfache 3D-Animationen erstellen. VPython ist ein externes Modul, das vorab installiert werden muss. Unter openSUSE Tumbleweed gibt es dzt. kein entsprechendes rpm-Paket. Die übliche Methode der Installation mittels YaST oder zypper ist somit nicht möglich. Auch eine direkte Verwendung von pip führt nur zu einer Fehlermeldung (<code>error: externally-managed-environment</code>). Es empfiehlt sich dort folgende Vorgehensweise: # Erstelle zuerst eine virtuelle Umgebung, z.B.: <code>python3.11 -m venv ~/tmp/venv1</code> # Wechsle das Verzeichnis: <code>cd ~/tmp/venv1/bin</code> # Installiere das entsprechende Paket: <code>./pip install vpython</code> # Führe das entsprechende Skript aus: <code>./python ~/tmp/test1.py</code> Aktuell (März 2026) ist dieses Programmpaket lt. der [https://vpython.org/presentation2018/install.html VPython-Homepage] nur für die Python-Versionen 3.8 bis 3.12 verfügbar. Ein Beispiel zu einer einfachen Animation wird nachfolgend geliefert. from vpython import * scene.width = 1200 scene.height = 600 scene.center = vector(20,0,0) scene.background = color.white cylinder(pos=vector(0,0,0), axis=vector(20,0,0), radius=5, color=color.blue) cone(pos=vector(0,0,0), axis=vector(-10,0,0), radius=5, color=color.blue) helix(pos=vector(20,0,0), axis=vector(40,0,0), radius=2, coils=10, thickness=0.5, color=color.blue) ball = sphere(pos=vector(20,0,0), color = color.green, radius = 1) ball.p = vector(0.15, 0, 0) toc = True while True: rate(200) if(ball.pos.x <= 60 and toc == True): ball.pos += ball.p else: toc = False ball.pos -= ball.p if(ball.pos.x <= 20 and toc == False): toc = True [[Datei:PythonIng_vpython_anim.JPG]] Idealerweise öffnet sich beim Ausführen des Scripts ein Browserfenster. Darin wird die programmierte Animation gezeigt (siehe auch den obigen Screenshot). Eine Größenänderung können Sie mit der mittleren Maustaste initiieren. Die Szenerie drehen können Sie mit der rechten Maustaste. === Mit VTK === Komplexer, aber auch mächtiger als VPython ist die Verwendung von VTK ('''V'''isualization '''T'''ool'''k'''it). Genauer gesagt des Python-Wrappers von VTK. Dieses externe Python-Modul muss vorab installiert werden (z.B. mittels YaST, pip oder in eine virtuelle Umgebung). VTK ist eine Softwarebibliothek zur 3D-Visualisierung und wurde ursprünglich in C++ geschrieben. Verbreitet eingesetzt wird diese Bibliothek in der Wissenschaft und Forschung, z.B. * in der medizinischen Bildgebung * für Strömungssimulationen * für Klimadaten Als einfaches Beispiel wird die Darstellung eines Zylinders gezeigt, der mit den Maustasten gedreht oder in der Größe geändert werden kann: import vtk # Zylinder erzeugen cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) # Geometrie in darstellbare Daten umwandeln mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) # Objekt in der Szene actor = vtk.vtkActor() actor.SetMapper(mapper) # Szene verwalten renderer = vtk.vtkRenderer() renderer.AddActor(actor) # Render-Fenster render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) # Maus/Tastatur-Steuerung interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) # Starten render_window.Render() interactor.Start() Ausgabe: [[Datei:PythonIng_VTK_1.png]] Gleiches Beispiel wie oben, aber mit einer Animationssequenz: import vtk import time cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) renderer = vtk.vtkRenderer() renderer.AddActor(actor) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) render_window.Render() time.sleep(0.01) Das Grafikfenster schließt sich nach Ablauf der Schleife. Das Fenster bleibt geöffnet, wenn Sie am Programmende folgenden Befehl hinschreiben interactor.Start() Um den animierten Zylinder grün einzufärben, müssen Sie Folgendes im obigen Programm ergänzen (Farbnamen): colors = vtk.vtkNamedColors() actor.GetProperty().SetColor(colors.GetColor3d("Green")) Als Namen können Sie u.a. die CSS3 Web-Farben verwenden (siehe z.B. [https://wiki.selfhtml.org/wiki/Farbe/Farbangaben]). Alternativ funktioniert auch das (RGB): actor.GetProperty().SetColor(0.0, 0.6, 0.0) Wie der Zylinder mit einer Textur versehen wird, zeigt folgendes Programm: import vtk import time cylinder = vtk.vtkCylinderSource() cylinder.SetResolution(30) cylinder.SetHeight(3.0) cylinder.SetRadius(1.0) cylinder.CappingOn() texture_coords = vtk.vtkTextureMapToCylinder() texture_coords.SetInputConnection(cylinder.GetOutputPort()) texture_coords.PreventSeamOn() reader = vtk.vtkJPEGReader() reader.SetFileName("PythonIng_textur.jpg") texture = vtk.vtkTexture() texture.SetInputConnection(reader.GetOutputPort()) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(texture_coords.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.SetTexture(texture) renderer = vtk.vtkRenderer() renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) renderer.AddActor(actor) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) renderWindow.Render() time.sleep(0.01) interactor.Start() <gallery> PythonIng_textur.jpg | Textur-Datei PythonIng_VTK_2.png | Ausgabe (Screenshot) </gallery> Nun aber genug von VTK und der Erstellung von Grafiken, weiter geht es mit mathematischeren Themen. = Vektoren und Matrizen = == Zahlenfolgen == from numpy import * start = 0 stop = 10 step = 2 num = 10 r = arange(start, stop, step) l = linspace(start, stop, num) print("r = ", r) print("l = ", l) Ausgabe: r = [0 2 4 6 8] l = [ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556 6.66666667 7.77777778 8.88888889 10. ] == Vektoren == Vektoren sollten jedem aus der Linearen Algebra bekannt sein. === Arrays === In Python mit NumPy kann man Vektoren durch die Funktion array erzeugen. import numpy as np l1 = (-5, 3, 2) l2 = (1, 1, 4) a1 = np.array(l1) a2 = np.array(l2) a3 = a1 + a2 a4 = 2 * a2 print(a1) print(a2) print(a3) print(a3[2]) print(a4) Ausgabe: [-5 3 2] [1 1 4] [-4 4 6] 6 [2 2 8] === Zeilen- und Spaltenvektoren === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) print(z) print(s) Ausgabe: [ [-5 3 2] ] [[1] [1] [4]] === Skalarprodukt === import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) skalarprodukt = np.dot(a1, a2) print(skalarprodukt) Ausgabe: 6 === Vektorprodukt === <math>a\ast b=\left(\begin{array}{c} a_{1}\\ a_{2}\\ a_{3} \end{array}\right)\ast\left(\begin{array}{c} b_{1}\\ b_{2}\\ b_{3} \end{array}\right)=\left(\begin{array}{c} a_{2}b_{3}-a_{3}b_{2}\\ a_{3}b_{1}-a_{1}b_{3}\\ a_{1}b_{2}-a_{2}b_{1} \end{array}\right) </math> Python-Code: import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) vektorprodukt = np.cross(a1, a2) print(vektorprodukt) Ausgabe: [10 22 -8] === Transponierter Vektor === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) # transponierter Vektor z_tp = np.transpose(z) # transponierter Vektor s_tp = np.transpose(s) print(z_tp) print(s_tp) Ausgabe: [[-5] [ 3] [ 2]] [ [1 1 4] ] === Vektorfelder visualisieren === import matplotlib.pyplot as plt import numpy as np # Daten generieren x = np.arange(0, 10, 1) y = np.arange(0, 10, 1) X, Y = np.meshgrid(x, y) U = X * Y V = Y + X # Plotten fig, ax = plt.subplots() ax.quiver(X, Y, U, V, angles='xy') plt.show() Ausgabe: [[Datei:PythonIng_quiver1.png]] == Matrizen== import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) print(m1) Ausgabe: [[1 2 3] [4 5 6]] === Zugriff auf Matrizenelemente === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) # Element aus Zeile 2 und Spalte 3 (Achtung! Index startet bei Null) print(m1[1,2]) Ausgabe: 6 === Addition und Subtraktion von Matrizen === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) m2 = np.matrix([[0, 0, 2], [1, 3, 2]]) print(m1 + m2) print(m1 - m2) Ausgabe: [[1 2 5] [5 8 8]] [[1 2 1] [3 2 4]] === Transponierte Matrix === import numpy as np m = np.matrix([[1, 2, 3], [4, 5, 6]]) mt = np.transpose(m) print(m) print(mt) Ausgabe: [[1 2 3] [4 5 6]] [[1 4] [2 5] [3 6]] === Rang einer Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) rg = np.linalg.matrix_rank(m) print(rg) Ausgabe: 2 === Inverse Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) mi = np.linalg.inv(m) print(mi) Ausgabe: [[ 1. 0.6] [-0. -0.2]] === Multiplikation von Matrizen (falksches Schema) === import numpy as np m1 = np.matrix([[1, 3, 4], [0, -5, 1]]) m2 = np.matrix([[1, 2], [2, 3], [0, 2]]) print(m1 @ m2) Ausgabe: [[ 7 19] [-10 -13]] === Eigenwerte und Eigenvektoren === import numpy as np m = np.matrix([[5, 8], [1, 3]]) D,V = np.linalg.eig(m) # Eigenwerte print(D) # Eigenvektoren print(V) Ausgabe: [7. 1.] [[ 0.9701425 -0.89442719] [ 0.24253563 0.4472136 ]] === Teilmatrizen === import numpy as np m = np.matrix([[1, 3, 4], [0, -5, 1]]) print("m = ", m) # Erste Zeile extrahieren m1 = m[0,:] print("m1 = ", m1) # Das Element aus der 1. Zeile und der 2. Spalte extrahieren m2 = m[0,1] print("m2 = ", m2) # Zweite Spalte extrahieren m3 = m[:, 1] print("m3 = ", m3) Ausgabe: m = [[ 1 3 4] [ 0 -5 1]] m1 = [ [1 3 4] ] m2 = 3 m3 = [[ 3] [-5]] === Spezielle Matrizen === ==== Nullmatrix ==== import numpy as np z = np.zeros((3, 2)) print(z) Ausgabe: [[0. 0.] [0. 0.] [0. 0.]] ==== Einheitsmatrix ==== import numpy as np z = np.eye(3) print(z) Ausgabe: [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ==== Matrix mit lauter Einsen ==== import numpy as np z = np.ones((3, 2)) print(z) Ausgabe: [[1. 1.] [1. 1.] [1. 1.]] === Spärlich besetzte Matrizen === Das Thema spärlich besetzter Matrizen wird hier nur kurz angerissen. Nähere Details siehe unter dem Weblink [https://docs.scipy.org/doc/scipy/reference/sparse.html#module-scipy.sparse]. import numpy as np import scipy A = scipy.sparse.csr_array(np.eye(5)) print(A) Ausgabe: (0, 0) 1.0 (1, 1) 1.0 (2, 2) 1.0 (3, 3) 1.0 (4, 4) 1.0 = Lineare Gleichungssysteme = Sei <math>Ax = b</math> ein lineares Gleichungssystem. <math>A</math> sei die Koeffizientenmatrix, <math>x</math> der Lösungsvektor und <math>b</math> ein bekannter Vektor. Beispiel: import numpy as np A = np.array([[5, 1], [0, 2]]) b = np.array([1, 2]) x = np.linalg.solve(A, b) print(x) Ausgabe: [0. 1.] == Aufgabe == * Lösen Sie folgendes Gleichungssystem mittels Python (und zur Kontrolle auch händisch): 5x + 6y - 2z = 12 3x - y - 3z = 6 2x + 2y + 4z = 5 = Polynome = == Ein erstes einfaches Beispiel == Gegeben sei das Polynom <math>7x^3+5x^2+1</math>. In Python: import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p) Ausgabe: 3 2 7 x + 5 x + 1 == Einzelne Polynomwerte berechnen == import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p(1.5)) Ausgabe: 35.875 == Polynome integrieren und differenzieren == import numpy as np p = np.poly1d([7, 5, 0, 1]) # 1. Ableitung p1 = p.deriv() p2 = p.deriv(1) # 2. Ableitung p3 = p.deriv(2) # Integral p4 = p.integ() print(p1) print(p2) print(p3) print(p4) Ausgabe: 2 21 x + 10 x 2 21 x + 10 x 42 x + 10 4 3 1.75 x + 1.667 x + 1 x == Nullstellen bestimmen == import numpy as np p = np.poly1d([2, 5, 0, 4]) r = np.roots(p) print(r) Ausgabe: [-2.7621427 +0.j 0.13107135+0.84077099j 0.13107135-0.84077099j] == Aufgaben == * Berechnen Sie den Wert für x = 3 des Polynoms <math>y = 2x^4 - 3x^3 - x + 7</math>. * Differenzieren und integrieren Sie das Polynom <math>y = 2x^4 - 3x^3 - x + 7</math>. * Berechnen Sie die Nullstellen von <math>y = 7x^5 - 3x^2 + 12</math>. = Nichtlineare Gleichungen und Gleichungssysteme = == Nullstellenbestimmung == Löse eine beliebige Gleichung f(x) = 0, z.B. <math> f(x) = x^2 - 5\cos(x) - 10 = 0 </math>: import scipy import numpy as np def f(x): return x**2 - 5*np.cos(x) - 10 xstart = [-1, 1] # Startwerte xn = scipy.optimize.root(f, xstart) print(xn.x) Ausgabe: [-2.46813009 2.46813009] Funktionsgraph: [[Datei:octave_nichtlin2.jpg]] == Gleichungssysteme == SymPy ist ein externes Modul, das symbolisches Rechnen ('''Sym'''bolic '''Py'''thon) ermöglicht. Folgende Aufgabe ist dem Buch "Knorrenschild: Numerische Mathematik, Hanser, 2017, Seite 72" entnommen. Zu lösen ist das nichtlineare Gleichungssystem <math>f_1 = 2x_1 + 4x_2 = 0 </math> <math>f_2 = 4x_1 + 8x_2^3 = 0</math> Mit Python ist das so möglich: import sympy x1, x2 = sympy.symbols("x1 x2") f1 = 2*x1 + 4*x2 f2 = 4*x1 + 8*x2**3 s = sympy.solve((f1, f2), x1, x2) print(s) Ausgabe: [(-2, 1), (0, 0), (2, -1)] Plot: [[Datei:IngPython_nl_gleichung1.svg|500px]] = Komplexe Zahlen = Die imaginäre Einheit wird in Python durch den Buchstaben <code>j</code> symbolisiert. Darstellen kann man eine komplexe Zahl bekannterweise in mehreren Formen: * Kartesische Darstellung <math>z = \Re(z) + j \cdot \Im(z)</math> * Polardarstellungen <math>z = r \cdot (\cos(\phi) + j \cdot \sin(\phi)) = r \cdot e^{j\cdot \phi}</math> Die konjugiert komplexe Zahl ist <math>z^* = \Re(z) - j \cdot \Im(z)</math> Nachfolgend einige mathematische Operationen mit Python und NumPy. import numpy as np z1 = 2 + 5j # kartesische Darstellung z2 = 3 * np.exp(3j) # Polardarstellung # Addition res = z1 + z2 print("z1 + z2 = ", res) # Multiplikation res = z1 * z2 print("z1 * z2 = ", res) # Realteil res = np.real(z2) print("Realteil von z2 = ", res) # Imaginärteil res = np.imag(z2) print("Imaginaerteil von z2 = ", res) # Betrag res = np.abs(z1) print("Betrag von z1 = ", res) # Argument res = np.angle(z1) print("Argument von z1 = ", res) # Konjugiert komplexe Zahl res = np.conj(z1) print("Konjugiert komplexe Zahl von z1 = ", res) Ausgabe: z1 + z2 = (-0.9699774898013365+5.423360024179601j) z1 * z2 = (-8.05675510050068-14.003167400647481j) Realteil von z2 = -2.9699774898013365 Imaginaerteil von z2 = 0.4233600241796016 Betrag von z1 = 5.385164807134504 Argument von z1 = 1.1902899496825317 Konjugiert komplexe Zahl von z1 = (2-5j) = Interpolation = import numpy as np import scipy import matplotlib.pyplot as plt # Stützpunkte xp = np.arange(1, 6) yp = (0, -5, 2, 7, 6) ti = np.arange(1, 5, 0.01) i1 = scipy.interpolate.interp1d(xp, yp, kind = "linear") i2 = scipy.interpolate.interp1d(xp, yp, kind = "cubic") plt.plot(xp, yp, "rx") plt.plot(xp, i1(xp)) plt.plot(ti, i2(ti)) plt.show() Ausgabe: [[Datei:PythonIng_interpol1.png]] = Differenzialrechnung = == Numerisches Differenzieren == Als Beispiel differenzieren wir <math>y = 5x\sin{x}</math> und stellen das Ganze grafisch dar. from findiff import Diff import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) f = 5 * x * np.sin(x) dx = x[1] - x[0] # Ableitung d_dx = Diff(0, dx) df_dx = d_dx(f) # Grafik plt.plot(x, f, label = "y") plt.plot(x, df_dx, label = "y'") plt.grid() plt.legend(loc="best") plt.show() Ausgabe: [[Datei:octave_diff1.jpg]] <small>findiff ist ein externes Modul. Dieses muss installiert werden (z.B. so: ...\Python\Scripts\pip.exe install --upgrade findiff). Für die Vorgehensweise unter openSUSE Tumbleweed siehe das Kapitel VPython, nur dass das Ganze mit einer aktuelleren Python-Version exekutiert wird, z.B. mit Python 3.13. Das im Buch "Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler, Rheinwerk" verwendete Modul "scipy.misc" ist veraltet (deprecated ... missbilligt). Lt. [https://docs.scipy.org/doc/scipy-1.17.0/dev/roadmap-detailed.html#misc SciPy-Dokumentation für die Version 1.17.0] wurden alle entsprechenden Features schon entfernt.</small> == Symbolisches Differenzieren == Differenzieren Sie die Funktionen <math>f_1(x) = x^2</math> und <math>f_2(x) = \sin(x)\cos\left(\frac{x}{2}\right)</math>. import sympy x = sympy.symbols("x") f1 = x**2; f2 = sympy.sin(x) * sympy.cos(x/2.) d1 = sympy.diff(f1, x) d2 = sympy.diff(f2, x) print(d1) print(d2) Ausgabe: 2*x -0.5*sin(0.5*x)*sin(x) + cos(0.5*x)*cos(x) == Aufgaben == * Differenzieren Sie die Funktion <math>y = \log(x) + 10x</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. * Differenzieren Sie die Funktion <math>y = \frac{\sinh(x)}{(1+x)}</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. = Integralrechnung = == Numerisches Integrieren == Berechnen Sie das Integral <math>\int_{0}^{3}x^2 dx</math>. import scipy def f(x): return x**2 i = scipy.integrate.quad(f, 0, 3) print(i) Ausgabe: (9.000000000000002, 9.992007221626411e-14) Das trifft den exakten Wert 9.0 ziemlich genau. Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} dx</math>. import scipy import numpy as np def f(x): return 2**(-x) i = scipy.integrate.quad(f, 0, np.inf) print(i) Ausgabe: (1.4426950408889556, 4.486558477977586e-09) == Symbolisches Integrieren == Berechnen Sie <math>\int x^2 \text{d}x</math> und <math>\int \sin{x}\cos{\frac{x}{2}} \text{d}x</math>. import sympy x = sympy.symbols("x") f1 = x**2 f2 = sympy.sin(x) * sympy.cos(x/2.) i1 = sympy.integrate(f1, x) i2 = sympy.integrate(f2, x) print(i1) print(i2) Ausgabe: x**3/3 -0.666666666666667*sin(0.5*x)*sin(x) - 1.33333333333333*cos(0.5*x)*cos(x) Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} \text{d}x</math>. import sympy x = sympy.symbols("x") f = 2**(-x) i = sympy.integrate(f, (x, 0, sympy.oo)) print(i) Ausgabe: 1/log(2) Mit <code>sympy.pprint(i)</code> ließe sich letzere Ausgabe etwas schöner schreiben: 1 ────── log(2) Man beachtete, <code>log</code> steht hier für den natürlichen Logarithmus <code>ln</code>. == Aufgaben == * Integrieren Sie die Funktion <math>y = \log(x) + 10x</math> von 1 bis 5. * Integrieren Sie die Funktion <math>y = x^3</math> von 0 bis 4. * Integrieren Sie <math>\int x^x(\log (x) + 1)\mathrm dx</math> symbolisch. = Gewöhnliche Differenzialgleichungen = == DGL numerisch lösen == Für die Lösung von Differenzialgleichungen steht u.a. die Funktion scipy.integrate.solve_ivp() zur Verfügung. Diese Funktion implementiert auch das Runge-Kutta-Verfahren (RK45). {{Wikipedia | Runge-Kutta-Verfahren}} Beispiel <math>y' = x^2 + y^3</math>: import scipy import numpy as np import matplotlib.pyplot as plt def dy_dx(x, y): return x**2 + y**3 y0 = [1] xi = [0, 1] x = np.arange(0, 1, 0.01) z = scipy.integrate.solve_ivp(dy_dx, xi, y0, method="RK45", dense_output=True) y = z.sol(x) plt.plot(x, y.T) plt.grid() plt.show() [[Datei:PythonIng_dgl1.png]] == DGL symbolisch lösen == Beispiel <math>y' = x^2 + y^3</math>: import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) print(lsg) Ausgabe: [Eq(f(x), (-x**2)**(1/3)), Eq(f(x), (-x**2)**(1/3)*(-1 - sqrt(3)*I)/2), Eq(f(x), (-x**2)**(1/3)*(-1 + sqrt(3)*I)/2)] Mit <code>sympy.pprint</code> (pretty print) lässt sich die Ausgabe etwas übersichtlicher darstellen. import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) sympy.pprint(lsg) Ausgabe: ⎡ _____ _____ ⎤ ⎢ _____ 3 ╱ 2 3 ╱ 2 ⎥ ⎢ 3 ╱ 2 ╲╱ -x ⋅(-1 - √3⋅ⅈ) ╲╱ -x ⋅(-1 + √3⋅ⅈ)⎥ ⎢f(x) = ╲╱ -x , f(x) = ────────────────────, f(x) = ────────────────────⎥ ⎣ 2 2 ⎦ == Aufgaben == * Lösen Sie die Differenzialgleichung <math>y' = \frac{1}{x\cdot y}</math> mit Python. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>m' = -k\cdot m</math>. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>y' = \sqrt{|y|}</math>. =Rechnen mit wirklich großen Zahlen= Bekannt ist, dass Python kaum Einschränkungen beim Wertebereich von Ganzzahlen hat, z.B. print(10**300) Ausgabe (gekürzt): 100000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000 Ähnliches geht auch mit Gleitpunktzahlen, z.B. durch die Verwendung des Moduls mpmath: import mpmath print(mpmath.mpf(1500.4)**mpmath.mpf(300)) Ausgabe: 7.27975299218612e+952 Anderes Beispiel: from mpmath import mp, pi mp.dps = 100 print(pi) Ausgabe: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 mpmath kann noch einiges mehr, dazu sei aber auf die entsprechende Dokumentation auf der mpmath-Homepage verwiesen. mpmath ist Bestandteil von SymPy, kann aber auch separat installiert werden. =Regelungstechnische Aufgabenstellungen= Für regelungstechnische Aufgaben gibt es u.a. das externe Paket <code>control</code>. Hier soll nicht detailliert darauf eingegangen werden. Anhand eines Beispiels soll anschließend nur die Visualisierung in Form eines Bode-Diagramms und der Sprungantwort gezeigt werden. Gegeben sei ein P-Regler mit <math>R = \frac{5}{2}</math> und eine Strecke <math>S= \frac{1}{30s^3+20s^2+10s+1,5}</math>. Gesucht sei vorerst ein Bode-Diagramm für den offenen Regelkreis und das Führungsverhalten. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke # oder: G0 = ct.series(regler, strecke) Gw = ct.feedback(G0) ct.bode_plot(G0, label='G0') ct.bode_plot(Gw, label='Gw') plt.show() [[Datei:PythonIng_bode1.svg]] Nun noch für obiges Beispiel die Sprungantwort. Diese zeigt einige große Überschwinger, d.h. der Regler kann sicher noch optimiert werden. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke Gw = ct.feedback(G0) t, y = ct.step_response(Gw) plt.plot(t,y) plt.title('Sprungantwort') plt.xlabel('t') plt.ylabel('h(t)') plt.grid() plt.show() [[Datei:PythonIng_bode3.svg]] Einige weitere wichtige Daten (Phasenreserve, Amplitudenreserve, Durchtrittsfrequenz) lassen sich mittels der <code>control</code>-Funktion <code>margin()</code> ermitteln. Die Ortskurve lässt sich mit der Funktion <code>nyquist_plot()</code> zeichnen. Dies sei hier aber nicht weiter ausgeführt. ==Aufgaben== * Zeichen Sie mit Python die Ortskurve für obiges Beispiel. * Was passiert, wenn man die Reglerverstärkung weiter aufdreht (z.B. auf <math>R = \frac{25}{2}</math>)? * Wie sehen das Bode-Diagramm und die Sprungantwort aus, wenn ein PI-Regler verwendet wird? = Stereostatik etc. = Das Modul SymPy bietet einige Möglichkeiten einfache Bauwerke zu berechnen, z.B. Balken oder Fachwerke. Nachfolgend wird ein einfaches Fachwerk berechnet und gezeichnet. Python-Code: from sympy.physics.continuum_mechanics.truss import Truss t = Truss() # Knoten t.add_node(("A", -3, 0), ("B", 0, 0), ("C", 4, 0), ("D", 7, 0), ("E", 6, 1.5), ("F", 2, 3), ("G", -2, 1.5)) # Stäbe t.add_member(("AB","A","B"), ("BC","B","C"), ("CD","C","D")) t.add_member(("AG","A","G"), ("GB","G","B"), ("GF","G","F")) t.add_member(("BF","B","F"), ("FC","F","C"), ("CE","C","E")) t.add_member(("FE","F","E"), ("DE","D","E")) # Auflager; roller ... Loslager, pinned ... Festlager t.apply_support(("A","roller"), ("D","pinned")) # Einwirkende Kräfte t.apply_load(("G", 5, 270), ("E", 3, 90)) # Berechnung t.solve() print("Reaction Forces: ", t.reaction_loads) print("Internal Forces: ", t.internal_forces) # Fachwerk zeichnen p = t.draw() p.show() Ausgabe auf der Konsole: Reaction Forces: {'R_A_y': 4.20000000000000, 'R_D_x': 0, 'R_D_y': -2.20000000000000} Internal Forces: {'AB': 2.80000000000000, 'BC': 0.333333333333333, 'CD': -1.46666666666667, 'AG': -5.04777178564958, 'GB': -2.05555555555556, 'GF': -1.23413387432364, 'BF': 0.411111111111111*sqrt(13), 'FC': -0.3*sqrt(13), 'CE': 1.50000000000000, 'FE': 0.284800124843917, 'DE': 2.64407093534026} Zeichnung: [[File:PythonIng_fachwerk1.svg|300px]] Details zu diesem Thema siehe z.B. [https://docs.sympy.org/latest/modules/physics/continuum_mechanics/index.html Continuum Mechanics] oder [https://docs.sympy.org/latest/tutorials/physics/continuum_mechanics/index.html Continuum Mechanics Tutorials]. Auch andere mechanische Probleme werden von SymPy abgehandelt ([https://docs.sympy.org/latest/tutorials/physics/index.html Physics Tutorials]). == Aufgabe == Gegeben sei ein einseitig eingespannter Kragträger. Belastet wird er durch eine Einzellast am Trägerende. Für die Daten siehe folgende ASCII-Skizze: | 20 kN //|---> x | //| V //|---------------------- //| 10 m | Elastizitätsmodul E = 2,1*10⁵ N/mm² Flächenträgheitsmoment I = 0.001 m⁴ Berechnen Sie die Auflagerreaktionen, den Querkraft- und Biegemomentenverlauf, sowie die Verformungen. Stellen Sie dies mit Hilfe von SymPy graphisch und auch mittels Formeln dar. Verwenden Sie dazu auch pprint (pretty print) aus dem SymPy-Modul. Zwecks Lösungsansatz siehe die oben aufgeführte Seite "Continuum Mechanics Tutorials". Achten Sie auch auf die Einheiten! Kontrollieren Sie das Ganze mittels händischer Rechnung. In dem genannten Tutorial ist von "Singularity Functions" die Rede. Gemeint ist damit in diesem Kontext die {{W|Föppl-Klammer}}. Einige Python-Programme, vorrangig zu Maschinenelementen, finden sich auf [https://baymp.de/download_python.html BayMP für Python] (Balken, Zahnräder, Stabknickung usw.). = Stochastik = Die Stochastik ist ein sehr weites Feld. Hier werden nur einige wenige sehr einfache, aber wichtige Themen angerissen. Python stellt mit den Moduln math und statistics Software zu diesem Zwecke bereit. math und statistics sind bereits im Lieferumfang von Python enthalten. Aber auch mit den externen Modulen NumPy, SciPy und pandas kann man Stochastik in Python betreiben. Dies wird hier aber nicht gemacht. == Lageparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] m1 = statistics.mean(werte) m2 = statistics.mode(werte) m3 = statistics.median(werte) print("Arithmetischer Mittelwert = ", m1) print("Modalwert = ", m2) print("Median = ", m3) Ausgabe: Arithmetischer Mittelwert = 3.5 Modalwert = 1 Median = 3.0 == Streuungsparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] s = statistics.stdev(werte) print("Standardabweichung = ", s) Ausgabe: Standardabweichung = 2.6770630673681683 == Kombinatorik == import math n = 7 k = 5 print("n! = ", math.factorial(n)) print("Kombinationen (n über k) = ", math.comb(n, k)) Ausgabe: n! = 5040 Kombinationen (n über k) = 21 = Ein- und Ausgabe = == print == Die Anweisung print haben wir schon oft verwendet. Hier soll anhand von Beispielen kurz beschrieben werden, was der Befehl print leisten kann. print("Hallo", "Welt", 1, sep="-") print("Hallo", end=" ") print("Welt") Ausgabe: Hallo-Welt-1 Hallo Welt == input == a = int(input("Zahl 1: ")) b = int(input("Zahl 2: ")) print("a + b = ", a+b) Ausgabe (nach Eingabe der beiden Ganzzahlen): Zahl 1: 4 Zahl 2: 5 a + b = 9 == Aus Dateien lesen == Es seinen die datei.txt Hallo Welt. Wie geht es dir? ... und test1.py dat = open("datei.txt", mode = "r") print(dat.read()) dat.close() Ausgabe Hallo Welt. Wie geht es dir? ... Mit dem open()-Befehl wird die Datei datei.txt im Lesemodus geöffnet (r ... read). Mit dem read()-Befehl wird die Datei eingelesen und mittels print ausgegeben. == In Dateien schreiben == dat = open("datei.txt", mode = "a", encoding = "utf-8") dat.write("Hänge Zeile an\n") dat.close() Die Datei datei.txt sieht nach Abarbeitung des obigen Skripts nun so aus Hallo Welt. Wie geht es dir? ... Hänge Zeile an Es wird die Datei im Schreibmodus geöffnet (a ... append (anhängend), w ... write (überschreibend)). write() fügt hier also eine Zeile Text am Dateiende ein. close() schließt die Datei wieder. Das close() kann man sich mit der with-Anweisung auch sparen. with open("datei.txt", mode="a", encoding="utf-8") as dat: dat.write("Hänge Zeile an\n") = Benutzeroberflächen erstellen = == tkinter == {{Wikipedia | Tkinter}} Python bietet standardmäßig das Modul tkinter zur Programmierung von Benutzeroberflächen. Es müssen also bei der Verwendung von tkinter keine externen Module installiert werden. Hier wird eine (sehr) kurze Einführung in das Erstellen von grafischen Oberflächen mittels tkinter gegeben. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") win.minsize(300, 50) but = tk.Button(win, text = "Push the button") but.pack() win.mainloop() Ausgabe: [[Datei:PythonIng_gui1.jpg]] Ein etwas komplizierteres Beispiel sei nachfolgend gezeigt. Es sollen zwei Strings miteinander verknüpft und ausgegeben werden. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") def on_button_clicked(): str = ent1.get() + ent2.get() lab2["text"] = str ent1 = tk.Entry(win) ent2 = tk.Entry(win) lab1 = tk.Label(win, text="verknuepfen mit") lab2 = tk.Label(win, text="") but = tk.Button(win, text = "=", command=on_button_clicked) ent1.pack(side="left") lab1.pack(side="left") ent2.pack(side="left") but.pack(side="left") ent2.pack(side="left") lab2.pack(side="left") win.mainloop() Ausgabe (vor der Eingabe der Teilstrings): [[Datei:PythonIng_gui2.jpg]] Ausgabe (nach der Eingabe der Teilstrings und dem Drücken des =-Buttons): [[Datei:PythonIng_gui3.jpg]] == curses == {{Wikipedia | curses}} Mit dem curses-Modul lassen sich u.a. TUIs ('''T'''ext '''U'''ser '''I'''nterfaces) erstellen. Ein sehr einfaches Beispiel zur allgemeinen Funktionsweise wird nachstehend geliefert. import curses stdscr = curses.initscr() curses.start_color() curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) stdscr.clear() stdscr.addstr("Hallo Welt", curses.color_pair(1)) stdscr.refresh() stdscr.getch() curses.endwin() Als Ausgabe sollte <span style="color:#FF0000;">Hallo Welt</span> (rote Schrift auf weißem Hintergrund) auf dem Terminal/der Konsole erscheinen. Getestet wurde dies mit openSUSE Tumbleweed, Python-Version 3.13.12. Das entsprechende Python-curses-Package muss installiert sein. Allgemeine Informationen zur Terminal-/Konsolengröße und Cursorposition liefert folgendes Programm: import curses stdscr = curses.initscr() stdscr.addstr(3, 5, "LINES: %d" % curses.LINES) stdscr.addstr(4, 5, "COLS: %d" % curses.COLS) (y,x) = stdscr.getyx() stdscr.addstr(5, 5, "Momentane Cursorposition: [%d, %d]" % (y, x)) (y,x) = stdscr.getbegyx() stdscr.addstr(6, 5, "Koordinatenursprung: [%d, %d]" % (y, x)) (y,x) = stdscr.getmaxyx() stdscr.addstr(7, 5, "Fenstergröße: [%d, %d]" % (y, x)) stdscr.addstr(11, 2, "Taste drücken -> Ende") stdscr.refresh() stdscr.getch() curses.endwin() Es sollte sich in etwa folgende Ausgabe ergeben: LINES: 44 COLS: 110 Momentane Cursorposition: [4, 15] Koordinatenursprung: [0, 0] Fenstergröße: [44, 110] Taste drücken -> Ende Zur Funktionsweise von curses siehe auch das Wikibook [[ncurses]]. Zum Verständnis sind dort allerdings elementare Kenntnisse in der Programmiersprache C erforderlich. == Qt == {{Wikipedia | Qt (Bibliothek)}} Auch für das Qt-Framework gibt es eine Anbindung an Python. Nachfolgend ein einfaches Beispiel. import sys from PySide6.QtWidgets import QApplication, QLabel app = QApplication(sys.argv) label = QLabel("Hallo Welt!") label.show() sys.exit(app.exec()) Ausgabe: [[Datei:PythonIng_gui10.png]] == Gtk == {{Wikipedia | GTK (Programmbibliothek)}} Eine idente Ausgabe, wie oben für Qt gezeigt, erzeugt z.B. folgendes Gtk-Programm: import gi gi.require_version("Gtk", "4.0") from gi.repository import Gtk def on_activate(app): win = Gtk.ApplicationWindow(application=app) lab = Gtk.Label(label="Hallo Welt!") win.set_child(lab) win.present() app = Gtk.Application() app.connect('activate', on_activate) app.run(None) Auch für die Benutzung von Qt und Gtk müssen die jeweiligen Packages installiert sein. Getestet wurden die entsprechenden Python-Programme nur unter openSUSE Tumbleweed. Wie das GTK-Paket unter MS Windows 11 installiert wird, siehe z.B. [https://www.gtk.org/docs/installations/windows Setting up GTK for Windows]. Damit sei aber das Thema "Benutzeroberflächen erstellen" hier abgeschlossen, da dies schon ein sehr spezielles Aufgabengebiet ist, das eher Informatiker und nicht so sehr Ingenieure anspricht. Bei Bedarf siehe aber ggf. die entsprechenden Links unten in diesem Tutorial. Dort sind weiterführende Informationen zu finden. = Style Guide und flake8 = Wie man schönen und richtigen Python-Code schreibt, erfahren Sie in * [https://peps.python.org/pep-0008/ PEP 8 – Style Guide for Python Code] Ein Modul, das prüft, ob die Richtlinien im Style Guide eingehalten wurden, ist ''flake8'': * [https://flake8.pycqa.org/en/latest/ Flake8: Your Tool For Style Guide Enforcement] = Einige Integrierte Entwicklungsumgebungen (IDEs)= Werden Programmtexte größer und umfangreicher, so ist das Arbeiten mit der interaktiven Programmierumgebung bzw. das direkte Ausführen von Python-Skripten mühsam. Man wünscht sich z.B. Hilfen zum Debuggen oder die automatische Code-Vervollständigung. Zu diesem Zweck wurden IDEs (Integrated Development Environments) geschaffen. Von diesen seinen nachfolgend auszugsweise einige kurz beschrieben. Testen Sie einfach aus, welche davon für Sie bzw. für Ihr Python-Projekt geeignet sind. == IDLE == IDLE ist die mit dem Python-Programmpaket mitgelieferte IDE. Der Name leitet sich einerseits ab vom Monty-Python-Mitglied Eric Idle, andererseits steht es als Abkürzung für "'''I'''ntegrated '''D'''evelopment and '''L'''earning '''E'''nvironment. IDLE ist einfach zu bedienen, bietet aber schon einen beachtlichen Leistungsumfang. Nachfolgend wird ein Screenshot zu IDLE geliefert. Rechts ist das Editor-Fenster zu sehen, links die interaktive Programmierumgebung. Um das Beispiel selbst nachvollziehen zu können, starten Sie IDLE. Das geht ähnlich, wie Sie die interaktive Programmierumgebung von Python starten (nur, dass Sie eben das IDLE-Icon doppelklicken und nicht das Python-Icon. Unter Linux geben Sie einfach in einem Terminal <code>idle3.13</code> o. Ä. ein). Weiter geht es mit "File - Open - ...". Die auszuführende Datei auswählen (im konkreten Fall ein "Hallo-Welt"-Programm). Es erscheint das rechte Fenster. Dort "Run - Run Module" auswählen. Und schon wird im linken Fenster "Hallo Welt!" ausgegeben. [[Datei:PythonIng_idle1.jpg | 600px]] Siehe auch {{W|IDLE}}. == PyCharm == PyCharm ist ein kommerzielles Produkt. Es gab aber auch eine kostenlose Community Edition. Seit 2025 sind beide Varianten vereint. Für die ersten 30 Tage sind die Pro-Funktionen frei verfügbar, danach nur noch die Kernfunktionalitäten (oder man bezieht kostenpflichtig die Pro-Version). Zu beziehen ist PyCharm unter dem Weblink [https://www.jetbrains.com/pycharm/]. Nachfolgend ein etwas abgewandeltes "Hallo Welt"-Programm, editiert und ausgeführt mit PyCharm. [[Datei:PyCharm_IDE_2023_screenshot.png | 600px]] Siehe auch {{W|PyCharm}}. == Eric == Auch eric ist Open Source und steht unter der GNU General Public License Version 3 oder später. Zu beziehen ist diese Software unter [https://eric-ide.python-projects.org/]. [[Datei:Screenshot_Eric_4.png | 600px]] Siehe auch {{W|eric (Software)}}. <small> Unter openSUSE Tumbleweed sollte sich eric auch mit YaST installieren lassen. Bei mir gibt es aber dann beim Ausführen des eric-Programms eine Fehlermeldung (Stand März 2026): ... ModuleNotFoundError: No module named 'PyQt6.QtPdfWidgets' Umgehen kann man dieses Problem aber wieder mit dem Erstellen einer virtuellen Umgebung, in etwa so python3.13 -m venv ~/tmp/venv1 cd ~/tmp/venv1/bin ./python3.13 -m pip install --upgrade --prefer-binary eric-ide ./eric7_ide </small> == PyScripter == Vom Funktionsumfang vergleichbar mit den vorherigen IDEs ist PyScripter. Auch PyScripter ist Open Source. Die Projekt-Homepage findet sich auf [https://sourceforge.net/projects/pyscripter/]. PyScripter ist nur für MS Windows verfügbar. [[Datei:PythonIng_pyscripter1.jpg | 600px]] == Spyder IDE == Spyder enthält bereits eine stabile Python-Version und etliche Module (z.B. matplotlib, numpy, control). Ansonsten kann dieses Softwarepaket vom Funktionsumfang her mit den anderen genannten IDEs locker mithalten. Spyder wurde unter der MIT-Lizenz veröffentlicht. Diese Software findet sich auf [https://www.spyder-ide.org]. [[Datei:Spyder-windows-screenshot.png | 600px]] Siehe auch {{W|Spyder (Software)}} == Sonstige == Die genannten IDEs sind nicht die Einzigen. Es gibt, um dem Image Pythons als beliebteste Programmiersprache gerecht zu werden, noch einige andere. Sowohl Open Source-Programme als auch kommerzielle Programme sind im Web zu finden, z.B. Thonny oder {{W|Visual Studio Code}}. Braucht man den Umfang von ausgewachsenen IDEs nicht, so kann man auch normale Texteditoren verwenden (z.B. {{W|Geany}} oder {{W|Kate_(Texteditor)|Kate}}). = Debuggen und Testen = Das Debuggen und Testen von Programmen sind wichtige Bestandteile der Programmierung. Syntaxfehler lassen sich i.A. leicht beheben. Schwieriger ist das Eingrenzen von logischen Fehlern, die ev. nur in bestimmten Situationen auftreten und keine explizite Fehlermeldung hervorrufen. Das Programm liefert falsche Ergebnisse oder es stürzt aus heiterem Himmel ab. Um das zu verhindern gibt es verschiedene Werkzeuge, die bei der Fehlersuche behilflich sein können. Vorerst siehe aber zwecks Begriffsklärung noch folgende Links: * {{W|Debuggen}} * {{W|Debugger}} * {{W|Softwaretest}} <gallery> First Computer Bug, 1947.jpg Test ganzheitlich.png V-Modell.svg </gallery> == Das Modul pdb == Python bringt schon ein Modul zum Debuggen mit. Siehe z.B. [https://docs.python.org/3/library/pdb.html pdb — The Python Debugger]. Komfortabler lässt sich das aber mittels Integrierter Entwicklungsumgebungen (IDEs) angehen. == Debuggen mit IDEs == Für die IDEs IDLE und Spyder sei kurz auf die entsprechenden Webseiten verwiesen: * [https://www.cs.uky.edu/~keen/help/debug-tutorial/debug.html Debugging under IDLE]. * [https://docs.spyder-ide.org/current/panes/debugging.html Spyder Debugger] Dort wird die Vorgehensweise auch mittels Screenshots erläutert. == assert == assert ... behaupten, zusichern ({{W|Assertion (Informatik)}}) Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10., 0.) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10., 0.) File "/home/hr/Develop/test1.py", line 4, in print1 assert y != 0.0 ^^^^^^^^ AssertionError Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1("10.", "5.") File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Aber auch bei nachfolgendem Code gibt es eine Fehlermeldung: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10, 5) File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Damit letzteres funktioniert, kann man den Programmcode so umschreiben: def print1(x, y): assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 2.0 Und jetzt fangen wir den <code>AssertionError</code> auf: def print1(x, y): try: assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) except(AssertionError): print("Hallo") print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Hallo Ich hoffe, es ist wenigstens im Ansatz klar geworden, wofür <code>assert</code> gut sein kann. Ausschalten kann man die <code>assert</code>-Überprüfung übrigens mit dem Python-Schalter <code>-O</code>. == Doctests == Innerhalb eines Docstrings kann die Arbeit im interaktiven Modus simuliert werden. Nach den Promptzeichen (>>>) erfolgen dann bei unserem Beispiel innerhalb des Docstrings simulierte Aufrufe der Funktion <code>print1()</code>. Danach folgen jeweils die Sollresultate. Wird das Modul oder die Datei als Hauptprogramm aufgerufen, so wird die Funktion <code>doctest.testmode()</code> aufgerufen und ein Bericht auf der Konsole ausgegeben. Wird das Modul nicht als Hauptprogramm aufgerufen, sondern importiert, dann wird diese <code>testmod</code>-Funktion nicht aufgerufen. D.h. dieser Code kann sowohl für Testzwecke als auch für den produktiven Einsatz verwendet werden. Das ist auch sinnvoll, weil wenn man Teile der Datei immer löschen bzw. einfügen müsste, so würden sich Fehlerquellen auftun. Das würde den Sinn und Zweck von Doctests konterkarieren. def print1(x=0., y=1.): """ Dividiere zwei Zahlen Autor: Intruder Datum: 12.08.2025 >>> print1(2., 1.) 2.0 >>> print1(5., 2.) 2.5 >>> print1(5.) 5.0 """ print(x/y) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) Ausgabe: Trying: print1(2., 1.) Expecting: 2.0 ok Trying: print1(5., 2) Expecting: 2.5 ok Trying: print1(5.) Expecting: 5.0 ok 1 items had no tests: __main__ 1 items passed all tests: 3 tests in __main__.print1 3 tests in 2 items. 3 passed and 0 failed. Test passed. Das gezeigte Beispiel ist so ziemlich das einfachste, das es gibt. Für weiterführende Details siehe z.B.: * [https://peps.python.org/pep-0257/ PEP 257 – Docstring Conventions] * [https://docs.python.org/3/library/doctest.html doctest — Test interactive Python examples] == pytest == Siehe zu diesem Thema auch {{W|Modultest}}. pytest ist ein externes Modul und muss vorab installiert werden, z.B. mittels pip install -U pytest pip install -U pytest-html Python-Code, Datei test1.py: def add(x, y): return x + y def test_answer(): assert add(1, 1) == 3 Starten von pytest in der Konsole: pytest test1.py Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py F [100%] ========================================================= FAILURES ========================================================== ________________________________________________________ test_answer ________________________________________________________ def test_answer(): > assert add(1, 1) == 3 E assert 2 == 3 E + where 2 = add(1, 1) test1.py:6: AssertionError ================================================== short test summary info ================================================== FAILED test1.py::test_answer - assert 2 == 3 ===================================================== 1 failed in 0.09s ===================================================== Hier erhalten wir einen Fehler, da 1+1 eindeutig ungleich 3 ist. Aber aus irgendeinem Grund wollte der Programmierer oder Tester in diesem Fall, dass dies so ist. Testfälle werden übrigens mit dem Präfix <code>test_</code> eingeleitet. Python-Code: def add(x, y): return x + y + 1 def test_answer(): assert add(1, 1) == 3 Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py . [100%] ===================================================== 1 passed in 0.01s ===================================================== Jetzt ist alles in Ordnung. Weiterführendes siehe z.B. * [https://docs.pytest.org/en/stable/ pytest: helps you write better programs] == unittest == Auch unittest dient zur Durchführung von Testreihen, ist aber Bestandteil von Python. Hier wird vorerst nicht näher darauf eingegangen. Siehe z.B. * [https://docs.python.org/3/library/unittest.html unittest — Unit testing framework] Lt. ''Inden: Python Challenge; dpunkt, 2021, Seite 481'' soll unittest weniger komfortabel als pytest sein. Einen Vergleich von unittest mit pytest findet man in * [https://knapsackpro.com/testing_frameworks/difference_between/pytest/vs/unittest pytest vs unittest] = Ausblick = Dies war eine kurze Einführung in die Berechnungs- und Darstellungsmöglichkeiten mit Python. Es sollten etliche relevante Themen behandelt, oder zumindest kurz angesprochen worden sein. Wem dieser Text nicht ausreichend ist, der sei auf die entsprechenden weiterführenden Weblinks, Bücher und die Python-Hilfefunktion verwiesen. Python kennt noch viel mehr Befehle, als hier dargestellt wurden. Das Themenspektrum ist auch durch die Einbindung externer Module fast beliebig erweiterbar. = Weblinks= == Python allgemein == * [https://www.python.org/ Python Homepage] == Externe mathematische Module == * [https://numpy.org/ NumPy] * [https://numpy.org/doc/stable/user/numpy-for-matlab-users.html NumPy for MATLAB users] * [https://scipy.org/ SciPy] * [https://www.sympy.org/en/index.html SymPy] * [https://pandas.pydata.org/ pandas] * [https://github.com/maroba/findiff findiff] * [https://mpmath.org/ mpmath] == Externe Module für Grafiken == * [https://matplotlib.org/ Matplotlib] * [https://vpython.org/ VPython] * [https://docs.vtk.org/en/latest/api/python.html VTK] == Erstellung von User Interfaces == * [https://docs.python.org/3/library/tkinter.html tkinter - Python interface to Tcl/Tk] * [https://docs.python.org/3/library/curses.html curses - Terminal handling for character-cell displays] * [https://wiki.qt.io/Qt_for_Python Qt for Python] * [https://www.gtk.org/docs/language-bindings/python GTK and Python] == Erstellen virtueller Umgebungen == * [https://docs.python.org/3/library/venv.html venv - Creation of virtual environments] == Sonstige == * [https://python-control.readthedocs.io/en/stable/ Python Control Systems Library] * [https://pypi.org/project/regex/ regex - Regular Expressions] = Bücher = == Gedruckte Bücher, OpenBooks, Magazine == * Diverse: c't Python Lernen, Verstehen, Anwenden; Heise, 2022 * Ernesti, Kaiser: Python3 - das umfassende Handbuch; 5. Aufl., Rheinwerk, [https://openbook.rheinwerk-verlag.de/python/ OpenBook] * Inden: Python Challenge; dpunkt, 2021, ISBN 978-3-86490-809-5 * Klein: Numerisches Python; 2. Aufl., Hanser, 2023, ISBN 978-3-446-47170-2 * Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler; Rheinwerk, 2021, ISBN 978-3-8362-7316-9 * Weigend: Python 3 - Das umfassende Praxisbuch; 9. Aufl., mitp, 2022, ISBN 978-3-7475-0544-1 * Woyand: Python für Ingenieure und Naturwissenschaftler; 4. Aufl., Hanser, 2021, ISBN 978-3-446-46483-4 == Andere Wikibooks == * [[:en:Subject:Python_programming_language | Englische Wikibooks zum Thema Python]] * [[Python|Deutschsprachiges Python-Wikibook]] [[Bild:2von10.png|20%]] * [[Python unter Linux|Python 2.7 unter Linux]] [[Bild:10von10.png|100%]] {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} dg2pxhukvf5fzdiq3zl2dyfoty4h9at 1082861 1082859 2026-04-06T13:45:18Z Intruder 1513 /* Mit VTK */ Pipeline-Prinzip hinzu 1082861 wikitext text/x-wiki {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} = Hallo Welt und allgemeine Hinweise = == Was ist Python == * Python ist eine universelle höhere Programmiersprache. * Python ist objektorientiert. * Python ist Open-Source (Python Software Foundation License). * Python ist für viele Betriebssysteme erhältlich (z.B. für Linux, MS Windows, macOS). * Python ist ein Interpreter. * Python ist durch Module fast beliebig erweiterbar. * Python als Programmiersprache ist case-sensitive - d.h. Groß- und Kleinschreibung ist relevant bei der Eingabe von Befehlen. {{Wikipedia | Python (Programmiersprache)}} == Python installieren == === MS Windows === Laden Sie das aktuelle Python-Paket von der Webseite [https://www.python.org/] herunter. Weiter geht es wie bei jedem anderen größeren zu installierenden Programm. Einfach das Installationsprogramm im Explorer doppelklicken und den Anweisungen des Setup-Programmes folgen. === Linux === Entweder ist Python bereits standardmäßig installiert, ansonsten ist die Installation mittels Paketmanagementsystem einfach möglich. Aber auch die Spyder-Entwicklungsumgebung ([https://www.spyder-ide.org]) bietet einen guten Einstieg mit Python (das gilt auch für MS Windows). Spyder bringt auch schon etliche wichtige Module standardmäßig mit. == Python starten == === MS Windows === Das Icon für das Python-Programm doppelklicken. Und schon startet das Programm. [[Datei:PythonIng_start1.jpg]] Python im interaktiven Modus präsentiert sich dann so: Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> Alternativ kann das Programm auch über die Eingabeaufforderung oder die PowerShell gestartet werden: c:\devel\Python>python.exe Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> === Linux === Tippen Sie einfach das Wort „python“ (oder unter openSUSE Tumbleweed z.B. auch „python3.11“ oder „python3.13“) in einem Linux-Terminal ein, schließen den Befehl mit der RETURN-Taste ab, und schon startet Python im interaktiven Modus: Python 3.13.12 (main, Feb 09 2026, 22:37:44) [GCC] on linux Type "help", "copyright", "credits" or "license" for more information. >>> Es gibt auch noch andere Möglichkeiten Python zwecks Programmausführung zu starten, z.&nbsp;B. den {{W|Shebang}} (<code>#!</code>) am Beginn eines Python-Scripts. Das Script sei als Script.py gespeichert. Dann kann das Script mit ./Script.py ausgeführt werden. Für openSUSE Tumbleweed sei nachfolgend ein lauffähiges "Hallo Welt!"-Script angegeben. Es wird in diesem Script der Python-Interpreter in der Version 3.13 verwendet : #!/usr/bin/python3.13 print("Hallo Welt!") Die Berechtigungen zum Ausführen der Datei müssen natürlich noch richtig gesetzt werden, z.B. mittels <code>chmod 777 Script.py</code>. <small>Oder es wird in einen Pfad verschoben, in dem sich ausführbare Programme generell befinden (<code>echo $PATH</code>). Das Script kann dann wie ein normales Programm ohne weitere Angaben mit Script.py gestartet werden. Alternativ wird nicht das Script an sich verschoben, sondern nur ein symbolischer Link angelegt, z.B. mit <code>ln -s ~/tmp/Script.py ~/.local/bin/Script.py</code>.<code>~/.local/bin</code> sei ein im PATH gelegenes Verzeichnis. Dies sind aber schon Features für fortgeschrittene Linux-Benutzer und werden am Anfang eher selten benötigt.</small> == Ein paar Worte zur Erklärung == Getestet wurden die Beispiele unter den Betriebssystemen * MS Windows 10 mit der Python-Version 3.12.0 (teilweise auch mit 3.12.2 und 3.13.1; nur die Inhalte die bis spätestens Juli 2025 erstellt wurden) * MS Windows 11 ab der Python-Version 3.13.4 (nur zum Teil; ab Juli 2025) * openSUSE Leap 15.6 mit der Python-Version 3.11.12 (Spyder, nur vereinzelt) und zum Teil mit 3.12.11 (ab Juli 2025 bis November 2025). * openSUSE Tumbleweed ab der Python-Version 3.13.9 (nur vereinzelt, ab November 2025) An Beliebtheit rangiert Python mit Stand März 2026 mit einem Rating von 21,25% an 1. Stelle vor C und C++ (lt. [https://www.tiobe.com/tiobe-index/ TPCI - TIOBE Programming Community Index]). Lt. [https://innovationgraph.github.com/global-metrics/programming-languages GitHub Top 50 Programming Languages Globally] lag Python im Q3/2025 auf Rang 2, vor TypeScript und hinter JavaScript. Der Name "Python" rührt von der Komikertruppe {{W|Monty Python}} her. Die Icons für Python (z.B. Python selbst, Eric IDE, IDLE) sind aber durch die Python-Schlangenart symbolisiert. <gallery> Python-logo-notext.svg|Python-Logo Guido van Rossum OSCON 2006.jpg|Guido van Rossum (geb. 1956), der Erfinder von Python </gallery> == Ein erstes Programm == Kommentare werden in Python mit der Raute (#) eingeleitet. Sie werden vom Python-Interpreter ignoriert. Text kann mit der print-Funktion ausgegeben werden. Starten Sie Python und geben sie folgende Anweisungen zeilenweise ein >>> # Das ist ein Kommentar >>> print("Hallo Welt!") Als Ergebnis erhalten Sie Hallo Welt! Der Prompt (>>>) ist selbstverständlich nicht einzutippen, sondern wird vom Python-System geliefert. Strings können in Python entweder in Anführungszeichen (") gesetzt werden oder in Hochkommatas('). In diesem Text wird die erste Variante bevorzugt eingesetzt. Im Gegensatz zu Julia ist es hier egal, ob zwischen <code>print</code> und der öffnenden Klammer Leerzeichen stehen. = Python als Taschenrechner = == Allgemeines == Wir wollen 3 * 5 berechnen. Dazu starten wir Python im interaktiven Modus. Geben Sie dann die Formel >>> 3 * 5 ein, drücken die Taste ENTER/RETURN ({{Taste|↵}}) und erhalten als Ergebnis 15 Auch kompliziertere Ausdrücke sind möglich. Beispielsweise mit Winkelfunktionen, Quadratwurzeln etc. Wir wollen nun den Ausdruck <math>\sin\sqrt{15}</math> berechnen : >>> import math >>> math.sin(math.sqrt(15)) -0.6679052983383519 Als erstes wird das math-Modul importiert. Dann wird der mathematische Ausdruck berechnet. Eine andere Variante, die dasselbe Ergebnis liefert, ist >>> from math import * >>> sin(sqrt(15)) -0.6679052983383519 Es wird also aus dem Modul <code>math</code> alles importiert (erkennbar am <code>*</code>). Will man nicht alles importieren, so kann man das auch einschränken: >>> from math import sin, sqrt Beenden lässt sich das Python-Programm durch Eingabe von <code>exit()</code> (und natürlich ist zur Bestätigung die RETURN-Taste zu drücken). == Die Hilfefunktion von Python == Bei Eingabe der Anweisung help() springt Python in den Hilfemodus. Eingabe: >>> help() Eingabe: help> math.sin Ausgabe: Help on built-in function sin in math: math.sin = sin(x, /) Return the sine of x (measured in radians). Für die komplette Python-Dokumentation siehe [https://docs.python.org/3/]. Verlassen kann man den Hilfemodus durch das Drücken von STRG-C. == Aufgaben == * Erkunden Sie die Tangensfunktion "tan" mittels Python-Hilfe (vergessen Sie nicht das math-Modul zu importieren und das <code>math.</code> vor <code>tan</code>) * Berechnen Sie mit Python den Ausdruck <math>\frac{1}{2}\cdot e^2 \cdot \tan(\pi/3)</math>. Siehe für die Exponentialfunktion im Python-Hilfesystem auch den Befehl <code>math.exp</code>. Alternativ kann auch die Konstante <code>math.e</code> eingesetzt werden. Potenzieren kann man bei Python mit dem **-Operator (z.B. 2**3 = 8). Für <math>\pi</math> gibt es <code>math.pi</code>. = Python als Scriptsprache = Häufig wird man aber kompliziertere Anweisungsfolgen verarbeiten müssen. Diese will man normalerweise nicht jedesmal neu eingeben, sondern in einer Datei speichern und diese Datei dann zur Ausführung bringen. Speichern Sie dazu folgenden Code in einer Textdatei, z.B. unter MS Windows als c:\tmp\test1.py # Das ist ein Kommentar print("Hallo Welt!") Python-Dateien werden mit der Dateiendung .py versehen. Achten Sie darauf, dass vor dem print keine Leerzeichen vorhanden sind. Das ist eine Python-Eigenheit. Wie wir später sehen werden, nutzt Python Einrückungen als syntaktisches Mittel, z.B. um bei Schleifen den Schleifenkörper zu kennzeichnen. Danach bringen Sie die Skriptdatei test1.py (sozusagen das Hauptprogramm) folgendermaßen zur Ausführung: 1) Starten Sie unter MS Windows die Eingabeaufforderung (oder alternativ auch die Windows PowerShell). Das sieht dann etwa so aus: Microsoft Windows [Version 10.0.19045.3693] (c) Microsoft Corporation. Alle Rechte vorbehalten. C:\Users\xyz> : <small>Falls jemand nicht weiß, wie man die Eingabeaufforderung startet: Eine Möglichkeit ist, einfach in der Taskleiste von Windows das "Start"-Symbol &nbsp;([[Image:Windows_logo_-_2021_(Black).svg|10px]])&nbsp; mit der rechten Maustaste anklicken. "Ausführen" auswählen (oder alternativ für die PowerShell unter Windows 10 den Eintrag "Windows PowerShell", unter Windows 11 den Eintrag "Terminal"). Im sich öffnenden Dialogfenster gibt man in die "Öffnen"-Zeile das Wort <code>cmd</code> ein und mit "OK" wird das Ganze bestätigt.</small> 2) Wechseln Sie mittels <code>cd c:\tmp</code> in das Verzeichnis c:\tmp 3) Angenommen, Sie haben Python unter dem Pfad <code>c:\devel\Python\</code> installiert. Starten Sie das Programm so (der Prompt <code>c:\tmp></code>ist natürlich nicht mit einzutippen): c:\tmp>c:\devel\Python\python.exe test1.py 4) Wie erwartet ergibt sich folgende Ausgabe am Bildschirm Hallo Welt! Die Vorgehensweise unter Linux ist prinzipiell gleich. Die kleinen Unterschiede, wie z.B. der Slash statt dem Backslash in Pfadangaben, sollten für Linux-Benutzer keine Hürde darstellen. == Variablen == Variablenbezeichner können aus Buchstaben (A-Za-z), Ziffern (0-9) und Underscores (_) bestehen, dürfen aber nicht mit einer Zahl beginnen. Führende Underscores haben u.a. im Kontext mit der Objektorientierten Programmierung eine spezielle Bedeutung und sollten nicht für "normale" Variablenbezeichner verwendet werden. Gültige Variablenbezeichner wären also: xyz x1 _wert name_anzahl Es gibt in Python etliche Schlüsselwörter (z.B. for, if oder return). Diese dürfen nicht als eigene Variablenbezeichner verwendet werden. Eine Liste aller Schlüsselwörter liefert das Script import keyword print(keyword.kwlist) <small>Übung: Speichern Sie dieses Script in eine Datei, z.B. in c:\tmp\test1.py. Führen Sie diese Datei aus, um die Liste der Schlüsselwörter auszugeben.</small> Da Python case-sensitiv ist, repräsentieren folgende Bezeichner verschiedene Variablen: xyz XYZ xYz Werte werden an Variablen mittels Gleich-Zeichen (=) zugewiesen. Im Folgenden wird der Code immer in der Datei c:\tmp\test1.py gespeichert. x = 5 y = 10 z = x*y print(z) Bringen Sie die Datei test1.py zur Ausführung so erhalten Sie folgende Bildschirmausgabe 50 Sie können auch mehrere Anweisungen in einer Zeile durch Semikolon getrennt schreiben. Dies führt aber zu unübersichtlichem Code. x = 5; y = 10; z = x*y; print(z) Ausgabe: 50 Auch aus der Programmiersprache C/C++ oder Java bekannte Konstrukte können Sie verwenden, z.B. x = 5 # x = x - 2 x -= 2 print(x) Bildschirmausgabe: 3 Beachten Sie, dass mit dem =-Zeichen eine Wertezuweisung durchgeführt wird. Dies ist nicht äquivalent zum mathematischen =-Zeichen, wie am vorigen Beispiel zu ersehen ist. Den Inkrement-/Dekrementoperator (z.B. x++ oder x--) aus C/C++ oder Java kennt Python aber nicht. Variablen sind nicht an einen bestimmten Datentyp gebunden, folgendes ist mit Python problemlos möglich: import math wert = 10 print(wert) wert = 35.5 print(wert) wert = "Hallo" print(wert) wert = math.pi print(wert) Ausgabe: 10 35.5 Hallo 3.141592653589793 == Physische und logische Zeilen == In Python muss eine Anweisung in einer logischen Zeile Platz finden. Wird eine Anweisung aber zu lang für eine Zeile, dann kann sie in mehrere physische Zeilen unterteilt werden. Dies kann einerseits durch einen Backslash am Ende einer Zeile geschehen, z.B. a = 2 + \ 5 Dies stellt eine logische Zeile dar, die in zwei physische Zeilen unterbrochen ist. Geklammerte Ausdrücke werden automatisch zu einer logischen Zeile verbunden, z.B. a = (2 + 5) Achtung: Im ersten Beispiel darf nach dem Backslash nichts mehr stehen, auch kein Kommentar. Dies trifft im zweiten Bespiel nicht zu, hier könnte noch ein Kommentar folgen, z.B. a = (2 + # Kommentar 5) Auch für Strings gibt es Möglichkeiten, diese auf mehrere Zeilen aufzuspalten. # Kurzer String str1 = "ABC" # Langer String str2 = """Hallo Welt, Grüetzi Schwyzer, Servus an alle""" # Backslash str3 = "UVW\ XYZ" print(str1) print(str2) print(str3) Ausgabe: ABC Hallo Welt, Grüetzi Schwyzer, Servus an alle UVWXYZ ==Hexadezimale, oktale, binäre und andere Zahlen== d = 1050 # Dezimalzahl h = 0xAA2 # Hexadezimalzahl o = 0o12 # Oktalzahl b = 0b100001101 # Binärzahl print(d) print(h) print(o) print(b) Ausgabe: 1050 2722 10 269 Groß- und Kleinbuchstaben sind in obigen Literalen übrigens egal. So kann man z.B. statt <code>0b1001</code> auch <code>0B1001</code> schreiben (siehe dazu [https://docs.python.org/3/reference/lexical_analysis.html#integer-literals]). Sie können auch dezimale in hexadezimale Zahlen umwandeln, usw.: h = hex(1050) # Dezimalzahl -> Hexadezimalzahl b = bin(1050) # Dezimalzahl -> Binärzahl o = oct(1050) # Dezimalzahl -> Oktalzahl print(h) print(b) print(o) Ausgabe: 0x41a 0b10000011010 0o2032 Gegeben sei die Zahl 121 zur Basis 3. Diese soll in eine Dezimalzahl umgewandelt werden. Das kann so geschehen: z = int("121", 3) print(z) Ausgabe: 16 Dass dies richtig ist, davon kann man sich folgendermaßen überzeugen: <math> 1 \cdot 3^2 + 2 \cdot 3^1 + 1 \cdot 3^0 = 9 + 6+ 1 = 16 </math> Zahlen übersichtlicher schreiben kann man auch mittels Underscore, z.B.: print("Eine Million (Variante 1) =", 1000000) print("Eine Million (Variante 2) =", 1_000_000) print("Eine Rechnung:", 2_000 * 400_000); Es ergibt sich bei beiden Varianten die gleiche Ausgabe. Variante 2 ist aber im Sourcecode leichter lesbar, detto die Zahlen in der Rechnung: Eine Million (Variante 1) = 1000000 Eine Million (Variante 2) = 1000000 Eine Rechnung: 800000000 == Strings und Platzhalter== Ein paar einfache Beispiele: print("Hallo {}" . format("Hugo")) print("Hallo {:s}" . format("Hugo")) print("Hallo %s" % "Hugo") Ausgabe: Hallo Hugo Hallo Hugo Hallo Hugo Python-Code (formatted string literals): str1 = "Hallo" str2 = "Hugo" print(f"{str1} {str2}") Ausgabe: Hallo Hugo Komplexere Beispiele: print("Hallo {} und {}" . format("Hugo", "Mike")) print("Hallo {name1} und {name2}" . format(name2="Hugo", name1="Mike")) # Füllzeichen: * # Bündigkeit: > (=rechts), < (=links), ^ (=zentriert) # Feldweite: 10 # Typ: s (=String), f (=Gleitkommazahl), d (=Dezimalzahl) etc. print("Hallo {:*>10s}" . format("Hugo")) print("Hallo {:*<10s}" . format("Hugo")) Ausgabe: Hallo Hugo und Mike Hallo Mike und Hugo Hallo ******Hugo Hallo Hugo****** Python-Code: str = "Hallo\t%s\t%7.2f\t%10.2e\t%i" % ("Hugo", 12.34567, 34.567, 264) print(str) Ausgabe: Hallo Hugo 12.35 3.46e+01 264 == Unicode == Neben den bekannten ASCII-Zeichen lassen sich Zeichen auch mittels Unicode beschreiben. Griechische Buchstaben oder komplexere mathematische Operatoren - all das sollte kein Problem sein. Siehe auch {{W|Unicode}}, {{W|Liste der Unicodeblöcke}} und {{W|Unicodeblock Mathematische Operatoren}}. Im Folgenden werden ein paar Zeichen (Allquantor, Nabla-Operator, Existenzquantor), die man aus der Mathematik kennt, erzeugt. ch1 = "\N{FOR ALL}" ch2 = "\N{NABLA}" ch3 = "\u2203" print(ch1, ch2, ch3) Ausgabe: ∀ ∇ ∃ <small>Diese Ausgabe ergibt sich z.B. mit der IDLE-Shell oder mit Cygwin. Beim Ausführen über die Windows-Eingabeaufforderung oder Windows PowerShell unter MS Windows 10 erfolgt keine korrekte Darstellung. IDLE ist die mit Python mitgelieferte IDE ('''I'''ntegrated '''D'''evelopment '''E'''nvironment, Integrierte Entwicklungsumgebung). Gegen Ende dieses Textes wird IDLE kurz beschrieben. Das Problem mit der Windows Eingabeaufforderung lässt sich aber umgehen. Man muss nur eine Schriftart auswählen, die die Zeichen kennt, z.B. "DejaVu Sans Mono". Dazu klicken Sie einfach bei der Eingabeaufforderung mit der rechten Maustaste oben auf die weiße Leiste und wählen im aufpoppenden Fenster den Menüpunkt "Eigenschaften". Es öffnet sich ein Dialogfenster. Über den Reiter "Schriftart" lässt sich nun die Schriftart einstellen. Unter MS Windows 11 oder openSUSE Leap 15.6 (bash-Konsole) gibt es dieses Problem ohnehin nicht.</small> == Reguläre Ausdrücke == Python kennt auch {{W|Regulärer Ausdruck|reguläre Ausdrücke}}. Dazu gibt es in Python das Modul <code>re</code>. Beipielsweise sollen alle Zahlen (<math>\text{zahl}\in\mathbb{N}_0</math>) in einem String gesucht und ausgegeben werden. Als String sei gegeben: <code>3x Grüße und 100 Kekse.</code> Das Muster (Pattern) ist <code>\d+</code>. <code>\d</code> steht für eine Dezimalziffer 0-9. Das Plus-Zeichen (+) steht symbolisch für ein oder mehrere Zeichen des vorherigen Ausdrucks. Hier also ein oder mehrere Dezimalziffern. Es wird die Funktion <code>findall</code> aus dem Modul <code>re</code>verwendet. Python-Code: from re import findall str = "3x Grüße und 100 Kekse." pat = "\\d+" # Doppel-Backslashes müssen verwendet werden, sonst gibt Python eine Warnung aus! # alternativ: pat = r"\d+" # oder: pat = "[0-9]+" numb = findall(pat, str) print(numb) Ausgabe: ['3', '100'] Python kennt noch viele weitere Möglichkeiten mittels regulärer Ausdrücke zu hantieren. Dies soll hier aber nicht vertieft werden, da das Thema schon ziemlich speziell und komplex ist. Bei Bedarf siehe aber z.B. die Bücher ''Weigend, Seite 380ff'' und ''Ernesti, Kaiser'' [https://openbook.rheinwerk-verlag.de/python/28_001.html] oder die Python-Dokumentation [https://docs.python.org/3/library/re.html]. Auch [[Python unter Linux: Reguläre Ausdrücke]] liefert ein umfangreiches und brauchbares Python-2-Kapitel zu den regulären Ausdrücken. Die dort gelisteten Beispiele müssten ggf. vor Verwendung auf Python-3 umgeschrieben werden. <small>Wie macht man das? Dazu siehe z.B. [https://openbook.rheinwerk-verlag.de/python/43_001.html], [https://portingguide.readthedocs.io/en/latest/] oder [https://www.digitalocean.com/community/tutorials/how-to-port-python-2-code-to-python-3]</small> <small>Es gibt auch ein externes Modul ''regex'', das bei Bedarf extra installiert werden muss ([https://pypi.org/project/regex/]). Es bietet zusätzliche Funktionalität und gründlicheren Unicode-Support. Dies sei hier aber nur der Vollständigkeit halber erwähnt.</small> == Verzweigungen == === if === Die IF-Verzweigung ist aus anderen Programmiersprachen bereits bekannt. In Pseudocode lässt sie sich folgendermaßen darstellen: WENN bedingung TRUE führe block1 aus SONST führe block2 aus ENDE In Python gibt es keinen expliziten ENDE-Kennzeichner. Stattdessen wird der Code durch Einrückungen strukturiert. Alles mit der gleichen Einrückungstiefe gehört zum selben Block. Dies zeichnet Python vor anderen Programmiersprachen aus. Die test1.py-Datei laute also wie folgt: x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: Der else-Zweig wird ausgefuehrt x ist groesser oder gleich 4 Man achte auch auf die Doppelpunkte in der if- und else-Zeile. Darauf vergisst man gerne, wenn man von anderen Programmiersprachen kommt. Folgendes wäre in Python ein Fehler (genauer gesagt ein IndentationError). x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Auch Nachstehendes würde nicht zum gewünschten Ergebnis führen (löst aber keine Fehlermeldung aus). Der letzte print-Befehl ist schon außerhalb der IF-ELSE-Verzweigung. x = 3 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: x ist kleiner als 4 x ist groesser oder gleich 4 Python kennt eine Reihe von Vergleichs- und Verknüpfungsoperatoren: <, <= ... kleiner (gleich) >, >= ... größer (gleich) == ... gleich != ... ungleich is ... identisch is not ... nicht identisch and ... AND or ... OR not ... NOT Beispielsweise: a = 5 b = 9 if a<=10 and b!=7: print("OK") else print("Nicht OK") Ausgabe: OK Der else-Block kann übrigens auch ersatzlos entfallen. Mehrfache Verzweigungen werden durch das elif-Konstrukt erstellt. a = 14 if a<=10: print("<=5") elif a>11 and a<15: print("11 bis 15") elif a>16 and a<20: print("16 bis 20") else: print(">=20") Ausgabe: 11 bis 15 In Python gibt es auch die Schlüsselwörter <code>True</code> (für wahr) und <code>False</code> (für falsch). Man beachte, dass sie mit Großbuchstaben beginnen. Andere Schreibweisen wären ein Fehler. Sie gehören zum Datentyp <code>bool</code>. Ihnen sind auch die Zahlen <code>1</code> und <code>0</code> zugewiesen. === match === Ab Python 3.10 gibt es auch die match-Anweisung. Dies ist das Python-Pendant für die switch-Anweisung in anderen Programmiersprachen, geht aber bei näherer Betrachtung weit darüber hinaus. Hier nur ein einfaches Beispiel: x = "Hello" match x: case "Servus" | "Ciao": # or print("Servus an alle") case "Grüetzi": print("Grüetzi Schwyzer") case _: # other, default, sonstiges ... print("Hallo Welt") Ausgabe: Hallo Welt Für nähere Details siehe z.B. [https://www.geeksforgeeks.org/python-match-case-statement/], [https://learnpython.com/blog/python-match-case-statement/], [https://docs.python.org/3/tutorial/controlflow.html#match-statements] und das Python Enhancement Proposal (PEP) 636 – Structural Pattern Matching: Tutorial [https://peps.python.org/pep-0636] und dort insbesondere den Anhang A - Quick Intro. <small><code>match, case, _</code> etc. sind sogenannte ''soft keywords''. Im Gegensatz zu den normalen Schlüsselwörtern dürfen ihnen auch Werte zugewiesen werden. Eine Liste der weichen Schlüsselwörter lässt sich durch <code>keyword.softkwlist</code> erstellen (die Anweisung gibt es seit Python 3.9). Siehe dazu auch [https://stackoverflow.com/questions/65800344/what-are-soft-keywords] und [https://docs.python.org/3/library/keyword.html#keyword.softkwlist].</small> == Schleifen == === while === Die WHILE-Schleife ist kopfgesteuert. Sie funktioniert wie aus anderen Programmiersprachen bekannt. In Pseudocode: SOLANGE bedingung TRUE führe block aus ENDE In Python: x = 0 while x <= 10: print(x) x += 1 Ausgabe: 0 1 2 3 4 5 6 7 8 9 10 === for === for x in range(6): print(x*2) Ausgabe: 0 2 4 6 8 10 Die Schleife läuft von 0 bis 5. Ausgegeben wird jeweils der Wert x*2. Aquivalent kann diese Schleife auch so geschrieben werden: for x in range(0, 11, 2): print(x) Die Ausgabe ist wie oben. Der Startwert sei 0, der Endwert ist 11-1 und die Schrittweite ist 2. Ein anderes Beispiel sei for x in "text": print(x) Ausgabe: t e x t == Schleifen abbrechen == === break === <code>break</code> bricht die Schleife ab und setzt mit dem nächsten Befehl außerhalb der Schleife fort. for var in range(100): print(var) if var == 5: break Ausgabe: 0 1 2 3 4 5 === continue === <code>continue</code> bricht den aktuellen Schleifendurchlauf ab und setzt mit dem nächsten Schleifendurchlauf fort. for var in range (11): if var == 5: continue print(var) Ausgabe: 0 1 2 3 4 6 7 8 9 10 == try - except == try: z1 = 12 / 0 print(z1) except ZeroDivisionError: print("Das Ergebnis ist unendlich") except: print("Kann nicht berechnet werden!") print("Bitte die Formel korrigieren!") Ausgabe: Das Ergebnis ist unendlich Es wird versucht, eine Zahl durch Null zu dividieren. Das ist nicht möglich, es wird eine Ausnahme ausgelöst. Das Programm springt daher in den except-ZeroDivisionError-Block und führt die dort gelisteten Anweisungen aus (in unserem Fall eine print-Anweisung). Würden wir dieses Programm ohne try-except ausführen, so ergibt sich aus z1 = 12 / 0 print(z1) folgende Fehlermeldung und ein unmittelbarer Programmabbruch Traceback (most recent call last): File "C:\tmp\test1.py", line 1, in <module> z1 = 12 / 0 ZeroDivisionError: division by zero Mit dem try-except-Mechanismus können also Ausnahmen oder Fehler aufgefangen und behandelt werden. In unserem Beispiel ist das eher trivial, aber bei größeren Programmen kann das durchaus Sinn machen. == pass == Ein leerer Block muss in Python mittels dem Schlüsselwort <code>pass</code> dargestellt werden. Z.B. x = 2 if x == 1: print("Wert ist ", x) else: pass Würde man das <code>pass</code> im else-Block weglassen, so würde man eine Fehlermeldung erhalten: IndentationError: expected an indented block after 'else' statement on line 5 = Funktionen = == Aufrufen von Funktionen == Funktionen sind uns im Rahmen dieses Kurses schon zuhauf begegnet. Sei es die print()-, die math.sin()- oder die hex()-Funktion. All diese Funktionen werden von Python zur Verfügung gestellt, ohne dass man sie explizit programmieren müsste. Aufgerufen werden diese Funktionen, indem man ihren Namen eintippt, gefolgt von runden Klammern. In diesen Klammern können noch Argumente übergeben werden. Auch Rückgabewerte sind möglich. == Funktionen selber schreiben == Funktionen werden mit dem def-Schlüsselwort (man definiert die Funktion) eingeleitet, danach folgt der Funktionsname, danach wiederum runde Klammern, in denen formale Argumente stehen können. Abgeschlossen wird die def-Zeile mit einem Doppelpunkt. Danach folgt der Funktionskörper. Dieser Funktionskörper muss wiederum eingerückt werden (wie von den Verzweigungen und Schleifen bekannt). Aufgerufen wird diese Funktion, indem man ihren Funktionsnamen eingibt, gefolgt von runden Klammern (ggf. mit den aktuellen Parametern). Z.B. # Funktion definieren def halloWelt(i): # i ... beliebige Ganzzahl print("Hallo " * i, end="") print("Welt!") # Funktion aufrufen halloWelt(3) Ausgabe: Hallo Hallo Hallo Welt! Unterschied zwischen formalen und aktuellen Parametern: [[Datei:PythonIng_func1.jpg]] <small>Aktuelle Parameter werden auch Argumente genannt.</small> Rückgabe von Funktionswerten: # Funktion definieren def mathFunc(a, b): r1 = a + b r2 = a * b return r1, r2 # Funktion aufrufen a, b = mathFunc(3, 5) # Ausgabe der zurückgegebenen Werte print(a) print(b) Ausgabe: 8 15 Vorgabeparameter, z.B.: def mathFunc(a=10, b=20): r1 = a + b r2 = a * b return r1, r2 a, b = mathFunc(3, 5) print(a) print(b) a, b = mathFunc(5) print(a) print(b) a, b = mathFunc(b=6) print(a) print(b) Ausgabe: 8 15 25 100 16 60 == Lambda-Funktionen == print((lambda a, b: a*b) (3, 5)) Ausgabe: 15 Eingeleitet wird eine Lambda-Funktion (auch Lambda-Form, Lambda-Operator oder anonyme Funktion genannt) mit dem Schlüsselwort <code>lambda</code>. Es folgen die formalen Argumente, danach ein Doppelpunkt, die Berechnungsvorschrift und ggf. abschliessend in Klammern die aktuellen Parameter. Man kann einer Lambda-Funktion auch einen Funktionsnamen geben und die Funktion über diesen Namen aufrufen, z.B. prod = lambda a, b: a*b print(prod(3, 5)) Als Ausgabe wird wieder die Zahl 15 geliefert. == Rekursive Funktionen == Funktionen können wiederum andere Funktionen aufrufen. Von einem rekursiven Funktionsaufruf spricht man, wenn die aufgerufene Funktion gleich der aufrufenden ist. def printFunc(i): if (i >= 5): return else: print("Hallo Welt") printFunc(i+1) printFunc(1) Ausgabe: Hallo Welt Hallo Welt Hallo Welt Hallo Welt == Funktionsannotationen == Python ist sehr flexibel, was Typen angeht. Im Vorhergehenden haben wir generell keine Typangaben gemacht. Will man Typen angeben, so bietet Python das Konzept der Funktionsannotation. def calcFunc(a:int, b:int) -> int: return a+b, a*b r1 = calcFunc(8, 9) r2 = calcFunc(8.0, 9.0) print(r1) print(r2) Ausgabe: (17, 72) (17.0, 72.0) Jetzt sieht man auf den ersten Blick, welche Typen der Programmierer im Sinn hatte, als er die Funktion erstellte. Das Problem dabei ist nur, dass es Python ziemlich egal ist, welche Typen man in Endeffekt eingibt. Im obigen Beispiel können statt Integer-Typen auch Float-Typen eingegeben werden. == Variadische Funktionen == Python-Code: def test1(a, *b): print(a); for c in b: print(c); test1("Hallo", "Welt", "Schweizer", "und alle anderen") Ausgabe: Hallo Welt Schweizer und alle anderen Mit dem Stern (auch als Splat-Operator bezeichnet) in der formalen Parameterliste bei der Funktion <code>test1</code> wird angezeigt, dass eine beliebige Anzahl von Argumenten übergeben wird. <small> Dies entspricht in etwa dem, was in anderen Programmiersprachen (PHP etc.) mittels Ellipse (<code>...</code>) angezeigt wird.</small> = Tupel, Listen und andere = [[Datei:Python 3. The standard type hierarchy.png|mini|hochkant=1.7|Datentypen und Strukturen]] Tupel, Listen und einige andere sind Datenstrukturen oder Sequenzen. Listen (z.B. eine Einkaufsliste) sind veränderbar (mutable). Ein Tupel kann dagegen nicht verändert werden (immutable). Listen werden beim Anlegen in eckige Klammern eingeschlossen, Tupel in runde Klammern. Beim Tupel können die Klammern auch weggelassen werden. Ein Tupel mit nur einem Element muss mit einem Beistrich abgeschlossen werden. Der Grund ist, dass Python sonst nicht entscheiden kann, ob ein Tupel angelegt werden soll, oder nur ein geklammerter Wert. Nachfolgend werden einige Operationen mit Listen und Tupel dargestellt. Als Gedächtnisstütze kann man sich den Unterschied zwischen Tupel und Liste ev. so leichter merken: : T'''u'''pel ... r'''u'''nde Klammern, '''u'''nveränderlich : L'''i'''ste ... eck'''i'''ge Klammern, veränderl'''i'''ch. # Liste und Tupel liste = [1, 2, "Hallo"] tupel = (1, 2, "Hallo") # Ausgabe von liste und tupel print(liste) print(tupel) # Ausgabe von Einzelelementen print(liste[1]) print(tupel[2]) # Element an Liste anhängen und einfügen liste.append(55) liste.insert(4, "Welt") print(liste) # Element aus Liste entfernen liste.remove(1) print(liste) # einige weitere Beispiele liste2 = [1,] tupel2 = 1, 2 tupel3 = (1,) print(liste2) print(tupel2) print(tupel3) Ausgabe: [1, 2, 'Hallo'] (1, 2, 'Hallo') 2 Hallo [1, 2, 'Hallo', 55, 'Welt'] [2, 'Hallo', 55, 'Welt'] [1] (1, 2) (1,) Zu den Datenstrukturen gehören weiters auch Mengen und Dictionaries. Mengen sind von der Mathematik bekannt, sie sind ungeordnet und es kommen keine mehrfachen Elemente vor. Dictionaries sind durch Schlüssel :Wert-Paare gekennzeichnet. Mengen werden beim Anlegen wie Dictionaries in geschweifte Klammern eingeschlossen. dict = {"vorname":"Hugo", "nachname":"Meister" } menge = {1, 1, 3, 4, 4, 4, "Hallo"} print(dict) print(menge) print(dict["vorname"]) Ausgabe: {'vorname': 'Hugo', 'nachname': 'Meister'} {1, 3, 4, 'Hallo'} Hugo Geschweifte Klammern ohne Inhalt stellen Dictionaries dar und keine Mengen: di = {} print(type(di)) Ausgabe: <class 'dict'> == List Comprehensions == Aus einer Eingabeliste soll eine Ausgabeliste erzeugt werden. Das kann folgendermaßen geschehen. Mathematische Schreibweise: <math>lc = \{2x|x\in\ \mathbb{N}, 1\le x < 11\}</math> Python-Code: lc = [x*2 for x in range(1,11)] print(lc) Ausgabe: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] Mathematische Schreibweise: <math>lc = \{2x | x \in \mathbb{N}, 1\le x < 11, x \bmod 2 = 0 \}</math> Python-Code: lc = [x*2 for x in range(1,11) if x%2 == 0] print(lc) Ausgabe: [4, 8, 12, 16, 20] Siehe auch {{W|List Comprehension}}. == Set Comprehensions == Dies ist sehr ähnlich wie im vorigen Abschnitt beschrieben. Es wird aber keine Liste, sondern eine Menge erzeugt. sc = {x*2 for x in range(1,11)} print(sc) Ausgabe: {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} == Listen zusammenführen - zip() == li1 = ["A", "B", "C", "D"] li2 = [1, 2, 3, 4] li3 = [5.5, 6.6, 7.7, 8.8] z = zip(li1, li2, li3) print(z) li4 = list(z) print(li4) Ausgabe: <zip object at 0x00000283B6C6AC80> [('A', 1, 5.5), ('B', 2, 6.6), ('C', 3, 7.7), ('D', 4, 8.8)] == Generatorausdruck == g = (i*2 for i in range(1,11)) print(g) t = tuple(g) print(t) print(t[1:3]) Ausgabe: <generator object <genexpr> at 0x00000241D2A4A5A0> (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) (4, 6) == Slicing == slice ... Scheibe, Teil, in Scheiben schneiden Beispiel: Zugriff auf Elemente eines geordneten sequentiellen Objekttyps (Liste, Tupel oder String): str1 = "Hallo" # Das erste Element wird mit dem Index 0 angesprochen # [start (inkl.) : stop (exkl.) : step (default=1)] str2 = str1[0:2] # Alternativ auch: str2 = str1[:2] print(str2) tup1 = (0,1,2,3) # Das letzte Element hat auch den Index -1, das vorletzte den Index -2 usw. tup2 = tup1[-3:-1] print(tup2) lst1 = [[1, 5, 10, 20], [30, 40, 50, 60]] lst2 = lst1[1][1] print(lst2) Ausgabe: Ha (1, 2) 40 Beispiel: Umdrehen von Strings str1 = "Hallo" str2 = str1[::-1] print(str2) Ausgabe: ollaH = Objektorientierte Programmierung = == Eine einfache Klasse == [[Datei:PythonIng_uml1.svg | 200px]] class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 fahr = Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die Klasse Fahrzeug wird durch das class-Schlüsselwort eingeleitet. raeder ist ein Klassenattribut und public. __init__ wird bei der Objekterzeugung automatisch aufgerufen. Man achte darauf, dass diese Methode immer mit zwei Unterstrichen eingeleitet und abgeschlossen wird. Instanzattributen wird das Wort self vorangestellt. Wir sehen uns z.B. das Attribut self.__geschwind an. Auch hier werden zwei Unterstriche verwendet. Das bedeutet, dass dieses Attribut private ist. Bei den Methoden wird immer self als erster Parameter angegeben. Beim Aufruf der entsprechenden Funktion wird das self aber nicht berücksichtigt. == Klassen importieren == Häufig ist es sinnvoll und übersichtlicher Klassen in eigenen Dateien zu speichern. Das sind dann eigene Module. Abgespeichert werden Sie mit der Endung py, wie bisher auch praktiziert. Aufgerufen werden Sie mit der import-Anweisung. Dann ist aber nur der Dateiname ohne Endung py zu verwenden. Klarer wird das mit einem Beispiel. Datei c:\tmp\fahrzeug.py class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 Datei c:\tmp\test1.py import fahrzeug fahr = fahrzeug.Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die üblichen import-Anweisungen lauten wie folgt: {| {{prettytable}} ! import-Befehl ! Instanz |- | import xyz || xyz.Klasse |- | import xyz as x || x.Klasse |- | from xyz import Klasse || Klasse |- | from xyz import * || Klasse |} Der Vorteil der ersten beiden import-Anweisungen ist, dass es kaum zu Namenskollisionen kommen kann. Dafür hat man bei den letzten beiden Varianten weniger Tipparbeit. == Vererbung == [[Datei:PythonIng_uml2.svg | 200px]] Datei fahrzeug.py: class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 class Luftfahrzeug(Fahrzeug): def __init__(self, geschwindigkeit, leistung, fluegel): super().__init__(geschwindigkeit, leistung) self.__flueg = fluegel def getFlueg(self): return self.__flueg Datei test1.py: import fahrzeug fahr = fahrzeug.Luftfahrzeug(150, 90, 4) print(fahr.getFlueg()) Ausgabe: 4 = Grafiken zeichnen = Für das Zeichnen von Grafiken wird hier das Modul <code>matplotlib</code> verwendet. <code>matplotlib</code> ist ein externes Modul und muss vor der ersten Verwendung installiert werden. Das geht so: # Starten Sie ein Terminal (bei Windows die Eingabeaufforderung). # Führen Sie darin folgenden Befehl aus <code>c:\devel\Python\Scripts\pip.exe install matplotlib</code> pip ist übrigens der Paketmanager von Python ({{W|Pip_(Python)}}). Optimalerweise installieren wir auch gleich das Modul <code>numpy</code> (Numerical Python). Wir werden es im Folgenden oft benötigen (nicht nur bei den Grafiken). Das funktioniert vom Prinzip her genauso, wie für <code>matplotlib</code> gezeigt. <small>Verwenden Sie Spyder, so sind diese Schritte nicht nötig. Spyder inkludiert diese Pakete standardmäßig. Unter openSUSE Tumbleweed lassen sich diese Pakete mittels YaST oder zypper installieren.</small> == 2D == === Graph einer Funktion === Es soll die cosh-Funktion im Intervall <math>x\in[-3,3]</math> gezeichnet werden. Der Programmcode lautet in der einfachsten Form: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh1.jpg]] Der Code ist quasi selbsterklärend. Das Untermodul pyplot des matplotlib-Moduls und das numpy-Modul werden importiert. x läuft von -3 bis +3. y wird für jeden x-Wert per Formel ausgerechnet. "plt.plot()" ist der Zeichenbefehl. "plt.show" ist notwendig, um das Fenster mit der Grafik anzuzeigen. Die Schrittweite 0.1 wurde so gewählt, um einen ausreichend glatten Verlauf des Graphen zu gewährleisten. Das ist immer ein Kompromiss zwischen Berechnungszeit und Ansehnlichkeit. Testen Sie einfach ein paar verschiedene Werte, um ein Gefühl dafür zu zu bekommen. "plt.grid()" zeichnet ein Gitter in die Grafik (kann auch weggelassen werden). Die Bezeichnungen plt und np könnten auch anders gewählt werden. Es ist aber Konvention, diese so wie hier gezeigt zu wählen. <small>Mit der im obigen Bild gezeigten Menüleiste kann die dargestellte Grafik nachträglich noch geändert werden (Zoom, Pan, Achsenparameter, Kurvenparameter etc.). Natürlich kann man das alles auch direkt programmieren. Wie das funktioniert wird ansatzweise etwas später gezeigt.</small> Ein etwas komplexeres Beispiel ist Folgendes: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) + 2**x plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh4.png]] Man beachte, dass im Gegensatz zu Octave und Julia der ominöse Punkt (.) bei 2**x mit Python nicht benötigt wird. Das macht das Programmiererleben etwas einfacher. === Graphen mehrerer Funktionen und weiteres === import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x") plt.plot(x, y2, label = "sin(x) * cos(x)") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh2.png]] Um die Linienstile etwas individueller zu gestalten, ist folgender Programmcode gedacht: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x", lw=5, ls="dotted") plt.plot(x, y2, label = "sin(x) * cos(x)", lw=3, ls="--") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh3.png]] === Funktion in Parameterdarstellung === Es soll die archimedische Spirale <math>x = t \cos(t), y = t \sin(t)</math> im Intervall <math>[0, 6\pi[</math> gezeichnet werden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.show() [[Datei:PythonIng_spirale1.png]] Diese Darstellung erscheint verzerrt. Will man gleiche Achsenskalierungen, so kann man den plt.axis()-Befehl verwenden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.axis("equal") plt.show() [[Datei:PythonIng_spirale2.png]] === Funktion in Polardarstellung === import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(projection="polar") r = np.arange(0, 1, 0.01) theta = r**3 line = ax.plot(theta, r) plt.show() [[Datei:PythonIng_polar1.png]] === Logarithmische Achsenskalierung === ==== Semilog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.semilogy() plt.show() Ausgabe: [[Datei:PythonIng_semilog1.png]] ==== LogLog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.loglog() plt.show() [[Datei:PythonIng_loglog1.png]] === Gefüllte Fläche === import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 3, 0.1) y1 = 3*x - 1 y2 = x**2 plt.plot(x, y1, x, y2, color='black') plt.fill_between(x, y1, y2, where=y1>=y2) plt.show() [[Datei:PythonIng_gefuellt.png]] === Linien, Pfeile, Rechtecke, Kreise und Texte === import matplotlib as mpl import matplotlib.pyplot as plt fig, ax = plt.subplots() r = mpl.patches.Rectangle((0, 0), 3, 3, angle=30, fill=False) c = mpl.patches.Circle((4, 4), 2, fill=False) ax.add_patch(r) ax.add_patch(c) ax.plot([-2, 7], [-2, 0], color="black") ax.arrow(0, 7, 5, 0, length_includes_head=True, head_width=0.5, head_length=1.5, color="black") ax.set_aspect("equal") plt.axis([-3, 8, -3, 8]) plt.show() [[Datei:PythonIng_linien_pfeile_etc.png]] Text kann mit <code>ax.text(x, y, "Text")</code> hinzugefügt werden, bspw. import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.text(0.1, 0.1, "Hallo") ax.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() Oder einfacher auch ohne <code>subplots</code> import matplotlib.pyplot as plt plt.text(0.1, 0.1, "Hallo") plt.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text1.png]] Auch Sonderzeichen (griechische Buchstaben etc.) können verwendet werden (siehe dazu auch [https://matplotlib.org/stable/users/explain/text/mathtext.html]). import matplotlib.pyplot as plt plt.text(.3, .5, r'$\Omega\ \psi\ \oint\ \nabla\ \dot a\ \frac{a}{b}\ a_b$', size="20") plt.show() [[Datei:PythonIng_text20.svg]] Jetzt wird noch gezeigt, wofür <code>subplots</code> sinnvoll eingesetzt werden können. import matplotlib.pyplot as plt fig, ax = plt.subplots(nrows=1, ncols=2) ax[0].text(0.1, 0.1, "Hallo") ax[1].text(0.1, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text2.png]] === Aufgaben === * Zeichnen Sie die Strophoide <math>x = \frac{a(t^2-1)}{t^2+1}, y = \frac{at(t^2-1)}{t^2+1}, a = 2, -3 \leq t \leq 3</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_strophoide.jpg]] * Zeichnen Sie die verschlungene Hypozykloide <math>x = (R-r)\cos t + c\cos\frac{R-r}{r}t, y = (R-r)\sin t - c\sin\frac{R-r}{r}t, c = 3, r = 2, R = 6, -15 \leq t \leq 15</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_hypozykloide.jpg]] * Testen Sie bei den obigen Übungsaufgaben verschiedene Linienstile und Farben. Farben können mit dem plt.plot()-Parameter color gewählt werden. * Testen Sie bei den obigen Übungsaufgaben verschiedene Werte für a, c, r und R. == 3D == === Räumliche Kurven === import matplotlib.pyplot as plt import numpy as np t = np.arange(0, 6*np.pi, 0.1) x = t * np.cos(t) y = t * np.sin(t) z = t fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot(x, y, z) plt.show() [[Datei:PythonIng_raumkurve1.png]] === Flächen === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z) plt.show() [[Datei:PythonIng_fläche1.png]] Das Ganze in Netzdarstellung läßt sich so programmieren: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.5) y = np.arange(0, 10, 0.5) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_wireframe(x, y, z) plt.show() [[Datei:PythonIng_fläche2.png]] Ein etwas komplexeres Beispiel: import matplotlib.pyplot as plt import numpy as np x = np.arange(0.1, 10, 0.1) y = np.arange(0.1, 10, 0.1) x, y = np.meshgrid(x, y) z1 = np.sin(x) + 3 * np.cos(y) z2 = np.sin(x) + np.log(y) z3 = x + np.cos(y) z4 = x**2 - y fig, ax = plt.subplots(subplot_kw={"projection": "3d"}, nrows=2, ncols=2) ax[0][0].plot_surface(x, y, z1) ax[0][1].plot_surface(x, y, z2) ax[1][0].plot_surface(x, y, z3) ax[1][1].plot_surface(x, y, z4) plt.show() [[Datei:PythonIng_subplot1.png]] Man beachte, dass man die Unterbilder im Bild nach dem Ausführen des Scripts z.B. mit der mittleren Maustaste einzeln drehen, oder über die Einträge in der Menüzeile einzeln bearbeiten kann. Mit ein paar Zeilen Programmtext lässt sich also eine Menge an Funktionalität generieren. Die Farbgebung lässt sich über <code>colormaps</code> variieren. import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm) plt.show() [[Datei:PythonIng_colormap1.png]] Es gibt eine Menge an Colormaps, z.B. <code>plasma, Greys, Dark2, ocean</code>. Zwecks detaillierterer Infos siehe die matplotlib-Dokumentation. <small>Verwendet man die IDE namens IDLE, so gibt es dort auch die automatische Codevervollständigung. D.h. es werden alle Möglichkeiten (in unserem Fall nach dem Eintippen von <code>cm.</code> alle verfügbaren Colormaps) angezeigt.</small> Die "edgecolor" und Linienbreite können auch frei gewählt werden: import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm, edgecolor="black", linewidth=1.0) plt.show() [[Datei:PythonIng_colormap2.png]] === Höhenlinien === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contour(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien1.png]] Etwas abgewandelt sieht das so aus: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() hl = ax.contour(x, y, z) ax.clabel(hl, inline = True) plt.show() [[Datei:PythonIng_höhenlinien2.png]] Und noch eine Variante sei gezeigt. import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contourf(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien3.png]] === Aufgaben === * Zeichnen Sie die räumliche Kurve <math>x = 2 \cdot \cosh(t)</math>, <math>y = 5 \cdot \sin(t)</math>, <math> z = t^{2} - t</math>, <math>0 \leq t \leq 3\pi</math>. * Zeichnen Sie die Fläche <math>z = \log(x) + \cos(y)</math>. == Animationen == === Mit matplotlib === Auch mit matplotlib sind Animationen möglich. Das ist ein bisschen komplizierter und wird deshalb hier nur mit einem sehr einfachen Beispiel dargestellt (bei Interesse siehe z.B. auch das [https://matplotlib.org/stable/users/explain/animations/animations.html#animations Animations using Matplotlib-Tutorial]). import matplotlib.pyplot as plt import matplotlib.animation as ani import matplotlib import numpy as np def update(frame): line.set_xdata(x[:frame]) line.set_ydata(y[:frame]) return (line) fig, ax = plt.subplots() x = np.arange(0, 10, .1) y = np.sin(x) line, = ax.plot(x[0], y[0]) ax.set(xlim=[0, 10], ylim=[-1, 1]) a = ani.FuncAnimation(fig=fig, func=update, frames=100, interval=20) plt.show() # Speichere die Animation in einem animierten GIF (optional) a.save(filename="c:/tmp/PythonIng_anim5.gif", writer="pillow") [[Datei:PythonIng_anim5.gif]] Es wird eine Sinuskurve auf den Bildschirm gezeichnet. In der letzten Zeile wird diese Animation in ein animiertes GIF gespeichert. Das ist natürlich optional und kann auch weggelassen werden. === Mit VPython === Aber auch mit dem Modul VPython lassen sich einfache 3D-Animationen erstellen. VPython ist ein externes Modul, das vorab installiert werden muss. Unter openSUSE Tumbleweed gibt es dzt. kein entsprechendes rpm-Paket. Die übliche Methode der Installation mittels YaST oder zypper ist somit nicht möglich. Auch eine direkte Verwendung von pip führt nur zu einer Fehlermeldung (<code>error: externally-managed-environment</code>). Es empfiehlt sich dort folgende Vorgehensweise: # Erstelle zuerst eine virtuelle Umgebung, z.B.: <code>python3.11 -m venv ~/tmp/venv1</code> # Wechsle das Verzeichnis: <code>cd ~/tmp/venv1/bin</code> # Installiere das entsprechende Paket: <code>./pip install vpython</code> # Führe das entsprechende Skript aus: <code>./python ~/tmp/test1.py</code> Aktuell (März 2026) ist dieses Programmpaket lt. der [https://vpython.org/presentation2018/install.html VPython-Homepage] nur für die Python-Versionen 3.8 bis 3.12 verfügbar. Ein Beispiel zu einer einfachen Animation wird nachfolgend geliefert. from vpython import * scene.width = 1200 scene.height = 600 scene.center = vector(20,0,0) scene.background = color.white cylinder(pos=vector(0,0,0), axis=vector(20,0,0), radius=5, color=color.blue) cone(pos=vector(0,0,0), axis=vector(-10,0,0), radius=5, color=color.blue) helix(pos=vector(20,0,0), axis=vector(40,0,0), radius=2, coils=10, thickness=0.5, color=color.blue) ball = sphere(pos=vector(20,0,0), color = color.green, radius = 1) ball.p = vector(0.15, 0, 0) toc = True while True: rate(200) if(ball.pos.x <= 60 and toc == True): ball.pos += ball.p else: toc = False ball.pos -= ball.p if(ball.pos.x <= 20 and toc == False): toc = True [[Datei:PythonIng_vpython_anim.JPG]] Idealerweise öffnet sich beim Ausführen des Scripts ein Browserfenster. Darin wird die programmierte Animation gezeigt (siehe auch den obigen Screenshot). Eine Größenänderung können Sie mit der mittleren Maustaste initiieren. Die Szenerie drehen können Sie mit der rechten Maustaste. === Mit VTK === Komplexer, aber auch mächtiger als VPython ist die Verwendung von VTK ('''V'''isualization '''T'''ool'''k'''it). Genauer gesagt des Python-Wrappers von VTK. Dieses externe Python-Modul muss vorab installiert werden (z.B. mittels YaST, pip oder in eine virtuelle Umgebung). VTK ist eine Softwarebibliothek zur 3D-Visualisierung und wurde ursprünglich in C++ geschrieben. Verbreitet eingesetzt wird diese Bibliothek in der Wissenschaft und Forschung, z.B. * in der medizinischen Bildgebung * für Strömungssimulationen * für Klimadaten VTK funktioniert nach dem Pipeline-Prinzip: Source (Quellen) -> Filter -> Mapper (Senken) -> Actor/Renderer Daten fließen von den Quellen zu den Senken. Als einfaches Beispiel wird die Darstellung eines Zylinders gezeigt, der mit den Maustasten gedreht oder in der Größe geändert werden kann: import vtk # Zylinder erzeugen cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) # Geometrie in darstellbare Daten umwandeln mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) # Objekt in der Szene actor = vtk.vtkActor() actor.SetMapper(mapper) # Szene verwalten renderer = vtk.vtkRenderer() renderer.AddActor(actor) # Render-Fenster render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) # Maus/Tastatur-Steuerung interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) # Starten render_window.Render() interactor.Start() Ausgabe: [[Datei:PythonIng_VTK_1.png]] Gleiches Beispiel wie oben, aber mit einer Animationssequenz: import vtk import time cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) renderer = vtk.vtkRenderer() renderer.AddActor(actor) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) render_window.Render() time.sleep(0.01) Das Grafikfenster schließt sich nach Ablauf der Schleife. Das Fenster bleibt geöffnet, wenn Sie am Programmende folgenden Befehl hinschreiben interactor.Start() Um den animierten Zylinder grün einzufärben, müssen Sie Folgendes im obigen Programm ergänzen (Farbnamen): colors = vtk.vtkNamedColors() actor.GetProperty().SetColor(colors.GetColor3d("Green")) Als Namen können Sie u.a. die CSS3 Web-Farben verwenden (siehe z.B. [https://wiki.selfhtml.org/wiki/Farbe/Farbangaben]). Alternativ funktioniert auch das (RGB): actor.GetProperty().SetColor(0.0, 0.6, 0.0) Wie der Zylinder mit einer Textur versehen wird, zeigt folgendes Programm: import vtk import time cylinder = vtk.vtkCylinderSource() cylinder.SetResolution(30) cylinder.SetHeight(3.0) cylinder.SetRadius(1.0) cylinder.CappingOn() texture_coords = vtk.vtkTextureMapToCylinder() texture_coords.SetInputConnection(cylinder.GetOutputPort()) texture_coords.PreventSeamOn() reader = vtk.vtkJPEGReader() reader.SetFileName("PythonIng_textur.jpg") texture = vtk.vtkTexture() texture.SetInputConnection(reader.GetOutputPort()) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(texture_coords.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.SetTexture(texture) renderer = vtk.vtkRenderer() renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) renderer.AddActor(actor) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) renderWindow.Render() time.sleep(0.01) interactor.Start() <gallery> PythonIng_textur.jpg | Textur-Datei PythonIng_VTK_2.png | Ausgabe (Screenshot) </gallery> Nun aber genug von VTK und der Erstellung von Grafiken, weiter geht es mit mathematischeren Themen. = Vektoren und Matrizen = == Zahlenfolgen == from numpy import * start = 0 stop = 10 step = 2 num = 10 r = arange(start, stop, step) l = linspace(start, stop, num) print("r = ", r) print("l = ", l) Ausgabe: r = [0 2 4 6 8] l = [ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556 6.66666667 7.77777778 8.88888889 10. ] == Vektoren == Vektoren sollten jedem aus der Linearen Algebra bekannt sein. === Arrays === In Python mit NumPy kann man Vektoren durch die Funktion array erzeugen. import numpy as np l1 = (-5, 3, 2) l2 = (1, 1, 4) a1 = np.array(l1) a2 = np.array(l2) a3 = a1 + a2 a4 = 2 * a2 print(a1) print(a2) print(a3) print(a3[2]) print(a4) Ausgabe: [-5 3 2] [1 1 4] [-4 4 6] 6 [2 2 8] === Zeilen- und Spaltenvektoren === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) print(z) print(s) Ausgabe: [ [-5 3 2] ] [[1] [1] [4]] === Skalarprodukt === import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) skalarprodukt = np.dot(a1, a2) print(skalarprodukt) Ausgabe: 6 === Vektorprodukt === <math>a\ast b=\left(\begin{array}{c} a_{1}\\ a_{2}\\ a_{3} \end{array}\right)\ast\left(\begin{array}{c} b_{1}\\ b_{2}\\ b_{3} \end{array}\right)=\left(\begin{array}{c} a_{2}b_{3}-a_{3}b_{2}\\ a_{3}b_{1}-a_{1}b_{3}\\ a_{1}b_{2}-a_{2}b_{1} \end{array}\right) </math> Python-Code: import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) vektorprodukt = np.cross(a1, a2) print(vektorprodukt) Ausgabe: [10 22 -8] === Transponierter Vektor === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) # transponierter Vektor z_tp = np.transpose(z) # transponierter Vektor s_tp = np.transpose(s) print(z_tp) print(s_tp) Ausgabe: [[-5] [ 3] [ 2]] [ [1 1 4] ] === Vektorfelder visualisieren === import matplotlib.pyplot as plt import numpy as np # Daten generieren x = np.arange(0, 10, 1) y = np.arange(0, 10, 1) X, Y = np.meshgrid(x, y) U = X * Y V = Y + X # Plotten fig, ax = plt.subplots() ax.quiver(X, Y, U, V, angles='xy') plt.show() Ausgabe: [[Datei:PythonIng_quiver1.png]] == Matrizen== import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) print(m1) Ausgabe: [[1 2 3] [4 5 6]] === Zugriff auf Matrizenelemente === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) # Element aus Zeile 2 und Spalte 3 (Achtung! Index startet bei Null) print(m1[1,2]) Ausgabe: 6 === Addition und Subtraktion von Matrizen === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) m2 = np.matrix([[0, 0, 2], [1, 3, 2]]) print(m1 + m2) print(m1 - m2) Ausgabe: [[1 2 5] [5 8 8]] [[1 2 1] [3 2 4]] === Transponierte Matrix === import numpy as np m = np.matrix([[1, 2, 3], [4, 5, 6]]) mt = np.transpose(m) print(m) print(mt) Ausgabe: [[1 2 3] [4 5 6]] [[1 4] [2 5] [3 6]] === Rang einer Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) rg = np.linalg.matrix_rank(m) print(rg) Ausgabe: 2 === Inverse Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) mi = np.linalg.inv(m) print(mi) Ausgabe: [[ 1. 0.6] [-0. -0.2]] === Multiplikation von Matrizen (falksches Schema) === import numpy as np m1 = np.matrix([[1, 3, 4], [0, -5, 1]]) m2 = np.matrix([[1, 2], [2, 3], [0, 2]]) print(m1 @ m2) Ausgabe: [[ 7 19] [-10 -13]] === Eigenwerte und Eigenvektoren === import numpy as np m = np.matrix([[5, 8], [1, 3]]) D,V = np.linalg.eig(m) # Eigenwerte print(D) # Eigenvektoren print(V) Ausgabe: [7. 1.] [[ 0.9701425 -0.89442719] [ 0.24253563 0.4472136 ]] === Teilmatrizen === import numpy as np m = np.matrix([[1, 3, 4], [0, -5, 1]]) print("m = ", m) # Erste Zeile extrahieren m1 = m[0,:] print("m1 = ", m1) # Das Element aus der 1. Zeile und der 2. Spalte extrahieren m2 = m[0,1] print("m2 = ", m2) # Zweite Spalte extrahieren m3 = m[:, 1] print("m3 = ", m3) Ausgabe: m = [[ 1 3 4] [ 0 -5 1]] m1 = [ [1 3 4] ] m2 = 3 m3 = [[ 3] [-5]] === Spezielle Matrizen === ==== Nullmatrix ==== import numpy as np z = np.zeros((3, 2)) print(z) Ausgabe: [[0. 0.] [0. 0.] [0. 0.]] ==== Einheitsmatrix ==== import numpy as np z = np.eye(3) print(z) Ausgabe: [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ==== Matrix mit lauter Einsen ==== import numpy as np z = np.ones((3, 2)) print(z) Ausgabe: [[1. 1.] [1. 1.] [1. 1.]] === Spärlich besetzte Matrizen === Das Thema spärlich besetzter Matrizen wird hier nur kurz angerissen. Nähere Details siehe unter dem Weblink [https://docs.scipy.org/doc/scipy/reference/sparse.html#module-scipy.sparse]. import numpy as np import scipy A = scipy.sparse.csr_array(np.eye(5)) print(A) Ausgabe: (0, 0) 1.0 (1, 1) 1.0 (2, 2) 1.0 (3, 3) 1.0 (4, 4) 1.0 = Lineare Gleichungssysteme = Sei <math>Ax = b</math> ein lineares Gleichungssystem. <math>A</math> sei die Koeffizientenmatrix, <math>x</math> der Lösungsvektor und <math>b</math> ein bekannter Vektor. Beispiel: import numpy as np A = np.array([[5, 1], [0, 2]]) b = np.array([1, 2]) x = np.linalg.solve(A, b) print(x) Ausgabe: [0. 1.] == Aufgabe == * Lösen Sie folgendes Gleichungssystem mittels Python (und zur Kontrolle auch händisch): 5x + 6y - 2z = 12 3x - y - 3z = 6 2x + 2y + 4z = 5 = Polynome = == Ein erstes einfaches Beispiel == Gegeben sei das Polynom <math>7x^3+5x^2+1</math>. In Python: import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p) Ausgabe: 3 2 7 x + 5 x + 1 == Einzelne Polynomwerte berechnen == import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p(1.5)) Ausgabe: 35.875 == Polynome integrieren und differenzieren == import numpy as np p = np.poly1d([7, 5, 0, 1]) # 1. Ableitung p1 = p.deriv() p2 = p.deriv(1) # 2. Ableitung p3 = p.deriv(2) # Integral p4 = p.integ() print(p1) print(p2) print(p3) print(p4) Ausgabe: 2 21 x + 10 x 2 21 x + 10 x 42 x + 10 4 3 1.75 x + 1.667 x + 1 x == Nullstellen bestimmen == import numpy as np p = np.poly1d([2, 5, 0, 4]) r = np.roots(p) print(r) Ausgabe: [-2.7621427 +0.j 0.13107135+0.84077099j 0.13107135-0.84077099j] == Aufgaben == * Berechnen Sie den Wert für x = 3 des Polynoms <math>y = 2x^4 - 3x^3 - x + 7</math>. * Differenzieren und integrieren Sie das Polynom <math>y = 2x^4 - 3x^3 - x + 7</math>. * Berechnen Sie die Nullstellen von <math>y = 7x^5 - 3x^2 + 12</math>. = Nichtlineare Gleichungen und Gleichungssysteme = == Nullstellenbestimmung == Löse eine beliebige Gleichung f(x) = 0, z.B. <math> f(x) = x^2 - 5\cos(x) - 10 = 0 </math>: import scipy import numpy as np def f(x): return x**2 - 5*np.cos(x) - 10 xstart = [-1, 1] # Startwerte xn = scipy.optimize.root(f, xstart) print(xn.x) Ausgabe: [-2.46813009 2.46813009] Funktionsgraph: [[Datei:octave_nichtlin2.jpg]] == Gleichungssysteme == SymPy ist ein externes Modul, das symbolisches Rechnen ('''Sym'''bolic '''Py'''thon) ermöglicht. Folgende Aufgabe ist dem Buch "Knorrenschild: Numerische Mathematik, Hanser, 2017, Seite 72" entnommen. Zu lösen ist das nichtlineare Gleichungssystem <math>f_1 = 2x_1 + 4x_2 = 0 </math> <math>f_2 = 4x_1 + 8x_2^3 = 0</math> Mit Python ist das so möglich: import sympy x1, x2 = sympy.symbols("x1 x2") f1 = 2*x1 + 4*x2 f2 = 4*x1 + 8*x2**3 s = sympy.solve((f1, f2), x1, x2) print(s) Ausgabe: [(-2, 1), (0, 0), (2, -1)] Plot: [[Datei:IngPython_nl_gleichung1.svg|500px]] = Komplexe Zahlen = Die imaginäre Einheit wird in Python durch den Buchstaben <code>j</code> symbolisiert. Darstellen kann man eine komplexe Zahl bekannterweise in mehreren Formen: * Kartesische Darstellung <math>z = \Re(z) + j \cdot \Im(z)</math> * Polardarstellungen <math>z = r \cdot (\cos(\phi) + j \cdot \sin(\phi)) = r \cdot e^{j\cdot \phi}</math> Die konjugiert komplexe Zahl ist <math>z^* = \Re(z) - j \cdot \Im(z)</math> Nachfolgend einige mathematische Operationen mit Python und NumPy. import numpy as np z1 = 2 + 5j # kartesische Darstellung z2 = 3 * np.exp(3j) # Polardarstellung # Addition res = z1 + z2 print("z1 + z2 = ", res) # Multiplikation res = z1 * z2 print("z1 * z2 = ", res) # Realteil res = np.real(z2) print("Realteil von z2 = ", res) # Imaginärteil res = np.imag(z2) print("Imaginaerteil von z2 = ", res) # Betrag res = np.abs(z1) print("Betrag von z1 = ", res) # Argument res = np.angle(z1) print("Argument von z1 = ", res) # Konjugiert komplexe Zahl res = np.conj(z1) print("Konjugiert komplexe Zahl von z1 = ", res) Ausgabe: z1 + z2 = (-0.9699774898013365+5.423360024179601j) z1 * z2 = (-8.05675510050068-14.003167400647481j) Realteil von z2 = -2.9699774898013365 Imaginaerteil von z2 = 0.4233600241796016 Betrag von z1 = 5.385164807134504 Argument von z1 = 1.1902899496825317 Konjugiert komplexe Zahl von z1 = (2-5j) = Interpolation = import numpy as np import scipy import matplotlib.pyplot as plt # Stützpunkte xp = np.arange(1, 6) yp = (0, -5, 2, 7, 6) ti = np.arange(1, 5, 0.01) i1 = scipy.interpolate.interp1d(xp, yp, kind = "linear") i2 = scipy.interpolate.interp1d(xp, yp, kind = "cubic") plt.plot(xp, yp, "rx") plt.plot(xp, i1(xp)) plt.plot(ti, i2(ti)) plt.show() Ausgabe: [[Datei:PythonIng_interpol1.png]] = Differenzialrechnung = == Numerisches Differenzieren == Als Beispiel differenzieren wir <math>y = 5x\sin{x}</math> und stellen das Ganze grafisch dar. from findiff import Diff import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) f = 5 * x * np.sin(x) dx = x[1] - x[0] # Ableitung d_dx = Diff(0, dx) df_dx = d_dx(f) # Grafik plt.plot(x, f, label = "y") plt.plot(x, df_dx, label = "y'") plt.grid() plt.legend(loc="best") plt.show() Ausgabe: [[Datei:octave_diff1.jpg]] <small>findiff ist ein externes Modul. Dieses muss installiert werden (z.B. so: ...\Python\Scripts\pip.exe install --upgrade findiff). Für die Vorgehensweise unter openSUSE Tumbleweed siehe das Kapitel VPython, nur dass das Ganze mit einer aktuelleren Python-Version exekutiert wird, z.B. mit Python 3.13. Das im Buch "Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler, Rheinwerk" verwendete Modul "scipy.misc" ist veraltet (deprecated ... missbilligt). Lt. [https://docs.scipy.org/doc/scipy-1.17.0/dev/roadmap-detailed.html#misc SciPy-Dokumentation für die Version 1.17.0] wurden alle entsprechenden Features schon entfernt.</small> == Symbolisches Differenzieren == Differenzieren Sie die Funktionen <math>f_1(x) = x^2</math> und <math>f_2(x) = \sin(x)\cos\left(\frac{x}{2}\right)</math>. import sympy x = sympy.symbols("x") f1 = x**2; f2 = sympy.sin(x) * sympy.cos(x/2.) d1 = sympy.diff(f1, x) d2 = sympy.diff(f2, x) print(d1) print(d2) Ausgabe: 2*x -0.5*sin(0.5*x)*sin(x) + cos(0.5*x)*cos(x) == Aufgaben == * Differenzieren Sie die Funktion <math>y = \log(x) + 10x</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. * Differenzieren Sie die Funktion <math>y = \frac{\sinh(x)}{(1+x)}</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. = Integralrechnung = == Numerisches Integrieren == Berechnen Sie das Integral <math>\int_{0}^{3}x^2 dx</math>. import scipy def f(x): return x**2 i = scipy.integrate.quad(f, 0, 3) print(i) Ausgabe: (9.000000000000002, 9.992007221626411e-14) Das trifft den exakten Wert 9.0 ziemlich genau. Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} dx</math>. import scipy import numpy as np def f(x): return 2**(-x) i = scipy.integrate.quad(f, 0, np.inf) print(i) Ausgabe: (1.4426950408889556, 4.486558477977586e-09) == Symbolisches Integrieren == Berechnen Sie <math>\int x^2 \text{d}x</math> und <math>\int \sin{x}\cos{\frac{x}{2}} \text{d}x</math>. import sympy x = sympy.symbols("x") f1 = x**2 f2 = sympy.sin(x) * sympy.cos(x/2.) i1 = sympy.integrate(f1, x) i2 = sympy.integrate(f2, x) print(i1) print(i2) Ausgabe: x**3/3 -0.666666666666667*sin(0.5*x)*sin(x) - 1.33333333333333*cos(0.5*x)*cos(x) Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} \text{d}x</math>. import sympy x = sympy.symbols("x") f = 2**(-x) i = sympy.integrate(f, (x, 0, sympy.oo)) print(i) Ausgabe: 1/log(2) Mit <code>sympy.pprint(i)</code> ließe sich letzere Ausgabe etwas schöner schreiben: 1 ────── log(2) Man beachtete, <code>log</code> steht hier für den natürlichen Logarithmus <code>ln</code>. == Aufgaben == * Integrieren Sie die Funktion <math>y = \log(x) + 10x</math> von 1 bis 5. * Integrieren Sie die Funktion <math>y = x^3</math> von 0 bis 4. * Integrieren Sie <math>\int x^x(\log (x) + 1)\mathrm dx</math> symbolisch. = Gewöhnliche Differenzialgleichungen = == DGL numerisch lösen == Für die Lösung von Differenzialgleichungen steht u.a. die Funktion scipy.integrate.solve_ivp() zur Verfügung. Diese Funktion implementiert auch das Runge-Kutta-Verfahren (RK45). {{Wikipedia | Runge-Kutta-Verfahren}} Beispiel <math>y' = x^2 + y^3</math>: import scipy import numpy as np import matplotlib.pyplot as plt def dy_dx(x, y): return x**2 + y**3 y0 = [1] xi = [0, 1] x = np.arange(0, 1, 0.01) z = scipy.integrate.solve_ivp(dy_dx, xi, y0, method="RK45", dense_output=True) y = z.sol(x) plt.plot(x, y.T) plt.grid() plt.show() [[Datei:PythonIng_dgl1.png]] == DGL symbolisch lösen == Beispiel <math>y' = x^2 + y^3</math>: import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) print(lsg) Ausgabe: [Eq(f(x), (-x**2)**(1/3)), Eq(f(x), (-x**2)**(1/3)*(-1 - sqrt(3)*I)/2), Eq(f(x), (-x**2)**(1/3)*(-1 + sqrt(3)*I)/2)] Mit <code>sympy.pprint</code> (pretty print) lässt sich die Ausgabe etwas übersichtlicher darstellen. import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) sympy.pprint(lsg) Ausgabe: ⎡ _____ _____ ⎤ ⎢ _____ 3 ╱ 2 3 ╱ 2 ⎥ ⎢ 3 ╱ 2 ╲╱ -x ⋅(-1 - √3⋅ⅈ) ╲╱ -x ⋅(-1 + √3⋅ⅈ)⎥ ⎢f(x) = ╲╱ -x , f(x) = ────────────────────, f(x) = ────────────────────⎥ ⎣ 2 2 ⎦ == Aufgaben == * Lösen Sie die Differenzialgleichung <math>y' = \frac{1}{x\cdot y}</math> mit Python. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>m' = -k\cdot m</math>. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>y' = \sqrt{|y|}</math>. =Rechnen mit wirklich großen Zahlen= Bekannt ist, dass Python kaum Einschränkungen beim Wertebereich von Ganzzahlen hat, z.B. print(10**300) Ausgabe (gekürzt): 100000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000 Ähnliches geht auch mit Gleitpunktzahlen, z.B. durch die Verwendung des Moduls mpmath: import mpmath print(mpmath.mpf(1500.4)**mpmath.mpf(300)) Ausgabe: 7.27975299218612e+952 Anderes Beispiel: from mpmath import mp, pi mp.dps = 100 print(pi) Ausgabe: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 mpmath kann noch einiges mehr, dazu sei aber auf die entsprechende Dokumentation auf der mpmath-Homepage verwiesen. mpmath ist Bestandteil von SymPy, kann aber auch separat installiert werden. =Regelungstechnische Aufgabenstellungen= Für regelungstechnische Aufgaben gibt es u.a. das externe Paket <code>control</code>. Hier soll nicht detailliert darauf eingegangen werden. Anhand eines Beispiels soll anschließend nur die Visualisierung in Form eines Bode-Diagramms und der Sprungantwort gezeigt werden. Gegeben sei ein P-Regler mit <math>R = \frac{5}{2}</math> und eine Strecke <math>S= \frac{1}{30s^3+20s^2+10s+1,5}</math>. Gesucht sei vorerst ein Bode-Diagramm für den offenen Regelkreis und das Führungsverhalten. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke # oder: G0 = ct.series(regler, strecke) Gw = ct.feedback(G0) ct.bode_plot(G0, label='G0') ct.bode_plot(Gw, label='Gw') plt.show() [[Datei:PythonIng_bode1.svg]] Nun noch für obiges Beispiel die Sprungantwort. Diese zeigt einige große Überschwinger, d.h. der Regler kann sicher noch optimiert werden. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke Gw = ct.feedback(G0) t, y = ct.step_response(Gw) plt.plot(t,y) plt.title('Sprungantwort') plt.xlabel('t') plt.ylabel('h(t)') plt.grid() plt.show() [[Datei:PythonIng_bode3.svg]] Einige weitere wichtige Daten (Phasenreserve, Amplitudenreserve, Durchtrittsfrequenz) lassen sich mittels der <code>control</code>-Funktion <code>margin()</code> ermitteln. Die Ortskurve lässt sich mit der Funktion <code>nyquist_plot()</code> zeichnen. Dies sei hier aber nicht weiter ausgeführt. ==Aufgaben== * Zeichen Sie mit Python die Ortskurve für obiges Beispiel. * Was passiert, wenn man die Reglerverstärkung weiter aufdreht (z.B. auf <math>R = \frac{25}{2}</math>)? * Wie sehen das Bode-Diagramm und die Sprungantwort aus, wenn ein PI-Regler verwendet wird? = Stereostatik etc. = Das Modul SymPy bietet einige Möglichkeiten einfache Bauwerke zu berechnen, z.B. Balken oder Fachwerke. Nachfolgend wird ein einfaches Fachwerk berechnet und gezeichnet. Python-Code: from sympy.physics.continuum_mechanics.truss import Truss t = Truss() # Knoten t.add_node(("A", -3, 0), ("B", 0, 0), ("C", 4, 0), ("D", 7, 0), ("E", 6, 1.5), ("F", 2, 3), ("G", -2, 1.5)) # Stäbe t.add_member(("AB","A","B"), ("BC","B","C"), ("CD","C","D")) t.add_member(("AG","A","G"), ("GB","G","B"), ("GF","G","F")) t.add_member(("BF","B","F"), ("FC","F","C"), ("CE","C","E")) t.add_member(("FE","F","E"), ("DE","D","E")) # Auflager; roller ... Loslager, pinned ... Festlager t.apply_support(("A","roller"), ("D","pinned")) # Einwirkende Kräfte t.apply_load(("G", 5, 270), ("E", 3, 90)) # Berechnung t.solve() print("Reaction Forces: ", t.reaction_loads) print("Internal Forces: ", t.internal_forces) # Fachwerk zeichnen p = t.draw() p.show() Ausgabe auf der Konsole: Reaction Forces: {'R_A_y': 4.20000000000000, 'R_D_x': 0, 'R_D_y': -2.20000000000000} Internal Forces: {'AB': 2.80000000000000, 'BC': 0.333333333333333, 'CD': -1.46666666666667, 'AG': -5.04777178564958, 'GB': -2.05555555555556, 'GF': -1.23413387432364, 'BF': 0.411111111111111*sqrt(13), 'FC': -0.3*sqrt(13), 'CE': 1.50000000000000, 'FE': 0.284800124843917, 'DE': 2.64407093534026} Zeichnung: [[File:PythonIng_fachwerk1.svg|300px]] Details zu diesem Thema siehe z.B. [https://docs.sympy.org/latest/modules/physics/continuum_mechanics/index.html Continuum Mechanics] oder [https://docs.sympy.org/latest/tutorials/physics/continuum_mechanics/index.html Continuum Mechanics Tutorials]. Auch andere mechanische Probleme werden von SymPy abgehandelt ([https://docs.sympy.org/latest/tutorials/physics/index.html Physics Tutorials]). == Aufgabe == Gegeben sei ein einseitig eingespannter Kragträger. Belastet wird er durch eine Einzellast am Trägerende. Für die Daten siehe folgende ASCII-Skizze: | 20 kN //|---> x | //| V //|---------------------- //| 10 m | Elastizitätsmodul E = 2,1*10⁵ N/mm² Flächenträgheitsmoment I = 0.001 m⁴ Berechnen Sie die Auflagerreaktionen, den Querkraft- und Biegemomentenverlauf, sowie die Verformungen. Stellen Sie dies mit Hilfe von SymPy graphisch und auch mittels Formeln dar. Verwenden Sie dazu auch pprint (pretty print) aus dem SymPy-Modul. Zwecks Lösungsansatz siehe die oben aufgeführte Seite "Continuum Mechanics Tutorials". Achten Sie auch auf die Einheiten! Kontrollieren Sie das Ganze mittels händischer Rechnung. In dem genannten Tutorial ist von "Singularity Functions" die Rede. Gemeint ist damit in diesem Kontext die {{W|Föppl-Klammer}}. Einige Python-Programme, vorrangig zu Maschinenelementen, finden sich auf [https://baymp.de/download_python.html BayMP für Python] (Balken, Zahnräder, Stabknickung usw.). = Stochastik = Die Stochastik ist ein sehr weites Feld. Hier werden nur einige wenige sehr einfache, aber wichtige Themen angerissen. Python stellt mit den Moduln math und statistics Software zu diesem Zwecke bereit. math und statistics sind bereits im Lieferumfang von Python enthalten. Aber auch mit den externen Modulen NumPy, SciPy und pandas kann man Stochastik in Python betreiben. Dies wird hier aber nicht gemacht. == Lageparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] m1 = statistics.mean(werte) m2 = statistics.mode(werte) m3 = statistics.median(werte) print("Arithmetischer Mittelwert = ", m1) print("Modalwert = ", m2) print("Median = ", m3) Ausgabe: Arithmetischer Mittelwert = 3.5 Modalwert = 1 Median = 3.0 == Streuungsparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] s = statistics.stdev(werte) print("Standardabweichung = ", s) Ausgabe: Standardabweichung = 2.6770630673681683 == Kombinatorik == import math n = 7 k = 5 print("n! = ", math.factorial(n)) print("Kombinationen (n über k) = ", math.comb(n, k)) Ausgabe: n! = 5040 Kombinationen (n über k) = 21 = Ein- und Ausgabe = == print == Die Anweisung print haben wir schon oft verwendet. Hier soll anhand von Beispielen kurz beschrieben werden, was der Befehl print leisten kann. print("Hallo", "Welt", 1, sep="-") print("Hallo", end=" ") print("Welt") Ausgabe: Hallo-Welt-1 Hallo Welt == input == a = int(input("Zahl 1: ")) b = int(input("Zahl 2: ")) print("a + b = ", a+b) Ausgabe (nach Eingabe der beiden Ganzzahlen): Zahl 1: 4 Zahl 2: 5 a + b = 9 == Aus Dateien lesen == Es seinen die datei.txt Hallo Welt. Wie geht es dir? ... und test1.py dat = open("datei.txt", mode = "r") print(dat.read()) dat.close() Ausgabe Hallo Welt. Wie geht es dir? ... Mit dem open()-Befehl wird die Datei datei.txt im Lesemodus geöffnet (r ... read). Mit dem read()-Befehl wird die Datei eingelesen und mittels print ausgegeben. == In Dateien schreiben == dat = open("datei.txt", mode = "a", encoding = "utf-8") dat.write("Hänge Zeile an\n") dat.close() Die Datei datei.txt sieht nach Abarbeitung des obigen Skripts nun so aus Hallo Welt. Wie geht es dir? ... Hänge Zeile an Es wird die Datei im Schreibmodus geöffnet (a ... append (anhängend), w ... write (überschreibend)). write() fügt hier also eine Zeile Text am Dateiende ein. close() schließt die Datei wieder. Das close() kann man sich mit der with-Anweisung auch sparen. with open("datei.txt", mode="a", encoding="utf-8") as dat: dat.write("Hänge Zeile an\n") = Benutzeroberflächen erstellen = == tkinter == {{Wikipedia | Tkinter}} Python bietet standardmäßig das Modul tkinter zur Programmierung von Benutzeroberflächen. Es müssen also bei der Verwendung von tkinter keine externen Module installiert werden. Hier wird eine (sehr) kurze Einführung in das Erstellen von grafischen Oberflächen mittels tkinter gegeben. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") win.minsize(300, 50) but = tk.Button(win, text = "Push the button") but.pack() win.mainloop() Ausgabe: [[Datei:PythonIng_gui1.jpg]] Ein etwas komplizierteres Beispiel sei nachfolgend gezeigt. Es sollen zwei Strings miteinander verknüpft und ausgegeben werden. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") def on_button_clicked(): str = ent1.get() + ent2.get() lab2["text"] = str ent1 = tk.Entry(win) ent2 = tk.Entry(win) lab1 = tk.Label(win, text="verknuepfen mit") lab2 = tk.Label(win, text="") but = tk.Button(win, text = "=", command=on_button_clicked) ent1.pack(side="left") lab1.pack(side="left") ent2.pack(side="left") but.pack(side="left") ent2.pack(side="left") lab2.pack(side="left") win.mainloop() Ausgabe (vor der Eingabe der Teilstrings): [[Datei:PythonIng_gui2.jpg]] Ausgabe (nach der Eingabe der Teilstrings und dem Drücken des =-Buttons): [[Datei:PythonIng_gui3.jpg]] == curses == {{Wikipedia | curses}} Mit dem curses-Modul lassen sich u.a. TUIs ('''T'''ext '''U'''ser '''I'''nterfaces) erstellen. Ein sehr einfaches Beispiel zur allgemeinen Funktionsweise wird nachstehend geliefert. import curses stdscr = curses.initscr() curses.start_color() curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) stdscr.clear() stdscr.addstr("Hallo Welt", curses.color_pair(1)) stdscr.refresh() stdscr.getch() curses.endwin() Als Ausgabe sollte <span style="color:#FF0000;">Hallo Welt</span> (rote Schrift auf weißem Hintergrund) auf dem Terminal/der Konsole erscheinen. Getestet wurde dies mit openSUSE Tumbleweed, Python-Version 3.13.12. Das entsprechende Python-curses-Package muss installiert sein. Allgemeine Informationen zur Terminal-/Konsolengröße und Cursorposition liefert folgendes Programm: import curses stdscr = curses.initscr() stdscr.addstr(3, 5, "LINES: %d" % curses.LINES) stdscr.addstr(4, 5, "COLS: %d" % curses.COLS) (y,x) = stdscr.getyx() stdscr.addstr(5, 5, "Momentane Cursorposition: [%d, %d]" % (y, x)) (y,x) = stdscr.getbegyx() stdscr.addstr(6, 5, "Koordinatenursprung: [%d, %d]" % (y, x)) (y,x) = stdscr.getmaxyx() stdscr.addstr(7, 5, "Fenstergröße: [%d, %d]" % (y, x)) stdscr.addstr(11, 2, "Taste drücken -> Ende") stdscr.refresh() stdscr.getch() curses.endwin() Es sollte sich in etwa folgende Ausgabe ergeben: LINES: 44 COLS: 110 Momentane Cursorposition: [4, 15] Koordinatenursprung: [0, 0] Fenstergröße: [44, 110] Taste drücken -> Ende Zur Funktionsweise von curses siehe auch das Wikibook [[ncurses]]. Zum Verständnis sind dort allerdings elementare Kenntnisse in der Programmiersprache C erforderlich. == Qt == {{Wikipedia | Qt (Bibliothek)}} Auch für das Qt-Framework gibt es eine Anbindung an Python. Nachfolgend ein einfaches Beispiel. import sys from PySide6.QtWidgets import QApplication, QLabel app = QApplication(sys.argv) label = QLabel("Hallo Welt!") label.show() sys.exit(app.exec()) Ausgabe: [[Datei:PythonIng_gui10.png]] == Gtk == {{Wikipedia | GTK (Programmbibliothek)}} Eine idente Ausgabe, wie oben für Qt gezeigt, erzeugt z.B. folgendes Gtk-Programm: import gi gi.require_version("Gtk", "4.0") from gi.repository import Gtk def on_activate(app): win = Gtk.ApplicationWindow(application=app) lab = Gtk.Label(label="Hallo Welt!") win.set_child(lab) win.present() app = Gtk.Application() app.connect('activate', on_activate) app.run(None) Auch für die Benutzung von Qt und Gtk müssen die jeweiligen Packages installiert sein. Getestet wurden die entsprechenden Python-Programme nur unter openSUSE Tumbleweed. Wie das GTK-Paket unter MS Windows 11 installiert wird, siehe z.B. [https://www.gtk.org/docs/installations/windows Setting up GTK for Windows]. Damit sei aber das Thema "Benutzeroberflächen erstellen" hier abgeschlossen, da dies schon ein sehr spezielles Aufgabengebiet ist, das eher Informatiker und nicht so sehr Ingenieure anspricht. Bei Bedarf siehe aber ggf. die entsprechenden Links unten in diesem Tutorial. Dort sind weiterführende Informationen zu finden. = Style Guide und flake8 = Wie man schönen und richtigen Python-Code schreibt, erfahren Sie in * [https://peps.python.org/pep-0008/ PEP 8 – Style Guide for Python Code] Ein Modul, das prüft, ob die Richtlinien im Style Guide eingehalten wurden, ist ''flake8'': * [https://flake8.pycqa.org/en/latest/ Flake8: Your Tool For Style Guide Enforcement] = Einige Integrierte Entwicklungsumgebungen (IDEs)= Werden Programmtexte größer und umfangreicher, so ist das Arbeiten mit der interaktiven Programmierumgebung bzw. das direkte Ausführen von Python-Skripten mühsam. Man wünscht sich z.B. Hilfen zum Debuggen oder die automatische Code-Vervollständigung. Zu diesem Zweck wurden IDEs (Integrated Development Environments) geschaffen. Von diesen seinen nachfolgend auszugsweise einige kurz beschrieben. Testen Sie einfach aus, welche davon für Sie bzw. für Ihr Python-Projekt geeignet sind. == IDLE == IDLE ist die mit dem Python-Programmpaket mitgelieferte IDE. Der Name leitet sich einerseits ab vom Monty-Python-Mitglied Eric Idle, andererseits steht es als Abkürzung für "'''I'''ntegrated '''D'''evelopment and '''L'''earning '''E'''nvironment. IDLE ist einfach zu bedienen, bietet aber schon einen beachtlichen Leistungsumfang. Nachfolgend wird ein Screenshot zu IDLE geliefert. Rechts ist das Editor-Fenster zu sehen, links die interaktive Programmierumgebung. Um das Beispiel selbst nachvollziehen zu können, starten Sie IDLE. Das geht ähnlich, wie Sie die interaktive Programmierumgebung von Python starten (nur, dass Sie eben das IDLE-Icon doppelklicken und nicht das Python-Icon. Unter Linux geben Sie einfach in einem Terminal <code>idle3.13</code> o. Ä. ein). Weiter geht es mit "File - Open - ...". Die auszuführende Datei auswählen (im konkreten Fall ein "Hallo-Welt"-Programm). Es erscheint das rechte Fenster. Dort "Run - Run Module" auswählen. Und schon wird im linken Fenster "Hallo Welt!" ausgegeben. [[Datei:PythonIng_idle1.jpg | 600px]] Siehe auch {{W|IDLE}}. == PyCharm == PyCharm ist ein kommerzielles Produkt. Es gab aber auch eine kostenlose Community Edition. Seit 2025 sind beide Varianten vereint. Für die ersten 30 Tage sind die Pro-Funktionen frei verfügbar, danach nur noch die Kernfunktionalitäten (oder man bezieht kostenpflichtig die Pro-Version). Zu beziehen ist PyCharm unter dem Weblink [https://www.jetbrains.com/pycharm/]. Nachfolgend ein etwas abgewandeltes "Hallo Welt"-Programm, editiert und ausgeführt mit PyCharm. [[Datei:PyCharm_IDE_2023_screenshot.png | 600px]] Siehe auch {{W|PyCharm}}. == Eric == Auch eric ist Open Source und steht unter der GNU General Public License Version 3 oder später. Zu beziehen ist diese Software unter [https://eric-ide.python-projects.org/]. [[Datei:Screenshot_Eric_4.png | 600px]] Siehe auch {{W|eric (Software)}}. <small> Unter openSUSE Tumbleweed sollte sich eric auch mit YaST installieren lassen. Bei mir gibt es aber dann beim Ausführen des eric-Programms eine Fehlermeldung (Stand März 2026): ... ModuleNotFoundError: No module named 'PyQt6.QtPdfWidgets' Umgehen kann man dieses Problem aber wieder mit dem Erstellen einer virtuellen Umgebung, in etwa so python3.13 -m venv ~/tmp/venv1 cd ~/tmp/venv1/bin ./python3.13 -m pip install --upgrade --prefer-binary eric-ide ./eric7_ide </small> == PyScripter == Vom Funktionsumfang vergleichbar mit den vorherigen IDEs ist PyScripter. Auch PyScripter ist Open Source. Die Projekt-Homepage findet sich auf [https://sourceforge.net/projects/pyscripter/]. PyScripter ist nur für MS Windows verfügbar. [[Datei:PythonIng_pyscripter1.jpg | 600px]] == Spyder IDE == Spyder enthält bereits eine stabile Python-Version und etliche Module (z.B. matplotlib, numpy, control). Ansonsten kann dieses Softwarepaket vom Funktionsumfang her mit den anderen genannten IDEs locker mithalten. Spyder wurde unter der MIT-Lizenz veröffentlicht. Diese Software findet sich auf [https://www.spyder-ide.org]. [[Datei:Spyder-windows-screenshot.png | 600px]] Siehe auch {{W|Spyder (Software)}} == Sonstige == Die genannten IDEs sind nicht die Einzigen. Es gibt, um dem Image Pythons als beliebteste Programmiersprache gerecht zu werden, noch einige andere. Sowohl Open Source-Programme als auch kommerzielle Programme sind im Web zu finden, z.B. Thonny oder {{W|Visual Studio Code}}. Braucht man den Umfang von ausgewachsenen IDEs nicht, so kann man auch normale Texteditoren verwenden (z.B. {{W|Geany}} oder {{W|Kate_(Texteditor)|Kate}}). = Debuggen und Testen = Das Debuggen und Testen von Programmen sind wichtige Bestandteile der Programmierung. Syntaxfehler lassen sich i.A. leicht beheben. Schwieriger ist das Eingrenzen von logischen Fehlern, die ev. nur in bestimmten Situationen auftreten und keine explizite Fehlermeldung hervorrufen. Das Programm liefert falsche Ergebnisse oder es stürzt aus heiterem Himmel ab. Um das zu verhindern gibt es verschiedene Werkzeuge, die bei der Fehlersuche behilflich sein können. Vorerst siehe aber zwecks Begriffsklärung noch folgende Links: * {{W|Debuggen}} * {{W|Debugger}} * {{W|Softwaretest}} <gallery> First Computer Bug, 1947.jpg Test ganzheitlich.png V-Modell.svg </gallery> == Das Modul pdb == Python bringt schon ein Modul zum Debuggen mit. Siehe z.B. [https://docs.python.org/3/library/pdb.html pdb — The Python Debugger]. Komfortabler lässt sich das aber mittels Integrierter Entwicklungsumgebungen (IDEs) angehen. == Debuggen mit IDEs == Für die IDEs IDLE und Spyder sei kurz auf die entsprechenden Webseiten verwiesen: * [https://www.cs.uky.edu/~keen/help/debug-tutorial/debug.html Debugging under IDLE]. * [https://docs.spyder-ide.org/current/panes/debugging.html Spyder Debugger] Dort wird die Vorgehensweise auch mittels Screenshots erläutert. == assert == assert ... behaupten, zusichern ({{W|Assertion (Informatik)}}) Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10., 0.) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10., 0.) File "/home/hr/Develop/test1.py", line 4, in print1 assert y != 0.0 ^^^^^^^^ AssertionError Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1("10.", "5.") File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Aber auch bei nachfolgendem Code gibt es eine Fehlermeldung: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10, 5) File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Damit letzteres funktioniert, kann man den Programmcode so umschreiben: def print1(x, y): assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 2.0 Und jetzt fangen wir den <code>AssertionError</code> auf: def print1(x, y): try: assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) except(AssertionError): print("Hallo") print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Hallo Ich hoffe, es ist wenigstens im Ansatz klar geworden, wofür <code>assert</code> gut sein kann. Ausschalten kann man die <code>assert</code>-Überprüfung übrigens mit dem Python-Schalter <code>-O</code>. == Doctests == Innerhalb eines Docstrings kann die Arbeit im interaktiven Modus simuliert werden. Nach den Promptzeichen (>>>) erfolgen dann bei unserem Beispiel innerhalb des Docstrings simulierte Aufrufe der Funktion <code>print1()</code>. Danach folgen jeweils die Sollresultate. Wird das Modul oder die Datei als Hauptprogramm aufgerufen, so wird die Funktion <code>doctest.testmode()</code> aufgerufen und ein Bericht auf der Konsole ausgegeben. Wird das Modul nicht als Hauptprogramm aufgerufen, sondern importiert, dann wird diese <code>testmod</code>-Funktion nicht aufgerufen. D.h. dieser Code kann sowohl für Testzwecke als auch für den produktiven Einsatz verwendet werden. Das ist auch sinnvoll, weil wenn man Teile der Datei immer löschen bzw. einfügen müsste, so würden sich Fehlerquellen auftun. Das würde den Sinn und Zweck von Doctests konterkarieren. def print1(x=0., y=1.): """ Dividiere zwei Zahlen Autor: Intruder Datum: 12.08.2025 >>> print1(2., 1.) 2.0 >>> print1(5., 2.) 2.5 >>> print1(5.) 5.0 """ print(x/y) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) Ausgabe: Trying: print1(2., 1.) Expecting: 2.0 ok Trying: print1(5., 2) Expecting: 2.5 ok Trying: print1(5.) Expecting: 5.0 ok 1 items had no tests: __main__ 1 items passed all tests: 3 tests in __main__.print1 3 tests in 2 items. 3 passed and 0 failed. Test passed. Das gezeigte Beispiel ist so ziemlich das einfachste, das es gibt. Für weiterführende Details siehe z.B.: * [https://peps.python.org/pep-0257/ PEP 257 – Docstring Conventions] * [https://docs.python.org/3/library/doctest.html doctest — Test interactive Python examples] == pytest == Siehe zu diesem Thema auch {{W|Modultest}}. pytest ist ein externes Modul und muss vorab installiert werden, z.B. mittels pip install -U pytest pip install -U pytest-html Python-Code, Datei test1.py: def add(x, y): return x + y def test_answer(): assert add(1, 1) == 3 Starten von pytest in der Konsole: pytest test1.py Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py F [100%] ========================================================= FAILURES ========================================================== ________________________________________________________ test_answer ________________________________________________________ def test_answer(): > assert add(1, 1) == 3 E assert 2 == 3 E + where 2 = add(1, 1) test1.py:6: AssertionError ================================================== short test summary info ================================================== FAILED test1.py::test_answer - assert 2 == 3 ===================================================== 1 failed in 0.09s ===================================================== Hier erhalten wir einen Fehler, da 1+1 eindeutig ungleich 3 ist. Aber aus irgendeinem Grund wollte der Programmierer oder Tester in diesem Fall, dass dies so ist. Testfälle werden übrigens mit dem Präfix <code>test_</code> eingeleitet. Python-Code: def add(x, y): return x + y + 1 def test_answer(): assert add(1, 1) == 3 Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py . [100%] ===================================================== 1 passed in 0.01s ===================================================== Jetzt ist alles in Ordnung. Weiterführendes siehe z.B. * [https://docs.pytest.org/en/stable/ pytest: helps you write better programs] == unittest == Auch unittest dient zur Durchführung von Testreihen, ist aber Bestandteil von Python. Hier wird vorerst nicht näher darauf eingegangen. Siehe z.B. * [https://docs.python.org/3/library/unittest.html unittest — Unit testing framework] Lt. ''Inden: Python Challenge; dpunkt, 2021, Seite 481'' soll unittest weniger komfortabel als pytest sein. Einen Vergleich von unittest mit pytest findet man in * [https://knapsackpro.com/testing_frameworks/difference_between/pytest/vs/unittest pytest vs unittest] = Ausblick = Dies war eine kurze Einführung in die Berechnungs- und Darstellungsmöglichkeiten mit Python. Es sollten etliche relevante Themen behandelt, oder zumindest kurz angesprochen worden sein. Wem dieser Text nicht ausreichend ist, der sei auf die entsprechenden weiterführenden Weblinks, Bücher und die Python-Hilfefunktion verwiesen. Python kennt noch viel mehr Befehle, als hier dargestellt wurden. Das Themenspektrum ist auch durch die Einbindung externer Module fast beliebig erweiterbar. = Weblinks= == Python allgemein == * [https://www.python.org/ Python Homepage] == Externe mathematische Module == * [https://numpy.org/ NumPy] * [https://numpy.org/doc/stable/user/numpy-for-matlab-users.html NumPy for MATLAB users] * [https://scipy.org/ SciPy] * [https://www.sympy.org/en/index.html SymPy] * [https://pandas.pydata.org/ pandas] * [https://github.com/maroba/findiff findiff] * [https://mpmath.org/ mpmath] == Externe Module für Grafiken == * [https://matplotlib.org/ Matplotlib] * [https://vpython.org/ VPython] * [https://docs.vtk.org/en/latest/api/python.html VTK] == Erstellung von User Interfaces == * [https://docs.python.org/3/library/tkinter.html tkinter - Python interface to Tcl/Tk] * [https://docs.python.org/3/library/curses.html curses - Terminal handling for character-cell displays] * [https://wiki.qt.io/Qt_for_Python Qt for Python] * [https://www.gtk.org/docs/language-bindings/python GTK and Python] == Erstellen virtueller Umgebungen == * [https://docs.python.org/3/library/venv.html venv - Creation of virtual environments] == Sonstige == * [https://python-control.readthedocs.io/en/stable/ Python Control Systems Library] * [https://pypi.org/project/regex/ regex - Regular Expressions] = Bücher = == Gedruckte Bücher, OpenBooks, Magazine == * Diverse: c't Python Lernen, Verstehen, Anwenden; Heise, 2022 * Ernesti, Kaiser: Python3 - das umfassende Handbuch; 5. Aufl., Rheinwerk, [https://openbook.rheinwerk-verlag.de/python/ OpenBook] * Inden: Python Challenge; dpunkt, 2021, ISBN 978-3-86490-809-5 * Klein: Numerisches Python; 2. Aufl., Hanser, 2023, ISBN 978-3-446-47170-2 * Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler; Rheinwerk, 2021, ISBN 978-3-8362-7316-9 * Weigend: Python 3 - Das umfassende Praxisbuch; 9. Aufl., mitp, 2022, ISBN 978-3-7475-0544-1 * Woyand: Python für Ingenieure und Naturwissenschaftler; 4. Aufl., Hanser, 2021, ISBN 978-3-446-46483-4 == Andere Wikibooks == * [[:en:Subject:Python_programming_language | Englische Wikibooks zum Thema Python]] * [[Python|Deutschsprachiges Python-Wikibook]] [[Bild:2von10.png|20%]] * [[Python unter Linux|Python 2.7 unter Linux]] [[Bild:10von10.png|100%]] {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} pnsd3c9wa5uixxmtuycs2xcu3hx4e9y 1082862 1082861 2026-04-06T13:50:38Z Intruder 1513 /* Mit VTK */ Link zu Wikipedia hinzu 1082862 wikitext text/x-wiki {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} = Hallo Welt und allgemeine Hinweise = == Was ist Python == * Python ist eine universelle höhere Programmiersprache. * Python ist objektorientiert. * Python ist Open-Source (Python Software Foundation License). * Python ist für viele Betriebssysteme erhältlich (z.B. für Linux, MS Windows, macOS). * Python ist ein Interpreter. * Python ist durch Module fast beliebig erweiterbar. * Python als Programmiersprache ist case-sensitive - d.h. Groß- und Kleinschreibung ist relevant bei der Eingabe von Befehlen. {{Wikipedia | Python (Programmiersprache)}} == Python installieren == === MS Windows === Laden Sie das aktuelle Python-Paket von der Webseite [https://www.python.org/] herunter. Weiter geht es wie bei jedem anderen größeren zu installierenden Programm. Einfach das Installationsprogramm im Explorer doppelklicken und den Anweisungen des Setup-Programmes folgen. === Linux === Entweder ist Python bereits standardmäßig installiert, ansonsten ist die Installation mittels Paketmanagementsystem einfach möglich. Aber auch die Spyder-Entwicklungsumgebung ([https://www.spyder-ide.org]) bietet einen guten Einstieg mit Python (das gilt auch für MS Windows). Spyder bringt auch schon etliche wichtige Module standardmäßig mit. == Python starten == === MS Windows === Das Icon für das Python-Programm doppelklicken. Und schon startet das Programm. [[Datei:PythonIng_start1.jpg]] Python im interaktiven Modus präsentiert sich dann so: Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> Alternativ kann das Programm auch über die Eingabeaufforderung oder die PowerShell gestartet werden: c:\devel\Python>python.exe Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> === Linux === Tippen Sie einfach das Wort „python“ (oder unter openSUSE Tumbleweed z.B. auch „python3.11“ oder „python3.13“) in einem Linux-Terminal ein, schließen den Befehl mit der RETURN-Taste ab, und schon startet Python im interaktiven Modus: Python 3.13.12 (main, Feb 09 2026, 22:37:44) [GCC] on linux Type "help", "copyright", "credits" or "license" for more information. >>> Es gibt auch noch andere Möglichkeiten Python zwecks Programmausführung zu starten, z.&nbsp;B. den {{W|Shebang}} (<code>#!</code>) am Beginn eines Python-Scripts. Das Script sei als Script.py gespeichert. Dann kann das Script mit ./Script.py ausgeführt werden. Für openSUSE Tumbleweed sei nachfolgend ein lauffähiges "Hallo Welt!"-Script angegeben. Es wird in diesem Script der Python-Interpreter in der Version 3.13 verwendet : #!/usr/bin/python3.13 print("Hallo Welt!") Die Berechtigungen zum Ausführen der Datei müssen natürlich noch richtig gesetzt werden, z.B. mittels <code>chmod 777 Script.py</code>. <small>Oder es wird in einen Pfad verschoben, in dem sich ausführbare Programme generell befinden (<code>echo $PATH</code>). Das Script kann dann wie ein normales Programm ohne weitere Angaben mit Script.py gestartet werden. Alternativ wird nicht das Script an sich verschoben, sondern nur ein symbolischer Link angelegt, z.B. mit <code>ln -s ~/tmp/Script.py ~/.local/bin/Script.py</code>.<code>~/.local/bin</code> sei ein im PATH gelegenes Verzeichnis. Dies sind aber schon Features für fortgeschrittene Linux-Benutzer und werden am Anfang eher selten benötigt.</small> == Ein paar Worte zur Erklärung == Getestet wurden die Beispiele unter den Betriebssystemen * MS Windows 10 mit der Python-Version 3.12.0 (teilweise auch mit 3.12.2 und 3.13.1; nur die Inhalte die bis spätestens Juli 2025 erstellt wurden) * MS Windows 11 ab der Python-Version 3.13.4 (nur zum Teil; ab Juli 2025) * openSUSE Leap 15.6 mit der Python-Version 3.11.12 (Spyder, nur vereinzelt) und zum Teil mit 3.12.11 (ab Juli 2025 bis November 2025). * openSUSE Tumbleweed ab der Python-Version 3.13.9 (nur vereinzelt, ab November 2025) An Beliebtheit rangiert Python mit Stand März 2026 mit einem Rating von 21,25% an 1. Stelle vor C und C++ (lt. [https://www.tiobe.com/tiobe-index/ TPCI - TIOBE Programming Community Index]). Lt. [https://innovationgraph.github.com/global-metrics/programming-languages GitHub Top 50 Programming Languages Globally] lag Python im Q3/2025 auf Rang 2, vor TypeScript und hinter JavaScript. Der Name "Python" rührt von der Komikertruppe {{W|Monty Python}} her. Die Icons für Python (z.B. Python selbst, Eric IDE, IDLE) sind aber durch die Python-Schlangenart symbolisiert. <gallery> Python-logo-notext.svg|Python-Logo Guido van Rossum OSCON 2006.jpg|Guido van Rossum (geb. 1956), der Erfinder von Python </gallery> == Ein erstes Programm == Kommentare werden in Python mit der Raute (#) eingeleitet. Sie werden vom Python-Interpreter ignoriert. Text kann mit der print-Funktion ausgegeben werden. Starten Sie Python und geben sie folgende Anweisungen zeilenweise ein >>> # Das ist ein Kommentar >>> print("Hallo Welt!") Als Ergebnis erhalten Sie Hallo Welt! Der Prompt (>>>) ist selbstverständlich nicht einzutippen, sondern wird vom Python-System geliefert. Strings können in Python entweder in Anführungszeichen (") gesetzt werden oder in Hochkommatas('). In diesem Text wird die erste Variante bevorzugt eingesetzt. Im Gegensatz zu Julia ist es hier egal, ob zwischen <code>print</code> und der öffnenden Klammer Leerzeichen stehen. = Python als Taschenrechner = == Allgemeines == Wir wollen 3 * 5 berechnen. Dazu starten wir Python im interaktiven Modus. Geben Sie dann die Formel >>> 3 * 5 ein, drücken die Taste ENTER/RETURN ({{Taste|↵}}) und erhalten als Ergebnis 15 Auch kompliziertere Ausdrücke sind möglich. Beispielsweise mit Winkelfunktionen, Quadratwurzeln etc. Wir wollen nun den Ausdruck <math>\sin\sqrt{15}</math> berechnen : >>> import math >>> math.sin(math.sqrt(15)) -0.6679052983383519 Als erstes wird das math-Modul importiert. Dann wird der mathematische Ausdruck berechnet. Eine andere Variante, die dasselbe Ergebnis liefert, ist >>> from math import * >>> sin(sqrt(15)) -0.6679052983383519 Es wird also aus dem Modul <code>math</code> alles importiert (erkennbar am <code>*</code>). Will man nicht alles importieren, so kann man das auch einschränken: >>> from math import sin, sqrt Beenden lässt sich das Python-Programm durch Eingabe von <code>exit()</code> (und natürlich ist zur Bestätigung die RETURN-Taste zu drücken). == Die Hilfefunktion von Python == Bei Eingabe der Anweisung help() springt Python in den Hilfemodus. Eingabe: >>> help() Eingabe: help> math.sin Ausgabe: Help on built-in function sin in math: math.sin = sin(x, /) Return the sine of x (measured in radians). Für die komplette Python-Dokumentation siehe [https://docs.python.org/3/]. Verlassen kann man den Hilfemodus durch das Drücken von STRG-C. == Aufgaben == * Erkunden Sie die Tangensfunktion "tan" mittels Python-Hilfe (vergessen Sie nicht das math-Modul zu importieren und das <code>math.</code> vor <code>tan</code>) * Berechnen Sie mit Python den Ausdruck <math>\frac{1}{2}\cdot e^2 \cdot \tan(\pi/3)</math>. Siehe für die Exponentialfunktion im Python-Hilfesystem auch den Befehl <code>math.exp</code>. Alternativ kann auch die Konstante <code>math.e</code> eingesetzt werden. Potenzieren kann man bei Python mit dem **-Operator (z.B. 2**3 = 8). Für <math>\pi</math> gibt es <code>math.pi</code>. = Python als Scriptsprache = Häufig wird man aber kompliziertere Anweisungsfolgen verarbeiten müssen. Diese will man normalerweise nicht jedesmal neu eingeben, sondern in einer Datei speichern und diese Datei dann zur Ausführung bringen. Speichern Sie dazu folgenden Code in einer Textdatei, z.B. unter MS Windows als c:\tmp\test1.py # Das ist ein Kommentar print("Hallo Welt!") Python-Dateien werden mit der Dateiendung .py versehen. Achten Sie darauf, dass vor dem print keine Leerzeichen vorhanden sind. Das ist eine Python-Eigenheit. Wie wir später sehen werden, nutzt Python Einrückungen als syntaktisches Mittel, z.B. um bei Schleifen den Schleifenkörper zu kennzeichnen. Danach bringen Sie die Skriptdatei test1.py (sozusagen das Hauptprogramm) folgendermaßen zur Ausführung: 1) Starten Sie unter MS Windows die Eingabeaufforderung (oder alternativ auch die Windows PowerShell). Das sieht dann etwa so aus: Microsoft Windows [Version 10.0.19045.3693] (c) Microsoft Corporation. Alle Rechte vorbehalten. C:\Users\xyz> : <small>Falls jemand nicht weiß, wie man die Eingabeaufforderung startet: Eine Möglichkeit ist, einfach in der Taskleiste von Windows das "Start"-Symbol &nbsp;([[Image:Windows_logo_-_2021_(Black).svg|10px]])&nbsp; mit der rechten Maustaste anklicken. "Ausführen" auswählen (oder alternativ für die PowerShell unter Windows 10 den Eintrag "Windows PowerShell", unter Windows 11 den Eintrag "Terminal"). Im sich öffnenden Dialogfenster gibt man in die "Öffnen"-Zeile das Wort <code>cmd</code> ein und mit "OK" wird das Ganze bestätigt.</small> 2) Wechseln Sie mittels <code>cd c:\tmp</code> in das Verzeichnis c:\tmp 3) Angenommen, Sie haben Python unter dem Pfad <code>c:\devel\Python\</code> installiert. Starten Sie das Programm so (der Prompt <code>c:\tmp></code>ist natürlich nicht mit einzutippen): c:\tmp>c:\devel\Python\python.exe test1.py 4) Wie erwartet ergibt sich folgende Ausgabe am Bildschirm Hallo Welt! Die Vorgehensweise unter Linux ist prinzipiell gleich. Die kleinen Unterschiede, wie z.B. der Slash statt dem Backslash in Pfadangaben, sollten für Linux-Benutzer keine Hürde darstellen. == Variablen == Variablenbezeichner können aus Buchstaben (A-Za-z), Ziffern (0-9) und Underscores (_) bestehen, dürfen aber nicht mit einer Zahl beginnen. Führende Underscores haben u.a. im Kontext mit der Objektorientierten Programmierung eine spezielle Bedeutung und sollten nicht für "normale" Variablenbezeichner verwendet werden. Gültige Variablenbezeichner wären also: xyz x1 _wert name_anzahl Es gibt in Python etliche Schlüsselwörter (z.B. for, if oder return). Diese dürfen nicht als eigene Variablenbezeichner verwendet werden. Eine Liste aller Schlüsselwörter liefert das Script import keyword print(keyword.kwlist) <small>Übung: Speichern Sie dieses Script in eine Datei, z.B. in c:\tmp\test1.py. Führen Sie diese Datei aus, um die Liste der Schlüsselwörter auszugeben.</small> Da Python case-sensitiv ist, repräsentieren folgende Bezeichner verschiedene Variablen: xyz XYZ xYz Werte werden an Variablen mittels Gleich-Zeichen (=) zugewiesen. Im Folgenden wird der Code immer in der Datei c:\tmp\test1.py gespeichert. x = 5 y = 10 z = x*y print(z) Bringen Sie die Datei test1.py zur Ausführung so erhalten Sie folgende Bildschirmausgabe 50 Sie können auch mehrere Anweisungen in einer Zeile durch Semikolon getrennt schreiben. Dies führt aber zu unübersichtlichem Code. x = 5; y = 10; z = x*y; print(z) Ausgabe: 50 Auch aus der Programmiersprache C/C++ oder Java bekannte Konstrukte können Sie verwenden, z.B. x = 5 # x = x - 2 x -= 2 print(x) Bildschirmausgabe: 3 Beachten Sie, dass mit dem =-Zeichen eine Wertezuweisung durchgeführt wird. Dies ist nicht äquivalent zum mathematischen =-Zeichen, wie am vorigen Beispiel zu ersehen ist. Den Inkrement-/Dekrementoperator (z.B. x++ oder x--) aus C/C++ oder Java kennt Python aber nicht. Variablen sind nicht an einen bestimmten Datentyp gebunden, folgendes ist mit Python problemlos möglich: import math wert = 10 print(wert) wert = 35.5 print(wert) wert = "Hallo" print(wert) wert = math.pi print(wert) Ausgabe: 10 35.5 Hallo 3.141592653589793 == Physische und logische Zeilen == In Python muss eine Anweisung in einer logischen Zeile Platz finden. Wird eine Anweisung aber zu lang für eine Zeile, dann kann sie in mehrere physische Zeilen unterteilt werden. Dies kann einerseits durch einen Backslash am Ende einer Zeile geschehen, z.B. a = 2 + \ 5 Dies stellt eine logische Zeile dar, die in zwei physische Zeilen unterbrochen ist. Geklammerte Ausdrücke werden automatisch zu einer logischen Zeile verbunden, z.B. a = (2 + 5) Achtung: Im ersten Beispiel darf nach dem Backslash nichts mehr stehen, auch kein Kommentar. Dies trifft im zweiten Bespiel nicht zu, hier könnte noch ein Kommentar folgen, z.B. a = (2 + # Kommentar 5) Auch für Strings gibt es Möglichkeiten, diese auf mehrere Zeilen aufzuspalten. # Kurzer String str1 = "ABC" # Langer String str2 = """Hallo Welt, Grüetzi Schwyzer, Servus an alle""" # Backslash str3 = "UVW\ XYZ" print(str1) print(str2) print(str3) Ausgabe: ABC Hallo Welt, Grüetzi Schwyzer, Servus an alle UVWXYZ ==Hexadezimale, oktale, binäre und andere Zahlen== d = 1050 # Dezimalzahl h = 0xAA2 # Hexadezimalzahl o = 0o12 # Oktalzahl b = 0b100001101 # Binärzahl print(d) print(h) print(o) print(b) Ausgabe: 1050 2722 10 269 Groß- und Kleinbuchstaben sind in obigen Literalen übrigens egal. So kann man z.B. statt <code>0b1001</code> auch <code>0B1001</code> schreiben (siehe dazu [https://docs.python.org/3/reference/lexical_analysis.html#integer-literals]). Sie können auch dezimale in hexadezimale Zahlen umwandeln, usw.: h = hex(1050) # Dezimalzahl -> Hexadezimalzahl b = bin(1050) # Dezimalzahl -> Binärzahl o = oct(1050) # Dezimalzahl -> Oktalzahl print(h) print(b) print(o) Ausgabe: 0x41a 0b10000011010 0o2032 Gegeben sei die Zahl 121 zur Basis 3. Diese soll in eine Dezimalzahl umgewandelt werden. Das kann so geschehen: z = int("121", 3) print(z) Ausgabe: 16 Dass dies richtig ist, davon kann man sich folgendermaßen überzeugen: <math> 1 \cdot 3^2 + 2 \cdot 3^1 + 1 \cdot 3^0 = 9 + 6+ 1 = 16 </math> Zahlen übersichtlicher schreiben kann man auch mittels Underscore, z.B.: print("Eine Million (Variante 1) =", 1000000) print("Eine Million (Variante 2) =", 1_000_000) print("Eine Rechnung:", 2_000 * 400_000); Es ergibt sich bei beiden Varianten die gleiche Ausgabe. Variante 2 ist aber im Sourcecode leichter lesbar, detto die Zahlen in der Rechnung: Eine Million (Variante 1) = 1000000 Eine Million (Variante 2) = 1000000 Eine Rechnung: 800000000 == Strings und Platzhalter== Ein paar einfache Beispiele: print("Hallo {}" . format("Hugo")) print("Hallo {:s}" . format("Hugo")) print("Hallo %s" % "Hugo") Ausgabe: Hallo Hugo Hallo Hugo Hallo Hugo Python-Code (formatted string literals): str1 = "Hallo" str2 = "Hugo" print(f"{str1} {str2}") Ausgabe: Hallo Hugo Komplexere Beispiele: print("Hallo {} und {}" . format("Hugo", "Mike")) print("Hallo {name1} und {name2}" . format(name2="Hugo", name1="Mike")) # Füllzeichen: * # Bündigkeit: > (=rechts), < (=links), ^ (=zentriert) # Feldweite: 10 # Typ: s (=String), f (=Gleitkommazahl), d (=Dezimalzahl) etc. print("Hallo {:*>10s}" . format("Hugo")) print("Hallo {:*<10s}" . format("Hugo")) Ausgabe: Hallo Hugo und Mike Hallo Mike und Hugo Hallo ******Hugo Hallo Hugo****** Python-Code: str = "Hallo\t%s\t%7.2f\t%10.2e\t%i" % ("Hugo", 12.34567, 34.567, 264) print(str) Ausgabe: Hallo Hugo 12.35 3.46e+01 264 == Unicode == Neben den bekannten ASCII-Zeichen lassen sich Zeichen auch mittels Unicode beschreiben. Griechische Buchstaben oder komplexere mathematische Operatoren - all das sollte kein Problem sein. Siehe auch {{W|Unicode}}, {{W|Liste der Unicodeblöcke}} und {{W|Unicodeblock Mathematische Operatoren}}. Im Folgenden werden ein paar Zeichen (Allquantor, Nabla-Operator, Existenzquantor), die man aus der Mathematik kennt, erzeugt. ch1 = "\N{FOR ALL}" ch2 = "\N{NABLA}" ch3 = "\u2203" print(ch1, ch2, ch3) Ausgabe: ∀ ∇ ∃ <small>Diese Ausgabe ergibt sich z.B. mit der IDLE-Shell oder mit Cygwin. Beim Ausführen über die Windows-Eingabeaufforderung oder Windows PowerShell unter MS Windows 10 erfolgt keine korrekte Darstellung. IDLE ist die mit Python mitgelieferte IDE ('''I'''ntegrated '''D'''evelopment '''E'''nvironment, Integrierte Entwicklungsumgebung). Gegen Ende dieses Textes wird IDLE kurz beschrieben. Das Problem mit der Windows Eingabeaufforderung lässt sich aber umgehen. Man muss nur eine Schriftart auswählen, die die Zeichen kennt, z.B. "DejaVu Sans Mono". Dazu klicken Sie einfach bei der Eingabeaufforderung mit der rechten Maustaste oben auf die weiße Leiste und wählen im aufpoppenden Fenster den Menüpunkt "Eigenschaften". Es öffnet sich ein Dialogfenster. Über den Reiter "Schriftart" lässt sich nun die Schriftart einstellen. Unter MS Windows 11 oder openSUSE Leap 15.6 (bash-Konsole) gibt es dieses Problem ohnehin nicht.</small> == Reguläre Ausdrücke == Python kennt auch {{W|Regulärer Ausdruck|reguläre Ausdrücke}}. Dazu gibt es in Python das Modul <code>re</code>. Beipielsweise sollen alle Zahlen (<math>\text{zahl}\in\mathbb{N}_0</math>) in einem String gesucht und ausgegeben werden. Als String sei gegeben: <code>3x Grüße und 100 Kekse.</code> Das Muster (Pattern) ist <code>\d+</code>. <code>\d</code> steht für eine Dezimalziffer 0-9. Das Plus-Zeichen (+) steht symbolisch für ein oder mehrere Zeichen des vorherigen Ausdrucks. Hier also ein oder mehrere Dezimalziffern. Es wird die Funktion <code>findall</code> aus dem Modul <code>re</code>verwendet. Python-Code: from re import findall str = "3x Grüße und 100 Kekse." pat = "\\d+" # Doppel-Backslashes müssen verwendet werden, sonst gibt Python eine Warnung aus! # alternativ: pat = r"\d+" # oder: pat = "[0-9]+" numb = findall(pat, str) print(numb) Ausgabe: ['3', '100'] Python kennt noch viele weitere Möglichkeiten mittels regulärer Ausdrücke zu hantieren. Dies soll hier aber nicht vertieft werden, da das Thema schon ziemlich speziell und komplex ist. Bei Bedarf siehe aber z.B. die Bücher ''Weigend, Seite 380ff'' und ''Ernesti, Kaiser'' [https://openbook.rheinwerk-verlag.de/python/28_001.html] oder die Python-Dokumentation [https://docs.python.org/3/library/re.html]. Auch [[Python unter Linux: Reguläre Ausdrücke]] liefert ein umfangreiches und brauchbares Python-2-Kapitel zu den regulären Ausdrücken. Die dort gelisteten Beispiele müssten ggf. vor Verwendung auf Python-3 umgeschrieben werden. <small>Wie macht man das? Dazu siehe z.B. [https://openbook.rheinwerk-verlag.de/python/43_001.html], [https://portingguide.readthedocs.io/en/latest/] oder [https://www.digitalocean.com/community/tutorials/how-to-port-python-2-code-to-python-3]</small> <small>Es gibt auch ein externes Modul ''regex'', das bei Bedarf extra installiert werden muss ([https://pypi.org/project/regex/]). Es bietet zusätzliche Funktionalität und gründlicheren Unicode-Support. Dies sei hier aber nur der Vollständigkeit halber erwähnt.</small> == Verzweigungen == === if === Die IF-Verzweigung ist aus anderen Programmiersprachen bereits bekannt. In Pseudocode lässt sie sich folgendermaßen darstellen: WENN bedingung TRUE führe block1 aus SONST führe block2 aus ENDE In Python gibt es keinen expliziten ENDE-Kennzeichner. Stattdessen wird der Code durch Einrückungen strukturiert. Alles mit der gleichen Einrückungstiefe gehört zum selben Block. Dies zeichnet Python vor anderen Programmiersprachen aus. Die test1.py-Datei laute also wie folgt: x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: Der else-Zweig wird ausgefuehrt x ist groesser oder gleich 4 Man achte auch auf die Doppelpunkte in der if- und else-Zeile. Darauf vergisst man gerne, wenn man von anderen Programmiersprachen kommt. Folgendes wäre in Python ein Fehler (genauer gesagt ein IndentationError). x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Auch Nachstehendes würde nicht zum gewünschten Ergebnis führen (löst aber keine Fehlermeldung aus). Der letzte print-Befehl ist schon außerhalb der IF-ELSE-Verzweigung. x = 3 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: x ist kleiner als 4 x ist groesser oder gleich 4 Python kennt eine Reihe von Vergleichs- und Verknüpfungsoperatoren: <, <= ... kleiner (gleich) >, >= ... größer (gleich) == ... gleich != ... ungleich is ... identisch is not ... nicht identisch and ... AND or ... OR not ... NOT Beispielsweise: a = 5 b = 9 if a<=10 and b!=7: print("OK") else print("Nicht OK") Ausgabe: OK Der else-Block kann übrigens auch ersatzlos entfallen. Mehrfache Verzweigungen werden durch das elif-Konstrukt erstellt. a = 14 if a<=10: print("<=5") elif a>11 and a<15: print("11 bis 15") elif a>16 and a<20: print("16 bis 20") else: print(">=20") Ausgabe: 11 bis 15 In Python gibt es auch die Schlüsselwörter <code>True</code> (für wahr) und <code>False</code> (für falsch). Man beachte, dass sie mit Großbuchstaben beginnen. Andere Schreibweisen wären ein Fehler. Sie gehören zum Datentyp <code>bool</code>. Ihnen sind auch die Zahlen <code>1</code> und <code>0</code> zugewiesen. === match === Ab Python 3.10 gibt es auch die match-Anweisung. Dies ist das Python-Pendant für die switch-Anweisung in anderen Programmiersprachen, geht aber bei näherer Betrachtung weit darüber hinaus. Hier nur ein einfaches Beispiel: x = "Hello" match x: case "Servus" | "Ciao": # or print("Servus an alle") case "Grüetzi": print("Grüetzi Schwyzer") case _: # other, default, sonstiges ... print("Hallo Welt") Ausgabe: Hallo Welt Für nähere Details siehe z.B. [https://www.geeksforgeeks.org/python-match-case-statement/], [https://learnpython.com/blog/python-match-case-statement/], [https://docs.python.org/3/tutorial/controlflow.html#match-statements] und das Python Enhancement Proposal (PEP) 636 – Structural Pattern Matching: Tutorial [https://peps.python.org/pep-0636] und dort insbesondere den Anhang A - Quick Intro. <small><code>match, case, _</code> etc. sind sogenannte ''soft keywords''. Im Gegensatz zu den normalen Schlüsselwörtern dürfen ihnen auch Werte zugewiesen werden. Eine Liste der weichen Schlüsselwörter lässt sich durch <code>keyword.softkwlist</code> erstellen (die Anweisung gibt es seit Python 3.9). Siehe dazu auch [https://stackoverflow.com/questions/65800344/what-are-soft-keywords] und [https://docs.python.org/3/library/keyword.html#keyword.softkwlist].</small> == Schleifen == === while === Die WHILE-Schleife ist kopfgesteuert. Sie funktioniert wie aus anderen Programmiersprachen bekannt. In Pseudocode: SOLANGE bedingung TRUE führe block aus ENDE In Python: x = 0 while x <= 10: print(x) x += 1 Ausgabe: 0 1 2 3 4 5 6 7 8 9 10 === for === for x in range(6): print(x*2) Ausgabe: 0 2 4 6 8 10 Die Schleife läuft von 0 bis 5. Ausgegeben wird jeweils der Wert x*2. Aquivalent kann diese Schleife auch so geschrieben werden: for x in range(0, 11, 2): print(x) Die Ausgabe ist wie oben. Der Startwert sei 0, der Endwert ist 11-1 und die Schrittweite ist 2. Ein anderes Beispiel sei for x in "text": print(x) Ausgabe: t e x t == Schleifen abbrechen == === break === <code>break</code> bricht die Schleife ab und setzt mit dem nächsten Befehl außerhalb der Schleife fort. for var in range(100): print(var) if var == 5: break Ausgabe: 0 1 2 3 4 5 === continue === <code>continue</code> bricht den aktuellen Schleifendurchlauf ab und setzt mit dem nächsten Schleifendurchlauf fort. for var in range (11): if var == 5: continue print(var) Ausgabe: 0 1 2 3 4 6 7 8 9 10 == try - except == try: z1 = 12 / 0 print(z1) except ZeroDivisionError: print("Das Ergebnis ist unendlich") except: print("Kann nicht berechnet werden!") print("Bitte die Formel korrigieren!") Ausgabe: Das Ergebnis ist unendlich Es wird versucht, eine Zahl durch Null zu dividieren. Das ist nicht möglich, es wird eine Ausnahme ausgelöst. Das Programm springt daher in den except-ZeroDivisionError-Block und führt die dort gelisteten Anweisungen aus (in unserem Fall eine print-Anweisung). Würden wir dieses Programm ohne try-except ausführen, so ergibt sich aus z1 = 12 / 0 print(z1) folgende Fehlermeldung und ein unmittelbarer Programmabbruch Traceback (most recent call last): File "C:\tmp\test1.py", line 1, in <module> z1 = 12 / 0 ZeroDivisionError: division by zero Mit dem try-except-Mechanismus können also Ausnahmen oder Fehler aufgefangen und behandelt werden. In unserem Beispiel ist das eher trivial, aber bei größeren Programmen kann das durchaus Sinn machen. == pass == Ein leerer Block muss in Python mittels dem Schlüsselwort <code>pass</code> dargestellt werden. Z.B. x = 2 if x == 1: print("Wert ist ", x) else: pass Würde man das <code>pass</code> im else-Block weglassen, so würde man eine Fehlermeldung erhalten: IndentationError: expected an indented block after 'else' statement on line 5 = Funktionen = == Aufrufen von Funktionen == Funktionen sind uns im Rahmen dieses Kurses schon zuhauf begegnet. Sei es die print()-, die math.sin()- oder die hex()-Funktion. All diese Funktionen werden von Python zur Verfügung gestellt, ohne dass man sie explizit programmieren müsste. Aufgerufen werden diese Funktionen, indem man ihren Namen eintippt, gefolgt von runden Klammern. In diesen Klammern können noch Argumente übergeben werden. Auch Rückgabewerte sind möglich. == Funktionen selber schreiben == Funktionen werden mit dem def-Schlüsselwort (man definiert die Funktion) eingeleitet, danach folgt der Funktionsname, danach wiederum runde Klammern, in denen formale Argumente stehen können. Abgeschlossen wird die def-Zeile mit einem Doppelpunkt. Danach folgt der Funktionskörper. Dieser Funktionskörper muss wiederum eingerückt werden (wie von den Verzweigungen und Schleifen bekannt). Aufgerufen wird diese Funktion, indem man ihren Funktionsnamen eingibt, gefolgt von runden Klammern (ggf. mit den aktuellen Parametern). Z.B. # Funktion definieren def halloWelt(i): # i ... beliebige Ganzzahl print("Hallo " * i, end="") print("Welt!") # Funktion aufrufen halloWelt(3) Ausgabe: Hallo Hallo Hallo Welt! Unterschied zwischen formalen und aktuellen Parametern: [[Datei:PythonIng_func1.jpg]] <small>Aktuelle Parameter werden auch Argumente genannt.</small> Rückgabe von Funktionswerten: # Funktion definieren def mathFunc(a, b): r1 = a + b r2 = a * b return r1, r2 # Funktion aufrufen a, b = mathFunc(3, 5) # Ausgabe der zurückgegebenen Werte print(a) print(b) Ausgabe: 8 15 Vorgabeparameter, z.B.: def mathFunc(a=10, b=20): r1 = a + b r2 = a * b return r1, r2 a, b = mathFunc(3, 5) print(a) print(b) a, b = mathFunc(5) print(a) print(b) a, b = mathFunc(b=6) print(a) print(b) Ausgabe: 8 15 25 100 16 60 == Lambda-Funktionen == print((lambda a, b: a*b) (3, 5)) Ausgabe: 15 Eingeleitet wird eine Lambda-Funktion (auch Lambda-Form, Lambda-Operator oder anonyme Funktion genannt) mit dem Schlüsselwort <code>lambda</code>. Es folgen die formalen Argumente, danach ein Doppelpunkt, die Berechnungsvorschrift und ggf. abschliessend in Klammern die aktuellen Parameter. Man kann einer Lambda-Funktion auch einen Funktionsnamen geben und die Funktion über diesen Namen aufrufen, z.B. prod = lambda a, b: a*b print(prod(3, 5)) Als Ausgabe wird wieder die Zahl 15 geliefert. == Rekursive Funktionen == Funktionen können wiederum andere Funktionen aufrufen. Von einem rekursiven Funktionsaufruf spricht man, wenn die aufgerufene Funktion gleich der aufrufenden ist. def printFunc(i): if (i >= 5): return else: print("Hallo Welt") printFunc(i+1) printFunc(1) Ausgabe: Hallo Welt Hallo Welt Hallo Welt Hallo Welt == Funktionsannotationen == Python ist sehr flexibel, was Typen angeht. Im Vorhergehenden haben wir generell keine Typangaben gemacht. Will man Typen angeben, so bietet Python das Konzept der Funktionsannotation. def calcFunc(a:int, b:int) -> int: return a+b, a*b r1 = calcFunc(8, 9) r2 = calcFunc(8.0, 9.0) print(r1) print(r2) Ausgabe: (17, 72) (17.0, 72.0) Jetzt sieht man auf den ersten Blick, welche Typen der Programmierer im Sinn hatte, als er die Funktion erstellte. Das Problem dabei ist nur, dass es Python ziemlich egal ist, welche Typen man in Endeffekt eingibt. Im obigen Beispiel können statt Integer-Typen auch Float-Typen eingegeben werden. == Variadische Funktionen == Python-Code: def test1(a, *b): print(a); for c in b: print(c); test1("Hallo", "Welt", "Schweizer", "und alle anderen") Ausgabe: Hallo Welt Schweizer und alle anderen Mit dem Stern (auch als Splat-Operator bezeichnet) in der formalen Parameterliste bei der Funktion <code>test1</code> wird angezeigt, dass eine beliebige Anzahl von Argumenten übergeben wird. <small> Dies entspricht in etwa dem, was in anderen Programmiersprachen (PHP etc.) mittels Ellipse (<code>...</code>) angezeigt wird.</small> = Tupel, Listen und andere = [[Datei:Python 3. The standard type hierarchy.png|mini|hochkant=1.7|Datentypen und Strukturen]] Tupel, Listen und einige andere sind Datenstrukturen oder Sequenzen. Listen (z.B. eine Einkaufsliste) sind veränderbar (mutable). Ein Tupel kann dagegen nicht verändert werden (immutable). Listen werden beim Anlegen in eckige Klammern eingeschlossen, Tupel in runde Klammern. Beim Tupel können die Klammern auch weggelassen werden. Ein Tupel mit nur einem Element muss mit einem Beistrich abgeschlossen werden. Der Grund ist, dass Python sonst nicht entscheiden kann, ob ein Tupel angelegt werden soll, oder nur ein geklammerter Wert. Nachfolgend werden einige Operationen mit Listen und Tupel dargestellt. Als Gedächtnisstütze kann man sich den Unterschied zwischen Tupel und Liste ev. so leichter merken: : T'''u'''pel ... r'''u'''nde Klammern, '''u'''nveränderlich : L'''i'''ste ... eck'''i'''ge Klammern, veränderl'''i'''ch. # Liste und Tupel liste = [1, 2, "Hallo"] tupel = (1, 2, "Hallo") # Ausgabe von liste und tupel print(liste) print(tupel) # Ausgabe von Einzelelementen print(liste[1]) print(tupel[2]) # Element an Liste anhängen und einfügen liste.append(55) liste.insert(4, "Welt") print(liste) # Element aus Liste entfernen liste.remove(1) print(liste) # einige weitere Beispiele liste2 = [1,] tupel2 = 1, 2 tupel3 = (1,) print(liste2) print(tupel2) print(tupel3) Ausgabe: [1, 2, 'Hallo'] (1, 2, 'Hallo') 2 Hallo [1, 2, 'Hallo', 55, 'Welt'] [2, 'Hallo', 55, 'Welt'] [1] (1, 2) (1,) Zu den Datenstrukturen gehören weiters auch Mengen und Dictionaries. Mengen sind von der Mathematik bekannt, sie sind ungeordnet und es kommen keine mehrfachen Elemente vor. Dictionaries sind durch Schlüssel :Wert-Paare gekennzeichnet. Mengen werden beim Anlegen wie Dictionaries in geschweifte Klammern eingeschlossen. dict = {"vorname":"Hugo", "nachname":"Meister" } menge = {1, 1, 3, 4, 4, 4, "Hallo"} print(dict) print(menge) print(dict["vorname"]) Ausgabe: {'vorname': 'Hugo', 'nachname': 'Meister'} {1, 3, 4, 'Hallo'} Hugo Geschweifte Klammern ohne Inhalt stellen Dictionaries dar und keine Mengen: di = {} print(type(di)) Ausgabe: <class 'dict'> == List Comprehensions == Aus einer Eingabeliste soll eine Ausgabeliste erzeugt werden. Das kann folgendermaßen geschehen. Mathematische Schreibweise: <math>lc = \{2x|x\in\ \mathbb{N}, 1\le x < 11\}</math> Python-Code: lc = [x*2 for x in range(1,11)] print(lc) Ausgabe: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] Mathematische Schreibweise: <math>lc = \{2x | x \in \mathbb{N}, 1\le x < 11, x \bmod 2 = 0 \}</math> Python-Code: lc = [x*2 for x in range(1,11) if x%2 == 0] print(lc) Ausgabe: [4, 8, 12, 16, 20] Siehe auch {{W|List Comprehension}}. == Set Comprehensions == Dies ist sehr ähnlich wie im vorigen Abschnitt beschrieben. Es wird aber keine Liste, sondern eine Menge erzeugt. sc = {x*2 for x in range(1,11)} print(sc) Ausgabe: {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} == Listen zusammenführen - zip() == li1 = ["A", "B", "C", "D"] li2 = [1, 2, 3, 4] li3 = [5.5, 6.6, 7.7, 8.8] z = zip(li1, li2, li3) print(z) li4 = list(z) print(li4) Ausgabe: <zip object at 0x00000283B6C6AC80> [('A', 1, 5.5), ('B', 2, 6.6), ('C', 3, 7.7), ('D', 4, 8.8)] == Generatorausdruck == g = (i*2 for i in range(1,11)) print(g) t = tuple(g) print(t) print(t[1:3]) Ausgabe: <generator object <genexpr> at 0x00000241D2A4A5A0> (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) (4, 6) == Slicing == slice ... Scheibe, Teil, in Scheiben schneiden Beispiel: Zugriff auf Elemente eines geordneten sequentiellen Objekttyps (Liste, Tupel oder String): str1 = "Hallo" # Das erste Element wird mit dem Index 0 angesprochen # [start (inkl.) : stop (exkl.) : step (default=1)] str2 = str1[0:2] # Alternativ auch: str2 = str1[:2] print(str2) tup1 = (0,1,2,3) # Das letzte Element hat auch den Index -1, das vorletzte den Index -2 usw. tup2 = tup1[-3:-1] print(tup2) lst1 = [[1, 5, 10, 20], [30, 40, 50, 60]] lst2 = lst1[1][1] print(lst2) Ausgabe: Ha (1, 2) 40 Beispiel: Umdrehen von Strings str1 = "Hallo" str2 = str1[::-1] print(str2) Ausgabe: ollaH = Objektorientierte Programmierung = == Eine einfache Klasse == [[Datei:PythonIng_uml1.svg | 200px]] class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 fahr = Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die Klasse Fahrzeug wird durch das class-Schlüsselwort eingeleitet. raeder ist ein Klassenattribut und public. __init__ wird bei der Objekterzeugung automatisch aufgerufen. Man achte darauf, dass diese Methode immer mit zwei Unterstrichen eingeleitet und abgeschlossen wird. Instanzattributen wird das Wort self vorangestellt. Wir sehen uns z.B. das Attribut self.__geschwind an. Auch hier werden zwei Unterstriche verwendet. Das bedeutet, dass dieses Attribut private ist. Bei den Methoden wird immer self als erster Parameter angegeben. Beim Aufruf der entsprechenden Funktion wird das self aber nicht berücksichtigt. == Klassen importieren == Häufig ist es sinnvoll und übersichtlicher Klassen in eigenen Dateien zu speichern. Das sind dann eigene Module. Abgespeichert werden Sie mit der Endung py, wie bisher auch praktiziert. Aufgerufen werden Sie mit der import-Anweisung. Dann ist aber nur der Dateiname ohne Endung py zu verwenden. Klarer wird das mit einem Beispiel. Datei c:\tmp\fahrzeug.py class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 Datei c:\tmp\test1.py import fahrzeug fahr = fahrzeug.Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die üblichen import-Anweisungen lauten wie folgt: {| {{prettytable}} ! import-Befehl ! Instanz |- | import xyz || xyz.Klasse |- | import xyz as x || x.Klasse |- | from xyz import Klasse || Klasse |- | from xyz import * || Klasse |} Der Vorteil der ersten beiden import-Anweisungen ist, dass es kaum zu Namenskollisionen kommen kann. Dafür hat man bei den letzten beiden Varianten weniger Tipparbeit. == Vererbung == [[Datei:PythonIng_uml2.svg | 200px]] Datei fahrzeug.py: class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 class Luftfahrzeug(Fahrzeug): def __init__(self, geschwindigkeit, leistung, fluegel): super().__init__(geschwindigkeit, leistung) self.__flueg = fluegel def getFlueg(self): return self.__flueg Datei test1.py: import fahrzeug fahr = fahrzeug.Luftfahrzeug(150, 90, 4) print(fahr.getFlueg()) Ausgabe: 4 = Grafiken zeichnen = Für das Zeichnen von Grafiken wird hier das Modul <code>matplotlib</code> verwendet. <code>matplotlib</code> ist ein externes Modul und muss vor der ersten Verwendung installiert werden. Das geht so: # Starten Sie ein Terminal (bei Windows die Eingabeaufforderung). # Führen Sie darin folgenden Befehl aus <code>c:\devel\Python\Scripts\pip.exe install matplotlib</code> pip ist übrigens der Paketmanager von Python ({{W|Pip_(Python)}}). Optimalerweise installieren wir auch gleich das Modul <code>numpy</code> (Numerical Python). Wir werden es im Folgenden oft benötigen (nicht nur bei den Grafiken). Das funktioniert vom Prinzip her genauso, wie für <code>matplotlib</code> gezeigt. <small>Verwenden Sie Spyder, so sind diese Schritte nicht nötig. Spyder inkludiert diese Pakete standardmäßig. Unter openSUSE Tumbleweed lassen sich diese Pakete mittels YaST oder zypper installieren.</small> == 2D == === Graph einer Funktion === Es soll die cosh-Funktion im Intervall <math>x\in[-3,3]</math> gezeichnet werden. Der Programmcode lautet in der einfachsten Form: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh1.jpg]] Der Code ist quasi selbsterklärend. Das Untermodul pyplot des matplotlib-Moduls und das numpy-Modul werden importiert. x läuft von -3 bis +3. y wird für jeden x-Wert per Formel ausgerechnet. "plt.plot()" ist der Zeichenbefehl. "plt.show" ist notwendig, um das Fenster mit der Grafik anzuzeigen. Die Schrittweite 0.1 wurde so gewählt, um einen ausreichend glatten Verlauf des Graphen zu gewährleisten. Das ist immer ein Kompromiss zwischen Berechnungszeit und Ansehnlichkeit. Testen Sie einfach ein paar verschiedene Werte, um ein Gefühl dafür zu zu bekommen. "plt.grid()" zeichnet ein Gitter in die Grafik (kann auch weggelassen werden). Die Bezeichnungen plt und np könnten auch anders gewählt werden. Es ist aber Konvention, diese so wie hier gezeigt zu wählen. <small>Mit der im obigen Bild gezeigten Menüleiste kann die dargestellte Grafik nachträglich noch geändert werden (Zoom, Pan, Achsenparameter, Kurvenparameter etc.). Natürlich kann man das alles auch direkt programmieren. Wie das funktioniert wird ansatzweise etwas später gezeigt.</small> Ein etwas komplexeres Beispiel ist Folgendes: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) + 2**x plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh4.png]] Man beachte, dass im Gegensatz zu Octave und Julia der ominöse Punkt (.) bei 2**x mit Python nicht benötigt wird. Das macht das Programmiererleben etwas einfacher. === Graphen mehrerer Funktionen und weiteres === import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x") plt.plot(x, y2, label = "sin(x) * cos(x)") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh2.png]] Um die Linienstile etwas individueller zu gestalten, ist folgender Programmcode gedacht: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x", lw=5, ls="dotted") plt.plot(x, y2, label = "sin(x) * cos(x)", lw=3, ls="--") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh3.png]] === Funktion in Parameterdarstellung === Es soll die archimedische Spirale <math>x = t \cos(t), y = t \sin(t)</math> im Intervall <math>[0, 6\pi[</math> gezeichnet werden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.show() [[Datei:PythonIng_spirale1.png]] Diese Darstellung erscheint verzerrt. Will man gleiche Achsenskalierungen, so kann man den plt.axis()-Befehl verwenden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.axis("equal") plt.show() [[Datei:PythonIng_spirale2.png]] === Funktion in Polardarstellung === import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(projection="polar") r = np.arange(0, 1, 0.01) theta = r**3 line = ax.plot(theta, r) plt.show() [[Datei:PythonIng_polar1.png]] === Logarithmische Achsenskalierung === ==== Semilog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.semilogy() plt.show() Ausgabe: [[Datei:PythonIng_semilog1.png]] ==== LogLog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.loglog() plt.show() [[Datei:PythonIng_loglog1.png]] === Gefüllte Fläche === import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 3, 0.1) y1 = 3*x - 1 y2 = x**2 plt.plot(x, y1, x, y2, color='black') plt.fill_between(x, y1, y2, where=y1>=y2) plt.show() [[Datei:PythonIng_gefuellt.png]] === Linien, Pfeile, Rechtecke, Kreise und Texte === import matplotlib as mpl import matplotlib.pyplot as plt fig, ax = plt.subplots() r = mpl.patches.Rectangle((0, 0), 3, 3, angle=30, fill=False) c = mpl.patches.Circle((4, 4), 2, fill=False) ax.add_patch(r) ax.add_patch(c) ax.plot([-2, 7], [-2, 0], color="black") ax.arrow(0, 7, 5, 0, length_includes_head=True, head_width=0.5, head_length=1.5, color="black") ax.set_aspect("equal") plt.axis([-3, 8, -3, 8]) plt.show() [[Datei:PythonIng_linien_pfeile_etc.png]] Text kann mit <code>ax.text(x, y, "Text")</code> hinzugefügt werden, bspw. import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.text(0.1, 0.1, "Hallo") ax.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() Oder einfacher auch ohne <code>subplots</code> import matplotlib.pyplot as plt plt.text(0.1, 0.1, "Hallo") plt.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text1.png]] Auch Sonderzeichen (griechische Buchstaben etc.) können verwendet werden (siehe dazu auch [https://matplotlib.org/stable/users/explain/text/mathtext.html]). import matplotlib.pyplot as plt plt.text(.3, .5, r'$\Omega\ \psi\ \oint\ \nabla\ \dot a\ \frac{a}{b}\ a_b$', size="20") plt.show() [[Datei:PythonIng_text20.svg]] Jetzt wird noch gezeigt, wofür <code>subplots</code> sinnvoll eingesetzt werden können. import matplotlib.pyplot as plt fig, ax = plt.subplots(nrows=1, ncols=2) ax[0].text(0.1, 0.1, "Hallo") ax[1].text(0.1, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text2.png]] === Aufgaben === * Zeichnen Sie die Strophoide <math>x = \frac{a(t^2-1)}{t^2+1}, y = \frac{at(t^2-1)}{t^2+1}, a = 2, -3 \leq t \leq 3</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_strophoide.jpg]] * Zeichnen Sie die verschlungene Hypozykloide <math>x = (R-r)\cos t + c\cos\frac{R-r}{r}t, y = (R-r)\sin t - c\sin\frac{R-r}{r}t, c = 3, r = 2, R = 6, -15 \leq t \leq 15</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_hypozykloide.jpg]] * Testen Sie bei den obigen Übungsaufgaben verschiedene Linienstile und Farben. Farben können mit dem plt.plot()-Parameter color gewählt werden. * Testen Sie bei den obigen Übungsaufgaben verschiedene Werte für a, c, r und R. == 3D == === Räumliche Kurven === import matplotlib.pyplot as plt import numpy as np t = np.arange(0, 6*np.pi, 0.1) x = t * np.cos(t) y = t * np.sin(t) z = t fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot(x, y, z) plt.show() [[Datei:PythonIng_raumkurve1.png]] === Flächen === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z) plt.show() [[Datei:PythonIng_fläche1.png]] Das Ganze in Netzdarstellung läßt sich so programmieren: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.5) y = np.arange(0, 10, 0.5) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_wireframe(x, y, z) plt.show() [[Datei:PythonIng_fläche2.png]] Ein etwas komplexeres Beispiel: import matplotlib.pyplot as plt import numpy as np x = np.arange(0.1, 10, 0.1) y = np.arange(0.1, 10, 0.1) x, y = np.meshgrid(x, y) z1 = np.sin(x) + 3 * np.cos(y) z2 = np.sin(x) + np.log(y) z3 = x + np.cos(y) z4 = x**2 - y fig, ax = plt.subplots(subplot_kw={"projection": "3d"}, nrows=2, ncols=2) ax[0][0].plot_surface(x, y, z1) ax[0][1].plot_surface(x, y, z2) ax[1][0].plot_surface(x, y, z3) ax[1][1].plot_surface(x, y, z4) plt.show() [[Datei:PythonIng_subplot1.png]] Man beachte, dass man die Unterbilder im Bild nach dem Ausführen des Scripts z.B. mit der mittleren Maustaste einzeln drehen, oder über die Einträge in der Menüzeile einzeln bearbeiten kann. Mit ein paar Zeilen Programmtext lässt sich also eine Menge an Funktionalität generieren. Die Farbgebung lässt sich über <code>colormaps</code> variieren. import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm) plt.show() [[Datei:PythonIng_colormap1.png]] Es gibt eine Menge an Colormaps, z.B. <code>plasma, Greys, Dark2, ocean</code>. Zwecks detaillierterer Infos siehe die matplotlib-Dokumentation. <small>Verwendet man die IDE namens IDLE, so gibt es dort auch die automatische Codevervollständigung. D.h. es werden alle Möglichkeiten (in unserem Fall nach dem Eintippen von <code>cm.</code> alle verfügbaren Colormaps) angezeigt.</small> Die "edgecolor" und Linienbreite können auch frei gewählt werden: import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm, edgecolor="black", linewidth=1.0) plt.show() [[Datei:PythonIng_colormap2.png]] === Höhenlinien === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contour(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien1.png]] Etwas abgewandelt sieht das so aus: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() hl = ax.contour(x, y, z) ax.clabel(hl, inline = True) plt.show() [[Datei:PythonIng_höhenlinien2.png]] Und noch eine Variante sei gezeigt. import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contourf(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien3.png]] === Aufgaben === * Zeichnen Sie die räumliche Kurve <math>x = 2 \cdot \cosh(t)</math>, <math>y = 5 \cdot \sin(t)</math>, <math> z = t^{2} - t</math>, <math>0 \leq t \leq 3\pi</math>. * Zeichnen Sie die Fläche <math>z = \log(x) + \cos(y)</math>. == Animationen == === Mit matplotlib === Auch mit matplotlib sind Animationen möglich. Das ist ein bisschen komplizierter und wird deshalb hier nur mit einem sehr einfachen Beispiel dargestellt (bei Interesse siehe z.B. auch das [https://matplotlib.org/stable/users/explain/animations/animations.html#animations Animations using Matplotlib-Tutorial]). import matplotlib.pyplot as plt import matplotlib.animation as ani import matplotlib import numpy as np def update(frame): line.set_xdata(x[:frame]) line.set_ydata(y[:frame]) return (line) fig, ax = plt.subplots() x = np.arange(0, 10, .1) y = np.sin(x) line, = ax.plot(x[0], y[0]) ax.set(xlim=[0, 10], ylim=[-1, 1]) a = ani.FuncAnimation(fig=fig, func=update, frames=100, interval=20) plt.show() # Speichere die Animation in einem animierten GIF (optional) a.save(filename="c:/tmp/PythonIng_anim5.gif", writer="pillow") [[Datei:PythonIng_anim5.gif]] Es wird eine Sinuskurve auf den Bildschirm gezeichnet. In der letzten Zeile wird diese Animation in ein animiertes GIF gespeichert. Das ist natürlich optional und kann auch weggelassen werden. === Mit VPython === Aber auch mit dem Modul VPython lassen sich einfache 3D-Animationen erstellen. VPython ist ein externes Modul, das vorab installiert werden muss. Unter openSUSE Tumbleweed gibt es dzt. kein entsprechendes rpm-Paket. Die übliche Methode der Installation mittels YaST oder zypper ist somit nicht möglich. Auch eine direkte Verwendung von pip führt nur zu einer Fehlermeldung (<code>error: externally-managed-environment</code>). Es empfiehlt sich dort folgende Vorgehensweise: # Erstelle zuerst eine virtuelle Umgebung, z.B.: <code>python3.11 -m venv ~/tmp/venv1</code> # Wechsle das Verzeichnis: <code>cd ~/tmp/venv1/bin</code> # Installiere das entsprechende Paket: <code>./pip install vpython</code> # Führe das entsprechende Skript aus: <code>./python ~/tmp/test1.py</code> Aktuell (März 2026) ist dieses Programmpaket lt. der [https://vpython.org/presentation2018/install.html VPython-Homepage] nur für die Python-Versionen 3.8 bis 3.12 verfügbar. Ein Beispiel zu einer einfachen Animation wird nachfolgend geliefert. from vpython import * scene.width = 1200 scene.height = 600 scene.center = vector(20,0,0) scene.background = color.white cylinder(pos=vector(0,0,0), axis=vector(20,0,0), radius=5, color=color.blue) cone(pos=vector(0,0,0), axis=vector(-10,0,0), radius=5, color=color.blue) helix(pos=vector(20,0,0), axis=vector(40,0,0), radius=2, coils=10, thickness=0.5, color=color.blue) ball = sphere(pos=vector(20,0,0), color = color.green, radius = 1) ball.p = vector(0.15, 0, 0) toc = True while True: rate(200) if(ball.pos.x <= 60 and toc == True): ball.pos += ball.p else: toc = False ball.pos -= ball.p if(ball.pos.x <= 20 and toc == False): toc = True [[Datei:PythonIng_vpython_anim.JPG]] Idealerweise öffnet sich beim Ausführen des Scripts ein Browserfenster. Darin wird die programmierte Animation gezeigt (siehe auch den obigen Screenshot). Eine Größenänderung können Sie mit der mittleren Maustaste initiieren. Die Szenerie drehen können Sie mit der rechten Maustaste. === Mit VTK === Komplexer, aber auch mächtiger als VPython ist die Verwendung von VTK ('''V'''isualization '''T'''ool'''k'''it). Genauer gesagt des Python-Wrappers von VTK. Dieses externe Python-Modul muss vorab installiert werden (z.B. mittels YaST, pip oder in eine virtuelle Umgebung). VTK ist eine Softwarebibliothek zur 3D-Visualisierung und wurde ursprünglich in C++ geschrieben. Verbreitet eingesetzt wird diese Bibliothek in der Wissenschaft und Forschung, z.B. * in der medizinischen Bildgebung * für Strömungssimulationen * für Klimadaten VTK funktioniert nach dem {{W|Grafikpipeline|Pipeline-Prinzip}}: Source (Quellen) -> Filter -> Mapper (Senken) -> Actor/Renderer Daten fließen von den Quellen zu den Senken. Als einfaches Beispiel wird die Darstellung eines Zylinders gezeigt, der mit den Maustasten gedreht oder in der Größe geändert werden kann: import vtk # Zylinder erzeugen cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) # Geometrie in darstellbare Daten umwandeln mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) # Objekt in der Szene actor = vtk.vtkActor() actor.SetMapper(mapper) # Szene verwalten renderer = vtk.vtkRenderer() renderer.AddActor(actor) # Render-Fenster render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) # Maus/Tastatur-Steuerung interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) # Starten render_window.Render() interactor.Start() Ausgabe: [[Datei:PythonIng_VTK_1.png]] Gleiches Beispiel wie oben, aber mit einer Animationssequenz: import vtk import time cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) renderer = vtk.vtkRenderer() renderer.AddActor(actor) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) render_window.Render() time.sleep(0.01) Das Grafikfenster schließt sich nach Ablauf der Schleife. Das Fenster bleibt geöffnet, wenn Sie am Programmende folgenden Befehl hinschreiben interactor.Start() Um den animierten Zylinder grün einzufärben, müssen Sie Folgendes im obigen Programm ergänzen (Farbnamen): colors = vtk.vtkNamedColors() actor.GetProperty().SetColor(colors.GetColor3d("Green")) Als Namen können Sie u.a. die CSS3 Web-Farben verwenden (siehe z.B. [https://wiki.selfhtml.org/wiki/Farbe/Farbangaben]). Alternativ funktioniert auch das (RGB): actor.GetProperty().SetColor(0.0, 0.6, 0.0) Wie der Zylinder mit einer Textur versehen wird, zeigt folgendes Programm: import vtk import time cylinder = vtk.vtkCylinderSource() cylinder.SetResolution(30) cylinder.SetHeight(3.0) cylinder.SetRadius(1.0) cylinder.CappingOn() texture_coords = vtk.vtkTextureMapToCylinder() texture_coords.SetInputConnection(cylinder.GetOutputPort()) texture_coords.PreventSeamOn() reader = vtk.vtkJPEGReader() reader.SetFileName("PythonIng_textur.jpg") texture = vtk.vtkTexture() texture.SetInputConnection(reader.GetOutputPort()) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(texture_coords.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.SetTexture(texture) renderer = vtk.vtkRenderer() renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) renderer.AddActor(actor) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) renderWindow.Render() time.sleep(0.01) interactor.Start() <gallery> PythonIng_textur.jpg | Textur-Datei PythonIng_VTK_2.png | Ausgabe (Screenshot) </gallery> Nun aber genug von VTK und der Erstellung von Grafiken, weiter geht es mit mathematischeren Themen. = Vektoren und Matrizen = == Zahlenfolgen == from numpy import * start = 0 stop = 10 step = 2 num = 10 r = arange(start, stop, step) l = linspace(start, stop, num) print("r = ", r) print("l = ", l) Ausgabe: r = [0 2 4 6 8] l = [ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556 6.66666667 7.77777778 8.88888889 10. ] == Vektoren == Vektoren sollten jedem aus der Linearen Algebra bekannt sein. === Arrays === In Python mit NumPy kann man Vektoren durch die Funktion array erzeugen. import numpy as np l1 = (-5, 3, 2) l2 = (1, 1, 4) a1 = np.array(l1) a2 = np.array(l2) a3 = a1 + a2 a4 = 2 * a2 print(a1) print(a2) print(a3) print(a3[2]) print(a4) Ausgabe: [-5 3 2] [1 1 4] [-4 4 6] 6 [2 2 8] === Zeilen- und Spaltenvektoren === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) print(z) print(s) Ausgabe: [ [-5 3 2] ] [[1] [1] [4]] === Skalarprodukt === import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) skalarprodukt = np.dot(a1, a2) print(skalarprodukt) Ausgabe: 6 === Vektorprodukt === <math>a\ast b=\left(\begin{array}{c} a_{1}\\ a_{2}\\ a_{3} \end{array}\right)\ast\left(\begin{array}{c} b_{1}\\ b_{2}\\ b_{3} \end{array}\right)=\left(\begin{array}{c} a_{2}b_{3}-a_{3}b_{2}\\ a_{3}b_{1}-a_{1}b_{3}\\ a_{1}b_{2}-a_{2}b_{1} \end{array}\right) </math> Python-Code: import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) vektorprodukt = np.cross(a1, a2) print(vektorprodukt) Ausgabe: [10 22 -8] === Transponierter Vektor === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) # transponierter Vektor z_tp = np.transpose(z) # transponierter Vektor s_tp = np.transpose(s) print(z_tp) print(s_tp) Ausgabe: [[-5] [ 3] [ 2]] [ [1 1 4] ] === Vektorfelder visualisieren === import matplotlib.pyplot as plt import numpy as np # Daten generieren x = np.arange(0, 10, 1) y = np.arange(0, 10, 1) X, Y = np.meshgrid(x, y) U = X * Y V = Y + X # Plotten fig, ax = plt.subplots() ax.quiver(X, Y, U, V, angles='xy') plt.show() Ausgabe: [[Datei:PythonIng_quiver1.png]] == Matrizen== import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) print(m1) Ausgabe: [[1 2 3] [4 5 6]] === Zugriff auf Matrizenelemente === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) # Element aus Zeile 2 und Spalte 3 (Achtung! Index startet bei Null) print(m1[1,2]) Ausgabe: 6 === Addition und Subtraktion von Matrizen === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) m2 = np.matrix([[0, 0, 2], [1, 3, 2]]) print(m1 + m2) print(m1 - m2) Ausgabe: [[1 2 5] [5 8 8]] [[1 2 1] [3 2 4]] === Transponierte Matrix === import numpy as np m = np.matrix([[1, 2, 3], [4, 5, 6]]) mt = np.transpose(m) print(m) print(mt) Ausgabe: [[1 2 3] [4 5 6]] [[1 4] [2 5] [3 6]] === Rang einer Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) rg = np.linalg.matrix_rank(m) print(rg) Ausgabe: 2 === Inverse Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) mi = np.linalg.inv(m) print(mi) Ausgabe: [[ 1. 0.6] [-0. -0.2]] === Multiplikation von Matrizen (falksches Schema) === import numpy as np m1 = np.matrix([[1, 3, 4], [0, -5, 1]]) m2 = np.matrix([[1, 2], [2, 3], [0, 2]]) print(m1 @ m2) Ausgabe: [[ 7 19] [-10 -13]] === Eigenwerte und Eigenvektoren === import numpy as np m = np.matrix([[5, 8], [1, 3]]) D,V = np.linalg.eig(m) # Eigenwerte print(D) # Eigenvektoren print(V) Ausgabe: [7. 1.] [[ 0.9701425 -0.89442719] [ 0.24253563 0.4472136 ]] === Teilmatrizen === import numpy as np m = np.matrix([[1, 3, 4], [0, -5, 1]]) print("m = ", m) # Erste Zeile extrahieren m1 = m[0,:] print("m1 = ", m1) # Das Element aus der 1. Zeile und der 2. Spalte extrahieren m2 = m[0,1] print("m2 = ", m2) # Zweite Spalte extrahieren m3 = m[:, 1] print("m3 = ", m3) Ausgabe: m = [[ 1 3 4] [ 0 -5 1]] m1 = [ [1 3 4] ] m2 = 3 m3 = [[ 3] [-5]] === Spezielle Matrizen === ==== Nullmatrix ==== import numpy as np z = np.zeros((3, 2)) print(z) Ausgabe: [[0. 0.] [0. 0.] [0. 0.]] ==== Einheitsmatrix ==== import numpy as np z = np.eye(3) print(z) Ausgabe: [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ==== Matrix mit lauter Einsen ==== import numpy as np z = np.ones((3, 2)) print(z) Ausgabe: [[1. 1.] [1. 1.] [1. 1.]] === Spärlich besetzte Matrizen === Das Thema spärlich besetzter Matrizen wird hier nur kurz angerissen. Nähere Details siehe unter dem Weblink [https://docs.scipy.org/doc/scipy/reference/sparse.html#module-scipy.sparse]. import numpy as np import scipy A = scipy.sparse.csr_array(np.eye(5)) print(A) Ausgabe: (0, 0) 1.0 (1, 1) 1.0 (2, 2) 1.0 (3, 3) 1.0 (4, 4) 1.0 = Lineare Gleichungssysteme = Sei <math>Ax = b</math> ein lineares Gleichungssystem. <math>A</math> sei die Koeffizientenmatrix, <math>x</math> der Lösungsvektor und <math>b</math> ein bekannter Vektor. Beispiel: import numpy as np A = np.array([[5, 1], [0, 2]]) b = np.array([1, 2]) x = np.linalg.solve(A, b) print(x) Ausgabe: [0. 1.] == Aufgabe == * Lösen Sie folgendes Gleichungssystem mittels Python (und zur Kontrolle auch händisch): 5x + 6y - 2z = 12 3x - y - 3z = 6 2x + 2y + 4z = 5 = Polynome = == Ein erstes einfaches Beispiel == Gegeben sei das Polynom <math>7x^3+5x^2+1</math>. In Python: import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p) Ausgabe: 3 2 7 x + 5 x + 1 == Einzelne Polynomwerte berechnen == import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p(1.5)) Ausgabe: 35.875 == Polynome integrieren und differenzieren == import numpy as np p = np.poly1d([7, 5, 0, 1]) # 1. Ableitung p1 = p.deriv() p2 = p.deriv(1) # 2. Ableitung p3 = p.deriv(2) # Integral p4 = p.integ() print(p1) print(p2) print(p3) print(p4) Ausgabe: 2 21 x + 10 x 2 21 x + 10 x 42 x + 10 4 3 1.75 x + 1.667 x + 1 x == Nullstellen bestimmen == import numpy as np p = np.poly1d([2, 5, 0, 4]) r = np.roots(p) print(r) Ausgabe: [-2.7621427 +0.j 0.13107135+0.84077099j 0.13107135-0.84077099j] == Aufgaben == * Berechnen Sie den Wert für x = 3 des Polynoms <math>y = 2x^4 - 3x^3 - x + 7</math>. * Differenzieren und integrieren Sie das Polynom <math>y = 2x^4 - 3x^3 - x + 7</math>. * Berechnen Sie die Nullstellen von <math>y = 7x^5 - 3x^2 + 12</math>. = Nichtlineare Gleichungen und Gleichungssysteme = == Nullstellenbestimmung == Löse eine beliebige Gleichung f(x) = 0, z.B. <math> f(x) = x^2 - 5\cos(x) - 10 = 0 </math>: import scipy import numpy as np def f(x): return x**2 - 5*np.cos(x) - 10 xstart = [-1, 1] # Startwerte xn = scipy.optimize.root(f, xstart) print(xn.x) Ausgabe: [-2.46813009 2.46813009] Funktionsgraph: [[Datei:octave_nichtlin2.jpg]] == Gleichungssysteme == SymPy ist ein externes Modul, das symbolisches Rechnen ('''Sym'''bolic '''Py'''thon) ermöglicht. Folgende Aufgabe ist dem Buch "Knorrenschild: Numerische Mathematik, Hanser, 2017, Seite 72" entnommen. Zu lösen ist das nichtlineare Gleichungssystem <math>f_1 = 2x_1 + 4x_2 = 0 </math> <math>f_2 = 4x_1 + 8x_2^3 = 0</math> Mit Python ist das so möglich: import sympy x1, x2 = sympy.symbols("x1 x2") f1 = 2*x1 + 4*x2 f2 = 4*x1 + 8*x2**3 s = sympy.solve((f1, f2), x1, x2) print(s) Ausgabe: [(-2, 1), (0, 0), (2, -1)] Plot: [[Datei:IngPython_nl_gleichung1.svg|500px]] = Komplexe Zahlen = Die imaginäre Einheit wird in Python durch den Buchstaben <code>j</code> symbolisiert. Darstellen kann man eine komplexe Zahl bekannterweise in mehreren Formen: * Kartesische Darstellung <math>z = \Re(z) + j \cdot \Im(z)</math> * Polardarstellungen <math>z = r \cdot (\cos(\phi) + j \cdot \sin(\phi)) = r \cdot e^{j\cdot \phi}</math> Die konjugiert komplexe Zahl ist <math>z^* = \Re(z) - j \cdot \Im(z)</math> Nachfolgend einige mathematische Operationen mit Python und NumPy. import numpy as np z1 = 2 + 5j # kartesische Darstellung z2 = 3 * np.exp(3j) # Polardarstellung # Addition res = z1 + z2 print("z1 + z2 = ", res) # Multiplikation res = z1 * z2 print("z1 * z2 = ", res) # Realteil res = np.real(z2) print("Realteil von z2 = ", res) # Imaginärteil res = np.imag(z2) print("Imaginaerteil von z2 = ", res) # Betrag res = np.abs(z1) print("Betrag von z1 = ", res) # Argument res = np.angle(z1) print("Argument von z1 = ", res) # Konjugiert komplexe Zahl res = np.conj(z1) print("Konjugiert komplexe Zahl von z1 = ", res) Ausgabe: z1 + z2 = (-0.9699774898013365+5.423360024179601j) z1 * z2 = (-8.05675510050068-14.003167400647481j) Realteil von z2 = -2.9699774898013365 Imaginaerteil von z2 = 0.4233600241796016 Betrag von z1 = 5.385164807134504 Argument von z1 = 1.1902899496825317 Konjugiert komplexe Zahl von z1 = (2-5j) = Interpolation = import numpy as np import scipy import matplotlib.pyplot as plt # Stützpunkte xp = np.arange(1, 6) yp = (0, -5, 2, 7, 6) ti = np.arange(1, 5, 0.01) i1 = scipy.interpolate.interp1d(xp, yp, kind = "linear") i2 = scipy.interpolate.interp1d(xp, yp, kind = "cubic") plt.plot(xp, yp, "rx") plt.plot(xp, i1(xp)) plt.plot(ti, i2(ti)) plt.show() Ausgabe: [[Datei:PythonIng_interpol1.png]] = Differenzialrechnung = == Numerisches Differenzieren == Als Beispiel differenzieren wir <math>y = 5x\sin{x}</math> und stellen das Ganze grafisch dar. from findiff import Diff import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) f = 5 * x * np.sin(x) dx = x[1] - x[0] # Ableitung d_dx = Diff(0, dx) df_dx = d_dx(f) # Grafik plt.plot(x, f, label = "y") plt.plot(x, df_dx, label = "y'") plt.grid() plt.legend(loc="best") plt.show() Ausgabe: [[Datei:octave_diff1.jpg]] <small>findiff ist ein externes Modul. Dieses muss installiert werden (z.B. so: ...\Python\Scripts\pip.exe install --upgrade findiff). Für die Vorgehensweise unter openSUSE Tumbleweed siehe das Kapitel VPython, nur dass das Ganze mit einer aktuelleren Python-Version exekutiert wird, z.B. mit Python 3.13. Das im Buch "Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler, Rheinwerk" verwendete Modul "scipy.misc" ist veraltet (deprecated ... missbilligt). Lt. [https://docs.scipy.org/doc/scipy-1.17.0/dev/roadmap-detailed.html#misc SciPy-Dokumentation für die Version 1.17.0] wurden alle entsprechenden Features schon entfernt.</small> == Symbolisches Differenzieren == Differenzieren Sie die Funktionen <math>f_1(x) = x^2</math> und <math>f_2(x) = \sin(x)\cos\left(\frac{x}{2}\right)</math>. import sympy x = sympy.symbols("x") f1 = x**2; f2 = sympy.sin(x) * sympy.cos(x/2.) d1 = sympy.diff(f1, x) d2 = sympy.diff(f2, x) print(d1) print(d2) Ausgabe: 2*x -0.5*sin(0.5*x)*sin(x) + cos(0.5*x)*cos(x) == Aufgaben == * Differenzieren Sie die Funktion <math>y = \log(x) + 10x</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. * Differenzieren Sie die Funktion <math>y = \frac{\sinh(x)}{(1+x)}</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. = Integralrechnung = == Numerisches Integrieren == Berechnen Sie das Integral <math>\int_{0}^{3}x^2 dx</math>. import scipy def f(x): return x**2 i = scipy.integrate.quad(f, 0, 3) print(i) Ausgabe: (9.000000000000002, 9.992007221626411e-14) Das trifft den exakten Wert 9.0 ziemlich genau. Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} dx</math>. import scipy import numpy as np def f(x): return 2**(-x) i = scipy.integrate.quad(f, 0, np.inf) print(i) Ausgabe: (1.4426950408889556, 4.486558477977586e-09) == Symbolisches Integrieren == Berechnen Sie <math>\int x^2 \text{d}x</math> und <math>\int \sin{x}\cos{\frac{x}{2}} \text{d}x</math>. import sympy x = sympy.symbols("x") f1 = x**2 f2 = sympy.sin(x) * sympy.cos(x/2.) i1 = sympy.integrate(f1, x) i2 = sympy.integrate(f2, x) print(i1) print(i2) Ausgabe: x**3/3 -0.666666666666667*sin(0.5*x)*sin(x) - 1.33333333333333*cos(0.5*x)*cos(x) Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} \text{d}x</math>. import sympy x = sympy.symbols("x") f = 2**(-x) i = sympy.integrate(f, (x, 0, sympy.oo)) print(i) Ausgabe: 1/log(2) Mit <code>sympy.pprint(i)</code> ließe sich letzere Ausgabe etwas schöner schreiben: 1 ────── log(2) Man beachtete, <code>log</code> steht hier für den natürlichen Logarithmus <code>ln</code>. == Aufgaben == * Integrieren Sie die Funktion <math>y = \log(x) + 10x</math> von 1 bis 5. * Integrieren Sie die Funktion <math>y = x^3</math> von 0 bis 4. * Integrieren Sie <math>\int x^x(\log (x) + 1)\mathrm dx</math> symbolisch. = Gewöhnliche Differenzialgleichungen = == DGL numerisch lösen == Für die Lösung von Differenzialgleichungen steht u.a. die Funktion scipy.integrate.solve_ivp() zur Verfügung. Diese Funktion implementiert auch das Runge-Kutta-Verfahren (RK45). {{Wikipedia | Runge-Kutta-Verfahren}} Beispiel <math>y' = x^2 + y^3</math>: import scipy import numpy as np import matplotlib.pyplot as plt def dy_dx(x, y): return x**2 + y**3 y0 = [1] xi = [0, 1] x = np.arange(0, 1, 0.01) z = scipy.integrate.solve_ivp(dy_dx, xi, y0, method="RK45", dense_output=True) y = z.sol(x) plt.plot(x, y.T) plt.grid() plt.show() [[Datei:PythonIng_dgl1.png]] == DGL symbolisch lösen == Beispiel <math>y' = x^2 + y^3</math>: import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) print(lsg) Ausgabe: [Eq(f(x), (-x**2)**(1/3)), Eq(f(x), (-x**2)**(1/3)*(-1 - sqrt(3)*I)/2), Eq(f(x), (-x**2)**(1/3)*(-1 + sqrt(3)*I)/2)] Mit <code>sympy.pprint</code> (pretty print) lässt sich die Ausgabe etwas übersichtlicher darstellen. import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) sympy.pprint(lsg) Ausgabe: ⎡ _____ _____ ⎤ ⎢ _____ 3 ╱ 2 3 ╱ 2 ⎥ ⎢ 3 ╱ 2 ╲╱ -x ⋅(-1 - √3⋅ⅈ) ╲╱ -x ⋅(-1 + √3⋅ⅈ)⎥ ⎢f(x) = ╲╱ -x , f(x) = ────────────────────, f(x) = ────────────────────⎥ ⎣ 2 2 ⎦ == Aufgaben == * Lösen Sie die Differenzialgleichung <math>y' = \frac{1}{x\cdot y}</math> mit Python. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>m' = -k\cdot m</math>. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>y' = \sqrt{|y|}</math>. =Rechnen mit wirklich großen Zahlen= Bekannt ist, dass Python kaum Einschränkungen beim Wertebereich von Ganzzahlen hat, z.B. print(10**300) Ausgabe (gekürzt): 100000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000 Ähnliches geht auch mit Gleitpunktzahlen, z.B. durch die Verwendung des Moduls mpmath: import mpmath print(mpmath.mpf(1500.4)**mpmath.mpf(300)) Ausgabe: 7.27975299218612e+952 Anderes Beispiel: from mpmath import mp, pi mp.dps = 100 print(pi) Ausgabe: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 mpmath kann noch einiges mehr, dazu sei aber auf die entsprechende Dokumentation auf der mpmath-Homepage verwiesen. mpmath ist Bestandteil von SymPy, kann aber auch separat installiert werden. =Regelungstechnische Aufgabenstellungen= Für regelungstechnische Aufgaben gibt es u.a. das externe Paket <code>control</code>. Hier soll nicht detailliert darauf eingegangen werden. Anhand eines Beispiels soll anschließend nur die Visualisierung in Form eines Bode-Diagramms und der Sprungantwort gezeigt werden. Gegeben sei ein P-Regler mit <math>R = \frac{5}{2}</math> und eine Strecke <math>S= \frac{1}{30s^3+20s^2+10s+1,5}</math>. Gesucht sei vorerst ein Bode-Diagramm für den offenen Regelkreis und das Führungsverhalten. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke # oder: G0 = ct.series(regler, strecke) Gw = ct.feedback(G0) ct.bode_plot(G0, label='G0') ct.bode_plot(Gw, label='Gw') plt.show() [[Datei:PythonIng_bode1.svg]] Nun noch für obiges Beispiel die Sprungantwort. Diese zeigt einige große Überschwinger, d.h. der Regler kann sicher noch optimiert werden. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke Gw = ct.feedback(G0) t, y = ct.step_response(Gw) plt.plot(t,y) plt.title('Sprungantwort') plt.xlabel('t') plt.ylabel('h(t)') plt.grid() plt.show() [[Datei:PythonIng_bode3.svg]] Einige weitere wichtige Daten (Phasenreserve, Amplitudenreserve, Durchtrittsfrequenz) lassen sich mittels der <code>control</code>-Funktion <code>margin()</code> ermitteln. Die Ortskurve lässt sich mit der Funktion <code>nyquist_plot()</code> zeichnen. Dies sei hier aber nicht weiter ausgeführt. ==Aufgaben== * Zeichen Sie mit Python die Ortskurve für obiges Beispiel. * Was passiert, wenn man die Reglerverstärkung weiter aufdreht (z.B. auf <math>R = \frac{25}{2}</math>)? * Wie sehen das Bode-Diagramm und die Sprungantwort aus, wenn ein PI-Regler verwendet wird? = Stereostatik etc. = Das Modul SymPy bietet einige Möglichkeiten einfache Bauwerke zu berechnen, z.B. Balken oder Fachwerke. Nachfolgend wird ein einfaches Fachwerk berechnet und gezeichnet. Python-Code: from sympy.physics.continuum_mechanics.truss import Truss t = Truss() # Knoten t.add_node(("A", -3, 0), ("B", 0, 0), ("C", 4, 0), ("D", 7, 0), ("E", 6, 1.5), ("F", 2, 3), ("G", -2, 1.5)) # Stäbe t.add_member(("AB","A","B"), ("BC","B","C"), ("CD","C","D")) t.add_member(("AG","A","G"), ("GB","G","B"), ("GF","G","F")) t.add_member(("BF","B","F"), ("FC","F","C"), ("CE","C","E")) t.add_member(("FE","F","E"), ("DE","D","E")) # Auflager; roller ... Loslager, pinned ... Festlager t.apply_support(("A","roller"), ("D","pinned")) # Einwirkende Kräfte t.apply_load(("G", 5, 270), ("E", 3, 90)) # Berechnung t.solve() print("Reaction Forces: ", t.reaction_loads) print("Internal Forces: ", t.internal_forces) # Fachwerk zeichnen p = t.draw() p.show() Ausgabe auf der Konsole: Reaction Forces: {'R_A_y': 4.20000000000000, 'R_D_x': 0, 'R_D_y': -2.20000000000000} Internal Forces: {'AB': 2.80000000000000, 'BC': 0.333333333333333, 'CD': -1.46666666666667, 'AG': -5.04777178564958, 'GB': -2.05555555555556, 'GF': -1.23413387432364, 'BF': 0.411111111111111*sqrt(13), 'FC': -0.3*sqrt(13), 'CE': 1.50000000000000, 'FE': 0.284800124843917, 'DE': 2.64407093534026} Zeichnung: [[File:PythonIng_fachwerk1.svg|300px]] Details zu diesem Thema siehe z.B. [https://docs.sympy.org/latest/modules/physics/continuum_mechanics/index.html Continuum Mechanics] oder [https://docs.sympy.org/latest/tutorials/physics/continuum_mechanics/index.html Continuum Mechanics Tutorials]. Auch andere mechanische Probleme werden von SymPy abgehandelt ([https://docs.sympy.org/latest/tutorials/physics/index.html Physics Tutorials]). == Aufgabe == Gegeben sei ein einseitig eingespannter Kragträger. Belastet wird er durch eine Einzellast am Trägerende. Für die Daten siehe folgende ASCII-Skizze: | 20 kN //|---> x | //| V //|---------------------- //| 10 m | Elastizitätsmodul E = 2,1*10⁵ N/mm² Flächenträgheitsmoment I = 0.001 m⁴ Berechnen Sie die Auflagerreaktionen, den Querkraft- und Biegemomentenverlauf, sowie die Verformungen. Stellen Sie dies mit Hilfe von SymPy graphisch und auch mittels Formeln dar. Verwenden Sie dazu auch pprint (pretty print) aus dem SymPy-Modul. Zwecks Lösungsansatz siehe die oben aufgeführte Seite "Continuum Mechanics Tutorials". Achten Sie auch auf die Einheiten! Kontrollieren Sie das Ganze mittels händischer Rechnung. In dem genannten Tutorial ist von "Singularity Functions" die Rede. Gemeint ist damit in diesem Kontext die {{W|Föppl-Klammer}}. Einige Python-Programme, vorrangig zu Maschinenelementen, finden sich auf [https://baymp.de/download_python.html BayMP für Python] (Balken, Zahnräder, Stabknickung usw.). = Stochastik = Die Stochastik ist ein sehr weites Feld. Hier werden nur einige wenige sehr einfache, aber wichtige Themen angerissen. Python stellt mit den Moduln math und statistics Software zu diesem Zwecke bereit. math und statistics sind bereits im Lieferumfang von Python enthalten. Aber auch mit den externen Modulen NumPy, SciPy und pandas kann man Stochastik in Python betreiben. Dies wird hier aber nicht gemacht. == Lageparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] m1 = statistics.mean(werte) m2 = statistics.mode(werte) m3 = statistics.median(werte) print("Arithmetischer Mittelwert = ", m1) print("Modalwert = ", m2) print("Median = ", m3) Ausgabe: Arithmetischer Mittelwert = 3.5 Modalwert = 1 Median = 3.0 == Streuungsparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] s = statistics.stdev(werte) print("Standardabweichung = ", s) Ausgabe: Standardabweichung = 2.6770630673681683 == Kombinatorik == import math n = 7 k = 5 print("n! = ", math.factorial(n)) print("Kombinationen (n über k) = ", math.comb(n, k)) Ausgabe: n! = 5040 Kombinationen (n über k) = 21 = Ein- und Ausgabe = == print == Die Anweisung print haben wir schon oft verwendet. Hier soll anhand von Beispielen kurz beschrieben werden, was der Befehl print leisten kann. print("Hallo", "Welt", 1, sep="-") print("Hallo", end=" ") print("Welt") Ausgabe: Hallo-Welt-1 Hallo Welt == input == a = int(input("Zahl 1: ")) b = int(input("Zahl 2: ")) print("a + b = ", a+b) Ausgabe (nach Eingabe der beiden Ganzzahlen): Zahl 1: 4 Zahl 2: 5 a + b = 9 == Aus Dateien lesen == Es seinen die datei.txt Hallo Welt. Wie geht es dir? ... und test1.py dat = open("datei.txt", mode = "r") print(dat.read()) dat.close() Ausgabe Hallo Welt. Wie geht es dir? ... Mit dem open()-Befehl wird die Datei datei.txt im Lesemodus geöffnet (r ... read). Mit dem read()-Befehl wird die Datei eingelesen und mittels print ausgegeben. == In Dateien schreiben == dat = open("datei.txt", mode = "a", encoding = "utf-8") dat.write("Hänge Zeile an\n") dat.close() Die Datei datei.txt sieht nach Abarbeitung des obigen Skripts nun so aus Hallo Welt. Wie geht es dir? ... Hänge Zeile an Es wird die Datei im Schreibmodus geöffnet (a ... append (anhängend), w ... write (überschreibend)). write() fügt hier also eine Zeile Text am Dateiende ein. close() schließt die Datei wieder. Das close() kann man sich mit der with-Anweisung auch sparen. with open("datei.txt", mode="a", encoding="utf-8") as dat: dat.write("Hänge Zeile an\n") = Benutzeroberflächen erstellen = == tkinter == {{Wikipedia | Tkinter}} Python bietet standardmäßig das Modul tkinter zur Programmierung von Benutzeroberflächen. Es müssen also bei der Verwendung von tkinter keine externen Module installiert werden. Hier wird eine (sehr) kurze Einführung in das Erstellen von grafischen Oberflächen mittels tkinter gegeben. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") win.minsize(300, 50) but = tk.Button(win, text = "Push the button") but.pack() win.mainloop() Ausgabe: [[Datei:PythonIng_gui1.jpg]] Ein etwas komplizierteres Beispiel sei nachfolgend gezeigt. Es sollen zwei Strings miteinander verknüpft und ausgegeben werden. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") def on_button_clicked(): str = ent1.get() + ent2.get() lab2["text"] = str ent1 = tk.Entry(win) ent2 = tk.Entry(win) lab1 = tk.Label(win, text="verknuepfen mit") lab2 = tk.Label(win, text="") but = tk.Button(win, text = "=", command=on_button_clicked) ent1.pack(side="left") lab1.pack(side="left") ent2.pack(side="left") but.pack(side="left") ent2.pack(side="left") lab2.pack(side="left") win.mainloop() Ausgabe (vor der Eingabe der Teilstrings): [[Datei:PythonIng_gui2.jpg]] Ausgabe (nach der Eingabe der Teilstrings und dem Drücken des =-Buttons): [[Datei:PythonIng_gui3.jpg]] == curses == {{Wikipedia | curses}} Mit dem curses-Modul lassen sich u.a. TUIs ('''T'''ext '''U'''ser '''I'''nterfaces) erstellen. Ein sehr einfaches Beispiel zur allgemeinen Funktionsweise wird nachstehend geliefert. import curses stdscr = curses.initscr() curses.start_color() curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) stdscr.clear() stdscr.addstr("Hallo Welt", curses.color_pair(1)) stdscr.refresh() stdscr.getch() curses.endwin() Als Ausgabe sollte <span style="color:#FF0000;">Hallo Welt</span> (rote Schrift auf weißem Hintergrund) auf dem Terminal/der Konsole erscheinen. Getestet wurde dies mit openSUSE Tumbleweed, Python-Version 3.13.12. Das entsprechende Python-curses-Package muss installiert sein. Allgemeine Informationen zur Terminal-/Konsolengröße und Cursorposition liefert folgendes Programm: import curses stdscr = curses.initscr() stdscr.addstr(3, 5, "LINES: %d" % curses.LINES) stdscr.addstr(4, 5, "COLS: %d" % curses.COLS) (y,x) = stdscr.getyx() stdscr.addstr(5, 5, "Momentane Cursorposition: [%d, %d]" % (y, x)) (y,x) = stdscr.getbegyx() stdscr.addstr(6, 5, "Koordinatenursprung: [%d, %d]" % (y, x)) (y,x) = stdscr.getmaxyx() stdscr.addstr(7, 5, "Fenstergröße: [%d, %d]" % (y, x)) stdscr.addstr(11, 2, "Taste drücken -> Ende") stdscr.refresh() stdscr.getch() curses.endwin() Es sollte sich in etwa folgende Ausgabe ergeben: LINES: 44 COLS: 110 Momentane Cursorposition: [4, 15] Koordinatenursprung: [0, 0] Fenstergröße: [44, 110] Taste drücken -> Ende Zur Funktionsweise von curses siehe auch das Wikibook [[ncurses]]. Zum Verständnis sind dort allerdings elementare Kenntnisse in der Programmiersprache C erforderlich. == Qt == {{Wikipedia | Qt (Bibliothek)}} Auch für das Qt-Framework gibt es eine Anbindung an Python. Nachfolgend ein einfaches Beispiel. import sys from PySide6.QtWidgets import QApplication, QLabel app = QApplication(sys.argv) label = QLabel("Hallo Welt!") label.show() sys.exit(app.exec()) Ausgabe: [[Datei:PythonIng_gui10.png]] == Gtk == {{Wikipedia | GTK (Programmbibliothek)}} Eine idente Ausgabe, wie oben für Qt gezeigt, erzeugt z.B. folgendes Gtk-Programm: import gi gi.require_version("Gtk", "4.0") from gi.repository import Gtk def on_activate(app): win = Gtk.ApplicationWindow(application=app) lab = Gtk.Label(label="Hallo Welt!") win.set_child(lab) win.present() app = Gtk.Application() app.connect('activate', on_activate) app.run(None) Auch für die Benutzung von Qt und Gtk müssen die jeweiligen Packages installiert sein. Getestet wurden die entsprechenden Python-Programme nur unter openSUSE Tumbleweed. Wie das GTK-Paket unter MS Windows 11 installiert wird, siehe z.B. [https://www.gtk.org/docs/installations/windows Setting up GTK for Windows]. Damit sei aber das Thema "Benutzeroberflächen erstellen" hier abgeschlossen, da dies schon ein sehr spezielles Aufgabengebiet ist, das eher Informatiker und nicht so sehr Ingenieure anspricht. Bei Bedarf siehe aber ggf. die entsprechenden Links unten in diesem Tutorial. Dort sind weiterführende Informationen zu finden. = Style Guide und flake8 = Wie man schönen und richtigen Python-Code schreibt, erfahren Sie in * [https://peps.python.org/pep-0008/ PEP 8 – Style Guide for Python Code] Ein Modul, das prüft, ob die Richtlinien im Style Guide eingehalten wurden, ist ''flake8'': * [https://flake8.pycqa.org/en/latest/ Flake8: Your Tool For Style Guide Enforcement] = Einige Integrierte Entwicklungsumgebungen (IDEs)= Werden Programmtexte größer und umfangreicher, so ist das Arbeiten mit der interaktiven Programmierumgebung bzw. das direkte Ausführen von Python-Skripten mühsam. Man wünscht sich z.B. Hilfen zum Debuggen oder die automatische Code-Vervollständigung. Zu diesem Zweck wurden IDEs (Integrated Development Environments) geschaffen. Von diesen seinen nachfolgend auszugsweise einige kurz beschrieben. Testen Sie einfach aus, welche davon für Sie bzw. für Ihr Python-Projekt geeignet sind. == IDLE == IDLE ist die mit dem Python-Programmpaket mitgelieferte IDE. Der Name leitet sich einerseits ab vom Monty-Python-Mitglied Eric Idle, andererseits steht es als Abkürzung für "'''I'''ntegrated '''D'''evelopment and '''L'''earning '''E'''nvironment. IDLE ist einfach zu bedienen, bietet aber schon einen beachtlichen Leistungsumfang. Nachfolgend wird ein Screenshot zu IDLE geliefert. Rechts ist das Editor-Fenster zu sehen, links die interaktive Programmierumgebung. Um das Beispiel selbst nachvollziehen zu können, starten Sie IDLE. Das geht ähnlich, wie Sie die interaktive Programmierumgebung von Python starten (nur, dass Sie eben das IDLE-Icon doppelklicken und nicht das Python-Icon. Unter Linux geben Sie einfach in einem Terminal <code>idle3.13</code> o. Ä. ein). Weiter geht es mit "File - Open - ...". Die auszuführende Datei auswählen (im konkreten Fall ein "Hallo-Welt"-Programm). Es erscheint das rechte Fenster. Dort "Run - Run Module" auswählen. Und schon wird im linken Fenster "Hallo Welt!" ausgegeben. [[Datei:PythonIng_idle1.jpg | 600px]] Siehe auch {{W|IDLE}}. == PyCharm == PyCharm ist ein kommerzielles Produkt. Es gab aber auch eine kostenlose Community Edition. Seit 2025 sind beide Varianten vereint. Für die ersten 30 Tage sind die Pro-Funktionen frei verfügbar, danach nur noch die Kernfunktionalitäten (oder man bezieht kostenpflichtig die Pro-Version). Zu beziehen ist PyCharm unter dem Weblink [https://www.jetbrains.com/pycharm/]. Nachfolgend ein etwas abgewandeltes "Hallo Welt"-Programm, editiert und ausgeführt mit PyCharm. [[Datei:PyCharm_IDE_2023_screenshot.png | 600px]] Siehe auch {{W|PyCharm}}. == Eric == Auch eric ist Open Source und steht unter der GNU General Public License Version 3 oder später. Zu beziehen ist diese Software unter [https://eric-ide.python-projects.org/]. [[Datei:Screenshot_Eric_4.png | 600px]] Siehe auch {{W|eric (Software)}}. <small> Unter openSUSE Tumbleweed sollte sich eric auch mit YaST installieren lassen. Bei mir gibt es aber dann beim Ausführen des eric-Programms eine Fehlermeldung (Stand März 2026): ... ModuleNotFoundError: No module named 'PyQt6.QtPdfWidgets' Umgehen kann man dieses Problem aber wieder mit dem Erstellen einer virtuellen Umgebung, in etwa so python3.13 -m venv ~/tmp/venv1 cd ~/tmp/venv1/bin ./python3.13 -m pip install --upgrade --prefer-binary eric-ide ./eric7_ide </small> == PyScripter == Vom Funktionsumfang vergleichbar mit den vorherigen IDEs ist PyScripter. Auch PyScripter ist Open Source. Die Projekt-Homepage findet sich auf [https://sourceforge.net/projects/pyscripter/]. PyScripter ist nur für MS Windows verfügbar. [[Datei:PythonIng_pyscripter1.jpg | 600px]] == Spyder IDE == Spyder enthält bereits eine stabile Python-Version und etliche Module (z.B. matplotlib, numpy, control). Ansonsten kann dieses Softwarepaket vom Funktionsumfang her mit den anderen genannten IDEs locker mithalten. Spyder wurde unter der MIT-Lizenz veröffentlicht. Diese Software findet sich auf [https://www.spyder-ide.org]. [[Datei:Spyder-windows-screenshot.png | 600px]] Siehe auch {{W|Spyder (Software)}} == Sonstige == Die genannten IDEs sind nicht die Einzigen. Es gibt, um dem Image Pythons als beliebteste Programmiersprache gerecht zu werden, noch einige andere. Sowohl Open Source-Programme als auch kommerzielle Programme sind im Web zu finden, z.B. Thonny oder {{W|Visual Studio Code}}. Braucht man den Umfang von ausgewachsenen IDEs nicht, so kann man auch normale Texteditoren verwenden (z.B. {{W|Geany}} oder {{W|Kate_(Texteditor)|Kate}}). = Debuggen und Testen = Das Debuggen und Testen von Programmen sind wichtige Bestandteile der Programmierung. Syntaxfehler lassen sich i.A. leicht beheben. Schwieriger ist das Eingrenzen von logischen Fehlern, die ev. nur in bestimmten Situationen auftreten und keine explizite Fehlermeldung hervorrufen. Das Programm liefert falsche Ergebnisse oder es stürzt aus heiterem Himmel ab. Um das zu verhindern gibt es verschiedene Werkzeuge, die bei der Fehlersuche behilflich sein können. Vorerst siehe aber zwecks Begriffsklärung noch folgende Links: * {{W|Debuggen}} * {{W|Debugger}} * {{W|Softwaretest}} <gallery> First Computer Bug, 1947.jpg Test ganzheitlich.png V-Modell.svg </gallery> == Das Modul pdb == Python bringt schon ein Modul zum Debuggen mit. Siehe z.B. [https://docs.python.org/3/library/pdb.html pdb — The Python Debugger]. Komfortabler lässt sich das aber mittels Integrierter Entwicklungsumgebungen (IDEs) angehen. == Debuggen mit IDEs == Für die IDEs IDLE und Spyder sei kurz auf die entsprechenden Webseiten verwiesen: * [https://www.cs.uky.edu/~keen/help/debug-tutorial/debug.html Debugging under IDLE]. * [https://docs.spyder-ide.org/current/panes/debugging.html Spyder Debugger] Dort wird die Vorgehensweise auch mittels Screenshots erläutert. == assert == assert ... behaupten, zusichern ({{W|Assertion (Informatik)}}) Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10., 0.) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10., 0.) File "/home/hr/Develop/test1.py", line 4, in print1 assert y != 0.0 ^^^^^^^^ AssertionError Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1("10.", "5.") File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Aber auch bei nachfolgendem Code gibt es eine Fehlermeldung: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10, 5) File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Damit letzteres funktioniert, kann man den Programmcode so umschreiben: def print1(x, y): assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 2.0 Und jetzt fangen wir den <code>AssertionError</code> auf: def print1(x, y): try: assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) except(AssertionError): print("Hallo") print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Hallo Ich hoffe, es ist wenigstens im Ansatz klar geworden, wofür <code>assert</code> gut sein kann. Ausschalten kann man die <code>assert</code>-Überprüfung übrigens mit dem Python-Schalter <code>-O</code>. == Doctests == Innerhalb eines Docstrings kann die Arbeit im interaktiven Modus simuliert werden. Nach den Promptzeichen (>>>) erfolgen dann bei unserem Beispiel innerhalb des Docstrings simulierte Aufrufe der Funktion <code>print1()</code>. Danach folgen jeweils die Sollresultate. Wird das Modul oder die Datei als Hauptprogramm aufgerufen, so wird die Funktion <code>doctest.testmode()</code> aufgerufen und ein Bericht auf der Konsole ausgegeben. Wird das Modul nicht als Hauptprogramm aufgerufen, sondern importiert, dann wird diese <code>testmod</code>-Funktion nicht aufgerufen. D.h. dieser Code kann sowohl für Testzwecke als auch für den produktiven Einsatz verwendet werden. Das ist auch sinnvoll, weil wenn man Teile der Datei immer löschen bzw. einfügen müsste, so würden sich Fehlerquellen auftun. Das würde den Sinn und Zweck von Doctests konterkarieren. def print1(x=0., y=1.): """ Dividiere zwei Zahlen Autor: Intruder Datum: 12.08.2025 >>> print1(2., 1.) 2.0 >>> print1(5., 2.) 2.5 >>> print1(5.) 5.0 """ print(x/y) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) Ausgabe: Trying: print1(2., 1.) Expecting: 2.0 ok Trying: print1(5., 2) Expecting: 2.5 ok Trying: print1(5.) Expecting: 5.0 ok 1 items had no tests: __main__ 1 items passed all tests: 3 tests in __main__.print1 3 tests in 2 items. 3 passed and 0 failed. Test passed. Das gezeigte Beispiel ist so ziemlich das einfachste, das es gibt. Für weiterführende Details siehe z.B.: * [https://peps.python.org/pep-0257/ PEP 257 – Docstring Conventions] * [https://docs.python.org/3/library/doctest.html doctest — Test interactive Python examples] == pytest == Siehe zu diesem Thema auch {{W|Modultest}}. pytest ist ein externes Modul und muss vorab installiert werden, z.B. mittels pip install -U pytest pip install -U pytest-html Python-Code, Datei test1.py: def add(x, y): return x + y def test_answer(): assert add(1, 1) == 3 Starten von pytest in der Konsole: pytest test1.py Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py F [100%] ========================================================= FAILURES ========================================================== ________________________________________________________ test_answer ________________________________________________________ def test_answer(): > assert add(1, 1) == 3 E assert 2 == 3 E + where 2 = add(1, 1) test1.py:6: AssertionError ================================================== short test summary info ================================================== FAILED test1.py::test_answer - assert 2 == 3 ===================================================== 1 failed in 0.09s ===================================================== Hier erhalten wir einen Fehler, da 1+1 eindeutig ungleich 3 ist. Aber aus irgendeinem Grund wollte der Programmierer oder Tester in diesem Fall, dass dies so ist. Testfälle werden übrigens mit dem Präfix <code>test_</code> eingeleitet. Python-Code: def add(x, y): return x + y + 1 def test_answer(): assert add(1, 1) == 3 Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py . [100%] ===================================================== 1 passed in 0.01s ===================================================== Jetzt ist alles in Ordnung. Weiterführendes siehe z.B. * [https://docs.pytest.org/en/stable/ pytest: helps you write better programs] == unittest == Auch unittest dient zur Durchführung von Testreihen, ist aber Bestandteil von Python. Hier wird vorerst nicht näher darauf eingegangen. Siehe z.B. * [https://docs.python.org/3/library/unittest.html unittest — Unit testing framework] Lt. ''Inden: Python Challenge; dpunkt, 2021, Seite 481'' soll unittest weniger komfortabel als pytest sein. Einen Vergleich von unittest mit pytest findet man in * [https://knapsackpro.com/testing_frameworks/difference_between/pytest/vs/unittest pytest vs unittest] = Ausblick = Dies war eine kurze Einführung in die Berechnungs- und Darstellungsmöglichkeiten mit Python. Es sollten etliche relevante Themen behandelt, oder zumindest kurz angesprochen worden sein. Wem dieser Text nicht ausreichend ist, der sei auf die entsprechenden weiterführenden Weblinks, Bücher und die Python-Hilfefunktion verwiesen. Python kennt noch viel mehr Befehle, als hier dargestellt wurden. Das Themenspektrum ist auch durch die Einbindung externer Module fast beliebig erweiterbar. = Weblinks= == Python allgemein == * [https://www.python.org/ Python Homepage] == Externe mathematische Module == * [https://numpy.org/ NumPy] * [https://numpy.org/doc/stable/user/numpy-for-matlab-users.html NumPy for MATLAB users] * [https://scipy.org/ SciPy] * [https://www.sympy.org/en/index.html SymPy] * [https://pandas.pydata.org/ pandas] * [https://github.com/maroba/findiff findiff] * [https://mpmath.org/ mpmath] == Externe Module für Grafiken == * [https://matplotlib.org/ Matplotlib] * [https://vpython.org/ VPython] * [https://docs.vtk.org/en/latest/api/python.html VTK] == Erstellung von User Interfaces == * [https://docs.python.org/3/library/tkinter.html tkinter - Python interface to Tcl/Tk] * [https://docs.python.org/3/library/curses.html curses - Terminal handling for character-cell displays] * [https://wiki.qt.io/Qt_for_Python Qt for Python] * [https://www.gtk.org/docs/language-bindings/python GTK and Python] == Erstellen virtueller Umgebungen == * [https://docs.python.org/3/library/venv.html venv - Creation of virtual environments] == Sonstige == * [https://python-control.readthedocs.io/en/stable/ Python Control Systems Library] * [https://pypi.org/project/regex/ regex - Regular Expressions] = Bücher = == Gedruckte Bücher, OpenBooks, Magazine == * Diverse: c't Python Lernen, Verstehen, Anwenden; Heise, 2022 * Ernesti, Kaiser: Python3 - das umfassende Handbuch; 5. Aufl., Rheinwerk, [https://openbook.rheinwerk-verlag.de/python/ OpenBook] * Inden: Python Challenge; dpunkt, 2021, ISBN 978-3-86490-809-5 * Klein: Numerisches Python; 2. Aufl., Hanser, 2023, ISBN 978-3-446-47170-2 * Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler; Rheinwerk, 2021, ISBN 978-3-8362-7316-9 * Weigend: Python 3 - Das umfassende Praxisbuch; 9. Aufl., mitp, 2022, ISBN 978-3-7475-0544-1 * Woyand: Python für Ingenieure und Naturwissenschaftler; 4. Aufl., Hanser, 2021, ISBN 978-3-446-46483-4 == Andere Wikibooks == * [[:en:Subject:Python_programming_language | Englische Wikibooks zum Thema Python]] * [[Python|Deutschsprachiges Python-Wikibook]] [[Bild:2von10.png|20%]] * [[Python unter Linux|Python 2.7 unter Linux]] [[Bild:10von10.png|100%]] {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} dewzmojx4uau9ayi5wu0vdjrffckha8 1082866 1082862 2026-04-06T17:16:33Z Intruder 1513 /* Rechnen mit wirklich großen Zahlen */ 1082866 wikitext text/x-wiki {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} = Hallo Welt und allgemeine Hinweise = == Was ist Python == * Python ist eine universelle höhere Programmiersprache. * Python ist objektorientiert. * Python ist Open-Source (Python Software Foundation License). * Python ist für viele Betriebssysteme erhältlich (z.B. für Linux, MS Windows, macOS). * Python ist ein Interpreter. * Python ist durch Module fast beliebig erweiterbar. * Python als Programmiersprache ist case-sensitive - d.h. Groß- und Kleinschreibung ist relevant bei der Eingabe von Befehlen. {{Wikipedia | Python (Programmiersprache)}} == Python installieren == === MS Windows === Laden Sie das aktuelle Python-Paket von der Webseite [https://www.python.org/] herunter. Weiter geht es wie bei jedem anderen größeren zu installierenden Programm. Einfach das Installationsprogramm im Explorer doppelklicken und den Anweisungen des Setup-Programmes folgen. === Linux === Entweder ist Python bereits standardmäßig installiert, ansonsten ist die Installation mittels Paketmanagementsystem einfach möglich. Aber auch die Spyder-Entwicklungsumgebung ([https://www.spyder-ide.org]) bietet einen guten Einstieg mit Python (das gilt auch für MS Windows). Spyder bringt auch schon etliche wichtige Module standardmäßig mit. == Python starten == === MS Windows === Das Icon für das Python-Programm doppelklicken. Und schon startet das Programm. [[Datei:PythonIng_start1.jpg]] Python im interaktiven Modus präsentiert sich dann so: Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> Alternativ kann das Programm auch über die Eingabeaufforderung oder die PowerShell gestartet werden: c:\devel\Python>python.exe Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> === Linux === Tippen Sie einfach das Wort „python“ (oder unter openSUSE Tumbleweed z.B. auch „python3.11“ oder „python3.13“) in einem Linux-Terminal ein, schließen den Befehl mit der RETURN-Taste ab, und schon startet Python im interaktiven Modus: Python 3.13.12 (main, Feb 09 2026, 22:37:44) [GCC] on linux Type "help", "copyright", "credits" or "license" for more information. >>> Es gibt auch noch andere Möglichkeiten Python zwecks Programmausführung zu starten, z.&nbsp;B. den {{W|Shebang}} (<code>#!</code>) am Beginn eines Python-Scripts. Das Script sei als Script.py gespeichert. Dann kann das Script mit ./Script.py ausgeführt werden. Für openSUSE Tumbleweed sei nachfolgend ein lauffähiges "Hallo Welt!"-Script angegeben. Es wird in diesem Script der Python-Interpreter in der Version 3.13 verwendet : #!/usr/bin/python3.13 print("Hallo Welt!") Die Berechtigungen zum Ausführen der Datei müssen natürlich noch richtig gesetzt werden, z.B. mittels <code>chmod 777 Script.py</code>. <small>Oder es wird in einen Pfad verschoben, in dem sich ausführbare Programme generell befinden (<code>echo $PATH</code>). Das Script kann dann wie ein normales Programm ohne weitere Angaben mit Script.py gestartet werden. Alternativ wird nicht das Script an sich verschoben, sondern nur ein symbolischer Link angelegt, z.B. mit <code>ln -s ~/tmp/Script.py ~/.local/bin/Script.py</code>.<code>~/.local/bin</code> sei ein im PATH gelegenes Verzeichnis. Dies sind aber schon Features für fortgeschrittene Linux-Benutzer und werden am Anfang eher selten benötigt.</small> == Ein paar Worte zur Erklärung == Getestet wurden die Beispiele unter den Betriebssystemen * MS Windows 10 mit der Python-Version 3.12.0 (teilweise auch mit 3.12.2 und 3.13.1; nur die Inhalte die bis spätestens Juli 2025 erstellt wurden) * MS Windows 11 ab der Python-Version 3.13.4 (nur zum Teil; ab Juli 2025) * openSUSE Leap 15.6 mit der Python-Version 3.11.12 (Spyder, nur vereinzelt) und zum Teil mit 3.12.11 (ab Juli 2025 bis November 2025). * openSUSE Tumbleweed ab der Python-Version 3.13.9 (nur vereinzelt, ab November 2025) An Beliebtheit rangiert Python mit Stand März 2026 mit einem Rating von 21,25% an 1. Stelle vor C und C++ (lt. [https://www.tiobe.com/tiobe-index/ TPCI - TIOBE Programming Community Index]). Lt. [https://innovationgraph.github.com/global-metrics/programming-languages GitHub Top 50 Programming Languages Globally] lag Python im Q3/2025 auf Rang 2, vor TypeScript und hinter JavaScript. Der Name "Python" rührt von der Komikertruppe {{W|Monty Python}} her. Die Icons für Python (z.B. Python selbst, Eric IDE, IDLE) sind aber durch die Python-Schlangenart symbolisiert. <gallery> Python-logo-notext.svg|Python-Logo Guido van Rossum OSCON 2006.jpg|Guido van Rossum (geb. 1956), der Erfinder von Python </gallery> == Ein erstes Programm == Kommentare werden in Python mit der Raute (#) eingeleitet. Sie werden vom Python-Interpreter ignoriert. Text kann mit der print-Funktion ausgegeben werden. Starten Sie Python und geben sie folgende Anweisungen zeilenweise ein >>> # Das ist ein Kommentar >>> print("Hallo Welt!") Als Ergebnis erhalten Sie Hallo Welt! Der Prompt (>>>) ist selbstverständlich nicht einzutippen, sondern wird vom Python-System geliefert. Strings können in Python entweder in Anführungszeichen (") gesetzt werden oder in Hochkommatas('). In diesem Text wird die erste Variante bevorzugt eingesetzt. Im Gegensatz zu Julia ist es hier egal, ob zwischen <code>print</code> und der öffnenden Klammer Leerzeichen stehen. = Python als Taschenrechner = == Allgemeines == Wir wollen 3 * 5 berechnen. Dazu starten wir Python im interaktiven Modus. Geben Sie dann die Formel >>> 3 * 5 ein, drücken die Taste ENTER/RETURN ({{Taste|↵}}) und erhalten als Ergebnis 15 Auch kompliziertere Ausdrücke sind möglich. Beispielsweise mit Winkelfunktionen, Quadratwurzeln etc. Wir wollen nun den Ausdruck <math>\sin\sqrt{15}</math> berechnen : >>> import math >>> math.sin(math.sqrt(15)) -0.6679052983383519 Als erstes wird das math-Modul importiert. Dann wird der mathematische Ausdruck berechnet. Eine andere Variante, die dasselbe Ergebnis liefert, ist >>> from math import * >>> sin(sqrt(15)) -0.6679052983383519 Es wird also aus dem Modul <code>math</code> alles importiert (erkennbar am <code>*</code>). Will man nicht alles importieren, so kann man das auch einschränken: >>> from math import sin, sqrt Beenden lässt sich das Python-Programm durch Eingabe von <code>exit()</code> (und natürlich ist zur Bestätigung die RETURN-Taste zu drücken). == Die Hilfefunktion von Python == Bei Eingabe der Anweisung help() springt Python in den Hilfemodus. Eingabe: >>> help() Eingabe: help> math.sin Ausgabe: Help on built-in function sin in math: math.sin = sin(x, /) Return the sine of x (measured in radians). Für die komplette Python-Dokumentation siehe [https://docs.python.org/3/]. Verlassen kann man den Hilfemodus durch das Drücken von STRG-C. == Aufgaben == * Erkunden Sie die Tangensfunktion "tan" mittels Python-Hilfe (vergessen Sie nicht das math-Modul zu importieren und das <code>math.</code> vor <code>tan</code>) * Berechnen Sie mit Python den Ausdruck <math>\frac{1}{2}\cdot e^2 \cdot \tan(\pi/3)</math>. Siehe für die Exponentialfunktion im Python-Hilfesystem auch den Befehl <code>math.exp</code>. Alternativ kann auch die Konstante <code>math.e</code> eingesetzt werden. Potenzieren kann man bei Python mit dem **-Operator (z.B. 2**3 = 8). Für <math>\pi</math> gibt es <code>math.pi</code>. = Python als Scriptsprache = Häufig wird man aber kompliziertere Anweisungsfolgen verarbeiten müssen. Diese will man normalerweise nicht jedesmal neu eingeben, sondern in einer Datei speichern und diese Datei dann zur Ausführung bringen. Speichern Sie dazu folgenden Code in einer Textdatei, z.B. unter MS Windows als c:\tmp\test1.py # Das ist ein Kommentar print("Hallo Welt!") Python-Dateien werden mit der Dateiendung .py versehen. Achten Sie darauf, dass vor dem print keine Leerzeichen vorhanden sind. Das ist eine Python-Eigenheit. Wie wir später sehen werden, nutzt Python Einrückungen als syntaktisches Mittel, z.B. um bei Schleifen den Schleifenkörper zu kennzeichnen. Danach bringen Sie die Skriptdatei test1.py (sozusagen das Hauptprogramm) folgendermaßen zur Ausführung: 1) Starten Sie unter MS Windows die Eingabeaufforderung (oder alternativ auch die Windows PowerShell). Das sieht dann etwa so aus: Microsoft Windows [Version 10.0.19045.3693] (c) Microsoft Corporation. Alle Rechte vorbehalten. C:\Users\xyz> : <small>Falls jemand nicht weiß, wie man die Eingabeaufforderung startet: Eine Möglichkeit ist, einfach in der Taskleiste von Windows das "Start"-Symbol &nbsp;([[Image:Windows_logo_-_2021_(Black).svg|10px]])&nbsp; mit der rechten Maustaste anklicken. "Ausführen" auswählen (oder alternativ für die PowerShell unter Windows 10 den Eintrag "Windows PowerShell", unter Windows 11 den Eintrag "Terminal"). Im sich öffnenden Dialogfenster gibt man in die "Öffnen"-Zeile das Wort <code>cmd</code> ein und mit "OK" wird das Ganze bestätigt.</small> 2) Wechseln Sie mittels <code>cd c:\tmp</code> in das Verzeichnis c:\tmp 3) Angenommen, Sie haben Python unter dem Pfad <code>c:\devel\Python\</code> installiert. Starten Sie das Programm so (der Prompt <code>c:\tmp></code>ist natürlich nicht mit einzutippen): c:\tmp>c:\devel\Python\python.exe test1.py 4) Wie erwartet ergibt sich folgende Ausgabe am Bildschirm Hallo Welt! Die Vorgehensweise unter Linux ist prinzipiell gleich. Die kleinen Unterschiede, wie z.B. der Slash statt dem Backslash in Pfadangaben, sollten für Linux-Benutzer keine Hürde darstellen. == Variablen == Variablenbezeichner können aus Buchstaben (A-Za-z), Ziffern (0-9) und Underscores (_) bestehen, dürfen aber nicht mit einer Zahl beginnen. Führende Underscores haben u.a. im Kontext mit der Objektorientierten Programmierung eine spezielle Bedeutung und sollten nicht für "normale" Variablenbezeichner verwendet werden. Gültige Variablenbezeichner wären also: xyz x1 _wert name_anzahl Es gibt in Python etliche Schlüsselwörter (z.B. for, if oder return). Diese dürfen nicht als eigene Variablenbezeichner verwendet werden. Eine Liste aller Schlüsselwörter liefert das Script import keyword print(keyword.kwlist) <small>Übung: Speichern Sie dieses Script in eine Datei, z.B. in c:\tmp\test1.py. Führen Sie diese Datei aus, um die Liste der Schlüsselwörter auszugeben.</small> Da Python case-sensitiv ist, repräsentieren folgende Bezeichner verschiedene Variablen: xyz XYZ xYz Werte werden an Variablen mittels Gleich-Zeichen (=) zugewiesen. Im Folgenden wird der Code immer in der Datei c:\tmp\test1.py gespeichert. x = 5 y = 10 z = x*y print(z) Bringen Sie die Datei test1.py zur Ausführung so erhalten Sie folgende Bildschirmausgabe 50 Sie können auch mehrere Anweisungen in einer Zeile durch Semikolon getrennt schreiben. Dies führt aber zu unübersichtlichem Code. x = 5; y = 10; z = x*y; print(z) Ausgabe: 50 Auch aus der Programmiersprache C/C++ oder Java bekannte Konstrukte können Sie verwenden, z.B. x = 5 # x = x - 2 x -= 2 print(x) Bildschirmausgabe: 3 Beachten Sie, dass mit dem =-Zeichen eine Wertezuweisung durchgeführt wird. Dies ist nicht äquivalent zum mathematischen =-Zeichen, wie am vorigen Beispiel zu ersehen ist. Den Inkrement-/Dekrementoperator (z.B. x++ oder x--) aus C/C++ oder Java kennt Python aber nicht. Variablen sind nicht an einen bestimmten Datentyp gebunden, folgendes ist mit Python problemlos möglich: import math wert = 10 print(wert) wert = 35.5 print(wert) wert = "Hallo" print(wert) wert = math.pi print(wert) Ausgabe: 10 35.5 Hallo 3.141592653589793 == Physische und logische Zeilen == In Python muss eine Anweisung in einer logischen Zeile Platz finden. Wird eine Anweisung aber zu lang für eine Zeile, dann kann sie in mehrere physische Zeilen unterteilt werden. Dies kann einerseits durch einen Backslash am Ende einer Zeile geschehen, z.B. a = 2 + \ 5 Dies stellt eine logische Zeile dar, die in zwei physische Zeilen unterbrochen ist. Geklammerte Ausdrücke werden automatisch zu einer logischen Zeile verbunden, z.B. a = (2 + 5) Achtung: Im ersten Beispiel darf nach dem Backslash nichts mehr stehen, auch kein Kommentar. Dies trifft im zweiten Bespiel nicht zu, hier könnte noch ein Kommentar folgen, z.B. a = (2 + # Kommentar 5) Auch für Strings gibt es Möglichkeiten, diese auf mehrere Zeilen aufzuspalten. # Kurzer String str1 = "ABC" # Langer String str2 = """Hallo Welt, Grüetzi Schwyzer, Servus an alle""" # Backslash str3 = "UVW\ XYZ" print(str1) print(str2) print(str3) Ausgabe: ABC Hallo Welt, Grüetzi Schwyzer, Servus an alle UVWXYZ ==Hexadezimale, oktale, binäre und andere Zahlen== d = 1050 # Dezimalzahl h = 0xAA2 # Hexadezimalzahl o = 0o12 # Oktalzahl b = 0b100001101 # Binärzahl print(d) print(h) print(o) print(b) Ausgabe: 1050 2722 10 269 Groß- und Kleinbuchstaben sind in obigen Literalen übrigens egal. So kann man z.B. statt <code>0b1001</code> auch <code>0B1001</code> schreiben (siehe dazu [https://docs.python.org/3/reference/lexical_analysis.html#integer-literals]). Sie können auch dezimale in hexadezimale Zahlen umwandeln, usw.: h = hex(1050) # Dezimalzahl -> Hexadezimalzahl b = bin(1050) # Dezimalzahl -> Binärzahl o = oct(1050) # Dezimalzahl -> Oktalzahl print(h) print(b) print(o) Ausgabe: 0x41a 0b10000011010 0o2032 Gegeben sei die Zahl 121 zur Basis 3. Diese soll in eine Dezimalzahl umgewandelt werden. Das kann so geschehen: z = int("121", 3) print(z) Ausgabe: 16 Dass dies richtig ist, davon kann man sich folgendermaßen überzeugen: <math> 1 \cdot 3^2 + 2 \cdot 3^1 + 1 \cdot 3^0 = 9 + 6+ 1 = 16 </math> Zahlen übersichtlicher schreiben kann man auch mittels Underscore, z.B.: print("Eine Million (Variante 1) =", 1000000) print("Eine Million (Variante 2) =", 1_000_000) print("Eine Rechnung:", 2_000 * 400_000); Es ergibt sich bei beiden Varianten die gleiche Ausgabe. Variante 2 ist aber im Sourcecode leichter lesbar, detto die Zahlen in der Rechnung: Eine Million (Variante 1) = 1000000 Eine Million (Variante 2) = 1000000 Eine Rechnung: 800000000 == Strings und Platzhalter== Ein paar einfache Beispiele: print("Hallo {}" . format("Hugo")) print("Hallo {:s}" . format("Hugo")) print("Hallo %s" % "Hugo") Ausgabe: Hallo Hugo Hallo Hugo Hallo Hugo Python-Code (formatted string literals): str1 = "Hallo" str2 = "Hugo" print(f"{str1} {str2}") Ausgabe: Hallo Hugo Komplexere Beispiele: print("Hallo {} und {}" . format("Hugo", "Mike")) print("Hallo {name1} und {name2}" . format(name2="Hugo", name1="Mike")) # Füllzeichen: * # Bündigkeit: > (=rechts), < (=links), ^ (=zentriert) # Feldweite: 10 # Typ: s (=String), f (=Gleitkommazahl), d (=Dezimalzahl) etc. print("Hallo {:*>10s}" . format("Hugo")) print("Hallo {:*<10s}" . format("Hugo")) Ausgabe: Hallo Hugo und Mike Hallo Mike und Hugo Hallo ******Hugo Hallo Hugo****** Python-Code: str = "Hallo\t%s\t%7.2f\t%10.2e\t%i" % ("Hugo", 12.34567, 34.567, 264) print(str) Ausgabe: Hallo Hugo 12.35 3.46e+01 264 == Unicode == Neben den bekannten ASCII-Zeichen lassen sich Zeichen auch mittels Unicode beschreiben. Griechische Buchstaben oder komplexere mathematische Operatoren - all das sollte kein Problem sein. Siehe auch {{W|Unicode}}, {{W|Liste der Unicodeblöcke}} und {{W|Unicodeblock Mathematische Operatoren}}. Im Folgenden werden ein paar Zeichen (Allquantor, Nabla-Operator, Existenzquantor), die man aus der Mathematik kennt, erzeugt. ch1 = "\N{FOR ALL}" ch2 = "\N{NABLA}" ch3 = "\u2203" print(ch1, ch2, ch3) Ausgabe: ∀ ∇ ∃ <small>Diese Ausgabe ergibt sich z.B. mit der IDLE-Shell oder mit Cygwin. Beim Ausführen über die Windows-Eingabeaufforderung oder Windows PowerShell unter MS Windows 10 erfolgt keine korrekte Darstellung. IDLE ist die mit Python mitgelieferte IDE ('''I'''ntegrated '''D'''evelopment '''E'''nvironment, Integrierte Entwicklungsumgebung). Gegen Ende dieses Textes wird IDLE kurz beschrieben. Das Problem mit der Windows Eingabeaufforderung lässt sich aber umgehen. Man muss nur eine Schriftart auswählen, die die Zeichen kennt, z.B. "DejaVu Sans Mono". Dazu klicken Sie einfach bei der Eingabeaufforderung mit der rechten Maustaste oben auf die weiße Leiste und wählen im aufpoppenden Fenster den Menüpunkt "Eigenschaften". Es öffnet sich ein Dialogfenster. Über den Reiter "Schriftart" lässt sich nun die Schriftart einstellen. Unter MS Windows 11 oder openSUSE Leap 15.6 (bash-Konsole) gibt es dieses Problem ohnehin nicht.</small> == Reguläre Ausdrücke == Python kennt auch {{W|Regulärer Ausdruck|reguläre Ausdrücke}}. Dazu gibt es in Python das Modul <code>re</code>. Beipielsweise sollen alle Zahlen (<math>\text{zahl}\in\mathbb{N}_0</math>) in einem String gesucht und ausgegeben werden. Als String sei gegeben: <code>3x Grüße und 100 Kekse.</code> Das Muster (Pattern) ist <code>\d+</code>. <code>\d</code> steht für eine Dezimalziffer 0-9. Das Plus-Zeichen (+) steht symbolisch für ein oder mehrere Zeichen des vorherigen Ausdrucks. Hier also ein oder mehrere Dezimalziffern. Es wird die Funktion <code>findall</code> aus dem Modul <code>re</code>verwendet. Python-Code: from re import findall str = "3x Grüße und 100 Kekse." pat = "\\d+" # Doppel-Backslashes müssen verwendet werden, sonst gibt Python eine Warnung aus! # alternativ: pat = r"\d+" # oder: pat = "[0-9]+" numb = findall(pat, str) print(numb) Ausgabe: ['3', '100'] Python kennt noch viele weitere Möglichkeiten mittels regulärer Ausdrücke zu hantieren. Dies soll hier aber nicht vertieft werden, da das Thema schon ziemlich speziell und komplex ist. Bei Bedarf siehe aber z.B. die Bücher ''Weigend, Seite 380ff'' und ''Ernesti, Kaiser'' [https://openbook.rheinwerk-verlag.de/python/28_001.html] oder die Python-Dokumentation [https://docs.python.org/3/library/re.html]. Auch [[Python unter Linux: Reguläre Ausdrücke]] liefert ein umfangreiches und brauchbares Python-2-Kapitel zu den regulären Ausdrücken. Die dort gelisteten Beispiele müssten ggf. vor Verwendung auf Python-3 umgeschrieben werden. <small>Wie macht man das? Dazu siehe z.B. [https://openbook.rheinwerk-verlag.de/python/43_001.html], [https://portingguide.readthedocs.io/en/latest/] oder [https://www.digitalocean.com/community/tutorials/how-to-port-python-2-code-to-python-3]</small> <small>Es gibt auch ein externes Modul ''regex'', das bei Bedarf extra installiert werden muss ([https://pypi.org/project/regex/]). Es bietet zusätzliche Funktionalität und gründlicheren Unicode-Support. Dies sei hier aber nur der Vollständigkeit halber erwähnt.</small> == Verzweigungen == === if === Die IF-Verzweigung ist aus anderen Programmiersprachen bereits bekannt. In Pseudocode lässt sie sich folgendermaßen darstellen: WENN bedingung TRUE führe block1 aus SONST führe block2 aus ENDE In Python gibt es keinen expliziten ENDE-Kennzeichner. Stattdessen wird der Code durch Einrückungen strukturiert. Alles mit der gleichen Einrückungstiefe gehört zum selben Block. Dies zeichnet Python vor anderen Programmiersprachen aus. Die test1.py-Datei laute also wie folgt: x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: Der else-Zweig wird ausgefuehrt x ist groesser oder gleich 4 Man achte auch auf die Doppelpunkte in der if- und else-Zeile. Darauf vergisst man gerne, wenn man von anderen Programmiersprachen kommt. Folgendes wäre in Python ein Fehler (genauer gesagt ein IndentationError). x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Auch Nachstehendes würde nicht zum gewünschten Ergebnis führen (löst aber keine Fehlermeldung aus). Der letzte print-Befehl ist schon außerhalb der IF-ELSE-Verzweigung. x = 3 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: x ist kleiner als 4 x ist groesser oder gleich 4 Python kennt eine Reihe von Vergleichs- und Verknüpfungsoperatoren: <, <= ... kleiner (gleich) >, >= ... größer (gleich) == ... gleich != ... ungleich is ... identisch is not ... nicht identisch and ... AND or ... OR not ... NOT Beispielsweise: a = 5 b = 9 if a<=10 and b!=7: print("OK") else print("Nicht OK") Ausgabe: OK Der else-Block kann übrigens auch ersatzlos entfallen. Mehrfache Verzweigungen werden durch das elif-Konstrukt erstellt. a = 14 if a<=10: print("<=5") elif a>11 and a<15: print("11 bis 15") elif a>16 and a<20: print("16 bis 20") else: print(">=20") Ausgabe: 11 bis 15 In Python gibt es auch die Schlüsselwörter <code>True</code> (für wahr) und <code>False</code> (für falsch). Man beachte, dass sie mit Großbuchstaben beginnen. Andere Schreibweisen wären ein Fehler. Sie gehören zum Datentyp <code>bool</code>. Ihnen sind auch die Zahlen <code>1</code> und <code>0</code> zugewiesen. === match === Ab Python 3.10 gibt es auch die match-Anweisung. Dies ist das Python-Pendant für die switch-Anweisung in anderen Programmiersprachen, geht aber bei näherer Betrachtung weit darüber hinaus. Hier nur ein einfaches Beispiel: x = "Hello" match x: case "Servus" | "Ciao": # or print("Servus an alle") case "Grüetzi": print("Grüetzi Schwyzer") case _: # other, default, sonstiges ... print("Hallo Welt") Ausgabe: Hallo Welt Für nähere Details siehe z.B. [https://www.geeksforgeeks.org/python-match-case-statement/], [https://learnpython.com/blog/python-match-case-statement/], [https://docs.python.org/3/tutorial/controlflow.html#match-statements] und das Python Enhancement Proposal (PEP) 636 – Structural Pattern Matching: Tutorial [https://peps.python.org/pep-0636] und dort insbesondere den Anhang A - Quick Intro. <small><code>match, case, _</code> etc. sind sogenannte ''soft keywords''. Im Gegensatz zu den normalen Schlüsselwörtern dürfen ihnen auch Werte zugewiesen werden. Eine Liste der weichen Schlüsselwörter lässt sich durch <code>keyword.softkwlist</code> erstellen (die Anweisung gibt es seit Python 3.9). Siehe dazu auch [https://stackoverflow.com/questions/65800344/what-are-soft-keywords] und [https://docs.python.org/3/library/keyword.html#keyword.softkwlist].</small> == Schleifen == === while === Die WHILE-Schleife ist kopfgesteuert. Sie funktioniert wie aus anderen Programmiersprachen bekannt. In Pseudocode: SOLANGE bedingung TRUE führe block aus ENDE In Python: x = 0 while x <= 10: print(x) x += 1 Ausgabe: 0 1 2 3 4 5 6 7 8 9 10 === for === for x in range(6): print(x*2) Ausgabe: 0 2 4 6 8 10 Die Schleife läuft von 0 bis 5. Ausgegeben wird jeweils der Wert x*2. Aquivalent kann diese Schleife auch so geschrieben werden: for x in range(0, 11, 2): print(x) Die Ausgabe ist wie oben. Der Startwert sei 0, der Endwert ist 11-1 und die Schrittweite ist 2. Ein anderes Beispiel sei for x in "text": print(x) Ausgabe: t e x t == Schleifen abbrechen == === break === <code>break</code> bricht die Schleife ab und setzt mit dem nächsten Befehl außerhalb der Schleife fort. for var in range(100): print(var) if var == 5: break Ausgabe: 0 1 2 3 4 5 === continue === <code>continue</code> bricht den aktuellen Schleifendurchlauf ab und setzt mit dem nächsten Schleifendurchlauf fort. for var in range (11): if var == 5: continue print(var) Ausgabe: 0 1 2 3 4 6 7 8 9 10 == try - except == try: z1 = 12 / 0 print(z1) except ZeroDivisionError: print("Das Ergebnis ist unendlich") except: print("Kann nicht berechnet werden!") print("Bitte die Formel korrigieren!") Ausgabe: Das Ergebnis ist unendlich Es wird versucht, eine Zahl durch Null zu dividieren. Das ist nicht möglich, es wird eine Ausnahme ausgelöst. Das Programm springt daher in den except-ZeroDivisionError-Block und führt die dort gelisteten Anweisungen aus (in unserem Fall eine print-Anweisung). Würden wir dieses Programm ohne try-except ausführen, so ergibt sich aus z1 = 12 / 0 print(z1) folgende Fehlermeldung und ein unmittelbarer Programmabbruch Traceback (most recent call last): File "C:\tmp\test1.py", line 1, in <module> z1 = 12 / 0 ZeroDivisionError: division by zero Mit dem try-except-Mechanismus können also Ausnahmen oder Fehler aufgefangen und behandelt werden. In unserem Beispiel ist das eher trivial, aber bei größeren Programmen kann das durchaus Sinn machen. == pass == Ein leerer Block muss in Python mittels dem Schlüsselwort <code>pass</code> dargestellt werden. Z.B. x = 2 if x == 1: print("Wert ist ", x) else: pass Würde man das <code>pass</code> im else-Block weglassen, so würde man eine Fehlermeldung erhalten: IndentationError: expected an indented block after 'else' statement on line 5 = Funktionen = == Aufrufen von Funktionen == Funktionen sind uns im Rahmen dieses Kurses schon zuhauf begegnet. Sei es die print()-, die math.sin()- oder die hex()-Funktion. All diese Funktionen werden von Python zur Verfügung gestellt, ohne dass man sie explizit programmieren müsste. Aufgerufen werden diese Funktionen, indem man ihren Namen eintippt, gefolgt von runden Klammern. In diesen Klammern können noch Argumente übergeben werden. Auch Rückgabewerte sind möglich. == Funktionen selber schreiben == Funktionen werden mit dem def-Schlüsselwort (man definiert die Funktion) eingeleitet, danach folgt der Funktionsname, danach wiederum runde Klammern, in denen formale Argumente stehen können. Abgeschlossen wird die def-Zeile mit einem Doppelpunkt. Danach folgt der Funktionskörper. Dieser Funktionskörper muss wiederum eingerückt werden (wie von den Verzweigungen und Schleifen bekannt). Aufgerufen wird diese Funktion, indem man ihren Funktionsnamen eingibt, gefolgt von runden Klammern (ggf. mit den aktuellen Parametern). Z.B. # Funktion definieren def halloWelt(i): # i ... beliebige Ganzzahl print("Hallo " * i, end="") print("Welt!") # Funktion aufrufen halloWelt(3) Ausgabe: Hallo Hallo Hallo Welt! Unterschied zwischen formalen und aktuellen Parametern: [[Datei:PythonIng_func1.jpg]] <small>Aktuelle Parameter werden auch Argumente genannt.</small> Rückgabe von Funktionswerten: # Funktion definieren def mathFunc(a, b): r1 = a + b r2 = a * b return r1, r2 # Funktion aufrufen a, b = mathFunc(3, 5) # Ausgabe der zurückgegebenen Werte print(a) print(b) Ausgabe: 8 15 Vorgabeparameter, z.B.: def mathFunc(a=10, b=20): r1 = a + b r2 = a * b return r1, r2 a, b = mathFunc(3, 5) print(a) print(b) a, b = mathFunc(5) print(a) print(b) a, b = mathFunc(b=6) print(a) print(b) Ausgabe: 8 15 25 100 16 60 == Lambda-Funktionen == print((lambda a, b: a*b) (3, 5)) Ausgabe: 15 Eingeleitet wird eine Lambda-Funktion (auch Lambda-Form, Lambda-Operator oder anonyme Funktion genannt) mit dem Schlüsselwort <code>lambda</code>. Es folgen die formalen Argumente, danach ein Doppelpunkt, die Berechnungsvorschrift und ggf. abschliessend in Klammern die aktuellen Parameter. Man kann einer Lambda-Funktion auch einen Funktionsnamen geben und die Funktion über diesen Namen aufrufen, z.B. prod = lambda a, b: a*b print(prod(3, 5)) Als Ausgabe wird wieder die Zahl 15 geliefert. == Rekursive Funktionen == Funktionen können wiederum andere Funktionen aufrufen. Von einem rekursiven Funktionsaufruf spricht man, wenn die aufgerufene Funktion gleich der aufrufenden ist. def printFunc(i): if (i >= 5): return else: print("Hallo Welt") printFunc(i+1) printFunc(1) Ausgabe: Hallo Welt Hallo Welt Hallo Welt Hallo Welt == Funktionsannotationen == Python ist sehr flexibel, was Typen angeht. Im Vorhergehenden haben wir generell keine Typangaben gemacht. Will man Typen angeben, so bietet Python das Konzept der Funktionsannotation. def calcFunc(a:int, b:int) -> int: return a+b, a*b r1 = calcFunc(8, 9) r2 = calcFunc(8.0, 9.0) print(r1) print(r2) Ausgabe: (17, 72) (17.0, 72.0) Jetzt sieht man auf den ersten Blick, welche Typen der Programmierer im Sinn hatte, als er die Funktion erstellte. Das Problem dabei ist nur, dass es Python ziemlich egal ist, welche Typen man in Endeffekt eingibt. Im obigen Beispiel können statt Integer-Typen auch Float-Typen eingegeben werden. == Variadische Funktionen == Python-Code: def test1(a, *b): print(a); for c in b: print(c); test1("Hallo", "Welt", "Schweizer", "und alle anderen") Ausgabe: Hallo Welt Schweizer und alle anderen Mit dem Stern (auch als Splat-Operator bezeichnet) in der formalen Parameterliste bei der Funktion <code>test1</code> wird angezeigt, dass eine beliebige Anzahl von Argumenten übergeben wird. <small> Dies entspricht in etwa dem, was in anderen Programmiersprachen (PHP etc.) mittels Ellipse (<code>...</code>) angezeigt wird.</small> = Tupel, Listen und andere = [[Datei:Python 3. The standard type hierarchy.png|mini|hochkant=1.7|Datentypen und Strukturen]] Tupel, Listen und einige andere sind Datenstrukturen oder Sequenzen. Listen (z.B. eine Einkaufsliste) sind veränderbar (mutable). Ein Tupel kann dagegen nicht verändert werden (immutable). Listen werden beim Anlegen in eckige Klammern eingeschlossen, Tupel in runde Klammern. Beim Tupel können die Klammern auch weggelassen werden. Ein Tupel mit nur einem Element muss mit einem Beistrich abgeschlossen werden. Der Grund ist, dass Python sonst nicht entscheiden kann, ob ein Tupel angelegt werden soll, oder nur ein geklammerter Wert. Nachfolgend werden einige Operationen mit Listen und Tupel dargestellt. Als Gedächtnisstütze kann man sich den Unterschied zwischen Tupel und Liste ev. so leichter merken: : T'''u'''pel ... r'''u'''nde Klammern, '''u'''nveränderlich : L'''i'''ste ... eck'''i'''ge Klammern, veränderl'''i'''ch. # Liste und Tupel liste = [1, 2, "Hallo"] tupel = (1, 2, "Hallo") # Ausgabe von liste und tupel print(liste) print(tupel) # Ausgabe von Einzelelementen print(liste[1]) print(tupel[2]) # Element an Liste anhängen und einfügen liste.append(55) liste.insert(4, "Welt") print(liste) # Element aus Liste entfernen liste.remove(1) print(liste) # einige weitere Beispiele liste2 = [1,] tupel2 = 1, 2 tupel3 = (1,) print(liste2) print(tupel2) print(tupel3) Ausgabe: [1, 2, 'Hallo'] (1, 2, 'Hallo') 2 Hallo [1, 2, 'Hallo', 55, 'Welt'] [2, 'Hallo', 55, 'Welt'] [1] (1, 2) (1,) Zu den Datenstrukturen gehören weiters auch Mengen und Dictionaries. Mengen sind von der Mathematik bekannt, sie sind ungeordnet und es kommen keine mehrfachen Elemente vor. Dictionaries sind durch Schlüssel :Wert-Paare gekennzeichnet. Mengen werden beim Anlegen wie Dictionaries in geschweifte Klammern eingeschlossen. dict = {"vorname":"Hugo", "nachname":"Meister" } menge = {1, 1, 3, 4, 4, 4, "Hallo"} print(dict) print(menge) print(dict["vorname"]) Ausgabe: {'vorname': 'Hugo', 'nachname': 'Meister'} {1, 3, 4, 'Hallo'} Hugo Geschweifte Klammern ohne Inhalt stellen Dictionaries dar und keine Mengen: di = {} print(type(di)) Ausgabe: <class 'dict'> == List Comprehensions == Aus einer Eingabeliste soll eine Ausgabeliste erzeugt werden. Das kann folgendermaßen geschehen. Mathematische Schreibweise: <math>lc = \{2x|x\in\ \mathbb{N}, 1\le x < 11\}</math> Python-Code: lc = [x*2 for x in range(1,11)] print(lc) Ausgabe: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] Mathematische Schreibweise: <math>lc = \{2x | x \in \mathbb{N}, 1\le x < 11, x \bmod 2 = 0 \}</math> Python-Code: lc = [x*2 for x in range(1,11) if x%2 == 0] print(lc) Ausgabe: [4, 8, 12, 16, 20] Siehe auch {{W|List Comprehension}}. == Set Comprehensions == Dies ist sehr ähnlich wie im vorigen Abschnitt beschrieben. Es wird aber keine Liste, sondern eine Menge erzeugt. sc = {x*2 for x in range(1,11)} print(sc) Ausgabe: {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} == Listen zusammenführen - zip() == li1 = ["A", "B", "C", "D"] li2 = [1, 2, 3, 4] li3 = [5.5, 6.6, 7.7, 8.8] z = zip(li1, li2, li3) print(z) li4 = list(z) print(li4) Ausgabe: <zip object at 0x00000283B6C6AC80> [('A', 1, 5.5), ('B', 2, 6.6), ('C', 3, 7.7), ('D', 4, 8.8)] == Generatorausdruck == g = (i*2 for i in range(1,11)) print(g) t = tuple(g) print(t) print(t[1:3]) Ausgabe: <generator object <genexpr> at 0x00000241D2A4A5A0> (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) (4, 6) == Slicing == slice ... Scheibe, Teil, in Scheiben schneiden Beispiel: Zugriff auf Elemente eines geordneten sequentiellen Objekttyps (Liste, Tupel oder String): str1 = "Hallo" # Das erste Element wird mit dem Index 0 angesprochen # [start (inkl.) : stop (exkl.) : step (default=1)] str2 = str1[0:2] # Alternativ auch: str2 = str1[:2] print(str2) tup1 = (0,1,2,3) # Das letzte Element hat auch den Index -1, das vorletzte den Index -2 usw. tup2 = tup1[-3:-1] print(tup2) lst1 = [[1, 5, 10, 20], [30, 40, 50, 60]] lst2 = lst1[1][1] print(lst2) Ausgabe: Ha (1, 2) 40 Beispiel: Umdrehen von Strings str1 = "Hallo" str2 = str1[::-1] print(str2) Ausgabe: ollaH = Objektorientierte Programmierung = == Eine einfache Klasse == [[Datei:PythonIng_uml1.svg | 200px]] class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 fahr = Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die Klasse Fahrzeug wird durch das class-Schlüsselwort eingeleitet. raeder ist ein Klassenattribut und public. __init__ wird bei der Objekterzeugung automatisch aufgerufen. Man achte darauf, dass diese Methode immer mit zwei Unterstrichen eingeleitet und abgeschlossen wird. Instanzattributen wird das Wort self vorangestellt. Wir sehen uns z.B. das Attribut self.__geschwind an. Auch hier werden zwei Unterstriche verwendet. Das bedeutet, dass dieses Attribut private ist. Bei den Methoden wird immer self als erster Parameter angegeben. Beim Aufruf der entsprechenden Funktion wird das self aber nicht berücksichtigt. == Klassen importieren == Häufig ist es sinnvoll und übersichtlicher Klassen in eigenen Dateien zu speichern. Das sind dann eigene Module. Abgespeichert werden Sie mit der Endung py, wie bisher auch praktiziert. Aufgerufen werden Sie mit der import-Anweisung. Dann ist aber nur der Dateiname ohne Endung py zu verwenden. Klarer wird das mit einem Beispiel. Datei c:\tmp\fahrzeug.py class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 Datei c:\tmp\test1.py import fahrzeug fahr = fahrzeug.Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die üblichen import-Anweisungen lauten wie folgt: {| {{prettytable}} ! import-Befehl ! Instanz |- | import xyz || xyz.Klasse |- | import xyz as x || x.Klasse |- | from xyz import Klasse || Klasse |- | from xyz import * || Klasse |} Der Vorteil der ersten beiden import-Anweisungen ist, dass es kaum zu Namenskollisionen kommen kann. Dafür hat man bei den letzten beiden Varianten weniger Tipparbeit. == Vererbung == [[Datei:PythonIng_uml2.svg | 200px]] Datei fahrzeug.py: class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 class Luftfahrzeug(Fahrzeug): def __init__(self, geschwindigkeit, leistung, fluegel): super().__init__(geschwindigkeit, leistung) self.__flueg = fluegel def getFlueg(self): return self.__flueg Datei test1.py: import fahrzeug fahr = fahrzeug.Luftfahrzeug(150, 90, 4) print(fahr.getFlueg()) Ausgabe: 4 = Grafiken zeichnen = Für das Zeichnen von Grafiken wird hier das Modul <code>matplotlib</code> verwendet. <code>matplotlib</code> ist ein externes Modul und muss vor der ersten Verwendung installiert werden. Das geht so: # Starten Sie ein Terminal (bei Windows die Eingabeaufforderung). # Führen Sie darin folgenden Befehl aus <code>c:\devel\Python\Scripts\pip.exe install matplotlib</code> pip ist übrigens der Paketmanager von Python ({{W|Pip_(Python)}}). Optimalerweise installieren wir auch gleich das Modul <code>numpy</code> (Numerical Python). Wir werden es im Folgenden oft benötigen (nicht nur bei den Grafiken). Das funktioniert vom Prinzip her genauso, wie für <code>matplotlib</code> gezeigt. <small>Verwenden Sie Spyder, so sind diese Schritte nicht nötig. Spyder inkludiert diese Pakete standardmäßig. Unter openSUSE Tumbleweed lassen sich diese Pakete mittels YaST oder zypper installieren.</small> == 2D == === Graph einer Funktion === Es soll die cosh-Funktion im Intervall <math>x\in[-3,3]</math> gezeichnet werden. Der Programmcode lautet in der einfachsten Form: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh1.jpg]] Der Code ist quasi selbsterklärend. Das Untermodul pyplot des matplotlib-Moduls und das numpy-Modul werden importiert. x läuft von -3 bis +3. y wird für jeden x-Wert per Formel ausgerechnet. "plt.plot()" ist der Zeichenbefehl. "plt.show" ist notwendig, um das Fenster mit der Grafik anzuzeigen. Die Schrittweite 0.1 wurde so gewählt, um einen ausreichend glatten Verlauf des Graphen zu gewährleisten. Das ist immer ein Kompromiss zwischen Berechnungszeit und Ansehnlichkeit. Testen Sie einfach ein paar verschiedene Werte, um ein Gefühl dafür zu zu bekommen. "plt.grid()" zeichnet ein Gitter in die Grafik (kann auch weggelassen werden). Die Bezeichnungen plt und np könnten auch anders gewählt werden. Es ist aber Konvention, diese so wie hier gezeigt zu wählen. <small>Mit der im obigen Bild gezeigten Menüleiste kann die dargestellte Grafik nachträglich noch geändert werden (Zoom, Pan, Achsenparameter, Kurvenparameter etc.). Natürlich kann man das alles auch direkt programmieren. Wie das funktioniert wird ansatzweise etwas später gezeigt.</small> Ein etwas komplexeres Beispiel ist Folgendes: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) + 2**x plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh4.png]] Man beachte, dass im Gegensatz zu Octave und Julia der ominöse Punkt (.) bei 2**x mit Python nicht benötigt wird. Das macht das Programmiererleben etwas einfacher. === Graphen mehrerer Funktionen und weiteres === import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x") plt.plot(x, y2, label = "sin(x) * cos(x)") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh2.png]] Um die Linienstile etwas individueller zu gestalten, ist folgender Programmcode gedacht: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x", lw=5, ls="dotted") plt.plot(x, y2, label = "sin(x) * cos(x)", lw=3, ls="--") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh3.png]] === Funktion in Parameterdarstellung === Es soll die archimedische Spirale <math>x = t \cos(t), y = t \sin(t)</math> im Intervall <math>[0, 6\pi[</math> gezeichnet werden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.show() [[Datei:PythonIng_spirale1.png]] Diese Darstellung erscheint verzerrt. Will man gleiche Achsenskalierungen, so kann man den plt.axis()-Befehl verwenden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.axis("equal") plt.show() [[Datei:PythonIng_spirale2.png]] === Funktion in Polardarstellung === import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(projection="polar") r = np.arange(0, 1, 0.01) theta = r**3 line = ax.plot(theta, r) plt.show() [[Datei:PythonIng_polar1.png]] === Logarithmische Achsenskalierung === ==== Semilog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.semilogy() plt.show() Ausgabe: [[Datei:PythonIng_semilog1.png]] ==== LogLog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.loglog() plt.show() [[Datei:PythonIng_loglog1.png]] === Gefüllte Fläche === import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 3, 0.1) y1 = 3*x - 1 y2 = x**2 plt.plot(x, y1, x, y2, color='black') plt.fill_between(x, y1, y2, where=y1>=y2) plt.show() [[Datei:PythonIng_gefuellt.png]] === Linien, Pfeile, Rechtecke, Kreise und Texte === import matplotlib as mpl import matplotlib.pyplot as plt fig, ax = plt.subplots() r = mpl.patches.Rectangle((0, 0), 3, 3, angle=30, fill=False) c = mpl.patches.Circle((4, 4), 2, fill=False) ax.add_patch(r) ax.add_patch(c) ax.plot([-2, 7], [-2, 0], color="black") ax.arrow(0, 7, 5, 0, length_includes_head=True, head_width=0.5, head_length=1.5, color="black") ax.set_aspect("equal") plt.axis([-3, 8, -3, 8]) plt.show() [[Datei:PythonIng_linien_pfeile_etc.png]] Text kann mit <code>ax.text(x, y, "Text")</code> hinzugefügt werden, bspw. import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.text(0.1, 0.1, "Hallo") ax.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() Oder einfacher auch ohne <code>subplots</code> import matplotlib.pyplot as plt plt.text(0.1, 0.1, "Hallo") plt.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text1.png]] Auch Sonderzeichen (griechische Buchstaben etc.) können verwendet werden (siehe dazu auch [https://matplotlib.org/stable/users/explain/text/mathtext.html]). import matplotlib.pyplot as plt plt.text(.3, .5, r'$\Omega\ \psi\ \oint\ \nabla\ \dot a\ \frac{a}{b}\ a_b$', size="20") plt.show() [[Datei:PythonIng_text20.svg]] Jetzt wird noch gezeigt, wofür <code>subplots</code> sinnvoll eingesetzt werden können. import matplotlib.pyplot as plt fig, ax = plt.subplots(nrows=1, ncols=2) ax[0].text(0.1, 0.1, "Hallo") ax[1].text(0.1, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text2.png]] === Aufgaben === * Zeichnen Sie die Strophoide <math>x = \frac{a(t^2-1)}{t^2+1}, y = \frac{at(t^2-1)}{t^2+1}, a = 2, -3 \leq t \leq 3</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_strophoide.jpg]] * Zeichnen Sie die verschlungene Hypozykloide <math>x = (R-r)\cos t + c\cos\frac{R-r}{r}t, y = (R-r)\sin t - c\sin\frac{R-r}{r}t, c = 3, r = 2, R = 6, -15 \leq t \leq 15</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_hypozykloide.jpg]] * Testen Sie bei den obigen Übungsaufgaben verschiedene Linienstile und Farben. Farben können mit dem plt.plot()-Parameter color gewählt werden. * Testen Sie bei den obigen Übungsaufgaben verschiedene Werte für a, c, r und R. == 3D == === Räumliche Kurven === import matplotlib.pyplot as plt import numpy as np t = np.arange(0, 6*np.pi, 0.1) x = t * np.cos(t) y = t * np.sin(t) z = t fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot(x, y, z) plt.show() [[Datei:PythonIng_raumkurve1.png]] === Flächen === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z) plt.show() [[Datei:PythonIng_fläche1.png]] Das Ganze in Netzdarstellung läßt sich so programmieren: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.5) y = np.arange(0, 10, 0.5) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_wireframe(x, y, z) plt.show() [[Datei:PythonIng_fläche2.png]] Ein etwas komplexeres Beispiel: import matplotlib.pyplot as plt import numpy as np x = np.arange(0.1, 10, 0.1) y = np.arange(0.1, 10, 0.1) x, y = np.meshgrid(x, y) z1 = np.sin(x) + 3 * np.cos(y) z2 = np.sin(x) + np.log(y) z3 = x + np.cos(y) z4 = x**2 - y fig, ax = plt.subplots(subplot_kw={"projection": "3d"}, nrows=2, ncols=2) ax[0][0].plot_surface(x, y, z1) ax[0][1].plot_surface(x, y, z2) ax[1][0].plot_surface(x, y, z3) ax[1][1].plot_surface(x, y, z4) plt.show() [[Datei:PythonIng_subplot1.png]] Man beachte, dass man die Unterbilder im Bild nach dem Ausführen des Scripts z.B. mit der mittleren Maustaste einzeln drehen, oder über die Einträge in der Menüzeile einzeln bearbeiten kann. Mit ein paar Zeilen Programmtext lässt sich also eine Menge an Funktionalität generieren. Die Farbgebung lässt sich über <code>colormaps</code> variieren. import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm) plt.show() [[Datei:PythonIng_colormap1.png]] Es gibt eine Menge an Colormaps, z.B. <code>plasma, Greys, Dark2, ocean</code>. Zwecks detaillierterer Infos siehe die matplotlib-Dokumentation. <small>Verwendet man die IDE namens IDLE, so gibt es dort auch die automatische Codevervollständigung. D.h. es werden alle Möglichkeiten (in unserem Fall nach dem Eintippen von <code>cm.</code> alle verfügbaren Colormaps) angezeigt.</small> Die "edgecolor" und Linienbreite können auch frei gewählt werden: import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm, edgecolor="black", linewidth=1.0) plt.show() [[Datei:PythonIng_colormap2.png]] === Höhenlinien === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contour(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien1.png]] Etwas abgewandelt sieht das so aus: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() hl = ax.contour(x, y, z) ax.clabel(hl, inline = True) plt.show() [[Datei:PythonIng_höhenlinien2.png]] Und noch eine Variante sei gezeigt. import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contourf(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien3.png]] === Aufgaben === * Zeichnen Sie die räumliche Kurve <math>x = 2 \cdot \cosh(t)</math>, <math>y = 5 \cdot \sin(t)</math>, <math> z = t^{2} - t</math>, <math>0 \leq t \leq 3\pi</math>. * Zeichnen Sie die Fläche <math>z = \log(x) + \cos(y)</math>. == Animationen == === Mit matplotlib === Auch mit matplotlib sind Animationen möglich. Das ist ein bisschen komplizierter und wird deshalb hier nur mit einem sehr einfachen Beispiel dargestellt (bei Interesse siehe z.B. auch das [https://matplotlib.org/stable/users/explain/animations/animations.html#animations Animations using Matplotlib-Tutorial]). import matplotlib.pyplot as plt import matplotlib.animation as ani import matplotlib import numpy as np def update(frame): line.set_xdata(x[:frame]) line.set_ydata(y[:frame]) return (line) fig, ax = plt.subplots() x = np.arange(0, 10, .1) y = np.sin(x) line, = ax.plot(x[0], y[0]) ax.set(xlim=[0, 10], ylim=[-1, 1]) a = ani.FuncAnimation(fig=fig, func=update, frames=100, interval=20) plt.show() # Speichere die Animation in einem animierten GIF (optional) a.save(filename="c:/tmp/PythonIng_anim5.gif", writer="pillow") [[Datei:PythonIng_anim5.gif]] Es wird eine Sinuskurve auf den Bildschirm gezeichnet. In der letzten Zeile wird diese Animation in ein animiertes GIF gespeichert. Das ist natürlich optional und kann auch weggelassen werden. === Mit VPython === Aber auch mit dem Modul VPython lassen sich einfache 3D-Animationen erstellen. VPython ist ein externes Modul, das vorab installiert werden muss. Unter openSUSE Tumbleweed gibt es dzt. kein entsprechendes rpm-Paket. Die übliche Methode der Installation mittels YaST oder zypper ist somit nicht möglich. Auch eine direkte Verwendung von pip führt nur zu einer Fehlermeldung (<code>error: externally-managed-environment</code>). Es empfiehlt sich dort folgende Vorgehensweise: # Erstelle zuerst eine virtuelle Umgebung, z.B.: <code>python3.11 -m venv ~/tmp/venv1</code> # Wechsle das Verzeichnis: <code>cd ~/tmp/venv1/bin</code> # Installiere das entsprechende Paket: <code>./pip install vpython</code> # Führe das entsprechende Skript aus: <code>./python ~/tmp/test1.py</code> Aktuell (März 2026) ist dieses Programmpaket lt. der [https://vpython.org/presentation2018/install.html VPython-Homepage] nur für die Python-Versionen 3.8 bis 3.12 verfügbar. Ein Beispiel zu einer einfachen Animation wird nachfolgend geliefert. from vpython import * scene.width = 1200 scene.height = 600 scene.center = vector(20,0,0) scene.background = color.white cylinder(pos=vector(0,0,0), axis=vector(20,0,0), radius=5, color=color.blue) cone(pos=vector(0,0,0), axis=vector(-10,0,0), radius=5, color=color.blue) helix(pos=vector(20,0,0), axis=vector(40,0,0), radius=2, coils=10, thickness=0.5, color=color.blue) ball = sphere(pos=vector(20,0,0), color = color.green, radius = 1) ball.p = vector(0.15, 0, 0) toc = True while True: rate(200) if(ball.pos.x <= 60 and toc == True): ball.pos += ball.p else: toc = False ball.pos -= ball.p if(ball.pos.x <= 20 and toc == False): toc = True [[Datei:PythonIng_vpython_anim.JPG]] Idealerweise öffnet sich beim Ausführen des Scripts ein Browserfenster. Darin wird die programmierte Animation gezeigt (siehe auch den obigen Screenshot). Eine Größenänderung können Sie mit der mittleren Maustaste initiieren. Die Szenerie drehen können Sie mit der rechten Maustaste. === Mit VTK === Komplexer, aber auch mächtiger als VPython ist die Verwendung von VTK ('''V'''isualization '''T'''ool'''k'''it). Genauer gesagt des Python-Wrappers von VTK. Dieses externe Python-Modul muss vorab installiert werden (z.B. mittels YaST, pip oder in eine virtuelle Umgebung). VTK ist eine Softwarebibliothek zur 3D-Visualisierung und wurde ursprünglich in C++ geschrieben. Verbreitet eingesetzt wird diese Bibliothek in der Wissenschaft und Forschung, z.B. * in der medizinischen Bildgebung * für Strömungssimulationen * für Klimadaten VTK funktioniert nach dem {{W|Grafikpipeline|Pipeline-Prinzip}}: Source (Quellen) -> Filter -> Mapper (Senken) -> Actor/Renderer Daten fließen von den Quellen zu den Senken. Als einfaches Beispiel wird die Darstellung eines Zylinders gezeigt, der mit den Maustasten gedreht oder in der Größe geändert werden kann: import vtk # Zylinder erzeugen cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) # Geometrie in darstellbare Daten umwandeln mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) # Objekt in der Szene actor = vtk.vtkActor() actor.SetMapper(mapper) # Szene verwalten renderer = vtk.vtkRenderer() renderer.AddActor(actor) # Render-Fenster render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) # Maus/Tastatur-Steuerung interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) # Starten render_window.Render() interactor.Start() Ausgabe: [[Datei:PythonIng_VTK_1.png]] Gleiches Beispiel wie oben, aber mit einer Animationssequenz: import vtk import time cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) renderer = vtk.vtkRenderer() renderer.AddActor(actor) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) render_window.Render() time.sleep(0.01) Das Grafikfenster schließt sich nach Ablauf der Schleife. Das Fenster bleibt geöffnet, wenn Sie am Programmende folgenden Befehl hinschreiben interactor.Start() Um den animierten Zylinder grün einzufärben, müssen Sie Folgendes im obigen Programm ergänzen (Farbnamen): colors = vtk.vtkNamedColors() actor.GetProperty().SetColor(colors.GetColor3d("Green")) Als Namen können Sie u.a. die CSS3 Web-Farben verwenden (siehe z.B. [https://wiki.selfhtml.org/wiki/Farbe/Farbangaben]). Alternativ funktioniert auch das (RGB): actor.GetProperty().SetColor(0.0, 0.6, 0.0) Wie der Zylinder mit einer Textur versehen wird, zeigt folgendes Programm: import vtk import time cylinder = vtk.vtkCylinderSource() cylinder.SetResolution(30) cylinder.SetHeight(3.0) cylinder.SetRadius(1.0) cylinder.CappingOn() texture_coords = vtk.vtkTextureMapToCylinder() texture_coords.SetInputConnection(cylinder.GetOutputPort()) texture_coords.PreventSeamOn() reader = vtk.vtkJPEGReader() reader.SetFileName("PythonIng_textur.jpg") texture = vtk.vtkTexture() texture.SetInputConnection(reader.GetOutputPort()) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(texture_coords.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.SetTexture(texture) renderer = vtk.vtkRenderer() renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) renderer.AddActor(actor) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) renderWindow.Render() time.sleep(0.01) interactor.Start() <gallery> PythonIng_textur.jpg | Textur-Datei PythonIng_VTK_2.png | Ausgabe (Screenshot) </gallery> Nun aber genug von VTK und der Erstellung von Grafiken, weiter geht es mit mathematischeren Themen. = Vektoren und Matrizen = == Zahlenfolgen == from numpy import * start = 0 stop = 10 step = 2 num = 10 r = arange(start, stop, step) l = linspace(start, stop, num) print("r = ", r) print("l = ", l) Ausgabe: r = [0 2 4 6 8] l = [ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556 6.66666667 7.77777778 8.88888889 10. ] == Vektoren == Vektoren sollten jedem aus der Linearen Algebra bekannt sein. === Arrays === In Python mit NumPy kann man Vektoren durch die Funktion array erzeugen. import numpy as np l1 = (-5, 3, 2) l2 = (1, 1, 4) a1 = np.array(l1) a2 = np.array(l2) a3 = a1 + a2 a4 = 2 * a2 print(a1) print(a2) print(a3) print(a3[2]) print(a4) Ausgabe: [-5 3 2] [1 1 4] [-4 4 6] 6 [2 2 8] === Zeilen- und Spaltenvektoren === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) print(z) print(s) Ausgabe: [ [-5 3 2] ] [[1] [1] [4]] === Skalarprodukt === import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) skalarprodukt = np.dot(a1, a2) print(skalarprodukt) Ausgabe: 6 === Vektorprodukt === <math>a\ast b=\left(\begin{array}{c} a_{1}\\ a_{2}\\ a_{3} \end{array}\right)\ast\left(\begin{array}{c} b_{1}\\ b_{2}\\ b_{3} \end{array}\right)=\left(\begin{array}{c} a_{2}b_{3}-a_{3}b_{2}\\ a_{3}b_{1}-a_{1}b_{3}\\ a_{1}b_{2}-a_{2}b_{1} \end{array}\right) </math> Python-Code: import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) vektorprodukt = np.cross(a1, a2) print(vektorprodukt) Ausgabe: [10 22 -8] === Transponierter Vektor === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) # transponierter Vektor z_tp = np.transpose(z) # transponierter Vektor s_tp = np.transpose(s) print(z_tp) print(s_tp) Ausgabe: [[-5] [ 3] [ 2]] [ [1 1 4] ] === Vektorfelder visualisieren === import matplotlib.pyplot as plt import numpy as np # Daten generieren x = np.arange(0, 10, 1) y = np.arange(0, 10, 1) X, Y = np.meshgrid(x, y) U = X * Y V = Y + X # Plotten fig, ax = plt.subplots() ax.quiver(X, Y, U, V, angles='xy') plt.show() Ausgabe: [[Datei:PythonIng_quiver1.png]] == Matrizen== import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) print(m1) Ausgabe: [[1 2 3] [4 5 6]] === Zugriff auf Matrizenelemente === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) # Element aus Zeile 2 und Spalte 3 (Achtung! Index startet bei Null) print(m1[1,2]) Ausgabe: 6 === Addition und Subtraktion von Matrizen === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) m2 = np.matrix([[0, 0, 2], [1, 3, 2]]) print(m1 + m2) print(m1 - m2) Ausgabe: [[1 2 5] [5 8 8]] [[1 2 1] [3 2 4]] === Transponierte Matrix === import numpy as np m = np.matrix([[1, 2, 3], [4, 5, 6]]) mt = np.transpose(m) print(m) print(mt) Ausgabe: [[1 2 3] [4 5 6]] [[1 4] [2 5] [3 6]] === Rang einer Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) rg = np.linalg.matrix_rank(m) print(rg) Ausgabe: 2 === Inverse Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) mi = np.linalg.inv(m) print(mi) Ausgabe: [[ 1. 0.6] [-0. -0.2]] === Multiplikation von Matrizen (falksches Schema) === import numpy as np m1 = np.matrix([[1, 3, 4], [0, -5, 1]]) m2 = np.matrix([[1, 2], [2, 3], [0, 2]]) print(m1 @ m2) Ausgabe: [[ 7 19] [-10 -13]] === Eigenwerte und Eigenvektoren === import numpy as np m = np.matrix([[5, 8], [1, 3]]) D,V = np.linalg.eig(m) # Eigenwerte print(D) # Eigenvektoren print(V) Ausgabe: [7. 1.] [[ 0.9701425 -0.89442719] [ 0.24253563 0.4472136 ]] === Teilmatrizen === import numpy as np m = np.matrix([[1, 3, 4], [0, -5, 1]]) print("m = ", m) # Erste Zeile extrahieren m1 = m[0,:] print("m1 = ", m1) # Das Element aus der 1. Zeile und der 2. Spalte extrahieren m2 = m[0,1] print("m2 = ", m2) # Zweite Spalte extrahieren m3 = m[:, 1] print("m3 = ", m3) Ausgabe: m = [[ 1 3 4] [ 0 -5 1]] m1 = [ [1 3 4] ] m2 = 3 m3 = [[ 3] [-5]] === Spezielle Matrizen === ==== Nullmatrix ==== import numpy as np z = np.zeros((3, 2)) print(z) Ausgabe: [[0. 0.] [0. 0.] [0. 0.]] ==== Einheitsmatrix ==== import numpy as np z = np.eye(3) print(z) Ausgabe: [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ==== Matrix mit lauter Einsen ==== import numpy as np z = np.ones((3, 2)) print(z) Ausgabe: [[1. 1.] [1. 1.] [1. 1.]] === Spärlich besetzte Matrizen === Das Thema spärlich besetzter Matrizen wird hier nur kurz angerissen. Nähere Details siehe unter dem Weblink [https://docs.scipy.org/doc/scipy/reference/sparse.html#module-scipy.sparse]. import numpy as np import scipy A = scipy.sparse.csr_array(np.eye(5)) print(A) Ausgabe: (0, 0) 1.0 (1, 1) 1.0 (2, 2) 1.0 (3, 3) 1.0 (4, 4) 1.0 = Lineare Gleichungssysteme = Sei <math>Ax = b</math> ein lineares Gleichungssystem. <math>A</math> sei die Koeffizientenmatrix, <math>x</math> der Lösungsvektor und <math>b</math> ein bekannter Vektor. Beispiel: import numpy as np A = np.array([[5, 1], [0, 2]]) b = np.array([1, 2]) x = np.linalg.solve(A, b) print(x) Ausgabe: [0. 1.] == Aufgabe == * Lösen Sie folgendes Gleichungssystem mittels Python (und zur Kontrolle auch händisch): 5x + 6y - 2z = 12 3x - y - 3z = 6 2x + 2y + 4z = 5 = Polynome = == Ein erstes einfaches Beispiel == Gegeben sei das Polynom <math>7x^3+5x^2+1</math>. In Python: import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p) Ausgabe: 3 2 7 x + 5 x + 1 == Einzelne Polynomwerte berechnen == import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p(1.5)) Ausgabe: 35.875 == Polynome integrieren und differenzieren == import numpy as np p = np.poly1d([7, 5, 0, 1]) # 1. Ableitung p1 = p.deriv() p2 = p.deriv(1) # 2. Ableitung p3 = p.deriv(2) # Integral p4 = p.integ() print(p1) print(p2) print(p3) print(p4) Ausgabe: 2 21 x + 10 x 2 21 x + 10 x 42 x + 10 4 3 1.75 x + 1.667 x + 1 x == Nullstellen bestimmen == import numpy as np p = np.poly1d([2, 5, 0, 4]) r = np.roots(p) print(r) Ausgabe: [-2.7621427 +0.j 0.13107135+0.84077099j 0.13107135-0.84077099j] == Aufgaben == * Berechnen Sie den Wert für x = 3 des Polynoms <math>y = 2x^4 - 3x^3 - x + 7</math>. * Differenzieren und integrieren Sie das Polynom <math>y = 2x^4 - 3x^3 - x + 7</math>. * Berechnen Sie die Nullstellen von <math>y = 7x^5 - 3x^2 + 12</math>. = Nichtlineare Gleichungen und Gleichungssysteme = == Nullstellenbestimmung == Löse eine beliebige Gleichung f(x) = 0, z.B. <math> f(x) = x^2 - 5\cos(x) - 10 = 0 </math>: import scipy import numpy as np def f(x): return x**2 - 5*np.cos(x) - 10 xstart = [-1, 1] # Startwerte xn = scipy.optimize.root(f, xstart) print(xn.x) Ausgabe: [-2.46813009 2.46813009] Funktionsgraph: [[Datei:octave_nichtlin2.jpg]] == Gleichungssysteme == SymPy ist ein externes Modul, das symbolisches Rechnen ('''Sym'''bolic '''Py'''thon) ermöglicht. Folgende Aufgabe ist dem Buch "Knorrenschild: Numerische Mathematik, Hanser, 2017, Seite 72" entnommen. Zu lösen ist das nichtlineare Gleichungssystem <math>f_1 = 2x_1 + 4x_2 = 0 </math> <math>f_2 = 4x_1 + 8x_2^3 = 0</math> Mit Python ist das so möglich: import sympy x1, x2 = sympy.symbols("x1 x2") f1 = 2*x1 + 4*x2 f2 = 4*x1 + 8*x2**3 s = sympy.solve((f1, f2), x1, x2) print(s) Ausgabe: [(-2, 1), (0, 0), (2, -1)] Plot: [[Datei:IngPython_nl_gleichung1.svg|500px]] = Komplexe Zahlen = Die imaginäre Einheit wird in Python durch den Buchstaben <code>j</code> symbolisiert. Darstellen kann man eine komplexe Zahl bekannterweise in mehreren Formen: * Kartesische Darstellung <math>z = \Re(z) + j \cdot \Im(z)</math> * Polardarstellungen <math>z = r \cdot (\cos(\phi) + j \cdot \sin(\phi)) = r \cdot e^{j\cdot \phi}</math> Die konjugiert komplexe Zahl ist <math>z^* = \Re(z) - j \cdot \Im(z)</math> Nachfolgend einige mathematische Operationen mit Python und NumPy. import numpy as np z1 = 2 + 5j # kartesische Darstellung z2 = 3 * np.exp(3j) # Polardarstellung # Addition res = z1 + z2 print("z1 + z2 = ", res) # Multiplikation res = z1 * z2 print("z1 * z2 = ", res) # Realteil res = np.real(z2) print("Realteil von z2 = ", res) # Imaginärteil res = np.imag(z2) print("Imaginaerteil von z2 = ", res) # Betrag res = np.abs(z1) print("Betrag von z1 = ", res) # Argument res = np.angle(z1) print("Argument von z1 = ", res) # Konjugiert komplexe Zahl res = np.conj(z1) print("Konjugiert komplexe Zahl von z1 = ", res) Ausgabe: z1 + z2 = (-0.9699774898013365+5.423360024179601j) z1 * z2 = (-8.05675510050068-14.003167400647481j) Realteil von z2 = -2.9699774898013365 Imaginaerteil von z2 = 0.4233600241796016 Betrag von z1 = 5.385164807134504 Argument von z1 = 1.1902899496825317 Konjugiert komplexe Zahl von z1 = (2-5j) = Interpolation = import numpy as np import scipy import matplotlib.pyplot as plt # Stützpunkte xp = np.arange(1, 6) yp = (0, -5, 2, 7, 6) ti = np.arange(1, 5, 0.01) i1 = scipy.interpolate.interp1d(xp, yp, kind = "linear") i2 = scipy.interpolate.interp1d(xp, yp, kind = "cubic") plt.plot(xp, yp, "rx") plt.plot(xp, i1(xp)) plt.plot(ti, i2(ti)) plt.show() Ausgabe: [[Datei:PythonIng_interpol1.png]] = Differenzialrechnung = == Numerisches Differenzieren == Als Beispiel differenzieren wir <math>y = 5x\sin{x}</math> und stellen das Ganze grafisch dar. from findiff import Diff import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) f = 5 * x * np.sin(x) dx = x[1] - x[0] # Ableitung d_dx = Diff(0, dx) df_dx = d_dx(f) # Grafik plt.plot(x, f, label = "y") plt.plot(x, df_dx, label = "y'") plt.grid() plt.legend(loc="best") plt.show() Ausgabe: [[Datei:octave_diff1.jpg]] <small>findiff ist ein externes Modul. Dieses muss installiert werden (z.B. so: ...\Python\Scripts\pip.exe install --upgrade findiff). Für die Vorgehensweise unter openSUSE Tumbleweed siehe das Kapitel VPython, nur dass das Ganze mit einer aktuelleren Python-Version exekutiert wird, z.B. mit Python 3.13. Das im Buch "Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler, Rheinwerk" verwendete Modul "scipy.misc" ist veraltet (deprecated ... missbilligt). Lt. [https://docs.scipy.org/doc/scipy-1.17.0/dev/roadmap-detailed.html#misc SciPy-Dokumentation für die Version 1.17.0] wurden alle entsprechenden Features schon entfernt.</small> == Symbolisches Differenzieren == Differenzieren Sie die Funktionen <math>f_1(x) = x^2</math> und <math>f_2(x) = \sin(x)\cos\left(\frac{x}{2}\right)</math>. import sympy x = sympy.symbols("x") f1 = x**2; f2 = sympy.sin(x) * sympy.cos(x/2.) d1 = sympy.diff(f1, x) d2 = sympy.diff(f2, x) print(d1) print(d2) Ausgabe: 2*x -0.5*sin(0.5*x)*sin(x) + cos(0.5*x)*cos(x) == Aufgaben == * Differenzieren Sie die Funktion <math>y = \log(x) + 10x</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. * Differenzieren Sie die Funktion <math>y = \frac{\sinh(x)}{(1+x)}</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. = Integralrechnung = == Numerisches Integrieren == Berechnen Sie das Integral <math>\int_{0}^{3}x^2 dx</math>. import scipy def f(x): return x**2 i = scipy.integrate.quad(f, 0, 3) print(i) Ausgabe: (9.000000000000002, 9.992007221626411e-14) Das trifft den exakten Wert 9.0 ziemlich genau. Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} dx</math>. import scipy import numpy as np def f(x): return 2**(-x) i = scipy.integrate.quad(f, 0, np.inf) print(i) Ausgabe: (1.4426950408889556, 4.486558477977586e-09) == Symbolisches Integrieren == Berechnen Sie <math>\int x^2 \text{d}x</math> und <math>\int \sin{x}\cos{\frac{x}{2}} \text{d}x</math>. import sympy x = sympy.symbols("x") f1 = x**2 f2 = sympy.sin(x) * sympy.cos(x/2.) i1 = sympy.integrate(f1, x) i2 = sympy.integrate(f2, x) print(i1) print(i2) Ausgabe: x**3/3 -0.666666666666667*sin(0.5*x)*sin(x) - 1.33333333333333*cos(0.5*x)*cos(x) Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} \text{d}x</math>. import sympy x = sympy.symbols("x") f = 2**(-x) i = sympy.integrate(f, (x, 0, sympy.oo)) print(i) Ausgabe: 1/log(2) Mit <code>sympy.pprint(i)</code> ließe sich letzere Ausgabe etwas schöner schreiben: 1 ────── log(2) Man beachtete, <code>log</code> steht hier für den natürlichen Logarithmus <code>ln</code>. == Aufgaben == * Integrieren Sie die Funktion <math>y = \log(x) + 10x</math> von 1 bis 5. * Integrieren Sie die Funktion <math>y = x^3</math> von 0 bis 4. * Integrieren Sie <math>\int x^x(\log (x) + 1)\mathrm dx</math> symbolisch. = Gewöhnliche Differenzialgleichungen = == DGL numerisch lösen == Für die Lösung von Differenzialgleichungen steht u.a. die Funktion scipy.integrate.solve_ivp() zur Verfügung. Diese Funktion implementiert auch das Runge-Kutta-Verfahren (RK45). {{Wikipedia | Runge-Kutta-Verfahren}} Beispiel <math>y' = x^2 + y^3</math>: import scipy import numpy as np import matplotlib.pyplot as plt def dy_dx(x, y): return x**2 + y**3 y0 = [1] xi = [0, 1] x = np.arange(0, 1, 0.01) z = scipy.integrate.solve_ivp(dy_dx, xi, y0, method="RK45", dense_output=True) y = z.sol(x) plt.plot(x, y.T) plt.grid() plt.show() [[Datei:PythonIng_dgl1.png]] == DGL symbolisch lösen == Beispiel <math>y' = x^2 + y^3</math>: import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) print(lsg) Ausgabe: [Eq(f(x), (-x**2)**(1/3)), Eq(f(x), (-x**2)**(1/3)*(-1 - sqrt(3)*I)/2), Eq(f(x), (-x**2)**(1/3)*(-1 + sqrt(3)*I)/2)] Mit <code>sympy.pprint</code> (pretty print) lässt sich die Ausgabe etwas übersichtlicher darstellen. import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) sympy.pprint(lsg) Ausgabe: ⎡ _____ _____ ⎤ ⎢ _____ 3 ╱ 2 3 ╱ 2 ⎥ ⎢ 3 ╱ 2 ╲╱ -x ⋅(-1 - √3⋅ⅈ) ╲╱ -x ⋅(-1 + √3⋅ⅈ)⎥ ⎢f(x) = ╲╱ -x , f(x) = ────────────────────, f(x) = ────────────────────⎥ ⎣ 2 2 ⎦ == Aufgaben == * Lösen Sie die Differenzialgleichung <math>y' = \frac{1}{x\cdot y}</math> mit Python. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>m' = -k\cdot m</math>. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>y' = \sqrt{|y|}</math>. =Rechnen mit wirklich großen Zahlen= Bekannt ist, dass Python kaum Einschränkungen beim Wertebereich von Ganzzahlen hat, z.B. print(10**300) Ausgabe (gekürzt): 100000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000 Ähnliches geht auch mit Gleitpunktzahlen, z.B. durch die Verwendung des Moduls mpmath: import mpmath print(mpmath.mpf(1500.4)**mpmath.mpf(300)) Ausgabe: 7.27975299218612e+952 Anderes Beispiel: from mpmath import mp, pi mp.dps = 100 print(pi) Ausgabe: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 mpmath kann noch einiges mehr, dazu sei aber auf die entsprechende Dokumentation auf der mpmath-Homepage verwiesen. mpmath ist Bestandteil von SymPy, kann aber auch separat installiert werden. Aber auch Python selbst besitzt eine Möglichkeit, um mit großen bzw. exakten Gleitpunktzahlen zu rechnen, nämlich das interne Modul decimal. Dieses hat einige Vorteile gegenüber mpmath, aber auch gravierende Nachteile. Diese seien hier nicht detailliert aufgezählt. Grob gesagt hat decimal im Finanzwesen seine Berechtigung. Für wissenschaftliche Anwendungen wird aber mpmath vorzuziehen sein, da es u.a. vielfältige mathematische Funktionen bereit stellt. Nachfolgend ein einfaches Beispiel mit decimal: import decimal print("Potenzierung:", decimal.Decimal(1500.4) ** decimal.Decimal(300.0)) print("Einfache Addition:", 0.1 + 0.2) decimal.getcontext().prec = 2 print("Addition mit decimal:", decimal.Decimal(0.1) + decimal.Decimal(0.2)) Ausgabe: Potenzierung: 7.279752992186121551039839134E+952 Einfache Addition: 0.30000000000000004 Addition mit decimal: 0.30 <u>Aufgabe:</u> Recherchieren Sie im Internet die genauen Vor- und Nachteile von decimal und mpmath. Verwenden Sie dazu auch KI (z.B. von Google, chatgpt). =Regelungstechnische Aufgabenstellungen= Für regelungstechnische Aufgaben gibt es u.a. das externe Paket <code>control</code>. Hier soll nicht detailliert darauf eingegangen werden. Anhand eines Beispiels soll anschließend nur die Visualisierung in Form eines Bode-Diagramms und der Sprungantwort gezeigt werden. Gegeben sei ein P-Regler mit <math>R = \frac{5}{2}</math> und eine Strecke <math>S= \frac{1}{30s^3+20s^2+10s+1,5}</math>. Gesucht sei vorerst ein Bode-Diagramm für den offenen Regelkreis und das Führungsverhalten. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke # oder: G0 = ct.series(regler, strecke) Gw = ct.feedback(G0) ct.bode_plot(G0, label='G0') ct.bode_plot(Gw, label='Gw') plt.show() [[Datei:PythonIng_bode1.svg]] Nun noch für obiges Beispiel die Sprungantwort. Diese zeigt einige große Überschwinger, d.h. der Regler kann sicher noch optimiert werden. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke Gw = ct.feedback(G0) t, y = ct.step_response(Gw) plt.plot(t,y) plt.title('Sprungantwort') plt.xlabel('t') plt.ylabel('h(t)') plt.grid() plt.show() [[Datei:PythonIng_bode3.svg]] Einige weitere wichtige Daten (Phasenreserve, Amplitudenreserve, Durchtrittsfrequenz) lassen sich mittels der <code>control</code>-Funktion <code>margin()</code> ermitteln. Die Ortskurve lässt sich mit der Funktion <code>nyquist_plot()</code> zeichnen. Dies sei hier aber nicht weiter ausgeführt. ==Aufgaben== * Zeichen Sie mit Python die Ortskurve für obiges Beispiel. * Was passiert, wenn man die Reglerverstärkung weiter aufdreht (z.B. auf <math>R = \frac{25}{2}</math>)? * Wie sehen das Bode-Diagramm und die Sprungantwort aus, wenn ein PI-Regler verwendet wird? = Stereostatik etc. = Das Modul SymPy bietet einige Möglichkeiten einfache Bauwerke zu berechnen, z.B. Balken oder Fachwerke. Nachfolgend wird ein einfaches Fachwerk berechnet und gezeichnet. Python-Code: from sympy.physics.continuum_mechanics.truss import Truss t = Truss() # Knoten t.add_node(("A", -3, 0), ("B", 0, 0), ("C", 4, 0), ("D", 7, 0), ("E", 6, 1.5), ("F", 2, 3), ("G", -2, 1.5)) # Stäbe t.add_member(("AB","A","B"), ("BC","B","C"), ("CD","C","D")) t.add_member(("AG","A","G"), ("GB","G","B"), ("GF","G","F")) t.add_member(("BF","B","F"), ("FC","F","C"), ("CE","C","E")) t.add_member(("FE","F","E"), ("DE","D","E")) # Auflager; roller ... Loslager, pinned ... Festlager t.apply_support(("A","roller"), ("D","pinned")) # Einwirkende Kräfte t.apply_load(("G", 5, 270), ("E", 3, 90)) # Berechnung t.solve() print("Reaction Forces: ", t.reaction_loads) print("Internal Forces: ", t.internal_forces) # Fachwerk zeichnen p = t.draw() p.show() Ausgabe auf der Konsole: Reaction Forces: {'R_A_y': 4.20000000000000, 'R_D_x': 0, 'R_D_y': -2.20000000000000} Internal Forces: {'AB': 2.80000000000000, 'BC': 0.333333333333333, 'CD': -1.46666666666667, 'AG': -5.04777178564958, 'GB': -2.05555555555556, 'GF': -1.23413387432364, 'BF': 0.411111111111111*sqrt(13), 'FC': -0.3*sqrt(13), 'CE': 1.50000000000000, 'FE': 0.284800124843917, 'DE': 2.64407093534026} Zeichnung: [[File:PythonIng_fachwerk1.svg|300px]] Details zu diesem Thema siehe z.B. [https://docs.sympy.org/latest/modules/physics/continuum_mechanics/index.html Continuum Mechanics] oder [https://docs.sympy.org/latest/tutorials/physics/continuum_mechanics/index.html Continuum Mechanics Tutorials]. Auch andere mechanische Probleme werden von SymPy abgehandelt ([https://docs.sympy.org/latest/tutorials/physics/index.html Physics Tutorials]). == Aufgabe == Gegeben sei ein einseitig eingespannter Kragträger. Belastet wird er durch eine Einzellast am Trägerende. Für die Daten siehe folgende ASCII-Skizze: | 20 kN //|---> x | //| V //|---------------------- //| 10 m | Elastizitätsmodul E = 2,1*10⁵ N/mm² Flächenträgheitsmoment I = 0.001 m⁴ Berechnen Sie die Auflagerreaktionen, den Querkraft- und Biegemomentenverlauf, sowie die Verformungen. Stellen Sie dies mit Hilfe von SymPy graphisch und auch mittels Formeln dar. Verwenden Sie dazu auch pprint (pretty print) aus dem SymPy-Modul. Zwecks Lösungsansatz siehe die oben aufgeführte Seite "Continuum Mechanics Tutorials". Achten Sie auch auf die Einheiten! Kontrollieren Sie das Ganze mittels händischer Rechnung. In dem genannten Tutorial ist von "Singularity Functions" die Rede. Gemeint ist damit in diesem Kontext die {{W|Föppl-Klammer}}. Einige Python-Programme, vorrangig zu Maschinenelementen, finden sich auf [https://baymp.de/download_python.html BayMP für Python] (Balken, Zahnräder, Stabknickung usw.). = Stochastik = Die Stochastik ist ein sehr weites Feld. Hier werden nur einige wenige sehr einfache, aber wichtige Themen angerissen. Python stellt mit den Moduln math und statistics Software zu diesem Zwecke bereit. math und statistics sind bereits im Lieferumfang von Python enthalten. Aber auch mit den externen Modulen NumPy, SciPy und pandas kann man Stochastik in Python betreiben. Dies wird hier aber nicht gemacht. == Lageparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] m1 = statistics.mean(werte) m2 = statistics.mode(werte) m3 = statistics.median(werte) print("Arithmetischer Mittelwert = ", m1) print("Modalwert = ", m2) print("Median = ", m3) Ausgabe: Arithmetischer Mittelwert = 3.5 Modalwert = 1 Median = 3.0 == Streuungsparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] s = statistics.stdev(werte) print("Standardabweichung = ", s) Ausgabe: Standardabweichung = 2.6770630673681683 == Kombinatorik == import math n = 7 k = 5 print("n! = ", math.factorial(n)) print("Kombinationen (n über k) = ", math.comb(n, k)) Ausgabe: n! = 5040 Kombinationen (n über k) = 21 = Ein- und Ausgabe = == print == Die Anweisung print haben wir schon oft verwendet. Hier soll anhand von Beispielen kurz beschrieben werden, was der Befehl print leisten kann. print("Hallo", "Welt", 1, sep="-") print("Hallo", end=" ") print("Welt") Ausgabe: Hallo-Welt-1 Hallo Welt == input == a = int(input("Zahl 1: ")) b = int(input("Zahl 2: ")) print("a + b = ", a+b) Ausgabe (nach Eingabe der beiden Ganzzahlen): Zahl 1: 4 Zahl 2: 5 a + b = 9 == Aus Dateien lesen == Es seinen die datei.txt Hallo Welt. Wie geht es dir? ... und test1.py dat = open("datei.txt", mode = "r") print(dat.read()) dat.close() Ausgabe Hallo Welt. Wie geht es dir? ... Mit dem open()-Befehl wird die Datei datei.txt im Lesemodus geöffnet (r ... read). Mit dem read()-Befehl wird die Datei eingelesen und mittels print ausgegeben. == In Dateien schreiben == dat = open("datei.txt", mode = "a", encoding = "utf-8") dat.write("Hänge Zeile an\n") dat.close() Die Datei datei.txt sieht nach Abarbeitung des obigen Skripts nun so aus Hallo Welt. Wie geht es dir? ... Hänge Zeile an Es wird die Datei im Schreibmodus geöffnet (a ... append (anhängend), w ... write (überschreibend)). write() fügt hier also eine Zeile Text am Dateiende ein. close() schließt die Datei wieder. Das close() kann man sich mit der with-Anweisung auch sparen. with open("datei.txt", mode="a", encoding="utf-8") as dat: dat.write("Hänge Zeile an\n") = Benutzeroberflächen erstellen = == tkinter == {{Wikipedia | Tkinter}} Python bietet standardmäßig das Modul tkinter zur Programmierung von Benutzeroberflächen. Es müssen also bei der Verwendung von tkinter keine externen Module installiert werden. Hier wird eine (sehr) kurze Einführung in das Erstellen von grafischen Oberflächen mittels tkinter gegeben. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") win.minsize(300, 50) but = tk.Button(win, text = "Push the button") but.pack() win.mainloop() Ausgabe: [[Datei:PythonIng_gui1.jpg]] Ein etwas komplizierteres Beispiel sei nachfolgend gezeigt. Es sollen zwei Strings miteinander verknüpft und ausgegeben werden. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") def on_button_clicked(): str = ent1.get() + ent2.get() lab2["text"] = str ent1 = tk.Entry(win) ent2 = tk.Entry(win) lab1 = tk.Label(win, text="verknuepfen mit") lab2 = tk.Label(win, text="") but = tk.Button(win, text = "=", command=on_button_clicked) ent1.pack(side="left") lab1.pack(side="left") ent2.pack(side="left") but.pack(side="left") ent2.pack(side="left") lab2.pack(side="left") win.mainloop() Ausgabe (vor der Eingabe der Teilstrings): [[Datei:PythonIng_gui2.jpg]] Ausgabe (nach der Eingabe der Teilstrings und dem Drücken des =-Buttons): [[Datei:PythonIng_gui3.jpg]] == curses == {{Wikipedia | curses}} Mit dem curses-Modul lassen sich u.a. TUIs ('''T'''ext '''U'''ser '''I'''nterfaces) erstellen. Ein sehr einfaches Beispiel zur allgemeinen Funktionsweise wird nachstehend geliefert. import curses stdscr = curses.initscr() curses.start_color() curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) stdscr.clear() stdscr.addstr("Hallo Welt", curses.color_pair(1)) stdscr.refresh() stdscr.getch() curses.endwin() Als Ausgabe sollte <span style="color:#FF0000;">Hallo Welt</span> (rote Schrift auf weißem Hintergrund) auf dem Terminal/der Konsole erscheinen. Getestet wurde dies mit openSUSE Tumbleweed, Python-Version 3.13.12. Das entsprechende Python-curses-Package muss installiert sein. Allgemeine Informationen zur Terminal-/Konsolengröße und Cursorposition liefert folgendes Programm: import curses stdscr = curses.initscr() stdscr.addstr(3, 5, "LINES: %d" % curses.LINES) stdscr.addstr(4, 5, "COLS: %d" % curses.COLS) (y,x) = stdscr.getyx() stdscr.addstr(5, 5, "Momentane Cursorposition: [%d, %d]" % (y, x)) (y,x) = stdscr.getbegyx() stdscr.addstr(6, 5, "Koordinatenursprung: [%d, %d]" % (y, x)) (y,x) = stdscr.getmaxyx() stdscr.addstr(7, 5, "Fenstergröße: [%d, %d]" % (y, x)) stdscr.addstr(11, 2, "Taste drücken -> Ende") stdscr.refresh() stdscr.getch() curses.endwin() Es sollte sich in etwa folgende Ausgabe ergeben: LINES: 44 COLS: 110 Momentane Cursorposition: [4, 15] Koordinatenursprung: [0, 0] Fenstergröße: [44, 110] Taste drücken -> Ende Zur Funktionsweise von curses siehe auch das Wikibook [[ncurses]]. Zum Verständnis sind dort allerdings elementare Kenntnisse in der Programmiersprache C erforderlich. == Qt == {{Wikipedia | Qt (Bibliothek)}} Auch für das Qt-Framework gibt es eine Anbindung an Python. Nachfolgend ein einfaches Beispiel. import sys from PySide6.QtWidgets import QApplication, QLabel app = QApplication(sys.argv) label = QLabel("Hallo Welt!") label.show() sys.exit(app.exec()) Ausgabe: [[Datei:PythonIng_gui10.png]] == Gtk == {{Wikipedia | GTK (Programmbibliothek)}} Eine idente Ausgabe, wie oben für Qt gezeigt, erzeugt z.B. folgendes Gtk-Programm: import gi gi.require_version("Gtk", "4.0") from gi.repository import Gtk def on_activate(app): win = Gtk.ApplicationWindow(application=app) lab = Gtk.Label(label="Hallo Welt!") win.set_child(lab) win.present() app = Gtk.Application() app.connect('activate', on_activate) app.run(None) Auch für die Benutzung von Qt und Gtk müssen die jeweiligen Packages installiert sein. Getestet wurden die entsprechenden Python-Programme nur unter openSUSE Tumbleweed. Wie das GTK-Paket unter MS Windows 11 installiert wird, siehe z.B. [https://www.gtk.org/docs/installations/windows Setting up GTK for Windows]. Damit sei aber das Thema "Benutzeroberflächen erstellen" hier abgeschlossen, da dies schon ein sehr spezielles Aufgabengebiet ist, das eher Informatiker und nicht so sehr Ingenieure anspricht. Bei Bedarf siehe aber ggf. die entsprechenden Links unten in diesem Tutorial. Dort sind weiterführende Informationen zu finden. = Style Guide und flake8 = Wie man schönen und richtigen Python-Code schreibt, erfahren Sie in * [https://peps.python.org/pep-0008/ PEP 8 – Style Guide for Python Code] Ein Modul, das prüft, ob die Richtlinien im Style Guide eingehalten wurden, ist ''flake8'': * [https://flake8.pycqa.org/en/latest/ Flake8: Your Tool For Style Guide Enforcement] = Einige Integrierte Entwicklungsumgebungen (IDEs)= Werden Programmtexte größer und umfangreicher, so ist das Arbeiten mit der interaktiven Programmierumgebung bzw. das direkte Ausführen von Python-Skripten mühsam. Man wünscht sich z.B. Hilfen zum Debuggen oder die automatische Code-Vervollständigung. Zu diesem Zweck wurden IDEs (Integrated Development Environments) geschaffen. Von diesen seinen nachfolgend auszugsweise einige kurz beschrieben. Testen Sie einfach aus, welche davon für Sie bzw. für Ihr Python-Projekt geeignet sind. == IDLE == IDLE ist die mit dem Python-Programmpaket mitgelieferte IDE. Der Name leitet sich einerseits ab vom Monty-Python-Mitglied Eric Idle, andererseits steht es als Abkürzung für "'''I'''ntegrated '''D'''evelopment and '''L'''earning '''E'''nvironment. IDLE ist einfach zu bedienen, bietet aber schon einen beachtlichen Leistungsumfang. Nachfolgend wird ein Screenshot zu IDLE geliefert. Rechts ist das Editor-Fenster zu sehen, links die interaktive Programmierumgebung. Um das Beispiel selbst nachvollziehen zu können, starten Sie IDLE. Das geht ähnlich, wie Sie die interaktive Programmierumgebung von Python starten (nur, dass Sie eben das IDLE-Icon doppelklicken und nicht das Python-Icon. Unter Linux geben Sie einfach in einem Terminal <code>idle3.13</code> o. Ä. ein). Weiter geht es mit "File - Open - ...". Die auszuführende Datei auswählen (im konkreten Fall ein "Hallo-Welt"-Programm). Es erscheint das rechte Fenster. Dort "Run - Run Module" auswählen. Und schon wird im linken Fenster "Hallo Welt!" ausgegeben. [[Datei:PythonIng_idle1.jpg | 600px]] Siehe auch {{W|IDLE}}. == PyCharm == PyCharm ist ein kommerzielles Produkt. Es gab aber auch eine kostenlose Community Edition. Seit 2025 sind beide Varianten vereint. Für die ersten 30 Tage sind die Pro-Funktionen frei verfügbar, danach nur noch die Kernfunktionalitäten (oder man bezieht kostenpflichtig die Pro-Version). Zu beziehen ist PyCharm unter dem Weblink [https://www.jetbrains.com/pycharm/]. Nachfolgend ein etwas abgewandeltes "Hallo Welt"-Programm, editiert und ausgeführt mit PyCharm. [[Datei:PyCharm_IDE_2023_screenshot.png | 600px]] Siehe auch {{W|PyCharm}}. == Eric == Auch eric ist Open Source und steht unter der GNU General Public License Version 3 oder später. Zu beziehen ist diese Software unter [https://eric-ide.python-projects.org/]. [[Datei:Screenshot_Eric_4.png | 600px]] Siehe auch {{W|eric (Software)}}. <small> Unter openSUSE Tumbleweed sollte sich eric auch mit YaST installieren lassen. Bei mir gibt es aber dann beim Ausführen des eric-Programms eine Fehlermeldung (Stand März 2026): ... ModuleNotFoundError: No module named 'PyQt6.QtPdfWidgets' Umgehen kann man dieses Problem aber wieder mit dem Erstellen einer virtuellen Umgebung, in etwa so python3.13 -m venv ~/tmp/venv1 cd ~/tmp/venv1/bin ./python3.13 -m pip install --upgrade --prefer-binary eric-ide ./eric7_ide </small> == PyScripter == Vom Funktionsumfang vergleichbar mit den vorherigen IDEs ist PyScripter. Auch PyScripter ist Open Source. Die Projekt-Homepage findet sich auf [https://sourceforge.net/projects/pyscripter/]. PyScripter ist nur für MS Windows verfügbar. [[Datei:PythonIng_pyscripter1.jpg | 600px]] == Spyder IDE == Spyder enthält bereits eine stabile Python-Version und etliche Module (z.B. matplotlib, numpy, control). Ansonsten kann dieses Softwarepaket vom Funktionsumfang her mit den anderen genannten IDEs locker mithalten. Spyder wurde unter der MIT-Lizenz veröffentlicht. Diese Software findet sich auf [https://www.spyder-ide.org]. [[Datei:Spyder-windows-screenshot.png | 600px]] Siehe auch {{W|Spyder (Software)}} == Sonstige == Die genannten IDEs sind nicht die Einzigen. Es gibt, um dem Image Pythons als beliebteste Programmiersprache gerecht zu werden, noch einige andere. Sowohl Open Source-Programme als auch kommerzielle Programme sind im Web zu finden, z.B. Thonny oder {{W|Visual Studio Code}}. Braucht man den Umfang von ausgewachsenen IDEs nicht, so kann man auch normale Texteditoren verwenden (z.B. {{W|Geany}} oder {{W|Kate_(Texteditor)|Kate}}). = Debuggen und Testen = Das Debuggen und Testen von Programmen sind wichtige Bestandteile der Programmierung. Syntaxfehler lassen sich i.A. leicht beheben. Schwieriger ist das Eingrenzen von logischen Fehlern, die ev. nur in bestimmten Situationen auftreten und keine explizite Fehlermeldung hervorrufen. Das Programm liefert falsche Ergebnisse oder es stürzt aus heiterem Himmel ab. Um das zu verhindern gibt es verschiedene Werkzeuge, die bei der Fehlersuche behilflich sein können. Vorerst siehe aber zwecks Begriffsklärung noch folgende Links: * {{W|Debuggen}} * {{W|Debugger}} * {{W|Softwaretest}} <gallery> First Computer Bug, 1947.jpg Test ganzheitlich.png V-Modell.svg </gallery> == Das Modul pdb == Python bringt schon ein Modul zum Debuggen mit. Siehe z.B. [https://docs.python.org/3/library/pdb.html pdb — The Python Debugger]. Komfortabler lässt sich das aber mittels Integrierter Entwicklungsumgebungen (IDEs) angehen. == Debuggen mit IDEs == Für die IDEs IDLE und Spyder sei kurz auf die entsprechenden Webseiten verwiesen: * [https://www.cs.uky.edu/~keen/help/debug-tutorial/debug.html Debugging under IDLE]. * [https://docs.spyder-ide.org/current/panes/debugging.html Spyder Debugger] Dort wird die Vorgehensweise auch mittels Screenshots erläutert. == assert == assert ... behaupten, zusichern ({{W|Assertion (Informatik)}}) Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10., 0.) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10., 0.) File "/home/hr/Develop/test1.py", line 4, in print1 assert y != 0.0 ^^^^^^^^ AssertionError Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1("10.", "5.") File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Aber auch bei nachfolgendem Code gibt es eine Fehlermeldung: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10, 5) File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Damit letzteres funktioniert, kann man den Programmcode so umschreiben: def print1(x, y): assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 2.0 Und jetzt fangen wir den <code>AssertionError</code> auf: def print1(x, y): try: assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) except(AssertionError): print("Hallo") print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Hallo Ich hoffe, es ist wenigstens im Ansatz klar geworden, wofür <code>assert</code> gut sein kann. Ausschalten kann man die <code>assert</code>-Überprüfung übrigens mit dem Python-Schalter <code>-O</code>. == Doctests == Innerhalb eines Docstrings kann die Arbeit im interaktiven Modus simuliert werden. Nach den Promptzeichen (>>>) erfolgen dann bei unserem Beispiel innerhalb des Docstrings simulierte Aufrufe der Funktion <code>print1()</code>. Danach folgen jeweils die Sollresultate. Wird das Modul oder die Datei als Hauptprogramm aufgerufen, so wird die Funktion <code>doctest.testmode()</code> aufgerufen und ein Bericht auf der Konsole ausgegeben. Wird das Modul nicht als Hauptprogramm aufgerufen, sondern importiert, dann wird diese <code>testmod</code>-Funktion nicht aufgerufen. D.h. dieser Code kann sowohl für Testzwecke als auch für den produktiven Einsatz verwendet werden. Das ist auch sinnvoll, weil wenn man Teile der Datei immer löschen bzw. einfügen müsste, so würden sich Fehlerquellen auftun. Das würde den Sinn und Zweck von Doctests konterkarieren. def print1(x=0., y=1.): """ Dividiere zwei Zahlen Autor: Intruder Datum: 12.08.2025 >>> print1(2., 1.) 2.0 >>> print1(5., 2.) 2.5 >>> print1(5.) 5.0 """ print(x/y) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) Ausgabe: Trying: print1(2., 1.) Expecting: 2.0 ok Trying: print1(5., 2) Expecting: 2.5 ok Trying: print1(5.) Expecting: 5.0 ok 1 items had no tests: __main__ 1 items passed all tests: 3 tests in __main__.print1 3 tests in 2 items. 3 passed and 0 failed. Test passed. Das gezeigte Beispiel ist so ziemlich das einfachste, das es gibt. Für weiterführende Details siehe z.B.: * [https://peps.python.org/pep-0257/ PEP 257 – Docstring Conventions] * [https://docs.python.org/3/library/doctest.html doctest — Test interactive Python examples] == pytest == Siehe zu diesem Thema auch {{W|Modultest}}. pytest ist ein externes Modul und muss vorab installiert werden, z.B. mittels pip install -U pytest pip install -U pytest-html Python-Code, Datei test1.py: def add(x, y): return x + y def test_answer(): assert add(1, 1) == 3 Starten von pytest in der Konsole: pytest test1.py Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py F [100%] ========================================================= FAILURES ========================================================== ________________________________________________________ test_answer ________________________________________________________ def test_answer(): > assert add(1, 1) == 3 E assert 2 == 3 E + where 2 = add(1, 1) test1.py:6: AssertionError ================================================== short test summary info ================================================== FAILED test1.py::test_answer - assert 2 == 3 ===================================================== 1 failed in 0.09s ===================================================== Hier erhalten wir einen Fehler, da 1+1 eindeutig ungleich 3 ist. Aber aus irgendeinem Grund wollte der Programmierer oder Tester in diesem Fall, dass dies so ist. Testfälle werden übrigens mit dem Präfix <code>test_</code> eingeleitet. Python-Code: def add(x, y): return x + y + 1 def test_answer(): assert add(1, 1) == 3 Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py . [100%] ===================================================== 1 passed in 0.01s ===================================================== Jetzt ist alles in Ordnung. Weiterführendes siehe z.B. * [https://docs.pytest.org/en/stable/ pytest: helps you write better programs] == unittest == Auch unittest dient zur Durchführung von Testreihen, ist aber Bestandteil von Python. Hier wird vorerst nicht näher darauf eingegangen. Siehe z.B. * [https://docs.python.org/3/library/unittest.html unittest — Unit testing framework] Lt. ''Inden: Python Challenge; dpunkt, 2021, Seite 481'' soll unittest weniger komfortabel als pytest sein. Einen Vergleich von unittest mit pytest findet man in * [https://knapsackpro.com/testing_frameworks/difference_between/pytest/vs/unittest pytest vs unittest] = Ausblick = Dies war eine kurze Einführung in die Berechnungs- und Darstellungsmöglichkeiten mit Python. Es sollten etliche relevante Themen behandelt, oder zumindest kurz angesprochen worden sein. Wem dieser Text nicht ausreichend ist, der sei auf die entsprechenden weiterführenden Weblinks, Bücher und die Python-Hilfefunktion verwiesen. Python kennt noch viel mehr Befehle, als hier dargestellt wurden. Das Themenspektrum ist auch durch die Einbindung externer Module fast beliebig erweiterbar. = Weblinks= == Python allgemein == * [https://www.python.org/ Python Homepage] == Externe mathematische Module == * [https://numpy.org/ NumPy] * [https://numpy.org/doc/stable/user/numpy-for-matlab-users.html NumPy for MATLAB users] * [https://scipy.org/ SciPy] * [https://www.sympy.org/en/index.html SymPy] * [https://pandas.pydata.org/ pandas] * [https://github.com/maroba/findiff findiff] * [https://mpmath.org/ mpmath] == Externe Module für Grafiken == * [https://matplotlib.org/ Matplotlib] * [https://vpython.org/ VPython] * [https://docs.vtk.org/en/latest/api/python.html VTK] == Erstellung von User Interfaces == * [https://docs.python.org/3/library/tkinter.html tkinter - Python interface to Tcl/Tk] * [https://docs.python.org/3/library/curses.html curses - Terminal handling for character-cell displays] * [https://wiki.qt.io/Qt_for_Python Qt for Python] * [https://www.gtk.org/docs/language-bindings/python GTK and Python] == Erstellen virtueller Umgebungen == * [https://docs.python.org/3/library/venv.html venv - Creation of virtual environments] == Sonstige == * [https://python-control.readthedocs.io/en/stable/ Python Control Systems Library] * [https://pypi.org/project/regex/ regex - Regular Expressions] = Bücher = == Gedruckte Bücher, OpenBooks, Magazine == * Diverse: c't Python Lernen, Verstehen, Anwenden; Heise, 2022 * Ernesti, Kaiser: Python3 - das umfassende Handbuch; 5. Aufl., Rheinwerk, [https://openbook.rheinwerk-verlag.de/python/ OpenBook] * Inden: Python Challenge; dpunkt, 2021, ISBN 978-3-86490-809-5 * Klein: Numerisches Python; 2. Aufl., Hanser, 2023, ISBN 978-3-446-47170-2 * Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler; Rheinwerk, 2021, ISBN 978-3-8362-7316-9 * Weigend: Python 3 - Das umfassende Praxisbuch; 9. Aufl., mitp, 2022, ISBN 978-3-7475-0544-1 * Woyand: Python für Ingenieure und Naturwissenschaftler; 4. Aufl., Hanser, 2021, ISBN 978-3-446-46483-4 == Andere Wikibooks == * [[:en:Subject:Python_programming_language | Englische Wikibooks zum Thema Python]] * [[Python|Deutschsprachiges Python-Wikibook]] [[Bild:2von10.png|20%]] * [[Python unter Linux|Python 2.7 unter Linux]] [[Bild:10von10.png|100%]] {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} 3u1iihf0w889zyhy4cwnga4vctucrkv 1082868 1082866 2026-04-07T04:50:02Z Intruder 1513 /* Rechnen mit wirklich großen Zahlen */ decimal -> Strings 1082868 wikitext text/x-wiki {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} = Hallo Welt und allgemeine Hinweise = == Was ist Python == * Python ist eine universelle höhere Programmiersprache. * Python ist objektorientiert. * Python ist Open-Source (Python Software Foundation License). * Python ist für viele Betriebssysteme erhältlich (z.B. für Linux, MS Windows, macOS). * Python ist ein Interpreter. * Python ist durch Module fast beliebig erweiterbar. * Python als Programmiersprache ist case-sensitive - d.h. Groß- und Kleinschreibung ist relevant bei der Eingabe von Befehlen. {{Wikipedia | Python (Programmiersprache)}} == Python installieren == === MS Windows === Laden Sie das aktuelle Python-Paket von der Webseite [https://www.python.org/] herunter. Weiter geht es wie bei jedem anderen größeren zu installierenden Programm. Einfach das Installationsprogramm im Explorer doppelklicken und den Anweisungen des Setup-Programmes folgen. === Linux === Entweder ist Python bereits standardmäßig installiert, ansonsten ist die Installation mittels Paketmanagementsystem einfach möglich. Aber auch die Spyder-Entwicklungsumgebung ([https://www.spyder-ide.org]) bietet einen guten Einstieg mit Python (das gilt auch für MS Windows). Spyder bringt auch schon etliche wichtige Module standardmäßig mit. == Python starten == === MS Windows === Das Icon für das Python-Programm doppelklicken. Und schon startet das Programm. [[Datei:PythonIng_start1.jpg]] Python im interaktiven Modus präsentiert sich dann so: Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> Alternativ kann das Programm auch über die Eingabeaufforderung oder die PowerShell gestartet werden: c:\devel\Python>python.exe Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> === Linux === Tippen Sie einfach das Wort „python“ (oder unter openSUSE Tumbleweed z.B. auch „python3.11“ oder „python3.13“) in einem Linux-Terminal ein, schließen den Befehl mit der RETURN-Taste ab, und schon startet Python im interaktiven Modus: Python 3.13.12 (main, Feb 09 2026, 22:37:44) [GCC] on linux Type "help", "copyright", "credits" or "license" for more information. >>> Es gibt auch noch andere Möglichkeiten Python zwecks Programmausführung zu starten, z.&nbsp;B. den {{W|Shebang}} (<code>#!</code>) am Beginn eines Python-Scripts. Das Script sei als Script.py gespeichert. Dann kann das Script mit ./Script.py ausgeführt werden. Für openSUSE Tumbleweed sei nachfolgend ein lauffähiges "Hallo Welt!"-Script angegeben. Es wird in diesem Script der Python-Interpreter in der Version 3.13 verwendet : #!/usr/bin/python3.13 print("Hallo Welt!") Die Berechtigungen zum Ausführen der Datei müssen natürlich noch richtig gesetzt werden, z.B. mittels <code>chmod 777 Script.py</code>. <small>Oder es wird in einen Pfad verschoben, in dem sich ausführbare Programme generell befinden (<code>echo $PATH</code>). Das Script kann dann wie ein normales Programm ohne weitere Angaben mit Script.py gestartet werden. Alternativ wird nicht das Script an sich verschoben, sondern nur ein symbolischer Link angelegt, z.B. mit <code>ln -s ~/tmp/Script.py ~/.local/bin/Script.py</code>.<code>~/.local/bin</code> sei ein im PATH gelegenes Verzeichnis. Dies sind aber schon Features für fortgeschrittene Linux-Benutzer und werden am Anfang eher selten benötigt.</small> == Ein paar Worte zur Erklärung == Getestet wurden die Beispiele unter den Betriebssystemen * MS Windows 10 mit der Python-Version 3.12.0 (teilweise auch mit 3.12.2 und 3.13.1; nur die Inhalte die bis spätestens Juli 2025 erstellt wurden) * MS Windows 11 ab der Python-Version 3.13.4 (nur zum Teil; ab Juli 2025) * openSUSE Leap 15.6 mit der Python-Version 3.11.12 (Spyder, nur vereinzelt) und zum Teil mit 3.12.11 (ab Juli 2025 bis November 2025). * openSUSE Tumbleweed ab der Python-Version 3.13.9 (nur vereinzelt, ab November 2025) An Beliebtheit rangiert Python mit Stand März 2026 mit einem Rating von 21,25% an 1. Stelle vor C und C++ (lt. [https://www.tiobe.com/tiobe-index/ TPCI - TIOBE Programming Community Index]). Lt. [https://innovationgraph.github.com/global-metrics/programming-languages GitHub Top 50 Programming Languages Globally] lag Python im Q3/2025 auf Rang 2, vor TypeScript und hinter JavaScript. Der Name "Python" rührt von der Komikertruppe {{W|Monty Python}} her. Die Icons für Python (z.B. Python selbst, Eric IDE, IDLE) sind aber durch die Python-Schlangenart symbolisiert. <gallery> Python-logo-notext.svg|Python-Logo Guido van Rossum OSCON 2006.jpg|Guido van Rossum (geb. 1956), der Erfinder von Python </gallery> == Ein erstes Programm == Kommentare werden in Python mit der Raute (#) eingeleitet. Sie werden vom Python-Interpreter ignoriert. Text kann mit der print-Funktion ausgegeben werden. Starten Sie Python und geben sie folgende Anweisungen zeilenweise ein >>> # Das ist ein Kommentar >>> print("Hallo Welt!") Als Ergebnis erhalten Sie Hallo Welt! Der Prompt (>>>) ist selbstverständlich nicht einzutippen, sondern wird vom Python-System geliefert. Strings können in Python entweder in Anführungszeichen (") gesetzt werden oder in Hochkommatas('). In diesem Text wird die erste Variante bevorzugt eingesetzt. Im Gegensatz zu Julia ist es hier egal, ob zwischen <code>print</code> und der öffnenden Klammer Leerzeichen stehen. = Python als Taschenrechner = == Allgemeines == Wir wollen 3 * 5 berechnen. Dazu starten wir Python im interaktiven Modus. Geben Sie dann die Formel >>> 3 * 5 ein, drücken die Taste ENTER/RETURN ({{Taste|↵}}) und erhalten als Ergebnis 15 Auch kompliziertere Ausdrücke sind möglich. Beispielsweise mit Winkelfunktionen, Quadratwurzeln etc. Wir wollen nun den Ausdruck <math>\sin\sqrt{15}</math> berechnen : >>> import math >>> math.sin(math.sqrt(15)) -0.6679052983383519 Als erstes wird das math-Modul importiert. Dann wird der mathematische Ausdruck berechnet. Eine andere Variante, die dasselbe Ergebnis liefert, ist >>> from math import * >>> sin(sqrt(15)) -0.6679052983383519 Es wird also aus dem Modul <code>math</code> alles importiert (erkennbar am <code>*</code>). Will man nicht alles importieren, so kann man das auch einschränken: >>> from math import sin, sqrt Beenden lässt sich das Python-Programm durch Eingabe von <code>exit()</code> (und natürlich ist zur Bestätigung die RETURN-Taste zu drücken). == Die Hilfefunktion von Python == Bei Eingabe der Anweisung help() springt Python in den Hilfemodus. Eingabe: >>> help() Eingabe: help> math.sin Ausgabe: Help on built-in function sin in math: math.sin = sin(x, /) Return the sine of x (measured in radians). Für die komplette Python-Dokumentation siehe [https://docs.python.org/3/]. Verlassen kann man den Hilfemodus durch das Drücken von STRG-C. == Aufgaben == * Erkunden Sie die Tangensfunktion "tan" mittels Python-Hilfe (vergessen Sie nicht das math-Modul zu importieren und das <code>math.</code> vor <code>tan</code>) * Berechnen Sie mit Python den Ausdruck <math>\frac{1}{2}\cdot e^2 \cdot \tan(\pi/3)</math>. Siehe für die Exponentialfunktion im Python-Hilfesystem auch den Befehl <code>math.exp</code>. Alternativ kann auch die Konstante <code>math.e</code> eingesetzt werden. Potenzieren kann man bei Python mit dem **-Operator (z.B. 2**3 = 8). Für <math>\pi</math> gibt es <code>math.pi</code>. = Python als Scriptsprache = Häufig wird man aber kompliziertere Anweisungsfolgen verarbeiten müssen. Diese will man normalerweise nicht jedesmal neu eingeben, sondern in einer Datei speichern und diese Datei dann zur Ausführung bringen. Speichern Sie dazu folgenden Code in einer Textdatei, z.B. unter MS Windows als c:\tmp\test1.py # Das ist ein Kommentar print("Hallo Welt!") Python-Dateien werden mit der Dateiendung .py versehen. Achten Sie darauf, dass vor dem print keine Leerzeichen vorhanden sind. Das ist eine Python-Eigenheit. Wie wir später sehen werden, nutzt Python Einrückungen als syntaktisches Mittel, z.B. um bei Schleifen den Schleifenkörper zu kennzeichnen. Danach bringen Sie die Skriptdatei test1.py (sozusagen das Hauptprogramm) folgendermaßen zur Ausführung: 1) Starten Sie unter MS Windows die Eingabeaufforderung (oder alternativ auch die Windows PowerShell). Das sieht dann etwa so aus: Microsoft Windows [Version 10.0.19045.3693] (c) Microsoft Corporation. Alle Rechte vorbehalten. C:\Users\xyz> : <small>Falls jemand nicht weiß, wie man die Eingabeaufforderung startet: Eine Möglichkeit ist, einfach in der Taskleiste von Windows das "Start"-Symbol &nbsp;([[Image:Windows_logo_-_2021_(Black).svg|10px]])&nbsp; mit der rechten Maustaste anklicken. "Ausführen" auswählen (oder alternativ für die PowerShell unter Windows 10 den Eintrag "Windows PowerShell", unter Windows 11 den Eintrag "Terminal"). Im sich öffnenden Dialogfenster gibt man in die "Öffnen"-Zeile das Wort <code>cmd</code> ein und mit "OK" wird das Ganze bestätigt.</small> 2) Wechseln Sie mittels <code>cd c:\tmp</code> in das Verzeichnis c:\tmp 3) Angenommen, Sie haben Python unter dem Pfad <code>c:\devel\Python\</code> installiert. Starten Sie das Programm so (der Prompt <code>c:\tmp></code>ist natürlich nicht mit einzutippen): c:\tmp>c:\devel\Python\python.exe test1.py 4) Wie erwartet ergibt sich folgende Ausgabe am Bildschirm Hallo Welt! Die Vorgehensweise unter Linux ist prinzipiell gleich. Die kleinen Unterschiede, wie z.B. der Slash statt dem Backslash in Pfadangaben, sollten für Linux-Benutzer keine Hürde darstellen. == Variablen == Variablenbezeichner können aus Buchstaben (A-Za-z), Ziffern (0-9) und Underscores (_) bestehen, dürfen aber nicht mit einer Zahl beginnen. Führende Underscores haben u.a. im Kontext mit der Objektorientierten Programmierung eine spezielle Bedeutung und sollten nicht für "normale" Variablenbezeichner verwendet werden. Gültige Variablenbezeichner wären also: xyz x1 _wert name_anzahl Es gibt in Python etliche Schlüsselwörter (z.B. for, if oder return). Diese dürfen nicht als eigene Variablenbezeichner verwendet werden. Eine Liste aller Schlüsselwörter liefert das Script import keyword print(keyword.kwlist) <small>Übung: Speichern Sie dieses Script in eine Datei, z.B. in c:\tmp\test1.py. Führen Sie diese Datei aus, um die Liste der Schlüsselwörter auszugeben.</small> Da Python case-sensitiv ist, repräsentieren folgende Bezeichner verschiedene Variablen: xyz XYZ xYz Werte werden an Variablen mittels Gleich-Zeichen (=) zugewiesen. Im Folgenden wird der Code immer in der Datei c:\tmp\test1.py gespeichert. x = 5 y = 10 z = x*y print(z) Bringen Sie die Datei test1.py zur Ausführung so erhalten Sie folgende Bildschirmausgabe 50 Sie können auch mehrere Anweisungen in einer Zeile durch Semikolon getrennt schreiben. Dies führt aber zu unübersichtlichem Code. x = 5; y = 10; z = x*y; print(z) Ausgabe: 50 Auch aus der Programmiersprache C/C++ oder Java bekannte Konstrukte können Sie verwenden, z.B. x = 5 # x = x - 2 x -= 2 print(x) Bildschirmausgabe: 3 Beachten Sie, dass mit dem =-Zeichen eine Wertezuweisung durchgeführt wird. Dies ist nicht äquivalent zum mathematischen =-Zeichen, wie am vorigen Beispiel zu ersehen ist. Den Inkrement-/Dekrementoperator (z.B. x++ oder x--) aus C/C++ oder Java kennt Python aber nicht. Variablen sind nicht an einen bestimmten Datentyp gebunden, folgendes ist mit Python problemlos möglich: import math wert = 10 print(wert) wert = 35.5 print(wert) wert = "Hallo" print(wert) wert = math.pi print(wert) Ausgabe: 10 35.5 Hallo 3.141592653589793 == Physische und logische Zeilen == In Python muss eine Anweisung in einer logischen Zeile Platz finden. Wird eine Anweisung aber zu lang für eine Zeile, dann kann sie in mehrere physische Zeilen unterteilt werden. Dies kann einerseits durch einen Backslash am Ende einer Zeile geschehen, z.B. a = 2 + \ 5 Dies stellt eine logische Zeile dar, die in zwei physische Zeilen unterbrochen ist. Geklammerte Ausdrücke werden automatisch zu einer logischen Zeile verbunden, z.B. a = (2 + 5) Achtung: Im ersten Beispiel darf nach dem Backslash nichts mehr stehen, auch kein Kommentar. Dies trifft im zweiten Bespiel nicht zu, hier könnte noch ein Kommentar folgen, z.B. a = (2 + # Kommentar 5) Auch für Strings gibt es Möglichkeiten, diese auf mehrere Zeilen aufzuspalten. # Kurzer String str1 = "ABC" # Langer String str2 = """Hallo Welt, Grüetzi Schwyzer, Servus an alle""" # Backslash str3 = "UVW\ XYZ" print(str1) print(str2) print(str3) Ausgabe: ABC Hallo Welt, Grüetzi Schwyzer, Servus an alle UVWXYZ ==Hexadezimale, oktale, binäre und andere Zahlen== d = 1050 # Dezimalzahl h = 0xAA2 # Hexadezimalzahl o = 0o12 # Oktalzahl b = 0b100001101 # Binärzahl print(d) print(h) print(o) print(b) Ausgabe: 1050 2722 10 269 Groß- und Kleinbuchstaben sind in obigen Literalen übrigens egal. So kann man z.B. statt <code>0b1001</code> auch <code>0B1001</code> schreiben (siehe dazu [https://docs.python.org/3/reference/lexical_analysis.html#integer-literals]). Sie können auch dezimale in hexadezimale Zahlen umwandeln, usw.: h = hex(1050) # Dezimalzahl -> Hexadezimalzahl b = bin(1050) # Dezimalzahl -> Binärzahl o = oct(1050) # Dezimalzahl -> Oktalzahl print(h) print(b) print(o) Ausgabe: 0x41a 0b10000011010 0o2032 Gegeben sei die Zahl 121 zur Basis 3. Diese soll in eine Dezimalzahl umgewandelt werden. Das kann so geschehen: z = int("121", 3) print(z) Ausgabe: 16 Dass dies richtig ist, davon kann man sich folgendermaßen überzeugen: <math> 1 \cdot 3^2 + 2 \cdot 3^1 + 1 \cdot 3^0 = 9 + 6+ 1 = 16 </math> Zahlen übersichtlicher schreiben kann man auch mittels Underscore, z.B.: print("Eine Million (Variante 1) =", 1000000) print("Eine Million (Variante 2) =", 1_000_000) print("Eine Rechnung:", 2_000 * 400_000); Es ergibt sich bei beiden Varianten die gleiche Ausgabe. Variante 2 ist aber im Sourcecode leichter lesbar, detto die Zahlen in der Rechnung: Eine Million (Variante 1) = 1000000 Eine Million (Variante 2) = 1000000 Eine Rechnung: 800000000 == Strings und Platzhalter== Ein paar einfache Beispiele: print("Hallo {}" . format("Hugo")) print("Hallo {:s}" . format("Hugo")) print("Hallo %s" % "Hugo") Ausgabe: Hallo Hugo Hallo Hugo Hallo Hugo Python-Code (formatted string literals): str1 = "Hallo" str2 = "Hugo" print(f"{str1} {str2}") Ausgabe: Hallo Hugo Komplexere Beispiele: print("Hallo {} und {}" . format("Hugo", "Mike")) print("Hallo {name1} und {name2}" . format(name2="Hugo", name1="Mike")) # Füllzeichen: * # Bündigkeit: > (=rechts), < (=links), ^ (=zentriert) # Feldweite: 10 # Typ: s (=String), f (=Gleitkommazahl), d (=Dezimalzahl) etc. print("Hallo {:*>10s}" . format("Hugo")) print("Hallo {:*<10s}" . format("Hugo")) Ausgabe: Hallo Hugo und Mike Hallo Mike und Hugo Hallo ******Hugo Hallo Hugo****** Python-Code: str = "Hallo\t%s\t%7.2f\t%10.2e\t%i" % ("Hugo", 12.34567, 34.567, 264) print(str) Ausgabe: Hallo Hugo 12.35 3.46e+01 264 == Unicode == Neben den bekannten ASCII-Zeichen lassen sich Zeichen auch mittels Unicode beschreiben. Griechische Buchstaben oder komplexere mathematische Operatoren - all das sollte kein Problem sein. Siehe auch {{W|Unicode}}, {{W|Liste der Unicodeblöcke}} und {{W|Unicodeblock Mathematische Operatoren}}. Im Folgenden werden ein paar Zeichen (Allquantor, Nabla-Operator, Existenzquantor), die man aus der Mathematik kennt, erzeugt. ch1 = "\N{FOR ALL}" ch2 = "\N{NABLA}" ch3 = "\u2203" print(ch1, ch2, ch3) Ausgabe: ∀ ∇ ∃ <small>Diese Ausgabe ergibt sich z.B. mit der IDLE-Shell oder mit Cygwin. Beim Ausführen über die Windows-Eingabeaufforderung oder Windows PowerShell unter MS Windows 10 erfolgt keine korrekte Darstellung. IDLE ist die mit Python mitgelieferte IDE ('''I'''ntegrated '''D'''evelopment '''E'''nvironment, Integrierte Entwicklungsumgebung). Gegen Ende dieses Textes wird IDLE kurz beschrieben. Das Problem mit der Windows Eingabeaufforderung lässt sich aber umgehen. Man muss nur eine Schriftart auswählen, die die Zeichen kennt, z.B. "DejaVu Sans Mono". Dazu klicken Sie einfach bei der Eingabeaufforderung mit der rechten Maustaste oben auf die weiße Leiste und wählen im aufpoppenden Fenster den Menüpunkt "Eigenschaften". Es öffnet sich ein Dialogfenster. Über den Reiter "Schriftart" lässt sich nun die Schriftart einstellen. Unter MS Windows 11 oder openSUSE Leap 15.6 (bash-Konsole) gibt es dieses Problem ohnehin nicht.</small> == Reguläre Ausdrücke == Python kennt auch {{W|Regulärer Ausdruck|reguläre Ausdrücke}}. Dazu gibt es in Python das Modul <code>re</code>. Beipielsweise sollen alle Zahlen (<math>\text{zahl}\in\mathbb{N}_0</math>) in einem String gesucht und ausgegeben werden. Als String sei gegeben: <code>3x Grüße und 100 Kekse.</code> Das Muster (Pattern) ist <code>\d+</code>. <code>\d</code> steht für eine Dezimalziffer 0-9. Das Plus-Zeichen (+) steht symbolisch für ein oder mehrere Zeichen des vorherigen Ausdrucks. Hier also ein oder mehrere Dezimalziffern. Es wird die Funktion <code>findall</code> aus dem Modul <code>re</code>verwendet. Python-Code: from re import findall str = "3x Grüße und 100 Kekse." pat = "\\d+" # Doppel-Backslashes müssen verwendet werden, sonst gibt Python eine Warnung aus! # alternativ: pat = r"\d+" # oder: pat = "[0-9]+" numb = findall(pat, str) print(numb) Ausgabe: ['3', '100'] Python kennt noch viele weitere Möglichkeiten mittels regulärer Ausdrücke zu hantieren. Dies soll hier aber nicht vertieft werden, da das Thema schon ziemlich speziell und komplex ist. Bei Bedarf siehe aber z.B. die Bücher ''Weigend, Seite 380ff'' und ''Ernesti, Kaiser'' [https://openbook.rheinwerk-verlag.de/python/28_001.html] oder die Python-Dokumentation [https://docs.python.org/3/library/re.html]. Auch [[Python unter Linux: Reguläre Ausdrücke]] liefert ein umfangreiches und brauchbares Python-2-Kapitel zu den regulären Ausdrücken. Die dort gelisteten Beispiele müssten ggf. vor Verwendung auf Python-3 umgeschrieben werden. <small>Wie macht man das? Dazu siehe z.B. [https://openbook.rheinwerk-verlag.de/python/43_001.html], [https://portingguide.readthedocs.io/en/latest/] oder [https://www.digitalocean.com/community/tutorials/how-to-port-python-2-code-to-python-3]</small> <small>Es gibt auch ein externes Modul ''regex'', das bei Bedarf extra installiert werden muss ([https://pypi.org/project/regex/]). Es bietet zusätzliche Funktionalität und gründlicheren Unicode-Support. Dies sei hier aber nur der Vollständigkeit halber erwähnt.</small> == Verzweigungen == === if === Die IF-Verzweigung ist aus anderen Programmiersprachen bereits bekannt. In Pseudocode lässt sie sich folgendermaßen darstellen: WENN bedingung TRUE führe block1 aus SONST führe block2 aus ENDE In Python gibt es keinen expliziten ENDE-Kennzeichner. Stattdessen wird der Code durch Einrückungen strukturiert. Alles mit der gleichen Einrückungstiefe gehört zum selben Block. Dies zeichnet Python vor anderen Programmiersprachen aus. Die test1.py-Datei laute also wie folgt: x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: Der else-Zweig wird ausgefuehrt x ist groesser oder gleich 4 Man achte auch auf die Doppelpunkte in der if- und else-Zeile. Darauf vergisst man gerne, wenn man von anderen Programmiersprachen kommt. Folgendes wäre in Python ein Fehler (genauer gesagt ein IndentationError). x = 5 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Auch Nachstehendes würde nicht zum gewünschten Ergebnis führen (löst aber keine Fehlermeldung aus). Der letzte print-Befehl ist schon außerhalb der IF-ELSE-Verzweigung. x = 3 if x < 4: print("x ist kleiner als 4") else: print("Der else-Zweig wird ausgefuehrt") print("x ist groesser oder gleich 4") Ausgabe: x ist kleiner als 4 x ist groesser oder gleich 4 Python kennt eine Reihe von Vergleichs- und Verknüpfungsoperatoren: <, <= ... kleiner (gleich) >, >= ... größer (gleich) == ... gleich != ... ungleich is ... identisch is not ... nicht identisch and ... AND or ... OR not ... NOT Beispielsweise: a = 5 b = 9 if a<=10 and b!=7: print("OK") else print("Nicht OK") Ausgabe: OK Der else-Block kann übrigens auch ersatzlos entfallen. Mehrfache Verzweigungen werden durch das elif-Konstrukt erstellt. a = 14 if a<=10: print("<=5") elif a>11 and a<15: print("11 bis 15") elif a>16 and a<20: print("16 bis 20") else: print(">=20") Ausgabe: 11 bis 15 In Python gibt es auch die Schlüsselwörter <code>True</code> (für wahr) und <code>False</code> (für falsch). Man beachte, dass sie mit Großbuchstaben beginnen. Andere Schreibweisen wären ein Fehler. Sie gehören zum Datentyp <code>bool</code>. Ihnen sind auch die Zahlen <code>1</code> und <code>0</code> zugewiesen. === match === Ab Python 3.10 gibt es auch die match-Anweisung. Dies ist das Python-Pendant für die switch-Anweisung in anderen Programmiersprachen, geht aber bei näherer Betrachtung weit darüber hinaus. Hier nur ein einfaches Beispiel: x = "Hello" match x: case "Servus" | "Ciao": # or print("Servus an alle") case "Grüetzi": print("Grüetzi Schwyzer") case _: # other, default, sonstiges ... print("Hallo Welt") Ausgabe: Hallo Welt Für nähere Details siehe z.B. [https://www.geeksforgeeks.org/python-match-case-statement/], [https://learnpython.com/blog/python-match-case-statement/], [https://docs.python.org/3/tutorial/controlflow.html#match-statements] und das Python Enhancement Proposal (PEP) 636 – Structural Pattern Matching: Tutorial [https://peps.python.org/pep-0636] und dort insbesondere den Anhang A - Quick Intro. <small><code>match, case, _</code> etc. sind sogenannte ''soft keywords''. Im Gegensatz zu den normalen Schlüsselwörtern dürfen ihnen auch Werte zugewiesen werden. Eine Liste der weichen Schlüsselwörter lässt sich durch <code>keyword.softkwlist</code> erstellen (die Anweisung gibt es seit Python 3.9). Siehe dazu auch [https://stackoverflow.com/questions/65800344/what-are-soft-keywords] und [https://docs.python.org/3/library/keyword.html#keyword.softkwlist].</small> == Schleifen == === while === Die WHILE-Schleife ist kopfgesteuert. Sie funktioniert wie aus anderen Programmiersprachen bekannt. In Pseudocode: SOLANGE bedingung TRUE führe block aus ENDE In Python: x = 0 while x <= 10: print(x) x += 1 Ausgabe: 0 1 2 3 4 5 6 7 8 9 10 === for === for x in range(6): print(x*2) Ausgabe: 0 2 4 6 8 10 Die Schleife läuft von 0 bis 5. Ausgegeben wird jeweils der Wert x*2. Aquivalent kann diese Schleife auch so geschrieben werden: for x in range(0, 11, 2): print(x) Die Ausgabe ist wie oben. Der Startwert sei 0, der Endwert ist 11-1 und die Schrittweite ist 2. Ein anderes Beispiel sei for x in "text": print(x) Ausgabe: t e x t == Schleifen abbrechen == === break === <code>break</code> bricht die Schleife ab und setzt mit dem nächsten Befehl außerhalb der Schleife fort. for var in range(100): print(var) if var == 5: break Ausgabe: 0 1 2 3 4 5 === continue === <code>continue</code> bricht den aktuellen Schleifendurchlauf ab und setzt mit dem nächsten Schleifendurchlauf fort. for var in range (11): if var == 5: continue print(var) Ausgabe: 0 1 2 3 4 6 7 8 9 10 == try - except == try: z1 = 12 / 0 print(z1) except ZeroDivisionError: print("Das Ergebnis ist unendlich") except: print("Kann nicht berechnet werden!") print("Bitte die Formel korrigieren!") Ausgabe: Das Ergebnis ist unendlich Es wird versucht, eine Zahl durch Null zu dividieren. Das ist nicht möglich, es wird eine Ausnahme ausgelöst. Das Programm springt daher in den except-ZeroDivisionError-Block und führt die dort gelisteten Anweisungen aus (in unserem Fall eine print-Anweisung). Würden wir dieses Programm ohne try-except ausführen, so ergibt sich aus z1 = 12 / 0 print(z1) folgende Fehlermeldung und ein unmittelbarer Programmabbruch Traceback (most recent call last): File "C:\tmp\test1.py", line 1, in <module> z1 = 12 / 0 ZeroDivisionError: division by zero Mit dem try-except-Mechanismus können also Ausnahmen oder Fehler aufgefangen und behandelt werden. In unserem Beispiel ist das eher trivial, aber bei größeren Programmen kann das durchaus Sinn machen. == pass == Ein leerer Block muss in Python mittels dem Schlüsselwort <code>pass</code> dargestellt werden. Z.B. x = 2 if x == 1: print("Wert ist ", x) else: pass Würde man das <code>pass</code> im else-Block weglassen, so würde man eine Fehlermeldung erhalten: IndentationError: expected an indented block after 'else' statement on line 5 = Funktionen = == Aufrufen von Funktionen == Funktionen sind uns im Rahmen dieses Kurses schon zuhauf begegnet. Sei es die print()-, die math.sin()- oder die hex()-Funktion. All diese Funktionen werden von Python zur Verfügung gestellt, ohne dass man sie explizit programmieren müsste. Aufgerufen werden diese Funktionen, indem man ihren Namen eintippt, gefolgt von runden Klammern. In diesen Klammern können noch Argumente übergeben werden. Auch Rückgabewerte sind möglich. == Funktionen selber schreiben == Funktionen werden mit dem def-Schlüsselwort (man definiert die Funktion) eingeleitet, danach folgt der Funktionsname, danach wiederum runde Klammern, in denen formale Argumente stehen können. Abgeschlossen wird die def-Zeile mit einem Doppelpunkt. Danach folgt der Funktionskörper. Dieser Funktionskörper muss wiederum eingerückt werden (wie von den Verzweigungen und Schleifen bekannt). Aufgerufen wird diese Funktion, indem man ihren Funktionsnamen eingibt, gefolgt von runden Klammern (ggf. mit den aktuellen Parametern). Z.B. # Funktion definieren def halloWelt(i): # i ... beliebige Ganzzahl print("Hallo " * i, end="") print("Welt!") # Funktion aufrufen halloWelt(3) Ausgabe: Hallo Hallo Hallo Welt! Unterschied zwischen formalen und aktuellen Parametern: [[Datei:PythonIng_func1.jpg]] <small>Aktuelle Parameter werden auch Argumente genannt.</small> Rückgabe von Funktionswerten: # Funktion definieren def mathFunc(a, b): r1 = a + b r2 = a * b return r1, r2 # Funktion aufrufen a, b = mathFunc(3, 5) # Ausgabe der zurückgegebenen Werte print(a) print(b) Ausgabe: 8 15 Vorgabeparameter, z.B.: def mathFunc(a=10, b=20): r1 = a + b r2 = a * b return r1, r2 a, b = mathFunc(3, 5) print(a) print(b) a, b = mathFunc(5) print(a) print(b) a, b = mathFunc(b=6) print(a) print(b) Ausgabe: 8 15 25 100 16 60 == Lambda-Funktionen == print((lambda a, b: a*b) (3, 5)) Ausgabe: 15 Eingeleitet wird eine Lambda-Funktion (auch Lambda-Form, Lambda-Operator oder anonyme Funktion genannt) mit dem Schlüsselwort <code>lambda</code>. Es folgen die formalen Argumente, danach ein Doppelpunkt, die Berechnungsvorschrift und ggf. abschliessend in Klammern die aktuellen Parameter. Man kann einer Lambda-Funktion auch einen Funktionsnamen geben und die Funktion über diesen Namen aufrufen, z.B. prod = lambda a, b: a*b print(prod(3, 5)) Als Ausgabe wird wieder die Zahl 15 geliefert. == Rekursive Funktionen == Funktionen können wiederum andere Funktionen aufrufen. Von einem rekursiven Funktionsaufruf spricht man, wenn die aufgerufene Funktion gleich der aufrufenden ist. def printFunc(i): if (i >= 5): return else: print("Hallo Welt") printFunc(i+1) printFunc(1) Ausgabe: Hallo Welt Hallo Welt Hallo Welt Hallo Welt == Funktionsannotationen == Python ist sehr flexibel, was Typen angeht. Im Vorhergehenden haben wir generell keine Typangaben gemacht. Will man Typen angeben, so bietet Python das Konzept der Funktionsannotation. def calcFunc(a:int, b:int) -> int: return a+b, a*b r1 = calcFunc(8, 9) r2 = calcFunc(8.0, 9.0) print(r1) print(r2) Ausgabe: (17, 72) (17.0, 72.0) Jetzt sieht man auf den ersten Blick, welche Typen der Programmierer im Sinn hatte, als er die Funktion erstellte. Das Problem dabei ist nur, dass es Python ziemlich egal ist, welche Typen man in Endeffekt eingibt. Im obigen Beispiel können statt Integer-Typen auch Float-Typen eingegeben werden. == Variadische Funktionen == Python-Code: def test1(a, *b): print(a); for c in b: print(c); test1("Hallo", "Welt", "Schweizer", "und alle anderen") Ausgabe: Hallo Welt Schweizer und alle anderen Mit dem Stern (auch als Splat-Operator bezeichnet) in der formalen Parameterliste bei der Funktion <code>test1</code> wird angezeigt, dass eine beliebige Anzahl von Argumenten übergeben wird. <small> Dies entspricht in etwa dem, was in anderen Programmiersprachen (PHP etc.) mittels Ellipse (<code>...</code>) angezeigt wird.</small> = Tupel, Listen und andere = [[Datei:Python 3. The standard type hierarchy.png|mini|hochkant=1.7|Datentypen und Strukturen]] Tupel, Listen und einige andere sind Datenstrukturen oder Sequenzen. Listen (z.B. eine Einkaufsliste) sind veränderbar (mutable). Ein Tupel kann dagegen nicht verändert werden (immutable). Listen werden beim Anlegen in eckige Klammern eingeschlossen, Tupel in runde Klammern. Beim Tupel können die Klammern auch weggelassen werden. Ein Tupel mit nur einem Element muss mit einem Beistrich abgeschlossen werden. Der Grund ist, dass Python sonst nicht entscheiden kann, ob ein Tupel angelegt werden soll, oder nur ein geklammerter Wert. Nachfolgend werden einige Operationen mit Listen und Tupel dargestellt. Als Gedächtnisstütze kann man sich den Unterschied zwischen Tupel und Liste ev. so leichter merken: : T'''u'''pel ... r'''u'''nde Klammern, '''u'''nveränderlich : L'''i'''ste ... eck'''i'''ge Klammern, veränderl'''i'''ch. # Liste und Tupel liste = [1, 2, "Hallo"] tupel = (1, 2, "Hallo") # Ausgabe von liste und tupel print(liste) print(tupel) # Ausgabe von Einzelelementen print(liste[1]) print(tupel[2]) # Element an Liste anhängen und einfügen liste.append(55) liste.insert(4, "Welt") print(liste) # Element aus Liste entfernen liste.remove(1) print(liste) # einige weitere Beispiele liste2 = [1,] tupel2 = 1, 2 tupel3 = (1,) print(liste2) print(tupel2) print(tupel3) Ausgabe: [1, 2, 'Hallo'] (1, 2, 'Hallo') 2 Hallo [1, 2, 'Hallo', 55, 'Welt'] [2, 'Hallo', 55, 'Welt'] [1] (1, 2) (1,) Zu den Datenstrukturen gehören weiters auch Mengen und Dictionaries. Mengen sind von der Mathematik bekannt, sie sind ungeordnet und es kommen keine mehrfachen Elemente vor. Dictionaries sind durch Schlüssel :Wert-Paare gekennzeichnet. Mengen werden beim Anlegen wie Dictionaries in geschweifte Klammern eingeschlossen. dict = {"vorname":"Hugo", "nachname":"Meister" } menge = {1, 1, 3, 4, 4, 4, "Hallo"} print(dict) print(menge) print(dict["vorname"]) Ausgabe: {'vorname': 'Hugo', 'nachname': 'Meister'} {1, 3, 4, 'Hallo'} Hugo Geschweifte Klammern ohne Inhalt stellen Dictionaries dar und keine Mengen: di = {} print(type(di)) Ausgabe: <class 'dict'> == List Comprehensions == Aus einer Eingabeliste soll eine Ausgabeliste erzeugt werden. Das kann folgendermaßen geschehen. Mathematische Schreibweise: <math>lc = \{2x|x\in\ \mathbb{N}, 1\le x < 11\}</math> Python-Code: lc = [x*2 for x in range(1,11)] print(lc) Ausgabe: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] Mathematische Schreibweise: <math>lc = \{2x | x \in \mathbb{N}, 1\le x < 11, x \bmod 2 = 0 \}</math> Python-Code: lc = [x*2 for x in range(1,11) if x%2 == 0] print(lc) Ausgabe: [4, 8, 12, 16, 20] Siehe auch {{W|List Comprehension}}. == Set Comprehensions == Dies ist sehr ähnlich wie im vorigen Abschnitt beschrieben. Es wird aber keine Liste, sondern eine Menge erzeugt. sc = {x*2 for x in range(1,11)} print(sc) Ausgabe: {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} == Listen zusammenführen - zip() == li1 = ["A", "B", "C", "D"] li2 = [1, 2, 3, 4] li3 = [5.5, 6.6, 7.7, 8.8] z = zip(li1, li2, li3) print(z) li4 = list(z) print(li4) Ausgabe: <zip object at 0x00000283B6C6AC80> [('A', 1, 5.5), ('B', 2, 6.6), ('C', 3, 7.7), ('D', 4, 8.8)] == Generatorausdruck == g = (i*2 for i in range(1,11)) print(g) t = tuple(g) print(t) print(t[1:3]) Ausgabe: <generator object <genexpr> at 0x00000241D2A4A5A0> (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) (4, 6) == Slicing == slice ... Scheibe, Teil, in Scheiben schneiden Beispiel: Zugriff auf Elemente eines geordneten sequentiellen Objekttyps (Liste, Tupel oder String): str1 = "Hallo" # Das erste Element wird mit dem Index 0 angesprochen # [start (inkl.) : stop (exkl.) : step (default=1)] str2 = str1[0:2] # Alternativ auch: str2 = str1[:2] print(str2) tup1 = (0,1,2,3) # Das letzte Element hat auch den Index -1, das vorletzte den Index -2 usw. tup2 = tup1[-3:-1] print(tup2) lst1 = [[1, 5, 10, 20], [30, 40, 50, 60]] lst2 = lst1[1][1] print(lst2) Ausgabe: Ha (1, 2) 40 Beispiel: Umdrehen von Strings str1 = "Hallo" str2 = str1[::-1] print(str2) Ausgabe: ollaH = Objektorientierte Programmierung = == Eine einfache Klasse == [[Datei:PythonIng_uml1.svg | 200px]] class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 fahr = Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die Klasse Fahrzeug wird durch das class-Schlüsselwort eingeleitet. raeder ist ein Klassenattribut und public. __init__ wird bei der Objekterzeugung automatisch aufgerufen. Man achte darauf, dass diese Methode immer mit zwei Unterstrichen eingeleitet und abgeschlossen wird. Instanzattributen wird das Wort self vorangestellt. Wir sehen uns z.B. das Attribut self.__geschwind an. Auch hier werden zwei Unterstriche verwendet. Das bedeutet, dass dieses Attribut private ist. Bei den Methoden wird immer self als erster Parameter angegeben. Beim Aufruf der entsprechenden Funktion wird das self aber nicht berücksichtigt. == Klassen importieren == Häufig ist es sinnvoll und übersichtlicher Klassen in eigenen Dateien zu speichern. Das sind dann eigene Module. Abgespeichert werden Sie mit der Endung py, wie bisher auch praktiziert. Aufgerufen werden Sie mit der import-Anweisung. Dann ist aber nur der Dateiname ohne Endung py zu verwenden. Klarer wird das mit einem Beispiel. Datei c:\tmp\fahrzeug.py class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 Datei c:\tmp\test1.py import fahrzeug fahr = fahrzeug.Fahrzeug(150, 90) print(fahr.convertGeschw()) Ausgabe: 41.666666666666664 Die üblichen import-Anweisungen lauten wie folgt: {| {{prettytable}} ! import-Befehl ! Instanz |- | import xyz || xyz.Klasse |- | import xyz as x || x.Klasse |- | from xyz import Klasse || Klasse |- | from xyz import * || Klasse |} Der Vorteil der ersten beiden import-Anweisungen ist, dass es kaum zu Namenskollisionen kommen kann. Dafür hat man bei den letzten beiden Varianten weniger Tipparbeit. == Vererbung == [[Datei:PythonIng_uml2.svg | 200px]] Datei fahrzeug.py: class Fahrzeug: raeder = 4 def __init__(self, geschwindigkeit, leistung): self.__geschwind = geschwindigkeit self.__leistung = leistung def setGeschwindigkeit(self, geschwindigkeit): # geschwindigkeit in km/h self.__geschwind = geschwindigkeit def setLeistung(self, leistung): self.__leistung = leistung def convertGeschw(self): # geschwindigkeit in m/s rueckgeben return self.__geschwind / 3.6 class Luftfahrzeug(Fahrzeug): def __init__(self, geschwindigkeit, leistung, fluegel): super().__init__(geschwindigkeit, leistung) self.__flueg = fluegel def getFlueg(self): return self.__flueg Datei test1.py: import fahrzeug fahr = fahrzeug.Luftfahrzeug(150, 90, 4) print(fahr.getFlueg()) Ausgabe: 4 = Grafiken zeichnen = Für das Zeichnen von Grafiken wird hier das Modul <code>matplotlib</code> verwendet. <code>matplotlib</code> ist ein externes Modul und muss vor der ersten Verwendung installiert werden. Das geht so: # Starten Sie ein Terminal (bei Windows die Eingabeaufforderung). # Führen Sie darin folgenden Befehl aus <code>c:\devel\Python\Scripts\pip.exe install matplotlib</code> pip ist übrigens der Paketmanager von Python ({{W|Pip_(Python)}}). Optimalerweise installieren wir auch gleich das Modul <code>numpy</code> (Numerical Python). Wir werden es im Folgenden oft benötigen (nicht nur bei den Grafiken). Das funktioniert vom Prinzip her genauso, wie für <code>matplotlib</code> gezeigt. <small>Verwenden Sie Spyder, so sind diese Schritte nicht nötig. Spyder inkludiert diese Pakete standardmäßig. Unter openSUSE Tumbleweed lassen sich diese Pakete mittels YaST oder zypper installieren.</small> == 2D == === Graph einer Funktion === Es soll die cosh-Funktion im Intervall <math>x\in[-3,3]</math> gezeichnet werden. Der Programmcode lautet in der einfachsten Form: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh1.jpg]] Der Code ist quasi selbsterklärend. Das Untermodul pyplot des matplotlib-Moduls und das numpy-Modul werden importiert. x läuft von -3 bis +3. y wird für jeden x-Wert per Formel ausgerechnet. "plt.plot()" ist der Zeichenbefehl. "plt.show" ist notwendig, um das Fenster mit der Grafik anzuzeigen. Die Schrittweite 0.1 wurde so gewählt, um einen ausreichend glatten Verlauf des Graphen zu gewährleisten. Das ist immer ein Kompromiss zwischen Berechnungszeit und Ansehnlichkeit. Testen Sie einfach ein paar verschiedene Werte, um ein Gefühl dafür zu zu bekommen. "plt.grid()" zeichnet ein Gitter in die Grafik (kann auch weggelassen werden). Die Bezeichnungen plt und np könnten auch anders gewählt werden. Es ist aber Konvention, diese so wie hier gezeigt zu wählen. <small>Mit der im obigen Bild gezeigten Menüleiste kann die dargestellte Grafik nachträglich noch geändert werden (Zoom, Pan, Achsenparameter, Kurvenparameter etc.). Natürlich kann man das alles auch direkt programmieren. Wie das funktioniert wird ansatzweise etwas später gezeigt.</small> Ein etwas komplexeres Beispiel ist Folgendes: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y = np.cosh(x) + 2**x plt.plot(x,y) plt.grid() plt.show() Ausgabe: [[Datei:PythonIng_cosh4.png]] Man beachte, dass im Gegensatz zu Octave und Julia der ominöse Punkt (.) bei 2**x mit Python nicht benötigt wird. Das macht das Programmiererleben etwas einfacher. === Graphen mehrerer Funktionen und weiteres === import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x") plt.plot(x, y2, label = "sin(x) * cos(x)") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh2.png]] Um die Linienstile etwas individueller zu gestalten, ist folgender Programmcode gedacht: import matplotlib.pyplot as plt import numpy as np x = np.arange(-3., 3.1, .1) y1 = np.cosh(x) + 2**x y2 = np.sin(x) * np.cos(x) plt.plot(x, y1, label = "cosh(x) + 2**x", lw=5, ls="dotted") plt.plot(x, y2, label = "sin(x) * cos(x)", lw=3, ls="--") plt.grid() plt.title("Funktionsgraphen") plt.xlabel("x") plt.ylabel("y") plt.legend(loc="best") plt.show() [[Datei:PythonIng_cosh3.png]] === Funktion in Parameterdarstellung === Es soll die archimedische Spirale <math>x = t \cos(t), y = t \sin(t)</math> im Intervall <math>[0, 6\pi[</math> gezeichnet werden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.show() [[Datei:PythonIng_spirale1.png]] Diese Darstellung erscheint verzerrt. Will man gleiche Achsenskalierungen, so kann man den plt.axis()-Befehl verwenden. import matplotlib.pyplot as plt import numpy as np t = np.arange(0., 6*np.pi, .1) x = t * np.cos(t) y = t * np.sin(t) plt.plot(x, y) plt.grid() plt.title("Archimedische Spirale") plt.axis("equal") plt.show() [[Datei:PythonIng_spirale2.png]] === Funktion in Polardarstellung === import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(projection="polar") r = np.arange(0, 1, 0.01) theta = r**3 line = ax.plot(theta, r) plt.show() [[Datei:PythonIng_polar1.png]] === Logarithmische Achsenskalierung === ==== Semilog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.semilogy() plt.show() Ausgabe: [[Datei:PythonIng_semilog1.png]] ==== LogLog ==== import matplotlib.pyplot as plt import numpy as np x = np.arange(0., 10, .1) y = 10**x plt.plot(x, y) plt.grid() plt.loglog() plt.show() [[Datei:PythonIng_loglog1.png]] === Gefüllte Fläche === import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 3, 0.1) y1 = 3*x - 1 y2 = x**2 plt.plot(x, y1, x, y2, color='black') plt.fill_between(x, y1, y2, where=y1>=y2) plt.show() [[Datei:PythonIng_gefuellt.png]] === Linien, Pfeile, Rechtecke, Kreise und Texte === import matplotlib as mpl import matplotlib.pyplot as plt fig, ax = plt.subplots() r = mpl.patches.Rectangle((0, 0), 3, 3, angle=30, fill=False) c = mpl.patches.Circle((4, 4), 2, fill=False) ax.add_patch(r) ax.add_patch(c) ax.plot([-2, 7], [-2, 0], color="black") ax.arrow(0, 7, 5, 0, length_includes_head=True, head_width=0.5, head_length=1.5, color="black") ax.set_aspect("equal") plt.axis([-3, 8, -3, 8]) plt.show() [[Datei:PythonIng_linien_pfeile_etc.png]] Text kann mit <code>ax.text(x, y, "Text")</code> hinzugefügt werden, bspw. import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.text(0.1, 0.1, "Hallo") ax.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() Oder einfacher auch ohne <code>subplots</code> import matplotlib.pyplot as plt plt.text(0.1, 0.1, "Hallo") plt.text(0.5, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text1.png]] Auch Sonderzeichen (griechische Buchstaben etc.) können verwendet werden (siehe dazu auch [https://matplotlib.org/stable/users/explain/text/mathtext.html]). import matplotlib.pyplot as plt plt.text(.3, .5, r'$\Omega\ \psi\ \oint\ \nabla\ \dot a\ \frac{a}{b}\ a_b$', size="20") plt.show() [[Datei:PythonIng_text20.svg]] Jetzt wird noch gezeigt, wofür <code>subplots</code> sinnvoll eingesetzt werden können. import matplotlib.pyplot as plt fig, ax = plt.subplots(nrows=1, ncols=2) ax[0].text(0.1, 0.1, "Hallo") ax[1].text(0.1, 0.5, "Welt", size="40", family="cursive", style="italic", rotation=30.0) plt.show() [[Datei:PythonIng_text2.png]] === Aufgaben === * Zeichnen Sie die Strophoide <math>x = \frac{a(t^2-1)}{t^2+1}, y = \frac{at(t^2-1)}{t^2+1}, a = 2, -3 \leq t \leq 3</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_strophoide.jpg]] * Zeichnen Sie die verschlungene Hypozykloide <math>x = (R-r)\cos t + c\cos\frac{R-r}{r}t, y = (R-r)\sin t - c\sin\frac{R-r}{r}t, c = 3, r = 2, R = 6, -15 \leq t \leq 15</math>. Das Ganze sollte in etwa so aussehen wie folgende Grafik: [[Datei:octave_hypozykloide.jpg]] * Testen Sie bei den obigen Übungsaufgaben verschiedene Linienstile und Farben. Farben können mit dem plt.plot()-Parameter color gewählt werden. * Testen Sie bei den obigen Übungsaufgaben verschiedene Werte für a, c, r und R. == 3D == === Räumliche Kurven === import matplotlib.pyplot as plt import numpy as np t = np.arange(0, 6*np.pi, 0.1) x = t * np.cos(t) y = t * np.sin(t) z = t fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot(x, y, z) plt.show() [[Datei:PythonIng_raumkurve1.png]] === Flächen === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z) plt.show() [[Datei:PythonIng_fläche1.png]] Das Ganze in Netzdarstellung läßt sich so programmieren: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.5) y = np.arange(0, 10, 0.5) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_wireframe(x, y, z) plt.show() [[Datei:PythonIng_fläche2.png]] Ein etwas komplexeres Beispiel: import matplotlib.pyplot as plt import numpy as np x = np.arange(0.1, 10, 0.1) y = np.arange(0.1, 10, 0.1) x, y = np.meshgrid(x, y) z1 = np.sin(x) + 3 * np.cos(y) z2 = np.sin(x) + np.log(y) z3 = x + np.cos(y) z4 = x**2 - y fig, ax = plt.subplots(subplot_kw={"projection": "3d"}, nrows=2, ncols=2) ax[0][0].plot_surface(x, y, z1) ax[0][1].plot_surface(x, y, z2) ax[1][0].plot_surface(x, y, z3) ax[1][1].plot_surface(x, y, z4) plt.show() [[Datei:PythonIng_subplot1.png]] Man beachte, dass man die Unterbilder im Bild nach dem Ausführen des Scripts z.B. mit der mittleren Maustaste einzeln drehen, oder über die Einträge in der Menüzeile einzeln bearbeiten kann. Mit ein paar Zeilen Programmtext lässt sich also eine Menge an Funktionalität generieren. Die Farbgebung lässt sich über <code>colormaps</code> variieren. import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm) plt.show() [[Datei:PythonIng_colormap1.png]] Es gibt eine Menge an Colormaps, z.B. <code>plasma, Greys, Dark2, ocean</code>. Zwecks detaillierterer Infos siehe die matplotlib-Dokumentation. <small>Verwendet man die IDE namens IDLE, so gibt es dort auch die automatische Codevervollständigung. D.h. es werden alle Möglichkeiten (in unserem Fall nach dem Eintippen von <code>cm.</code> alle verfügbaren Colormaps) angezeigt.</small> Die "edgecolor" und Linienbreite können auch frei gewählt werden: import matplotlib.pyplot as plt import numpy as np from matplotlib import cm x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.plot_surface(x, y, z, cmap = cm.coolwarm, edgecolor="black", linewidth=1.0) plt.show() [[Datei:PythonIng_colormap2.png]] === Höhenlinien === import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contour(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien1.png]] Etwas abgewandelt sieht das so aus: import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() hl = ax.contour(x, y, z) ax.clabel(hl, inline = True) plt.show() [[Datei:PythonIng_höhenlinien2.png]] Und noch eine Variante sei gezeigt. import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.arange(0, 10, 0.1) x, y = np.meshgrid(x, y) z = np.sin(x) + 3 * np.cos(y) fig, ax = plt.subplots() ax.contourf(x, y, z) plt.show() [[Datei:PythonIng_höhenlinien3.png]] === Aufgaben === * Zeichnen Sie die räumliche Kurve <math>x = 2 \cdot \cosh(t)</math>, <math>y = 5 \cdot \sin(t)</math>, <math> z = t^{2} - t</math>, <math>0 \leq t \leq 3\pi</math>. * Zeichnen Sie die Fläche <math>z = \log(x) + \cos(y)</math>. == Animationen == === Mit matplotlib === Auch mit matplotlib sind Animationen möglich. Das ist ein bisschen komplizierter und wird deshalb hier nur mit einem sehr einfachen Beispiel dargestellt (bei Interesse siehe z.B. auch das [https://matplotlib.org/stable/users/explain/animations/animations.html#animations Animations using Matplotlib-Tutorial]). import matplotlib.pyplot as plt import matplotlib.animation as ani import matplotlib import numpy as np def update(frame): line.set_xdata(x[:frame]) line.set_ydata(y[:frame]) return (line) fig, ax = plt.subplots() x = np.arange(0, 10, .1) y = np.sin(x) line, = ax.plot(x[0], y[0]) ax.set(xlim=[0, 10], ylim=[-1, 1]) a = ani.FuncAnimation(fig=fig, func=update, frames=100, interval=20) plt.show() # Speichere die Animation in einem animierten GIF (optional) a.save(filename="c:/tmp/PythonIng_anim5.gif", writer="pillow") [[Datei:PythonIng_anim5.gif]] Es wird eine Sinuskurve auf den Bildschirm gezeichnet. In der letzten Zeile wird diese Animation in ein animiertes GIF gespeichert. Das ist natürlich optional und kann auch weggelassen werden. === Mit VPython === Aber auch mit dem Modul VPython lassen sich einfache 3D-Animationen erstellen. VPython ist ein externes Modul, das vorab installiert werden muss. Unter openSUSE Tumbleweed gibt es dzt. kein entsprechendes rpm-Paket. Die übliche Methode der Installation mittels YaST oder zypper ist somit nicht möglich. Auch eine direkte Verwendung von pip führt nur zu einer Fehlermeldung (<code>error: externally-managed-environment</code>). Es empfiehlt sich dort folgende Vorgehensweise: # Erstelle zuerst eine virtuelle Umgebung, z.B.: <code>python3.11 -m venv ~/tmp/venv1</code> # Wechsle das Verzeichnis: <code>cd ~/tmp/venv1/bin</code> # Installiere das entsprechende Paket: <code>./pip install vpython</code> # Führe das entsprechende Skript aus: <code>./python ~/tmp/test1.py</code> Aktuell (März 2026) ist dieses Programmpaket lt. der [https://vpython.org/presentation2018/install.html VPython-Homepage] nur für die Python-Versionen 3.8 bis 3.12 verfügbar. Ein Beispiel zu einer einfachen Animation wird nachfolgend geliefert. from vpython import * scene.width = 1200 scene.height = 600 scene.center = vector(20,0,0) scene.background = color.white cylinder(pos=vector(0,0,0), axis=vector(20,0,0), radius=5, color=color.blue) cone(pos=vector(0,0,0), axis=vector(-10,0,0), radius=5, color=color.blue) helix(pos=vector(20,0,0), axis=vector(40,0,0), radius=2, coils=10, thickness=0.5, color=color.blue) ball = sphere(pos=vector(20,0,0), color = color.green, radius = 1) ball.p = vector(0.15, 0, 0) toc = True while True: rate(200) if(ball.pos.x <= 60 and toc == True): ball.pos += ball.p else: toc = False ball.pos -= ball.p if(ball.pos.x <= 20 and toc == False): toc = True [[Datei:PythonIng_vpython_anim.JPG]] Idealerweise öffnet sich beim Ausführen des Scripts ein Browserfenster. Darin wird die programmierte Animation gezeigt (siehe auch den obigen Screenshot). Eine Größenänderung können Sie mit der mittleren Maustaste initiieren. Die Szenerie drehen können Sie mit der rechten Maustaste. === Mit VTK === Komplexer, aber auch mächtiger als VPython ist die Verwendung von VTK ('''V'''isualization '''T'''ool'''k'''it). Genauer gesagt des Python-Wrappers von VTK. Dieses externe Python-Modul muss vorab installiert werden (z.B. mittels YaST, pip oder in eine virtuelle Umgebung). VTK ist eine Softwarebibliothek zur 3D-Visualisierung und wurde ursprünglich in C++ geschrieben. Verbreitet eingesetzt wird diese Bibliothek in der Wissenschaft und Forschung, z.B. * in der medizinischen Bildgebung * für Strömungssimulationen * für Klimadaten VTK funktioniert nach dem {{W|Grafikpipeline|Pipeline-Prinzip}}: Source (Quellen) -> Filter -> Mapper (Senken) -> Actor/Renderer Daten fließen von den Quellen zu den Senken. Als einfaches Beispiel wird die Darstellung eines Zylinders gezeigt, der mit den Maustasten gedreht oder in der Größe geändert werden kann: import vtk # Zylinder erzeugen cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) # Geometrie in darstellbare Daten umwandeln mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) # Objekt in der Szene actor = vtk.vtkActor() actor.SetMapper(mapper) # Szene verwalten renderer = vtk.vtkRenderer() renderer.AddActor(actor) # Render-Fenster render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) # Maus/Tastatur-Steuerung interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) # Starten render_window.Render() interactor.Start() Ausgabe: [[Datei:PythonIng_VTK_1.png]] Gleiches Beispiel wie oben, aber mit einer Animationssequenz: import vtk import time cyl = vtk.vtkCylinderSource() cyl.SetRadius(5.0) cyl.SetHeight(20.0) cyl.SetResolution(40) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cyl.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) renderer = vtk.vtkRenderer() renderer.AddActor(actor) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) render_window.Render() time.sleep(0.01) Das Grafikfenster schließt sich nach Ablauf der Schleife. Das Fenster bleibt geöffnet, wenn Sie am Programmende folgenden Befehl hinschreiben interactor.Start() Um den animierten Zylinder grün einzufärben, müssen Sie Folgendes im obigen Programm ergänzen (Farbnamen): colors = vtk.vtkNamedColors() actor.GetProperty().SetColor(colors.GetColor3d("Green")) Als Namen können Sie u.a. die CSS3 Web-Farben verwenden (siehe z.B. [https://wiki.selfhtml.org/wiki/Farbe/Farbangaben]). Alternativ funktioniert auch das (RGB): actor.GetProperty().SetColor(0.0, 0.6, 0.0) Wie der Zylinder mit einer Textur versehen wird, zeigt folgendes Programm: import vtk import time cylinder = vtk.vtkCylinderSource() cylinder.SetResolution(30) cylinder.SetHeight(3.0) cylinder.SetRadius(1.0) cylinder.CappingOn() texture_coords = vtk.vtkTextureMapToCylinder() texture_coords.SetInputConnection(cylinder.GetOutputPort()) texture_coords.PreventSeamOn() reader = vtk.vtkJPEGReader() reader.SetFileName("PythonIng_textur.jpg") texture = vtk.vtkTexture() texture.SetInputConnection(reader.GetOutputPort()) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(texture_coords.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.SetTexture(texture) renderer = vtk.vtkRenderer() renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) renderer.AddActor(actor) for i in range(360): actor.RotateZ(1) actor.RotateY(.5) renderWindow.Render() time.sleep(0.01) interactor.Start() <gallery> PythonIng_textur.jpg | Textur-Datei PythonIng_VTK_2.png | Ausgabe (Screenshot) </gallery> Nun aber genug von VTK und der Erstellung von Grafiken, weiter geht es mit mathematischeren Themen. = Vektoren und Matrizen = == Zahlenfolgen == from numpy import * start = 0 stop = 10 step = 2 num = 10 r = arange(start, stop, step) l = linspace(start, stop, num) print("r = ", r) print("l = ", l) Ausgabe: r = [0 2 4 6 8] l = [ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556 6.66666667 7.77777778 8.88888889 10. ] == Vektoren == Vektoren sollten jedem aus der Linearen Algebra bekannt sein. === Arrays === In Python mit NumPy kann man Vektoren durch die Funktion array erzeugen. import numpy as np l1 = (-5, 3, 2) l2 = (1, 1, 4) a1 = np.array(l1) a2 = np.array(l2) a3 = a1 + a2 a4 = 2 * a2 print(a1) print(a2) print(a3) print(a3[2]) print(a4) Ausgabe: [-5 3 2] [1 1 4] [-4 4 6] 6 [2 2 8] === Zeilen- und Spaltenvektoren === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) print(z) print(s) Ausgabe: [ [-5 3 2] ] [[1] [1] [4]] === Skalarprodukt === import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) skalarprodukt = np.dot(a1, a2) print(skalarprodukt) Ausgabe: 6 === Vektorprodukt === <math>a\ast b=\left(\begin{array}{c} a_{1}\\ a_{2}\\ a_{3} \end{array}\right)\ast\left(\begin{array}{c} b_{1}\\ b_{2}\\ b_{3} \end{array}\right)=\left(\begin{array}{c} a_{2}b_{3}-a_{3}b_{2}\\ a_{3}b_{1}-a_{1}b_{3}\\ a_{1}b_{2}-a_{2}b_{1} \end{array}\right) </math> Python-Code: import numpy as np a1 = np.array((-5, 3, 2)) a2 = np.array((1, 1, 4)) vektorprodukt = np.cross(a1, a2) print(vektorprodukt) Ausgabe: [10 22 -8] === Transponierter Vektor === import numpy as np # Zeilenvektor z = np.array([ [-5, 3, 2] ]) # Spaltenvektor s = np.array([[1], [1], [4]]) # transponierter Vektor z_tp = np.transpose(z) # transponierter Vektor s_tp = np.transpose(s) print(z_tp) print(s_tp) Ausgabe: [[-5] [ 3] [ 2]] [ [1 1 4] ] === Vektorfelder visualisieren === import matplotlib.pyplot as plt import numpy as np # Daten generieren x = np.arange(0, 10, 1) y = np.arange(0, 10, 1) X, Y = np.meshgrid(x, y) U = X * Y V = Y + X # Plotten fig, ax = plt.subplots() ax.quiver(X, Y, U, V, angles='xy') plt.show() Ausgabe: [[Datei:PythonIng_quiver1.png]] == Matrizen== import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) print(m1) Ausgabe: [[1 2 3] [4 5 6]] === Zugriff auf Matrizenelemente === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) # Element aus Zeile 2 und Spalte 3 (Achtung! Index startet bei Null) print(m1[1,2]) Ausgabe: 6 === Addition und Subtraktion von Matrizen === import numpy as np m1 = np.matrix([[1, 2, 3], [4, 5, 6]]) m2 = np.matrix([[0, 0, 2], [1, 3, 2]]) print(m1 + m2) print(m1 - m2) Ausgabe: [[1 2 5] [5 8 8]] [[1 2 1] [3 2 4]] === Transponierte Matrix === import numpy as np m = np.matrix([[1, 2, 3], [4, 5, 6]]) mt = np.transpose(m) print(m) print(mt) Ausgabe: [[1 2 3] [4 5 6]] [[1 4] [2 5] [3 6]] === Rang einer Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) rg = np.linalg.matrix_rank(m) print(rg) Ausgabe: 2 === Inverse Matrix === import numpy as np m = np.matrix([[1, 3], [0, -5]]) mi = np.linalg.inv(m) print(mi) Ausgabe: [[ 1. 0.6] [-0. -0.2]] === Multiplikation von Matrizen (falksches Schema) === import numpy as np m1 = np.matrix([[1, 3, 4], [0, -5, 1]]) m2 = np.matrix([[1, 2], [2, 3], [0, 2]]) print(m1 @ m2) Ausgabe: [[ 7 19] [-10 -13]] === Eigenwerte und Eigenvektoren === import numpy as np m = np.matrix([[5, 8], [1, 3]]) D,V = np.linalg.eig(m) # Eigenwerte print(D) # Eigenvektoren print(V) Ausgabe: [7. 1.] [[ 0.9701425 -0.89442719] [ 0.24253563 0.4472136 ]] === Teilmatrizen === import numpy as np m = np.matrix([[1, 3, 4], [0, -5, 1]]) print("m = ", m) # Erste Zeile extrahieren m1 = m[0,:] print("m1 = ", m1) # Das Element aus der 1. Zeile und der 2. Spalte extrahieren m2 = m[0,1] print("m2 = ", m2) # Zweite Spalte extrahieren m3 = m[:, 1] print("m3 = ", m3) Ausgabe: m = [[ 1 3 4] [ 0 -5 1]] m1 = [ [1 3 4] ] m2 = 3 m3 = [[ 3] [-5]] === Spezielle Matrizen === ==== Nullmatrix ==== import numpy as np z = np.zeros((3, 2)) print(z) Ausgabe: [[0. 0.] [0. 0.] [0. 0.]] ==== Einheitsmatrix ==== import numpy as np z = np.eye(3) print(z) Ausgabe: [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ==== Matrix mit lauter Einsen ==== import numpy as np z = np.ones((3, 2)) print(z) Ausgabe: [[1. 1.] [1. 1.] [1. 1.]] === Spärlich besetzte Matrizen === Das Thema spärlich besetzter Matrizen wird hier nur kurz angerissen. Nähere Details siehe unter dem Weblink [https://docs.scipy.org/doc/scipy/reference/sparse.html#module-scipy.sparse]. import numpy as np import scipy A = scipy.sparse.csr_array(np.eye(5)) print(A) Ausgabe: (0, 0) 1.0 (1, 1) 1.0 (2, 2) 1.0 (3, 3) 1.0 (4, 4) 1.0 = Lineare Gleichungssysteme = Sei <math>Ax = b</math> ein lineares Gleichungssystem. <math>A</math> sei die Koeffizientenmatrix, <math>x</math> der Lösungsvektor und <math>b</math> ein bekannter Vektor. Beispiel: import numpy as np A = np.array([[5, 1], [0, 2]]) b = np.array([1, 2]) x = np.linalg.solve(A, b) print(x) Ausgabe: [0. 1.] == Aufgabe == * Lösen Sie folgendes Gleichungssystem mittels Python (und zur Kontrolle auch händisch): 5x + 6y - 2z = 12 3x - y - 3z = 6 2x + 2y + 4z = 5 = Polynome = == Ein erstes einfaches Beispiel == Gegeben sei das Polynom <math>7x^3+5x^2+1</math>. In Python: import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p) Ausgabe: 3 2 7 x + 5 x + 1 == Einzelne Polynomwerte berechnen == import numpy as np p = np.poly1d([7, 5, 0, 1]) print(p(1.5)) Ausgabe: 35.875 == Polynome integrieren und differenzieren == import numpy as np p = np.poly1d([7, 5, 0, 1]) # 1. Ableitung p1 = p.deriv() p2 = p.deriv(1) # 2. Ableitung p3 = p.deriv(2) # Integral p4 = p.integ() print(p1) print(p2) print(p3) print(p4) Ausgabe: 2 21 x + 10 x 2 21 x + 10 x 42 x + 10 4 3 1.75 x + 1.667 x + 1 x == Nullstellen bestimmen == import numpy as np p = np.poly1d([2, 5, 0, 4]) r = np.roots(p) print(r) Ausgabe: [-2.7621427 +0.j 0.13107135+0.84077099j 0.13107135-0.84077099j] == Aufgaben == * Berechnen Sie den Wert für x = 3 des Polynoms <math>y = 2x^4 - 3x^3 - x + 7</math>. * Differenzieren und integrieren Sie das Polynom <math>y = 2x^4 - 3x^3 - x + 7</math>. * Berechnen Sie die Nullstellen von <math>y = 7x^5 - 3x^2 + 12</math>. = Nichtlineare Gleichungen und Gleichungssysteme = == Nullstellenbestimmung == Löse eine beliebige Gleichung f(x) = 0, z.B. <math> f(x) = x^2 - 5\cos(x) - 10 = 0 </math>: import scipy import numpy as np def f(x): return x**2 - 5*np.cos(x) - 10 xstart = [-1, 1] # Startwerte xn = scipy.optimize.root(f, xstart) print(xn.x) Ausgabe: [-2.46813009 2.46813009] Funktionsgraph: [[Datei:octave_nichtlin2.jpg]] == Gleichungssysteme == SymPy ist ein externes Modul, das symbolisches Rechnen ('''Sym'''bolic '''Py'''thon) ermöglicht. Folgende Aufgabe ist dem Buch "Knorrenschild: Numerische Mathematik, Hanser, 2017, Seite 72" entnommen. Zu lösen ist das nichtlineare Gleichungssystem <math>f_1 = 2x_1 + 4x_2 = 0 </math> <math>f_2 = 4x_1 + 8x_2^3 = 0</math> Mit Python ist das so möglich: import sympy x1, x2 = sympy.symbols("x1 x2") f1 = 2*x1 + 4*x2 f2 = 4*x1 + 8*x2**3 s = sympy.solve((f1, f2), x1, x2) print(s) Ausgabe: [(-2, 1), (0, 0), (2, -1)] Plot: [[Datei:IngPython_nl_gleichung1.svg|500px]] = Komplexe Zahlen = Die imaginäre Einheit wird in Python durch den Buchstaben <code>j</code> symbolisiert. Darstellen kann man eine komplexe Zahl bekannterweise in mehreren Formen: * Kartesische Darstellung <math>z = \Re(z) + j \cdot \Im(z)</math> * Polardarstellungen <math>z = r \cdot (\cos(\phi) + j \cdot \sin(\phi)) = r \cdot e^{j\cdot \phi}</math> Die konjugiert komplexe Zahl ist <math>z^* = \Re(z) - j \cdot \Im(z)</math> Nachfolgend einige mathematische Operationen mit Python und NumPy. import numpy as np z1 = 2 + 5j # kartesische Darstellung z2 = 3 * np.exp(3j) # Polardarstellung # Addition res = z1 + z2 print("z1 + z2 = ", res) # Multiplikation res = z1 * z2 print("z1 * z2 = ", res) # Realteil res = np.real(z2) print("Realteil von z2 = ", res) # Imaginärteil res = np.imag(z2) print("Imaginaerteil von z2 = ", res) # Betrag res = np.abs(z1) print("Betrag von z1 = ", res) # Argument res = np.angle(z1) print("Argument von z1 = ", res) # Konjugiert komplexe Zahl res = np.conj(z1) print("Konjugiert komplexe Zahl von z1 = ", res) Ausgabe: z1 + z2 = (-0.9699774898013365+5.423360024179601j) z1 * z2 = (-8.05675510050068-14.003167400647481j) Realteil von z2 = -2.9699774898013365 Imaginaerteil von z2 = 0.4233600241796016 Betrag von z1 = 5.385164807134504 Argument von z1 = 1.1902899496825317 Konjugiert komplexe Zahl von z1 = (2-5j) = Interpolation = import numpy as np import scipy import matplotlib.pyplot as plt # Stützpunkte xp = np.arange(1, 6) yp = (0, -5, 2, 7, 6) ti = np.arange(1, 5, 0.01) i1 = scipy.interpolate.interp1d(xp, yp, kind = "linear") i2 = scipy.interpolate.interp1d(xp, yp, kind = "cubic") plt.plot(xp, yp, "rx") plt.plot(xp, i1(xp)) plt.plot(ti, i2(ti)) plt.show() Ausgabe: [[Datei:PythonIng_interpol1.png]] = Differenzialrechnung = == Numerisches Differenzieren == Als Beispiel differenzieren wir <math>y = 5x\sin{x}</math> und stellen das Ganze grafisch dar. from findiff import Diff import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) f = 5 * x * np.sin(x) dx = x[1] - x[0] # Ableitung d_dx = Diff(0, dx) df_dx = d_dx(f) # Grafik plt.plot(x, f, label = "y") plt.plot(x, df_dx, label = "y'") plt.grid() plt.legend(loc="best") plt.show() Ausgabe: [[Datei:octave_diff1.jpg]] <small>findiff ist ein externes Modul. Dieses muss installiert werden (z.B. so: ...\Python\Scripts\pip.exe install --upgrade findiff). Für die Vorgehensweise unter openSUSE Tumbleweed siehe das Kapitel VPython, nur dass das Ganze mit einer aktuelleren Python-Version exekutiert wird, z.B. mit Python 3.13. Das im Buch "Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler, Rheinwerk" verwendete Modul "scipy.misc" ist veraltet (deprecated ... missbilligt). Lt. [https://docs.scipy.org/doc/scipy-1.17.0/dev/roadmap-detailed.html#misc SciPy-Dokumentation für die Version 1.17.0] wurden alle entsprechenden Features schon entfernt.</small> == Symbolisches Differenzieren == Differenzieren Sie die Funktionen <math>f_1(x) = x^2</math> und <math>f_2(x) = \sin(x)\cos\left(\frac{x}{2}\right)</math>. import sympy x = sympy.symbols("x") f1 = x**2; f2 = sympy.sin(x) * sympy.cos(x/2.) d1 = sympy.diff(f1, x) d2 = sympy.diff(f2, x) print(d1) print(d2) Ausgabe: 2*x -0.5*sin(0.5*x)*sin(x) + cos(0.5*x)*cos(x) == Aufgaben == * Differenzieren Sie die Funktion <math>y = \log(x) + 10x</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. * Differenzieren Sie die Funktion <math>y = \frac{\sinh(x)}{(1+x)}</math> und stellen Sie y, sowie y' grafisch am Bildschirm dar. = Integralrechnung = == Numerisches Integrieren == Berechnen Sie das Integral <math>\int_{0}^{3}x^2 dx</math>. import scipy def f(x): return x**2 i = scipy.integrate.quad(f, 0, 3) print(i) Ausgabe: (9.000000000000002, 9.992007221626411e-14) Das trifft den exakten Wert 9.0 ziemlich genau. Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} dx</math>. import scipy import numpy as np def f(x): return 2**(-x) i = scipy.integrate.quad(f, 0, np.inf) print(i) Ausgabe: (1.4426950408889556, 4.486558477977586e-09) == Symbolisches Integrieren == Berechnen Sie <math>\int x^2 \text{d}x</math> und <math>\int \sin{x}\cos{\frac{x}{2}} \text{d}x</math>. import sympy x = sympy.symbols("x") f1 = x**2 f2 = sympy.sin(x) * sympy.cos(x/2.) i1 = sympy.integrate(f1, x) i2 = sympy.integrate(f2, x) print(i1) print(i2) Ausgabe: x**3/3 -0.666666666666667*sin(0.5*x)*sin(x) - 1.33333333333333*cos(0.5*x)*cos(x) Berechnen Sie das Integral <math>\int_{0}^{\infty} 2^{-x} \text{d}x</math>. import sympy x = sympy.symbols("x") f = 2**(-x) i = sympy.integrate(f, (x, 0, sympy.oo)) print(i) Ausgabe: 1/log(2) Mit <code>sympy.pprint(i)</code> ließe sich letzere Ausgabe etwas schöner schreiben: 1 ────── log(2) Man beachtete, <code>log</code> steht hier für den natürlichen Logarithmus <code>ln</code>. == Aufgaben == * Integrieren Sie die Funktion <math>y = \log(x) + 10x</math> von 1 bis 5. * Integrieren Sie die Funktion <math>y = x^3</math> von 0 bis 4. * Integrieren Sie <math>\int x^x(\log (x) + 1)\mathrm dx</math> symbolisch. = Gewöhnliche Differenzialgleichungen = == DGL numerisch lösen == Für die Lösung von Differenzialgleichungen steht u.a. die Funktion scipy.integrate.solve_ivp() zur Verfügung. Diese Funktion implementiert auch das Runge-Kutta-Verfahren (RK45). {{Wikipedia | Runge-Kutta-Verfahren}} Beispiel <math>y' = x^2 + y^3</math>: import scipy import numpy as np import matplotlib.pyplot as plt def dy_dx(x, y): return x**2 + y**3 y0 = [1] xi = [0, 1] x = np.arange(0, 1, 0.01) z = scipy.integrate.solve_ivp(dy_dx, xi, y0, method="RK45", dense_output=True) y = z.sol(x) plt.plot(x, y.T) plt.grid() plt.show() [[Datei:PythonIng_dgl1.png]] == DGL symbolisch lösen == Beispiel <math>y' = x^2 + y^3</math>: import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) print(lsg) Ausgabe: [Eq(f(x), (-x**2)**(1/3)), Eq(f(x), (-x**2)**(1/3)*(-1 - sqrt(3)*I)/2), Eq(f(x), (-x**2)**(1/3)*(-1 + sqrt(3)*I)/2)] Mit <code>sympy.pprint</code> (pretty print) lässt sich die Ausgabe etwas übersichtlicher darstellen. import sympy x = sympy.symbols("x") y = sympy.Function("f")(x) dgl = x**2 + y**3 lsg = sympy.dsolve(dgl, y) sympy.pprint(lsg) Ausgabe: ⎡ _____ _____ ⎤ ⎢ _____ 3 ╱ 2 3 ╱ 2 ⎥ ⎢ 3 ╱ 2 ╲╱ -x ⋅(-1 - √3⋅ⅈ) ╲╱ -x ⋅(-1 + √3⋅ⅈ)⎥ ⎢f(x) = ╲╱ -x , f(x) = ────────────────────, f(x) = ────────────────────⎥ ⎣ 2 2 ⎦ == Aufgaben == * Lösen Sie die Differenzialgleichung <math>y' = \frac{1}{x\cdot y}</math> mit Python. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>m' = -k\cdot m</math>. Kontrollieren Sie das Ergebnis, indem Sie die DGl händisch lösen. * Lösen Sie die Differenzialgleichung <math>y' = \sqrt{|y|}</math>. =Rechnen mit wirklich großen Zahlen= Bekannt ist, dass Python kaum Einschränkungen beim Wertebereich von Ganzzahlen hat, z.B. print(10**300) Ausgabe (gekürzt): 100000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000 Ähnliches geht auch mit Gleitpunktzahlen, z.B. durch die Verwendung des Moduls mpmath: import mpmath print(mpmath.mpf(1500.4)**mpmath.mpf(300)) Ausgabe: 7.27975299218612e+952 Anderes Beispiel: from mpmath import mp, pi mp.dps = 100 print(pi) Ausgabe: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 mpmath kann noch einiges mehr, dazu sei aber auf die entsprechende Dokumentation auf der mpmath-Homepage verwiesen. mpmath ist Bestandteil von SymPy, kann aber auch separat installiert werden. Aber auch Python selbst besitzt eine Möglichkeit, um mit großen bzw. exakten Gleitpunktzahlen zu rechnen, nämlich das interne Modul decimal. Dieses hat einige Vorteile gegenüber mpmath, aber auch gravierende Nachteile. Diese seien hier nicht detailliert aufgezählt. Grob gesagt hat decimal im Finanzwesen seine Berechtigung. Für wissenschaftliche Anwendungen wird aber mpmath vorzuziehen sein, da es u.a. vielfältige mathematische Funktionen bereit stellt. Nachfolgend ein einfaches Beispiel mit decimal: import decimal print("Potenzierung:", decimal.Decimal(1500.4) ** decimal.Decimal(300.0)) print("Einfache Addition:", 0.1 + 0.2) decimal.getcontext().prec = 50 print("Addition mit decimal:", decimal.Decimal("0.1") + decimal.Decimal("0.2")) Ausgabe: Potenzierung: 7.279752992186121551039839134E+952 Einfache Addition: 0.30000000000000004 Addition mit decimal: 0.3 <u>Aufgabe:</u> Recherchieren Sie im Internet die genauen Vor- und Nachteile von decimal und mpmath. Verwenden Sie dazu auch KI (z.B. von Google, chatgpt). =Regelungstechnische Aufgabenstellungen= Für regelungstechnische Aufgaben gibt es u.a. das externe Paket <code>control</code>. Hier soll nicht detailliert darauf eingegangen werden. Anhand eines Beispiels soll anschließend nur die Visualisierung in Form eines Bode-Diagramms und der Sprungantwort gezeigt werden. Gegeben sei ein P-Regler mit <math>R = \frac{5}{2}</math> und eine Strecke <math>S= \frac{1}{30s^3+20s^2+10s+1,5}</math>. Gesucht sei vorerst ein Bode-Diagramm für den offenen Regelkreis und das Führungsverhalten. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke # oder: G0 = ct.series(regler, strecke) Gw = ct.feedback(G0) ct.bode_plot(G0, label='G0') ct.bode_plot(Gw, label='Gw') plt.show() [[Datei:PythonIng_bode1.svg]] Nun noch für obiges Beispiel die Sprungantwort. Diese zeigt einige große Überschwinger, d.h. der Regler kann sicher noch optimiert werden. import numpy as np import control as ct import matplotlib.pyplot as plt zaehler1 = np.array([1.]) nenner1 = np.array([30., 20., 10., 1.5]) strecke = ct.tf(zaehler1, nenner1) zaehler2 = np.array([5.]) nenner2 = np.array([2.]) regler = ct.tf(zaehler2, nenner2) G0 = regler*strecke Gw = ct.feedback(G0) t, y = ct.step_response(Gw) plt.plot(t,y) plt.title('Sprungantwort') plt.xlabel('t') plt.ylabel('h(t)') plt.grid() plt.show() [[Datei:PythonIng_bode3.svg]] Einige weitere wichtige Daten (Phasenreserve, Amplitudenreserve, Durchtrittsfrequenz) lassen sich mittels der <code>control</code>-Funktion <code>margin()</code> ermitteln. Die Ortskurve lässt sich mit der Funktion <code>nyquist_plot()</code> zeichnen. Dies sei hier aber nicht weiter ausgeführt. ==Aufgaben== * Zeichen Sie mit Python die Ortskurve für obiges Beispiel. * Was passiert, wenn man die Reglerverstärkung weiter aufdreht (z.B. auf <math>R = \frac{25}{2}</math>)? * Wie sehen das Bode-Diagramm und die Sprungantwort aus, wenn ein PI-Regler verwendet wird? = Stereostatik etc. = Das Modul SymPy bietet einige Möglichkeiten einfache Bauwerke zu berechnen, z.B. Balken oder Fachwerke. Nachfolgend wird ein einfaches Fachwerk berechnet und gezeichnet. Python-Code: from sympy.physics.continuum_mechanics.truss import Truss t = Truss() # Knoten t.add_node(("A", -3, 0), ("B", 0, 0), ("C", 4, 0), ("D", 7, 0), ("E", 6, 1.5), ("F", 2, 3), ("G", -2, 1.5)) # Stäbe t.add_member(("AB","A","B"), ("BC","B","C"), ("CD","C","D")) t.add_member(("AG","A","G"), ("GB","G","B"), ("GF","G","F")) t.add_member(("BF","B","F"), ("FC","F","C"), ("CE","C","E")) t.add_member(("FE","F","E"), ("DE","D","E")) # Auflager; roller ... Loslager, pinned ... Festlager t.apply_support(("A","roller"), ("D","pinned")) # Einwirkende Kräfte t.apply_load(("G", 5, 270), ("E", 3, 90)) # Berechnung t.solve() print("Reaction Forces: ", t.reaction_loads) print("Internal Forces: ", t.internal_forces) # Fachwerk zeichnen p = t.draw() p.show() Ausgabe auf der Konsole: Reaction Forces: {'R_A_y': 4.20000000000000, 'R_D_x': 0, 'R_D_y': -2.20000000000000} Internal Forces: {'AB': 2.80000000000000, 'BC': 0.333333333333333, 'CD': -1.46666666666667, 'AG': -5.04777178564958, 'GB': -2.05555555555556, 'GF': -1.23413387432364, 'BF': 0.411111111111111*sqrt(13), 'FC': -0.3*sqrt(13), 'CE': 1.50000000000000, 'FE': 0.284800124843917, 'DE': 2.64407093534026} Zeichnung: [[File:PythonIng_fachwerk1.svg|300px]] Details zu diesem Thema siehe z.B. [https://docs.sympy.org/latest/modules/physics/continuum_mechanics/index.html Continuum Mechanics] oder [https://docs.sympy.org/latest/tutorials/physics/continuum_mechanics/index.html Continuum Mechanics Tutorials]. Auch andere mechanische Probleme werden von SymPy abgehandelt ([https://docs.sympy.org/latest/tutorials/physics/index.html Physics Tutorials]). == Aufgabe == Gegeben sei ein einseitig eingespannter Kragträger. Belastet wird er durch eine Einzellast am Trägerende. Für die Daten siehe folgende ASCII-Skizze: | 20 kN //|---> x | //| V //|---------------------- //| 10 m | Elastizitätsmodul E = 2,1*10⁵ N/mm² Flächenträgheitsmoment I = 0.001 m⁴ Berechnen Sie die Auflagerreaktionen, den Querkraft- und Biegemomentenverlauf, sowie die Verformungen. Stellen Sie dies mit Hilfe von SymPy graphisch und auch mittels Formeln dar. Verwenden Sie dazu auch pprint (pretty print) aus dem SymPy-Modul. Zwecks Lösungsansatz siehe die oben aufgeführte Seite "Continuum Mechanics Tutorials". Achten Sie auch auf die Einheiten! Kontrollieren Sie das Ganze mittels händischer Rechnung. In dem genannten Tutorial ist von "Singularity Functions" die Rede. Gemeint ist damit in diesem Kontext die {{W|Föppl-Klammer}}. Einige Python-Programme, vorrangig zu Maschinenelementen, finden sich auf [https://baymp.de/download_python.html BayMP für Python] (Balken, Zahnräder, Stabknickung usw.). = Stochastik = Die Stochastik ist ein sehr weites Feld. Hier werden nur einige wenige sehr einfache, aber wichtige Themen angerissen. Python stellt mit den Moduln math und statistics Software zu diesem Zwecke bereit. math und statistics sind bereits im Lieferumfang von Python enthalten. Aber auch mit den externen Modulen NumPy, SciPy und pandas kann man Stochastik in Python betreiben. Dies wird hier aber nicht gemacht. == Lageparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] m1 = statistics.mean(werte) m2 = statistics.mode(werte) m3 = statistics.median(werte) print("Arithmetischer Mittelwert = ", m1) print("Modalwert = ", m2) print("Median = ", m3) Ausgabe: Arithmetischer Mittelwert = 3.5 Modalwert = 1 Median = 3.0 == Streuungsparameter == import statistics werte = [1, 3, 4, 4, 1, 7, 9, 1, 2, 3] s = statistics.stdev(werte) print("Standardabweichung = ", s) Ausgabe: Standardabweichung = 2.6770630673681683 == Kombinatorik == import math n = 7 k = 5 print("n! = ", math.factorial(n)) print("Kombinationen (n über k) = ", math.comb(n, k)) Ausgabe: n! = 5040 Kombinationen (n über k) = 21 = Ein- und Ausgabe = == print == Die Anweisung print haben wir schon oft verwendet. Hier soll anhand von Beispielen kurz beschrieben werden, was der Befehl print leisten kann. print("Hallo", "Welt", 1, sep="-") print("Hallo", end=" ") print("Welt") Ausgabe: Hallo-Welt-1 Hallo Welt == input == a = int(input("Zahl 1: ")) b = int(input("Zahl 2: ")) print("a + b = ", a+b) Ausgabe (nach Eingabe der beiden Ganzzahlen): Zahl 1: 4 Zahl 2: 5 a + b = 9 == Aus Dateien lesen == Es seinen die datei.txt Hallo Welt. Wie geht es dir? ... und test1.py dat = open("datei.txt", mode = "r") print(dat.read()) dat.close() Ausgabe Hallo Welt. Wie geht es dir? ... Mit dem open()-Befehl wird die Datei datei.txt im Lesemodus geöffnet (r ... read). Mit dem read()-Befehl wird die Datei eingelesen und mittels print ausgegeben. == In Dateien schreiben == dat = open("datei.txt", mode = "a", encoding = "utf-8") dat.write("Hänge Zeile an\n") dat.close() Die Datei datei.txt sieht nach Abarbeitung des obigen Skripts nun so aus Hallo Welt. Wie geht es dir? ... Hänge Zeile an Es wird die Datei im Schreibmodus geöffnet (a ... append (anhängend), w ... write (überschreibend)). write() fügt hier also eine Zeile Text am Dateiende ein. close() schließt die Datei wieder. Das close() kann man sich mit der with-Anweisung auch sparen. with open("datei.txt", mode="a", encoding="utf-8") as dat: dat.write("Hänge Zeile an\n") = Benutzeroberflächen erstellen = == tkinter == {{Wikipedia | Tkinter}} Python bietet standardmäßig das Modul tkinter zur Programmierung von Benutzeroberflächen. Es müssen also bei der Verwendung von tkinter keine externen Module installiert werden. Hier wird eine (sehr) kurze Einführung in das Erstellen von grafischen Oberflächen mittels tkinter gegeben. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") win.minsize(300, 50) but = tk.Button(win, text = "Push the button") but.pack() win.mainloop() Ausgabe: [[Datei:PythonIng_gui1.jpg]] Ein etwas komplizierteres Beispiel sei nachfolgend gezeigt. Es sollen zwei Strings miteinander verknüpft und ausgegeben werden. import tkinter as tk win = tk.Tk() win.title("Hallo Welt!") def on_button_clicked(): str = ent1.get() + ent2.get() lab2["text"] = str ent1 = tk.Entry(win) ent2 = tk.Entry(win) lab1 = tk.Label(win, text="verknuepfen mit") lab2 = tk.Label(win, text="") but = tk.Button(win, text = "=", command=on_button_clicked) ent1.pack(side="left") lab1.pack(side="left") ent2.pack(side="left") but.pack(side="left") ent2.pack(side="left") lab2.pack(side="left") win.mainloop() Ausgabe (vor der Eingabe der Teilstrings): [[Datei:PythonIng_gui2.jpg]] Ausgabe (nach der Eingabe der Teilstrings und dem Drücken des =-Buttons): [[Datei:PythonIng_gui3.jpg]] == curses == {{Wikipedia | curses}} Mit dem curses-Modul lassen sich u.a. TUIs ('''T'''ext '''U'''ser '''I'''nterfaces) erstellen. Ein sehr einfaches Beispiel zur allgemeinen Funktionsweise wird nachstehend geliefert. import curses stdscr = curses.initscr() curses.start_color() curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) stdscr.clear() stdscr.addstr("Hallo Welt", curses.color_pair(1)) stdscr.refresh() stdscr.getch() curses.endwin() Als Ausgabe sollte <span style="color:#FF0000;">Hallo Welt</span> (rote Schrift auf weißem Hintergrund) auf dem Terminal/der Konsole erscheinen. Getestet wurde dies mit openSUSE Tumbleweed, Python-Version 3.13.12. Das entsprechende Python-curses-Package muss installiert sein. Allgemeine Informationen zur Terminal-/Konsolengröße und Cursorposition liefert folgendes Programm: import curses stdscr = curses.initscr() stdscr.addstr(3, 5, "LINES: %d" % curses.LINES) stdscr.addstr(4, 5, "COLS: %d" % curses.COLS) (y,x) = stdscr.getyx() stdscr.addstr(5, 5, "Momentane Cursorposition: [%d, %d]" % (y, x)) (y,x) = stdscr.getbegyx() stdscr.addstr(6, 5, "Koordinatenursprung: [%d, %d]" % (y, x)) (y,x) = stdscr.getmaxyx() stdscr.addstr(7, 5, "Fenstergröße: [%d, %d]" % (y, x)) stdscr.addstr(11, 2, "Taste drücken -> Ende") stdscr.refresh() stdscr.getch() curses.endwin() Es sollte sich in etwa folgende Ausgabe ergeben: LINES: 44 COLS: 110 Momentane Cursorposition: [4, 15] Koordinatenursprung: [0, 0] Fenstergröße: [44, 110] Taste drücken -> Ende Zur Funktionsweise von curses siehe auch das Wikibook [[ncurses]]. Zum Verständnis sind dort allerdings elementare Kenntnisse in der Programmiersprache C erforderlich. == Qt == {{Wikipedia | Qt (Bibliothek)}} Auch für das Qt-Framework gibt es eine Anbindung an Python. Nachfolgend ein einfaches Beispiel. import sys from PySide6.QtWidgets import QApplication, QLabel app = QApplication(sys.argv) label = QLabel("Hallo Welt!") label.show() sys.exit(app.exec()) Ausgabe: [[Datei:PythonIng_gui10.png]] == Gtk == {{Wikipedia | GTK (Programmbibliothek)}} Eine idente Ausgabe, wie oben für Qt gezeigt, erzeugt z.B. folgendes Gtk-Programm: import gi gi.require_version("Gtk", "4.0") from gi.repository import Gtk def on_activate(app): win = Gtk.ApplicationWindow(application=app) lab = Gtk.Label(label="Hallo Welt!") win.set_child(lab) win.present() app = Gtk.Application() app.connect('activate', on_activate) app.run(None) Auch für die Benutzung von Qt und Gtk müssen die jeweiligen Packages installiert sein. Getestet wurden die entsprechenden Python-Programme nur unter openSUSE Tumbleweed. Wie das GTK-Paket unter MS Windows 11 installiert wird, siehe z.B. [https://www.gtk.org/docs/installations/windows Setting up GTK for Windows]. Damit sei aber das Thema "Benutzeroberflächen erstellen" hier abgeschlossen, da dies schon ein sehr spezielles Aufgabengebiet ist, das eher Informatiker und nicht so sehr Ingenieure anspricht. Bei Bedarf siehe aber ggf. die entsprechenden Links unten in diesem Tutorial. Dort sind weiterführende Informationen zu finden. = Style Guide und flake8 = Wie man schönen und richtigen Python-Code schreibt, erfahren Sie in * [https://peps.python.org/pep-0008/ PEP 8 – Style Guide for Python Code] Ein Modul, das prüft, ob die Richtlinien im Style Guide eingehalten wurden, ist ''flake8'': * [https://flake8.pycqa.org/en/latest/ Flake8: Your Tool For Style Guide Enforcement] = Einige Integrierte Entwicklungsumgebungen (IDEs)= Werden Programmtexte größer und umfangreicher, so ist das Arbeiten mit der interaktiven Programmierumgebung bzw. das direkte Ausführen von Python-Skripten mühsam. Man wünscht sich z.B. Hilfen zum Debuggen oder die automatische Code-Vervollständigung. Zu diesem Zweck wurden IDEs (Integrated Development Environments) geschaffen. Von diesen seinen nachfolgend auszugsweise einige kurz beschrieben. Testen Sie einfach aus, welche davon für Sie bzw. für Ihr Python-Projekt geeignet sind. == IDLE == IDLE ist die mit dem Python-Programmpaket mitgelieferte IDE. Der Name leitet sich einerseits ab vom Monty-Python-Mitglied Eric Idle, andererseits steht es als Abkürzung für "'''I'''ntegrated '''D'''evelopment and '''L'''earning '''E'''nvironment. IDLE ist einfach zu bedienen, bietet aber schon einen beachtlichen Leistungsumfang. Nachfolgend wird ein Screenshot zu IDLE geliefert. Rechts ist das Editor-Fenster zu sehen, links die interaktive Programmierumgebung. Um das Beispiel selbst nachvollziehen zu können, starten Sie IDLE. Das geht ähnlich, wie Sie die interaktive Programmierumgebung von Python starten (nur, dass Sie eben das IDLE-Icon doppelklicken und nicht das Python-Icon. Unter Linux geben Sie einfach in einem Terminal <code>idle3.13</code> o. Ä. ein). Weiter geht es mit "File - Open - ...". Die auszuführende Datei auswählen (im konkreten Fall ein "Hallo-Welt"-Programm). Es erscheint das rechte Fenster. Dort "Run - Run Module" auswählen. Und schon wird im linken Fenster "Hallo Welt!" ausgegeben. [[Datei:PythonIng_idle1.jpg | 600px]] Siehe auch {{W|IDLE}}. == PyCharm == PyCharm ist ein kommerzielles Produkt. Es gab aber auch eine kostenlose Community Edition. Seit 2025 sind beide Varianten vereint. Für die ersten 30 Tage sind die Pro-Funktionen frei verfügbar, danach nur noch die Kernfunktionalitäten (oder man bezieht kostenpflichtig die Pro-Version). Zu beziehen ist PyCharm unter dem Weblink [https://www.jetbrains.com/pycharm/]. Nachfolgend ein etwas abgewandeltes "Hallo Welt"-Programm, editiert und ausgeführt mit PyCharm. [[Datei:PyCharm_IDE_2023_screenshot.png | 600px]] Siehe auch {{W|PyCharm}}. == Eric == Auch eric ist Open Source und steht unter der GNU General Public License Version 3 oder später. Zu beziehen ist diese Software unter [https://eric-ide.python-projects.org/]. [[Datei:Screenshot_Eric_4.png | 600px]] Siehe auch {{W|eric (Software)}}. <small> Unter openSUSE Tumbleweed sollte sich eric auch mit YaST installieren lassen. Bei mir gibt es aber dann beim Ausführen des eric-Programms eine Fehlermeldung (Stand März 2026): ... ModuleNotFoundError: No module named 'PyQt6.QtPdfWidgets' Umgehen kann man dieses Problem aber wieder mit dem Erstellen einer virtuellen Umgebung, in etwa so python3.13 -m venv ~/tmp/venv1 cd ~/tmp/venv1/bin ./python3.13 -m pip install --upgrade --prefer-binary eric-ide ./eric7_ide </small> == PyScripter == Vom Funktionsumfang vergleichbar mit den vorherigen IDEs ist PyScripter. Auch PyScripter ist Open Source. Die Projekt-Homepage findet sich auf [https://sourceforge.net/projects/pyscripter/]. PyScripter ist nur für MS Windows verfügbar. [[Datei:PythonIng_pyscripter1.jpg | 600px]] == Spyder IDE == Spyder enthält bereits eine stabile Python-Version und etliche Module (z.B. matplotlib, numpy, control). Ansonsten kann dieses Softwarepaket vom Funktionsumfang her mit den anderen genannten IDEs locker mithalten. Spyder wurde unter der MIT-Lizenz veröffentlicht. Diese Software findet sich auf [https://www.spyder-ide.org]. [[Datei:Spyder-windows-screenshot.png | 600px]] Siehe auch {{W|Spyder (Software)}} == Sonstige == Die genannten IDEs sind nicht die Einzigen. Es gibt, um dem Image Pythons als beliebteste Programmiersprache gerecht zu werden, noch einige andere. Sowohl Open Source-Programme als auch kommerzielle Programme sind im Web zu finden, z.B. Thonny oder {{W|Visual Studio Code}}. Braucht man den Umfang von ausgewachsenen IDEs nicht, so kann man auch normale Texteditoren verwenden (z.B. {{W|Geany}} oder {{W|Kate_(Texteditor)|Kate}}). = Debuggen und Testen = Das Debuggen und Testen von Programmen sind wichtige Bestandteile der Programmierung. Syntaxfehler lassen sich i.A. leicht beheben. Schwieriger ist das Eingrenzen von logischen Fehlern, die ev. nur in bestimmten Situationen auftreten und keine explizite Fehlermeldung hervorrufen. Das Programm liefert falsche Ergebnisse oder es stürzt aus heiterem Himmel ab. Um das zu verhindern gibt es verschiedene Werkzeuge, die bei der Fehlersuche behilflich sein können. Vorerst siehe aber zwecks Begriffsklärung noch folgende Links: * {{W|Debuggen}} * {{W|Debugger}} * {{W|Softwaretest}} <gallery> First Computer Bug, 1947.jpg Test ganzheitlich.png V-Modell.svg </gallery> == Das Modul pdb == Python bringt schon ein Modul zum Debuggen mit. Siehe z.B. [https://docs.python.org/3/library/pdb.html pdb — The Python Debugger]. Komfortabler lässt sich das aber mittels Integrierter Entwicklungsumgebungen (IDEs) angehen. == Debuggen mit IDEs == Für die IDEs IDLE und Spyder sei kurz auf die entsprechenden Webseiten verwiesen: * [https://www.cs.uky.edu/~keen/help/debug-tutorial/debug.html Debugging under IDLE]. * [https://docs.spyder-ide.org/current/panes/debugging.html Spyder Debugger] Dort wird die Vorgehensweise auch mittels Screenshots erläutert. == assert == assert ... behaupten, zusichern ({{W|Assertion (Informatik)}}) Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10., 0.) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10., 0.) File "/home/hr/Develop/test1.py", line 4, in print1 assert y != 0.0 ^^^^^^^^ AssertionError Python-Code: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1("10.", "5.") File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Aber auch bei nachfolgendem Code gibt es eine Fehlermeldung: def print1(x, y): assert type(x) == float assert type(y) == float assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 Traceback (most recent call last): File "/home/hr/Develop/test1.py", line 8, in <module> print1(10, 5) File "/home/hr/Develop/test1.py", line 2, in print1 assert type(x) == float ^^^^^^^^^^^^^^^^ AssertionError Damit letzteres funktioniert, kann man den Programmcode so umschreiben: def print1(x, y): assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) print1(10., 5.) print1(10, 5) Ausgabe: 2.0 2.0 Und jetzt fangen wir den <code>AssertionError</code> auf: def print1(x, y): try: assert type(x) == float or type(x) == int assert type(y) == float or type(y) == int assert y != 0.0 print(x/y) except(AssertionError): print("Hallo") print1(10., 5.) print1("10.", "5.") Ausgabe: 2.0 Hallo Ich hoffe, es ist wenigstens im Ansatz klar geworden, wofür <code>assert</code> gut sein kann. Ausschalten kann man die <code>assert</code>-Überprüfung übrigens mit dem Python-Schalter <code>-O</code>. == Doctests == Innerhalb eines Docstrings kann die Arbeit im interaktiven Modus simuliert werden. Nach den Promptzeichen (>>>) erfolgen dann bei unserem Beispiel innerhalb des Docstrings simulierte Aufrufe der Funktion <code>print1()</code>. Danach folgen jeweils die Sollresultate. Wird das Modul oder die Datei als Hauptprogramm aufgerufen, so wird die Funktion <code>doctest.testmode()</code> aufgerufen und ein Bericht auf der Konsole ausgegeben. Wird das Modul nicht als Hauptprogramm aufgerufen, sondern importiert, dann wird diese <code>testmod</code>-Funktion nicht aufgerufen. D.h. dieser Code kann sowohl für Testzwecke als auch für den produktiven Einsatz verwendet werden. Das ist auch sinnvoll, weil wenn man Teile der Datei immer löschen bzw. einfügen müsste, so würden sich Fehlerquellen auftun. Das würde den Sinn und Zweck von Doctests konterkarieren. def print1(x=0., y=1.): """ Dividiere zwei Zahlen Autor: Intruder Datum: 12.08.2025 >>> print1(2., 1.) 2.0 >>> print1(5., 2.) 2.5 >>> print1(5.) 5.0 """ print(x/y) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) Ausgabe: Trying: print1(2., 1.) Expecting: 2.0 ok Trying: print1(5., 2) Expecting: 2.5 ok Trying: print1(5.) Expecting: 5.0 ok 1 items had no tests: __main__ 1 items passed all tests: 3 tests in __main__.print1 3 tests in 2 items. 3 passed and 0 failed. Test passed. Das gezeigte Beispiel ist so ziemlich das einfachste, das es gibt. Für weiterführende Details siehe z.B.: * [https://peps.python.org/pep-0257/ PEP 257 – Docstring Conventions] * [https://docs.python.org/3/library/doctest.html doctest — Test interactive Python examples] == pytest == Siehe zu diesem Thema auch {{W|Modultest}}. pytest ist ein externes Modul und muss vorab installiert werden, z.B. mittels pip install -U pytest pip install -U pytest-html Python-Code, Datei test1.py: def add(x, y): return x + y def test_answer(): assert add(1, 1) == 3 Starten von pytest in der Konsole: pytest test1.py Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py F [100%] ========================================================= FAILURES ========================================================== ________________________________________________________ test_answer ________________________________________________________ def test_answer(): > assert add(1, 1) == 3 E assert 2 == 3 E + where 2 = add(1, 1) test1.py:6: AssertionError ================================================== short test summary info ================================================== FAILED test1.py::test_answer - assert 2 == 3 ===================================================== 1 failed in 0.09s ===================================================== Hier erhalten wir einen Fehler, da 1+1 eindeutig ungleich 3 ist. Aber aus irgendeinem Grund wollte der Programmierer oder Tester in diesem Fall, dass dies so ist. Testfälle werden übrigens mit dem Präfix <code>test_</code> eingeleitet. Python-Code: def add(x, y): return x + y + 1 def test_answer(): assert add(1, 1) == 3 Ausgabe: ==================================================== test session starts ==================================================== platform linux -- Python 3.12.11, pytest-8.4.1, pluggy-1.6.0 rootdir: /home/hr/Develop plugins: anyio-4.10.0, metadata-3.1.1, html-4.1.1 collected 1 item test1.py . [100%] ===================================================== 1 passed in 0.01s ===================================================== Jetzt ist alles in Ordnung. Weiterführendes siehe z.B. * [https://docs.pytest.org/en/stable/ pytest: helps you write better programs] == unittest == Auch unittest dient zur Durchführung von Testreihen, ist aber Bestandteil von Python. Hier wird vorerst nicht näher darauf eingegangen. Siehe z.B. * [https://docs.python.org/3/library/unittest.html unittest — Unit testing framework] Lt. ''Inden: Python Challenge; dpunkt, 2021, Seite 481'' soll unittest weniger komfortabel als pytest sein. Einen Vergleich von unittest mit pytest findet man in * [https://knapsackpro.com/testing_frameworks/difference_between/pytest/vs/unittest pytest vs unittest] = Ausblick = Dies war eine kurze Einführung in die Berechnungs- und Darstellungsmöglichkeiten mit Python. Es sollten etliche relevante Themen behandelt, oder zumindest kurz angesprochen worden sein. Wem dieser Text nicht ausreichend ist, der sei auf die entsprechenden weiterführenden Weblinks, Bücher und die Python-Hilfefunktion verwiesen. Python kennt noch viel mehr Befehle, als hier dargestellt wurden. Das Themenspektrum ist auch durch die Einbindung externer Module fast beliebig erweiterbar. = Weblinks= == Python allgemein == * [https://www.python.org/ Python Homepage] == Externe mathematische Module == * [https://numpy.org/ NumPy] * [https://numpy.org/doc/stable/user/numpy-for-matlab-users.html NumPy for MATLAB users] * [https://scipy.org/ SciPy] * [https://www.sympy.org/en/index.html SymPy] * [https://pandas.pydata.org/ pandas] * [https://github.com/maroba/findiff findiff] * [https://mpmath.org/ mpmath] == Externe Module für Grafiken == * [https://matplotlib.org/ Matplotlib] * [https://vpython.org/ VPython] * [https://docs.vtk.org/en/latest/api/python.html VTK] == Erstellung von User Interfaces == * [https://docs.python.org/3/library/tkinter.html tkinter - Python interface to Tcl/Tk] * [https://docs.python.org/3/library/curses.html curses - Terminal handling for character-cell displays] * [https://wiki.qt.io/Qt_for_Python Qt for Python] * [https://www.gtk.org/docs/language-bindings/python GTK and Python] == Erstellen virtueller Umgebungen == * [https://docs.python.org/3/library/venv.html venv - Creation of virtual environments] == Sonstige == * [https://python-control.readthedocs.io/en/stable/ Python Control Systems Library] * [https://pypi.org/project/regex/ regex - Regular Expressions] = Bücher = == Gedruckte Bücher, OpenBooks, Magazine == * Diverse: c't Python Lernen, Verstehen, Anwenden; Heise, 2022 * Ernesti, Kaiser: Python3 - das umfassende Handbuch; 5. Aufl., Rheinwerk, [https://openbook.rheinwerk-verlag.de/python/ OpenBook] * Inden: Python Challenge; dpunkt, 2021, ISBN 978-3-86490-809-5 * Klein: Numerisches Python; 2. Aufl., Hanser, 2023, ISBN 978-3-446-47170-2 * Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler; Rheinwerk, 2021, ISBN 978-3-8362-7316-9 * Weigend: Python 3 - Das umfassende Praxisbuch; 9. Aufl., mitp, 2022, ISBN 978-3-7475-0544-1 * Woyand: Python für Ingenieure und Naturwissenschaftler; 4. Aufl., Hanser, 2021, ISBN 978-3-446-46483-4 == Andere Wikibooks == * [[:en:Subject:Python_programming_language | Englische Wikibooks zum Thema Python]] * [[Python|Deutschsprachiges Python-Wikibook]] [[Bild:2von10.png|20%]] * [[Python unter Linux|Python 2.7 unter Linux]] [[Bild:10von10.png|100%]] {{Navigation_zurückhochvor_buch| zurücktext=Julia für Ingenieure| zurücklink=Ing Mathematik: Julia| hochtext=Gesamtinhaltsverzeichnis| hochlink=Ing:_Mathematik_für_Ingenieure| vortext=Landau-Notation| vorlink=Ing Mathematik: Landau}} mvho4w8maru4ootplhcanplrunkdyci Traktorenlexikon: Deutz-Allis 6060 0 122395 1082855 2026-04-06T12:25:14Z Baupit 56622 Neue Seite (vgl. [[WB:AZ]]) 1082855 wikitext text/x-wiki {{:Traktorenlexikon: Navigation |HERSTELLER-LINK=Traktorenlexikon: Deutz-Allis |HERSTELLER= Deutz-Allis}} {{:Traktorenlexikon: Modell-Infobox | HERSTELLER = DEUTZ-ALLIS | MODELLREIHE = 6.000 er- Serie | MODELL = 6060 | BILD = | BILDBESCHREIBUNG = | BAUWEISE = Blockbauweise | PRODUKTIONSBEGINN = 1985 | PRODUKTIONSENDE = 1988 | STÜCKZAHL = | EIGENGEWICHT = 2.585 (4 WD: 2.948) | LÄNGE = 3.721 | BREITE = 1.740 | HÖHE = 2.621 | RADSTAND = 2.362 (4 WD: 2.334) | BODENFREIHEIT = 518 (4 WD: 460) | SPURWEITE = | SPURWEITE VORNE = 1.371-2.007 (4 WD: 1.499-1.930) | SPURWEITE HINTEN = 1.448-2.261 | WENDERADIUS MIT LENKBREMSE = 3.340 (4 WD: 4.648) | WENDERADIUS OHNE LENKBREMSE = 3.800 (4 WD: 5.791) | BEREIFUNG VORNE = 7.50-16 ASF (4 WD: 11.2-24 AS) | BEREIFUNG HINTEN = 16.9-28 AS (4 WD: 18.4-28 AS) | LEISTUNG KW = 47,8 | LEISTUNG PS = 65 | NENNDREHZAHL = 2.300 | ZYLINDER = 4 | HUBRAUM = 3.287 | DREHMOMENTANSTIEG = | KRAFTSTOFF = Diesel | KÜHLSYSTEM = Wasserkühlung | ANTRIEBSTYP = Heck- oder Allradantrieb | GETRIEBE = 8 V/2 R | HÖCHSTGESCHWINDIGKEIT = 25 | KATEGORIESORTIERUNG = }} Nachdem im März 1985 die KLÖCKNER-HUMBOLD-DEUTZ AG den traditionellen Hersteller ALLIS-CHALMERS übernommen hatte, wurden Schlepper beider Hersteller angeboten. Eines dieser Modelle war der ALLIS-CHALMERS 6060, der jetzt als DEUTZ-ALLIS 6060 vermarktet wurde. ==Motor== * ALLIS-CHALMERS, Typ: 433 T, stehender-wassergekühlter Viertakt-Vierzylinder-Reihen-OHC-Saugmotor mit Direkteinspritzverfahren, hängenden Ventilen, zahnradgetriebener Nockenwelle, Reihen-Einspritzpumpe, Leichtmetall-Kolben, Trockenluftfilter, fünffach-gelagerter Kurbelwelle, mechanischer Fliehkraftregler, Turbolader, Druckumlaufschmierung mittels Zahnradpumpe, Motorölkühler, Mehrlochdüse und Lamellenkühler mit Lüfter. * Bohrung = 98,2 mm, Hub = 107,9 mm * Verdichtungsverhältnis = 14,1:1 * Mittlere Kolbengeschwindigkeit = 8,28 m/s * Geregelter Drehzahlbereich = 775 bis 2.580 U/min ==Kupplung== * Trockene Doppelkupplung Typ: 11/11" Pedal-betätigte Fahrkupplung mit 279,4 mm Scheibendurchmesser * Handhebel-betätigte Zapfwellenkupplung mit 279,4 mm Scheibendurchmesser ==Getriebe== * Im Ölbad laufendes, teilsynchronisiertes Gruppen-Getriebe * Wechselgetriebe mit vier Vorwärts-und einem Rückwärtsgang * Gruppen-Getriebe mit zwei Gruppen, in die Bereiche L und H unterteilt * Die Gänge 3+4 und 7+8 sind synchronisiert 8 Vorwärts- und 2 Rückwärtsgänge ==Geschwindigkeiten vor- und rückwärts== "Geschwindigkeiten mit Bereifung 18.4-28 AS" {| class="wikitable" |- ! bei Motordrehzahl (U/min) !! 2.300 |- ! Gruppe - L || |- | 1.Gang || 2,25 km/h |- | 2.Gang || 3,22 km/h |- | 3.Gang || 4,83 km/h |- | 4.Gang || 6,28 km/h |- | 1.Rückwärtsgang || 2,90 km/h |- ! Gruppe - H !! |- | 1.Gang || 8,05 km/h |- | 2.Gang || 11,59 km/h |- | 3.Gang || 17,22 km/h |- | 4.Gang || 22,37 km/h |- | 2.Rückwärtsgang || 10,46 km/h |- |} ==Zapfwelle== * Mechanisch-betätigte, kupplungsunabhängige Motorzapfwelle * Stummel = 1 3/8"- 6 Keile * Einfach schaltbar, 540 U/min. * 540 U/min. mit 2.226 U/min.- Motordrehzahl Übertragbare Leistung = 65,8 DIN-PS * Oder 558 U/min. mit Nenndrehzahl Übertragbare Leistung = 64,7 DIN-PS ==Bremsen== * Pedal-betätigte, hydraulisch-nasse Scheibenbremse auf die Differentialseitenwellen wirkend, als Einzelrad-Bremse ausgebildet * Handhebel-betätigte Feststellbremse auf die Getriebe-Zwischenwelle wirkend ==Achsen== * Pendelnd-aufgehängte Stahlvorderachse Verstellbare Spurweite = 1.371 bis 2.007 mm (Optional = 1.676 bis 2.540 mm) * Pendelnd-gelagerte Lenktriebvorderachse mit zentraler Gelenkwelle Verstellbare Spurweite = 1.499 bis 1.930 mm * Hinterachse mit Kegelradgetriebe und Endantrieb als Stirnradübersetzung * Mechanisch-betätigte Differentialsperre Verstellbare Spurweite = 1.448 bis 2.261 mm (Optional = 1.626 bis 2.438 mm) * Vordere Achslast = 971 kg * Hintere Achslast = 1.962 kg ==Lenkung== * Hydrostatische Lenkung Förderleistung = 28,7 l/min. ==Hydrauliksystem und Kraftheber== * Hydraulischer Blockkraftheber mit Unterlenkerregelung * Einfachwirkender Hubzylinder * Dreipunktkupplung der Kategorie II "Funktionen:" * Heben, Senken, Schwimmstellung, Zugkraft- und Lageregelung * Zahnradpumpe mit 71,9 l/min bei 175 bar und Nenndrehzahl Max. Hubkraft 610 mm hinter den Koppelpunkten = 1.588 kg ==Steuergeräte== * Ein einfach- oder doppelt-wirkendes Steuergerät * Auf Wunsch bis zu drei einfach- oder doppelt-wirkende Steuergeräte ==Elektrische Ausrüstung== "12 Volt-Einrichtung" * Lichtmaschine, 14 V-72 A ==Maße und Abmessungen== * Länge über alles = 3.721 mm * Breite bei kleinster Spurweite = 1.740 mm * Höhe über Motorhaube = 1.763 mm * Höhe über Kabine = 2.621 mm * Höhe über Auspuff = 2.799 mm * Radstand = 2.362 mm (4 WD = 2.334 mm) * Bodenfreiheit unter der Vorderachse = 518 mm (4 WD = 460 mm) * Betriebsgewicht = 2.933 kg (4 WD = 3.296 kg) ==Bereifung== "Standardbereifung:" * Vorne = 7.50-16 AS Front (4 WD = 11.2-24 AS) * Hinten = 16.9-28 AS (4 WD = 18.4-28 AS) "Optional:" * Vorne = 6.50-16 und 9.5 L-15 AS Front (4 WD = 11.2-28 AS) * Hinten = 15.5-38 und 13.6-38 AS ==Füllmengen== * Tankinhalt = 121,0 l * Motoröl mit Filter = 9,5 l * Kühlsystem = 16,0 l * Getriebe = 11,4 l * Differential = 35,0 l ==Verbrauch== * Kraftstoffverbrauch = 15,3 l/h bei 47,6 kW und Nenndrehzahl ==Kabine== * Fahrerstand mit seitlichem Aufstieg, Schutzrahmen, gefederten Sitz, Öldruck- und Batterieanzeige, Motortemperaturanzeige, Blinker und Luftfilteranzeige, Traktormeter mit Anzeige der Motor- und Zapfwellendrehzahlen und der Betriebsstunden. "Optional:" * Kabine mit Komfort-Sitz, Heizung, Klimaanlage und Arbeitsscheinwerfer ==Sonderausrüstung== * Kabine * Zusatzgewichte * Arbeitsscheinwerfer * Heizung ==Literatur & Weblinks== * tractordata.com * Brochure Deutz-Allis Corporation * digitalcommons.unl.edu (Test-Nr. 1397/81) <references /> {{:Traktorenlexikon: Navigation |HERSTELLER-LINK=Traktorenlexikon: Deutz-Allis |HERSTELLER= Deutz-Allis}} hyt0n8700umdjs2kroszux4ax6w4eci Traktorenlexikon: Deutz-Allis 6070 0 122396 1082860 2026-04-06T13:31:01Z Baupit 56622 Neue Seite (vgl. [[WB:AZ]]) 1082860 wikitext text/x-wiki {{:Traktorenlexikon: Navigation |HERSTELLER-LINK=Traktorenlexikon: Deutz-Allis |HERSTELLER= Deutz-Allis}} {{:Traktorenlexikon: Modell-Infobox | HERSTELLER = DEUTZ-ALLIS | MODELLREIHE = 6.000 er- Serie | MODELL = 6070 | BILD = | BILDBESCHREIBUNG = | BAUWEISE = Blockbauweise | PRODUKTIONSBEGINN = 1985 | PRODUKTIONSENDE = 1988 | STÜCKZAHL = | EIGENGEWICHT = 2.767 (4 WD: 2.948) | LÄNGE = 3.721 | BREITE = 1.740 | HÖHE = 2.621 | RADSTAND = 2.362 (4 WD: 2.334) | BODENFREIHEIT = 518 (4 WD: 459) | SPURWEITE = | SPURWEITE VORNE = 1.442-2.007 (4 WD: 1.524-1.981) | SPURWEITE HINTEN = 1.524-2.184 (4 WD: 1.499-2.184) | WENDERADIUS MIT LENKBREMSE = 3.170 (4 WD: 4.648) | WENDERADIUS OHNE LENKBREMSE = 3.580 (4 WD: 5.791) | BEREIFUNG VORNE = 7.50-16 ASF (4 WD: 11.2-24 AS) | BEREIFUNG HINTEN = 16.9-28 AS (4 WD: 18.4-28 AS) | LEISTUNG KW = 52,2 | LEISTUNG PS = 71 | NENNDREHZAHL = 2.300 | ZYLINDER = 4 | HUBRAUM = 3.287 | DREHMOMENTANSTIEG = | KRAFTSTOFF = Diesel | KÜHLSYSTEM = Wasserkühlung | ANTRIEBSTYP = Heck- oder Allradantrieb | GETRIEBE = 12 V/3 R | HÖCHSTGESCHWINDIGKEIT = 25 | KATEGORIESORTIERUNG = }} Nachdem im März 1985 die KLÖCKNER-HUMBOLD-DEUTZ AG den traditionellen Hersteller ALLIS-CHALMERS übernommen hatte, wurden Schlepper beider Hersteller angeboten. Eines dieser Modelle war der ALLIS-CHALMERS 6070, der jetzt als DEUTZ-ALLIS 6070 vermarktet wurde. Der DEUTZ-ALLIS 6070 verfügte gegenüber dem Modell 6060, über ein 12/3-Gänge Triebwerk. Ansonsten waren abgesehen von der Nennleistung, waren beide Schlepper weitgehend identisch. ==Motor== * ALLIS-CHALMERS, Typ: 433 T, stehender-wassergekühlter Viertakt-Vierzylinder-Reihen-OHC-Saugmotor mit Direkteinspritzverfahren, hängenden Ventilen, zahnradgetriebener Nockenwelle, Kolbenkühlung, Reihen-Einspritzpumpe, Leichtmetall-Kolben, Trockenluftfilter, fünffach-gelagerter Kurbelwelle, mechanischer Fliehkraftregler, Turbolader, Druckumlaufschmierung mittels Zahnradpumpe, Motorölkühler, Mehrlochdüse und Lamellenkühler mit Lüfter. * Bohrung = 98,2 mm, Hub = 107,9 mm * Verdichtungsverhältnis = 15,1:1 * Mittlere Kolbengeschwindigkeit = 8,28 m/s * Geregelter Drehzahlbereich = 775 bis 2.580 U/min ==Kupplung== * Trockene Doppelkupplung Typ: 12/12" Pedal-betätigte Fahrkupplung mit 304,8 mm Scheibendurchmesser * Mechanisch-betätigte Zapfwellenkupplung mit 304,8 mm Scheibendurchmesser ==Getriebe== * Im Ölbad laufendes, synchronisiertes Gruppen-Getriebe * Wechselgetriebe mit vier Vorwärts-und einem Rückwärtsgang * Gruppen-Getriebe mit drei Gruppen, in die Bereiche L-M und H unterteilt 12 Vorwärts- und 3 Rückwärtsgänge ==Geschwindigkeiten vor- und rückwärts== "Geschwindigkeiten mit Bereifung 18.4-28 AS" {| class="wikitable" |- ! bei Motordrehzahl (U/min) !! 2.300 |- ! Gruppe - L || |- | 1.Gang || 1,61 km/h |- | 2.Gang || 2,09 km/h |- | 3.Gang || 2,90 km/h |- | 4.Gang || 3,22 km/h |- | 1.Rückwärtsgang || 1,45 km/h |- ! Gruppe - M || |- | 1.Gang || 4,51 km/h |- | 2.Gang || 5,79 km/h |- | 3.Gang || 7,40 km/h |- | 4.Gang || 9,17 km/h |- | 2.Rückwärtsgang || 4,35 km/h |- ! Gruppe - H !! |- | 1.Gang || 13,04 km/h |- | 2.Gang || 17,06 km/h |- | 3.Gang || 21,40 km/h |- | 4.Gang || 26,88 km/h |- | 3.Rückwärtsgang || 12,55 km/h |- |} ==Zapfwelle== * Mechanisch-betätigte, kupplungsunabhängige Motorzapfwelle * Stummel = 1 3/8"- 6 Keile * Einfach schaltbar, 540 U/min. * 540 U/min. mit 2.228 U/min.- Motordrehzahl Übertragbare Leistung = 72,0 DIN-PS * Oder 558 U/min. mit Nenndrehzahl Übertragbare Leistung = 71,8 DIN-PS ==Bremsen== * Pedal-betätigte, hydraulisch-nasse Scheibenbremse auf die Differentialseitenwellen wirkend, als Einzelrad-Bremse ausgebildet * Handhebel-betätigte Feststellbremse auf die Getriebe-Zwischenwelle wirkend ==Achsen== * Pendelnd-aufgehängte Stahlvorderachse Verstellbare Spurweite = 1.442 bis 2.007 mm (Optional = 1.727 bis 2.438 mm) * Pendelnd-gelagerte Lenktriebvorderachse mit zentraler Gelenkwelle Verstellbare Spurweite = 1.524 bis 1.981 mm * Hinterachse mit Kegelradgetriebe und Endantrieb als Stirnradübersetzung * Mechanisch-betätigte Differentialsperre Verstellbare Spurweite = 1.499 bis 2.184 mm (Optional = 1.575 bis 2.464 mm) * Vordere Achslast = 1.034 kg * Hintere Achslast = 2.350 kg ==Lenkung== * Hydrostatische Lenkung Förderleistung = 28,7 l/min. ==Hydrauliksystem und Kraftheber== * Hydraulischer Blockkraftheber mit Unterlenkerregelung * Einfachwirkender Hubzylinder * Dreipunktkupplung der Kategorie II "Funktionen:" * Heben, Senken, Schwimmstellung, Zugkraft- und Lageregelung * Zahnradpumpe mit 71,9 l/min bei 175 bar und Nenndrehzahl Max. Hubkraft 610 mm hinter den Koppelpunkten = 1.588 kg ==Steuergeräte== * Ein einfach- oder doppelt-wirkendes Steuergerät * Auf Wunsch bis zu drei einfach- oder doppelt-wirkende Steuergeräte ==Elektrische Ausrüstung== "12 Volt-Einrichtung" * Lichtmaschine, 14 V-72 A ==Maße und Abmessungen== * Länge über alles = 3.721 mm * Breite bei kleinster Spurweite = 1.740 mm * Höhe über Motorhaube = 1.763 mm * Höhe über Kabine = 2.621 mm * Höhe über Auspuff = 2.799 mm * Radstand = 2.362 mm (4 WD = 2.334 mm) * Bodenfreiheit unter der Vorderachse = 518 mm (4 WD = 459 mm) * Betriebsgewicht = 3.384 kg (4 WD = 3.747 kg) ==Bereifung== "Standardbereifung:" * Vorne = 7.50-16 AS Front (4 WD = 11.2-24 AS) * Hinten = 16.9-28 AS (4 WD = 18.4-28 AS) "Optional:" * Vorne = 6.50-16 und 9.5 L-15 AS Front (4 WD = 11.2-28 AS) * Hinten = 15.5-38 und 13.6-38 AS ==Füllmengen== * Tankinhalt = 121,0 l * Motoröl mit Filter = 9,5 l * Kühlsystem = 16,0 l * Getriebe = 11,4 l * Differential = 35,0 l ==Verbrauch== * Kraftstoffverbrauch = 16,6 l/h bei 52,8 kW und Nenndrehzahl ==Kabine== * Fahrerstand mit seitlichem Aufstieg, Schutzrahmen, gefederten Sitz, Öldruck- und Batterieanzeige, Motortemperaturanzeige, Blinker und Luftfilteranzeige, Traktormeter mit Anzeige der Motor- und Zapfwellendrehzahlen und der Betriebsstunden. "Optional:" * Kabine mit Komfort-Sitz, Heizung, Klimaanlage und Arbeitsscheinwerfer ==Sonderausrüstung== * Kabine * Zusatzgewichte * Arbeitsscheinwerfer * Heizung ==Literatur & Weblinks== * tractordata.com * Brochure Deutz-Allis Corporation * digitalcommons.unl.edu (Test-Nr. 1545/84) <references /> {{:Traktorenlexikon: Navigation |HERSTELLER-LINK=Traktorenlexikon: Deutz-Allis |HERSTELLER= Deutz-Allis}} fpgz16103pfg8qe1ybyr0mmyef5a28j Traktorenlexikon: Deutz-Allis 6080 0 122397 1082863 2026-04-06T14:17:24Z Baupit 56622 Neue Seite (vgl. [[WB:AZ]]) 1082863 wikitext text/x-wiki {{:Traktorenlexikon: Navigation |HERSTELLER-LINK=Traktorenlexikon: Deutz-Allis |HERSTELLER= Deutz-Allis}} {{:Traktorenlexikon: Modell-Infobox | HERSTELLER = DEUTZ-ALLIS | MODELLREIHE = 6.000 er- Serie | MODELL = 6080 | BILD = | BILDBESCHREIBUNG = | BAUWEISE = Blockbauweise | PRODUKTIONSBEGINN = 1985 | PRODUKTIONSENDE = 1988 | STÜCKZAHL = | EIGENGEWICHT = 2.767 (4 WD: 3.175) | LÄNGE = 3.805 | BREITE = 1.857 | HÖHE = 2.621 | RADSTAND = 2.438 (4 WD: 2.421) | BODENFREIHEIT = 536 (4 WD: 447) | SPURWEITE = | SPURWEITE VORNE = 1.524-2.235 (4 WD: 1.702-2.134) | SPURWEITE HINTEN = 1.448-2.363 | WENDERADIUS MIT LENKBREMSE = 3.630 (4 WD: 4.693) | WENDERADIUS OHNE LENKBREMSE = 3.980 (4 WD: 6.077) | BEREIFUNG VORNE = 7.50-16 ASF (4 WD: 11.2-28 AS) | BEREIFUNG HINTEN = 18.4-34 AS (4 WD: 16.9-34 AS) | LEISTUNG KW = 61,8 | LEISTUNG PS = 84 | NENNDREHZAHL = 2.300 | ZYLINDER = 4 | HUBRAUM = 3.287 | DREHMOMENTANSTIEG = | KRAFTSTOFF = Diesel | KÜHLSYSTEM = Wasserkühlung | ANTRIEBSTYP = Heck- oder Allradantrieb | GETRIEBE = 12 V/3 R | HÖCHSTGESCHWINDIGKEIT = 30 | KATEGORIESORTIERUNG = }} Nachdem im März 1985 die KLÖCKNER-HUMBOLD-DEUTZ AG den traditionellen Hersteller ALLIS-CHALMERS übernommen hatte, wurden Schlepper beider Hersteller angeboten. Eines dieser Modelle war der ALLIS-CHALMERS 6080, der jetzt als DEUTZ-ALLIS 6080 vermarktet wurde. Er verfügte über das gleiche Vierzylinder-ALLIS-CHALMERS-Aggregat, wie seine beiden kleineren Brüder. Allerdings wurde bei diesem Modell zusätzlich mit Ladeluftkühlung gearbeitet. Der DEUTZ-ALLIS 6080 verfügte gegenüber dem Modell 6060, über ein 12/3-Gänge Triebwerk. ==Motor== * ALLIS-CHALMERS, Typ: 433 TI, stehender-wassergekühlter Viertakt-Vierzylinder-Reihen-OHC-Saugmotor mit Direkteinspritzverfahren, hängenden Ventilen, zahnradgetriebener Nockenwelle, Kolben-Ölkühlung, Reihen-Einspritzpumpe, Leichtmetall-Kolben, Trockenluftfilter, fünffach-gelagerter Kurbelwelle, mechanischer Fliehkraftregler, Turbolader incl. Ladeluftkühlung, Druckumlaufschmierung mittels Zahnradpumpe, Motorölkühler, Mehrlochdüse und Lamellenkühler mit Lüfter. * Bohrung = 98,2 mm, Hub = 107,9 mm * Verdichtungsverhältnis = 14,1:1 (Später = 15,1:1) * Mittlere Kolbengeschwindigkeit = 8,28 m/s * Geregelter Drehzahlbereich = 775 bis 2.580 U/min ==Kupplung== * Trockene Doppelkupplung Typ: 12/12" Pedal-betätigte Fahrkupplung mit 304,8 mm Scheibendurchmesser * Mechanisch-betätigte Zapfwellenkupplung mit 304,8 mm Scheibendurchmesser ==Getriebe== * Im Ölbad laufendes, synchronisiertes Gruppen-Getriebe * Wechselgetriebe mit vier Vorwärts-und einem Rückwärtsgang * Gruppen-Getriebe mit drei Gruppen, in die Bereiche L-M und H unterteilt 12 Vorwärts- und 3 Rückwärtsgänge ==Geschwindigkeiten vor- und rückwärts== "Geschwindigkeiten mit Bereifung 18.4-34 AS" {| class="wikitable" |- ! bei Motordrehzahl (U/min) !! 2.300 |- ! Gruppe - L || |- | 1.Gang || 1,61 km/h |- | 2.Gang || 2,25 km/h |- | 3.Gang || 2,74 km/h |- | 4.Gang || 3,38 km/h |- | 1.Rückwärtsgang || 1,58 km/h |- ! Gruppe - M || |- | 1.Gang || 4,83 km/h |- | 2.Gang || 6,44 km/h |- | 3.Gang || 8,05 km/h |- | 4.Gang || 9,98 km/h |- | 2.Rückwärtsgang || 4,67 km/h |- ! Gruppe - H !! |- | 1.Gang || 14,16 km/h |- | 2.Gang || 18,51 km/h |- | 3.Gang || 23,17 km/h |- | 4.Gang || 28,97 km/h |- | 3.Rückwärtsgang || 13,52 km/h |- |} ==Zapfwelle== * Mechanisch-betätigte, kupplungsunabhängige Motorzapfwelle * Stummel = 1 3/8"- 6 Keile oder 1 3/8"- 20 teilig * Zweifach schaltbar, 540/1.000 U/min. * 540 U/min. mit 2.124 U/min.- Motordrehzahl * 1.000 U/min. mit 2.408 U/min.- Motordrehzahl Übertragbare Leistung = 75,5 DIN-PS * Oder 955 U/min. mit Nenndrehzahl Übertragbare Leistung = 84,8 DIN-PS ==Bremsen== * Pedal-betätigte, hydraulisch-nasse Scheibenbremse auf die Differentialseitenwellen wirkend, als Einzelrad-Bremse ausgebildet * Handhebel-betätigte Feststellbremse auf die Getriebe-Zwischenwelle wirkend ==Achsen== * Pendelnd-aufgehängte Stahlvorderachse Verstellbare Spurweite = 1.524 bis 2.235 mm (Optional = 1.727 bis 2.540 mm) * Pendelnd-gelagerte Lenktriebvorderachse mit zentraler Gelenkwelle Verstellbare Spurweite = 1.702 bis 2.134 mm * Hinterachse mit Kegelradgetriebe und Endantrieb als Stirnradübersetzung * Mechanisch-betätigte Differentialsperre Verstellbare Spurweite = 1.448 bis 2.362 mm (Optional = 1.829 bis 2.438 mm) * Vordere Achslast = 1.052 kg * Hintere Achslast = 2.391 kg ==Lenkung== * Hydrostatische Lenkung Förderleistung = 28,7 l/min. ==Hydrauliksystem und Kraftheber== * Hydraulischer Blockkraftheber mit Unterlenkerregelung * Einfachwirkender Hubzylinder * Dreipunktkupplung der Kategorie II "Funktionen:" * Heben, Senken, Schwimmstellung, Zugkraft- und Lageregelung * Zahnradpumpe mit 71,9 l/min bei 175 bar und Nenndrehzahl Max. Hubkraft 610 mm hinter den Koppelpunkten = 2.041 kg ==Steuergeräte== * Ein einfach- oder doppelt-wirkendes Steuergerät * Auf Wunsch bis zu drei einfach- oder doppelt-wirkende Steuergeräte ==Elektrische Ausrüstung== "12 Volt-Einrichtung" * Lichtmaschine, 14 V-72 A ==Maße und Abmessungen== * Länge über alles = 3.805 mm * Breite bei kleinster Spurweite = 1.857 mm * Höhe über Motorhaube = 1.763 mm * Höhe über Kabine = 2.621 mm * Höhe über Auspuff = 2.799 mm * Radstand = 2.438 mm (4 WD = 2.421 mm) * Bodenfreiheit unter der Vorderachse = 536 mm (4 WD = 447 mm) * Betriebsgewicht = 3.443 kg (4 WD = 3.851 kg) ==Bereifung== "Standardbereifung:" * Vorne = 7.50-16 AS Front (4 WD = 11.2-28 AS) * Hinten = 16.9-34 AS (4 WD = 18.4-34 AS) "Optional:" * Vorne = 7.50-20, 10.00-16 und 9.5 L-15 AS Front (4 WD = 12.4-28 AS) * Hinten = 15.5-38 und 13.6-38 AS ==Füllmengen== * Tankinhalt = 121,0 l * Motoröl mit Filter = 9,5 l * Kühlsystem = 16,0 l * Getriebe = 11,4 l * Differential = 35,0 l ==Verbrauch== * Kraftstoffverbrauch = 19,0 l/h bei 62,4 kW und Nenndrehzahl ==Kabine== * Fahrerstand mit seitlichem Aufstieg, Schutzrahmen, gefederten Sitz, Öldruck- und Batterieanzeige, Motortemperaturanzeige, Blinker und Luftfilteranzeige, Traktormeter mit Anzeige der Motor- und Zapfwellendrehzahlen und der Betriebsstunden. "Optional:" * Kabine mit Komfort-Sitz, Heizung, Klimaanlage und Arbeitsscheinwerfer ==Sonderausrüstung== * Kabine * Zusatzgewichte * Arbeitsscheinwerfer * Heizung ==Literatur & Weblinks== * tractordata.com * Brochure Deutz-Allis Corporation * digitalcommons.unl.edu (Test-Nr. 1398/81) <references /> {{:Traktorenlexikon: Navigation |HERSTELLER-LINK=Traktorenlexikon: Deutz-Allis |HERSTELLER= Deutz-Allis}} 14x7ss9rvkpkl5soe7ff3bxfwo4bjhz