[Python]Bombers Fragetread

pineapplefreak

Lieutenant
Registriert
Okt. 2011
Beiträge
793
Hallo!
Ich hab mich jetzt, wie einige vlt schon wissen ;) dazu entschieden Python zu lernen. Jetzt diesen Thread: er wird mit einigen Fragen gefüllt, verlasst euch drauf :D

Ich fang einfach mal an!
Aufgabe:
"Fasse Öffnen und Schreiben der Datei zu einer Funktion zusammen, die Funktion bekommt als Parameter: den vollständigen Dateinamen (inclusive Pfad!) sowie den zu speichernden Text, Beispiel: schreibe_Datei(datei,text)."

Mein Programmtext dazu:
Code:
def dateischreiber(datei,text):
	in_datei = open(datei,"w")
	text = in_datei.write(text)
	in_datei.close()

Jetzt muss ich noch irgendwie die Parameter bekommen, bloß wie??
Sind das Funktionen, oder sind das Variablen?
Kann dazu bitte jemand einen Teil schreiben?
 
BomberDeluxe schrieb:
Jetzt muss ich noch irgendwie die Parameter bekommen, bloß wie??
Sind das Funktionen, oder sind das Variablen?
Kann dazu bitte jemand einen Teil schreiben?

Das kapier ich nicht?
du hast ja eh schon alles

in prinzip muss ja nur noch schreiben
Code:
mein_text = "halloWelt".
mein_dateiname= "halloWelt.txt"
dateischreiber (mein_dateiname,mein_text)
 
Danke nobs, ich hab den Fehler gefunden. Das Problem war, dass:
1. Variablen offenbar nur innerhalb einer Funktion gelten, und nach dem Ende der Funktion wieder gelöscht werden.
2. Ich habe eine Funktion als Parameter angesehen :rolleyes:
 
Also, hier die nächste Frage:
Code:
def sonderzeichen (zeile):
    text = ''
[B]    for i in range( len(zeile) ):[/B]
        if zeile[i] == 'ä':
            text = text + 'ä'
        elif zeile[i] == 'Ä':
            text = text + 'Ä'
        elif zeile[i] == 'ö':
            text = text + 'ö'
        elif zeile[i] == 'Ö':
            text = text + 'Ö'
        elif zeile[i] == 'ü':
            text = text + 'ü'
        elif zeile[i] == 'Ü':
            text = text + 'Ü'
        elif zeile[i] == 'ß':
            text = text + 'ß'
        elif zeile[i] == '<':
            text = text + '&lt;'
        elif zeile[i] == '>':
            text = text + '&gt;'
        elif zeile[i] == '&':
            text = text + '&amp;'
        elif zeile[i] == '"':
            text = text + '&quot;'
        else:
            text = text + zeile[i]
    return text

Diesen Code habe ich. Er soll ein HTML Filter werden, d.h. alle in HTML nicht darstellbaren Zeichen umwandeln. Jetzt meine Fragen:
1. text ist ja ein leerer String. Wozu dann die Zeilen mit text = text + '&quot;? Würde es nicht reichen zu schreiben text = '&quot;?
2. Was macht die fettgedruckte Zeile? Ich hab mit der For schleife so meine Probleme... Warum steht dort len?
3. Das return text löscht den Inhalt der Variable text?
4. Wie wird i definiert?
 
BomberDeluxe schrieb:
1. text ist ja ein leerer String. Wozu dann die Zeilen mit text = text + '&quot;? Würde es nicht reichen zu schreiben text = '&quot;?

Das würde bedeuten, dass man alle bereits gelesenen Zeichen ignorieren würde. Man will aber alle Zeichen der Zeile. Deswegen hängt der Programmierer bei jedem Zeilendurchlauf das neue Zeichen an die bereits gelesenen Zeichen an.

Übersetzt: Nimm den bereits gelesenen Text, hänge das neue Zeichen an, und speicher das als neuen Text ab.


BomberDeluxe schrieb:
2. Was macht die fettgedruckte Zeile? Ich hab mit der For schleife so meine Probleme... Warum steht dort len?

Um die Anzahl der Zeichen zu bestimmen. Die Schleife sorgt dafür, dass der Schleifenkörper so oft ausgeführt wird, wie Zeichen in der Zeile vorhanden sind.


BomberDeluxe schrieb:
3. Das return text löscht den Inhalt der Variable text?

Nein, es liefert den Rückgabewert der Methode. Hier also den Zeilentext mit den transformierten Sonderzeichen. Wenn keine Zeichen ersetzt wurden, ist das der gleiche Text wie am Anfang.


BomberDeluxe schrieb:
4. Wie wird i definiert?

Mit Hilfe der range-Funktion. Diese erstellt eine Liste mit Ganzzahlen von in diesem Fall 0 - Zeichenanzahl, die von der Schleife durchlaufen wird.
 
Ahh, erstmal danke!!
Zwei fragen hab ich noch:
Das zeile bedeutet sozusagen das i´ste zeichen in der Zeile, richtig?
Das len ist sozusagen die Zeichenanzahl von Zeile, richtig?
 
BomberDeluxe schrieb:
Das zeile bedeutet sozusagen das i´ste zeichen in der Zeile, richtig?


Mittels [] greift man auf das Array-Element an der angegebenen Index-Position zu. Im Beispiel ist dies in der Tat jeweils ein Zeichen der Zeile.


BomberDeluxe schrieb:
Das len ist sozusagen die Zeichenanzahl von Zeile, richtig?

len() ist eine interne Funktion mittels derer man die Länge eines Objektes ermitteln kann. In diesem Fall die Anzahl der Elemente im Zeichenarray.
 
Habs geschnallt, vielen Dank!

Eine Frage noch für heute:
Code:
		if test[i] == "e" or "i" or "o" or "u":
Wo ist der Fehler in dieser Zeile? Wenn ich nur "e": hinter dem == stehen habe, passt es... | kann ich nicht nutzen, da es ja Strings sind.

Edit: und wo ich gerade dabei bin... Wie schaffe ich es, dass z.B.
Code:
for i in range( len(wort) ):
dass ja jeden Buchstaben eines Wortes durchläuft...
von hinten nach vorn abläuft, also zuerst den letzten, bis zum 1. Zeichen. Gibt es da eine Möglichkeit?
 
Zuletzt bearbeitet:
BomberDeluxe schrieb:
ine Frage noch für heute:
Code:
		if test[i] == "e" or "i" or "o" or "u":
Wo ist der Fehler in dieser Zeile? Wenn ich nur "e": hinter dem == stehen habe, passt es... | kann ich nicht nutzen, da es ja Strings sind.
du musst schreiben
Code:
		if test[i] == "e" or test[i] == "i" or test[i] == "o" or test[i] == "u":
Der Interpreter weis ja nicth mit was du "i", "o", "u" usw. vergleichen willst.

BomberDeluxe schrieb:
Edit: und wo ich gerade dabei bin... Wie schaffe ich es, dass z.B.
Code:
for i in range( len(wort) ):
dass ja jeden Buchstaben eines Wortes durchläuft...
von hinten nach vorn abläuft, also zuerst den letzten, bis zum 1. Zeichen. Gibt es da eine Möglichkeit?
Lies dir die doku durch..
http://docs.python.org/library/functions.html#range
würde für dich so aussehen...
Code:
for i in range( len(wort),-1,-1 ):
 
Ok, vielen Dank
Übrigens:
Die letzte Codezeile funktioniert nicht.
Man muss schreiben:
Code:
for i in range( len(wort)-1,-1,-1 ):
 
Zur besseren Lesbarkeit würde ich definitiv auf folgendes setzen:
Code:
for i in reversed(range(len(wort))):
 
Wieder was gelernt ;)

EDIT: die alte Frage hat sich geklärt... ich lass nach if einfach immer was sinnloses machen ;D

Einwas hätte ich noch:
Was passt hier nicht:

Code:
def woerter():
        datei = "C:\Dokumente und Einstellungen\User\Desktop\text.txt"
	in_datei = open(datei,"r")
	text = in_datei.read()
	in_datei.close()
	wort = ""
	liste = [""]
	sonderzeichen = [","," ",".",";",":"]
	for i in range(len(text)):
		if text[i] in sonderzeichen:
			if wort in liste:
				a=1
			else:
				liste.append(wort)
			wort=""
		else:
			wort=wort+text[i]
	del liste[0]
	return liste

Soll auf Python 3.2 laufen.
Fehler ist in der 3. Zeile. Begründung:
SyntaxError: inconsistent use of tabs and spaces in indentation
 
Zuletzt bearbeitet:
vermute mal du hast tabs und spaces im text gemischt
Schalt bei deinem Editor die Whitespaces anzeige an, dann siehtst du was da schiefläuft
 
Sehr gut. Jetzt habe ich allerdings mal ein etwas komplexeres Programm. Es soll die Lebenstage eines Menschen zählen.
Leider funktioniert es nicht so ganz:

Code:
def alter():
	print ("Bitte nur in Zahlen antworten!\n")
	jahr = int(input("Geburtsjahr: "))
	monat = int(input("Geburtsmonat: "))
	tag = int(input("Geburtstag: "))
	djahr = 2012
	dmonat = 4
	dtag = 10
	lm = [1,3,5,7,8,10,12]
	km = [4,6,9,11]
	i = 0
[B]	while (jahr != djahr and monat != dmonat and tag != dtag):[/B]
		i = i + 1
		tag = tag+1
		if ((tag == 31 and monat == lm) or (tag == 30 and monat == km) or (tag == 28 and monat == 2)):
			tag = 1
			monat = monat + 1
		if (monat == 13):
			jahr = jahr + 1
			monat = 1
	i = str(i)		
	print ("Du bist genau " + i + " tage alt!")

Das Problem scheint in der fettgedruckten Zeile zu liegen. Und zwar wird das Programm ausgeführt bis einer der 3 Daten mit dem heutigem Datum übereinstimmen. Wie kann ich das lösen?

Ja ich weiß, dass ich Schaltjahre erstmal ausgelassen hab ;)
 
Das kann ich ja noch alles machen. Aber momentan gehts erstmal um das Prinzip hier, und zwar, warum Python die "and" nicht anerkennt und sozusagen zu einem "or" umwandelt...
Ergänzung ()

Hier mal der Neue Code, der das aktuelle datum verwendet.
Code:
def alter():
	import time
	date = time.localtime()
	print ("Bitte nur in Zahlen antworten!\n")
	jahr = int(input("Geburtsjahr: "))
	monat = int(input("Geburtsmonat: "))
	tag = int(input("Geburtstag: "))
	lm = [1,3,5,7,8,10,12]
	km = [4,6,9,11]
	i = 0
	while (jahr != date[0] and monat != date[1] and tag != date[2]):
		i = i + 1
		tag = tag+1
		if ((tag == 31 and monat == lm) or (tag == 30 and monat == km) or (tag == 28 and monat == 2)):
			tag = 1
			monat = monat + 1
		if (monat == 13):
			jahr = jahr + 1
			monat = 1
	i = str(i)		
	print ("Du bist genau " + i + " tage alt!")
Ergänzung ()

Ich verstehs nicht... Ich such jetzt seit bestimmt 4 Stunden den Fehler -.- ...
.
 
Zuletzt bearbeitet:
BomberDeluxe schrieb:
Das Problem scheint in der fettgedruckten Zeile zu liegen. Und zwar wird das Programm ausgeführt bis einer der 3 Daten mit dem heutigem Datum übereinstimmen. Wie kann ich das lösen?


Das Programm macht genau das, was da steht. Du solltest aber vielleicht nochmal Logik und boolsche Operatoren pauken. Die Negation von
Code:
(jahr == date[0] and monat == date[1] and tag == date[2])
ist nämlich nicht
Code:
(jahr != date[0] and monat != date[1] and tag != date[2])

Siehe http://de.wikipedia.org/wiki/De_Morgansche_Gesetze


Darüber hinaus ist dein Schleifenkörper auch nicht astrein.
Code:
monat == lm
muss
Code:
monat in lm
heissen, usw.
Und du setzt die Tag-Variable zu früh zurück. Deshalb zählst du pro Monat einen Tag zuwenig.


Code:
def alter():
	import time
	date = time.localtime()
	print ("Bitte nur in Zahlen antworten!\n")
	jahr = int(input("Geburtsjahr: "))
	monat = int(input("Geburtsmonat: "))
	tag = int(input("Geburtstag: "))
	lm = [1,3,5,7,8,10,12]
	km = [4,6,9,11]
	i = 0
	
	while not (jahr == date[0] and monat == date[1] and tag == date[2]):
		i = i + 1
		tag = tag+1
		if ((tag == 32 and monat in lm) or (tag == 31 and monat in km) or (tag == 29 and monat == 2)):
			tag = 1
			monat = monat + 1
		if (monat == 13):
			jahr = jahr + 1
			monat = 1
		
	i = str(i)		
	print ("Du bist genau " + i + " tage alt!")
 
Zuletzt bearbeitet:
Der Schleifenausdruck ist schon mal falsch. Sobald eine Bedingung eintritt, bricht die Schleife ab. Du willst aber erst aufhören, wenn alle Bedingungen eingetreten sind.

Dein Test, ob ein Monat gerade oder ungerade ist, ist ebenfalls nicht richtig. Du musst überprüfen, ob ein Element in der Liste ist, nicht ob das Element gleich der Liste ist!

Aber wie gesagt, viel einfacher ginge es mit Hilfe der Python Datefunktionen.
 
Ja, aber zu der Schleife
Übersetzt hieße sie doch:
Solange jahr ungleich date[0] and monat ungleich date[1] and tag ungleich date[2]
oder?

Und das mit dem einen Tag ist mir auch schon in den Kopf gekommen. Ich wollte nur erstmal das andere Problem lösen.
 
Zurück
Oben