pythonanfänger weiß nicht weiter

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

Hallo!

ich weiß nicht ob ich hier richtig bin, aber ich weiß nicht wo ich sonst fragen könnte. seit ca einer woche versuche ich mir python beizubringen. meine commilitonen und ich haben das fach unterm semester zu sehr auf die leichte schulter genommen und gedacht wir bringen uns das in der woche vor der klausur bei. Jetzt sind alle abgesprungen und wollen das im fünten machen, weil sie denken dass wirs nciht schaffen. ich würds trotzdem gern versuchen, und hätt mir auch erhofft dass ich dann leichter eine hiwi-stelle finde. aber inzwischen bin ich auch am verzweifeln, ich weiß gar nicht mehr wie ichs mir beibringen könnte. und oft wenn ich dann musterlkösungen oder sowas anschaue, dann verstehe ich die nichtmal weil ich nicht verstehe für was zB ein self. gut sein könnte, und zum fragen weiß cih niemand. Könnt ihr mir hier vielleicht einen tipp geben oder bin ich hier auch falsch?
liebe grüße,
lena.

PS: es würde mir schon ungemein helfen wenn jemand a gute seite wüsste wo ich zB self eingeben kann und dann eine erläuterung dazu erscheint, so eine art online-wörterbuch. am besten auf deutsch und absolut anfängertauglich erklärt..
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo lena_, willkommen im Forum,

Eine Bitte zuerst: Verwende ab und zu Großbuchstaben. So fand ich deinen Text ziemlich nervig zu lesen.

Was du durchlesen solltest ist einfach das offizielle Tutorial, entweder auf Englisch oder die deutsche Übersetzung. Wenn dir nach dem Durcharbeiten Sachen noch nicht klar sind, dann kannst du sie gerne hier stellen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

vielen Dank erstmal.

Da ich schon so ein Python-buch/skript größtenteils durchgelesen/gemacht habe, und das Pythontutorial recht ähnlich aussieht, dachte ich dass mich das vll nicht viel weiter bringt.
Die Seite "a byte of python" allerdings scheint recht gut zu sein! Da steht auch was über self habe ich gerade gesehen!
Naja dann werd ich mal versuchen so mein Wissen zu erweitern um dann vielleicht mit den Aufgabenblättern endlich einigermaßen klar zu kommen.

Also Danke nochmal! Und bei konkreten Fragen darf ich mich nochmal melden, oder?!
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

lena_ hat geschrieben:Da ich schon so ein Python-buch/skript größtenteils durchgelesen/gemacht habe, ...
Ich glaube nicht, daß man eine Sprache lernt, wenn man nur liest. In erster Linie mußt Du sie sprechen. Auf Programmiersprachen übertragen Du mußt Python anwenden. Such Dir eine/mehrere Problemstellungen und löse sie mit Python.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

hendrikS hat geschrieben: Ich glaube nicht, daß man eine Sprache lernt, wenn man nur liest. In erster Linie mußt Du sie sprechen. Auf Programmiersprachen übertragen Du mußt Python anwenden. Such Dir eine/mehrere Problemstellungen und löse sie mit Python.
Sie schrieb doch, dass sie Übungsblätter besitzt. Ich vermute mal stark, dass da Aufgaben drin stehen, die man praktisch lösen kann / sollte ;-) Da es sich um eine Klausur handelt, werden dort sicherlich nicht reine Programmieraufgaben vorherrschen, sondern vermutlich auch generelle Konzepte. Da die Frage nach "self" kam, liegt die Vermutung nahe, dass das z.B. eine solche Frage sein könnte.

Da zudem die Zeit relativ knapp ist, kann man sich nicht nur durch praktische Beispiele zum Erfolg pushen - denn das kostet eben auch Zeit ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Hyperion hat geschrieben: ... sondern vermutlich auch generelle Konzepte. Da die Frage nach "self" kam,
Konzepte sollten ja üblicherweise in Vorlesungen vermittelt und in Seminaren vertieft werden. Wer diese ignoriert sollte sich dann nicht wundern. Und gerade beim Programmieren gilt: Übung macht den Meister.
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

ja also damit ihr nicht so viel spekulieren müsst: wir haben 12 Übungblätter auf denen Aufgaben draufstehen wie dass man ein Programm schreiben soll das pi approximiert, oder einen Text auf eine bestimmte Art verschlüsselt. Zumindest sind das Aufagebn von den ersten beiden Blättern später wird natürlich dementsprechend komplizierter. Natürlich wärs am sinnvollsten die durchzumachen, das habe ich auch versucht, aber wenn ichs mal schaff was zu schreiben was meiner ansicht nach sinnvoll ist, dann funktionierts nicht, ich weiß nicht warum, ich schau die musterlösung an, in der das Problem völlig anders gelöst wurde, und die ich vll auch nciht verstehe, und dann komm ich shcon wieder nciht mehr weiter!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, das scheint ja dann doch eher praktisch motiviert zu sein. Gabs dazu keine betreute Übungen? Wundert mich da doch ein wenig...

Natürlich gibt es oftmals viele Wege zum Ziel - insofern muss Deine Lösung ja nicht falsch sein. Es sei denn, es wurden Vorgaben gemacht, welche den Weg einschränken.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

lena_ hat geschrieben:Natürlich wärs am sinnvollsten die durchzumachen, das habe ich auch versucht, aber wenn ichs mal schaff was zu schreiben was meiner ansicht nach sinnvoll ist, dann funktionierts nicht, ich weiß nicht warum, ich schau die musterlösung an, in der das Problem völlig anders gelöst wurde, und die ich vll auch nciht verstehe, und dann komm ich shcon wieder nciht mehr weiter!
In diesem Fall würde es sich doch anbieten, die Aufgabenstellung inklusive deines Lösungsansatzes hier in das Forum zu stellen. So kann dir sicher am besten geholfen werden.
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

also ich hätt da a erste Frage: (muss ich die woanders reinstellen?)

die aufgabe ist:
1.) Auswerten eines Polynoms
Implementieren Sie eine Funktion polyval mit einer Liste von Koeffizienten a0;... ; an
und einer Zahl x € IR als Parameter. Die Funktion soll dann den Wert der Polynomfunktion
f(x) = a0 + a1x + ... + anx^n;
an der Stelle x zurueckgeben.

mein programm dazu funktioniert, meine Frage dazu wäre:
Kann ich polyval nicht auch ein polynom mit noch unbestimmten x ausgeben lassen? wenn ich das machen will sagt python immer x ist nicht definiert.. stimmt ja auch..

hier noch der code:

Code: Alles auswählen

def polyval(a, x):
	f=0
	for i in range(len(a)):
		f=f+a[i]*x**i
	return f

print polyval([1,2,3,0,7],x)
BlackJack

@lena_: Wie sollte denn das Ergebnis bei einem unbestimmten `x` aussehen bei einer Funktion die den Wert an der Stelle `x` ausrechnen soll!?

Zur Funktion: Schleifen über ``range(len(obj))`` sind in der Regel "unpythonisch". Wenn man den Index nicht benötigt, kann man direkt über `obj` iterieren, und falls man ihn benötigt, kann man die `enumerate()`-Funktion verwenden.

Um binäre Operatoren empfiehlt PEP 8 -- Style Guide for Python Code Leerzeichen zu setzen, um die Lesbarkeit zu erhöhen.

Die Funktion liesse sich mit `sum()` und einem Generatorausdruck auch als Einzeiler schreiben:

Code: Alles auswählen

def polyval(cs, x):
    return sum(c * x**i for (i, c) in enumerate(cs))
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

ah ok enumerate kannte ich nicht! und dass er mir Ergebnisse in Abhängigkeit von Variablen gibt geht nicht weil des nicht ausrechnen ist.. verstehe.. danke!
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

hab schon wieder ein problem mit Variablen..:

"Implementieren Sie eine Funktion g, welche als Argumente eine andere Funktion f sowie die Zahlen a; b € IR und n € IN erhaelt. Bestimmen Sie dann das Minimum und Maximum der Funktion f an den aquidistanten Stuetzstellen

ki = a + i *(b-a)/(n-1) ; 0<=i<n

und geben Sie das Ergebnis aus."

Code: Alles auswählen

def g(f, a, b,n):
	fmin=f(a)
	fmax=f(a)
	for i in range(n):
		x=a+i*(b-a)/(n-1)
		if f(x)>fmax:
			fmax=f(x)
		if f(x)<fmin:
			fmin=f(x)
	return fmin
	return fmax


print g(x**2,1,2,30)
der Fehler ist, dass x nicht definiert ist. Aber x wird ja in der for-Schleife in Abhängigkeit von i definiert. Wenn ich x gleich definiere (das hieße ja dass ich zB schreiben muss x=1) dann habe ich ja gar keine Funktion mehr! Dann funktioniert wiederum die for-Schleife nicht, was ja eigentlich der Sinn wäre! Was ist der Denkfehler, oder wie ist das in Wirklichkeit?

Vielen Dank schonmal, für eure Mühe!
BlackJack

@lena_: `f` muss eine Funktion sein und keine Zahl. Wenn Du ``x**2`` als Argument dort hin schreibst, dann wird erst dieser Ausdruck ausgewertet und das Ergebnis -- eine Zahl -- dann als Argument an `g()` übergeben. Du musst also entweder mit ``def`` oder mit ``lambda`` eine Funktion definieren die das Quadrat eines übergebenen Arguments ausrechnen. Im einfachsten Fall also ``lambda x: x**2``.

Edit: Jedesmal wenn Du in `g()` ``f(x)`` hinschreibst, bedeutet das, dass die Funktion aufgerufen und ausgerechnet wird. Du machst das ein bisschen zu oft mit dem gleichen `x`. Es wäre effizienter den Wert vor den Abfragen nur einmal auszurechnen und an einen Namen zu binden.

Ein ``return`` beendet die Abarbeitung einer Funktion. Anweisungen im gleichen Block, die danach kommen sind "toter Code" -- die werden die *niemals* ausgeführt. Man kann bei einem ``return`` immer nur einen Wert zurück geben. Das kann allerdings auch ein Container wie zum Beispiel ein Tupel sein, was mehrere Objekte enthält.

Und Du könntest Probleme mit der Division bekommen wenn Du nicht sicherstellst, dass entweder mindestens einer der beiden Operanden eine Fliesskommazahl ist, oder der ``/``-Operator eine "echte" Division ist -- entweder weil Du Python 3.x benutzt, oder weil am Anfang vom Modul ein ``from __future__ import division`` steht. Denn sonst:

Code: Alles auswählen

In [19]: 3 / 2
Out[19]: 1

In [20]: 3.0 / 2
Out[20]: 1.5
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

okay.. also ich habs jetzt so umgeschrieben:

Code: Alles auswählen

def f(x):
	f=x**4
	return f
	
def g(f, a, b,n):
	fmin=f(a)
	fmax=f(a)
	for i in range(n):
		x=a+i*(b-a)/(n-1.0)
		z=f(x)
		if z>fmax:
			fmax=f(x)
		if z<fmin:
			fmin=f(x)
	return (fmin,fmax)


print g(f,3,0.5,100)
und ich glaube ich verstehe das, dass ich f vorher als funktion definieren muss weil er sonst f für eine normale Variable hält..
Aber kann ich die Funktion dann nur im Quelltext definieren? Also ich mein wenn mans noch ein bisschen umschrieben würde könnte man g ja benutzen um minimum und maximum für beliebige a und b ausrechnen. Kann ich f nicht auch im Argument von g angeben? Also dass ich wenn ich Maxima von *belibigefkt* suche , dass ich zB eingeb g(*beliebigefkt*, 3,5)..? Oder wird das arg kompliziert? Wennns recht kompliziert ist, glaub ich müssen wir das nicht können!
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

lena_ hat geschrieben:Kann ich f nicht auch im Argument von g angeben?
Ja geht prinzipiell:

Code: Alles auswählen

print g(lambda x:x**4,3,0.5,100)
Würde ich aber nur bei einfachen Ausdrücken empfehlen.
BlackJack

@lena_: `f` ist auch so eine "normale Variable". Du musst an der Stelle bei `g` halt eine Funktion übergeben und keine Zahl. Wenn Du da einen Ausdruck hinschreibst, dann wird der ja ausgewertet *bevor* `g()` aufgerufen wird.

Also insofern geht das schon dass Du für *belibigefkt* eine beliebige Funktion schreiben kannst. Es muss halt auch tatsächlich eine Funktion sein. ``x**2`` ist keine Funktion. Dein `f` ist eine Funktion und ``lambda x: x**2`` wäre auch eine.

Falls Du wolltest, dass der Benutzer eine beliebige Funktion bzw. den Ausdruck für den Körper so einer Funktion als Zeichenkette eingeben kann, dann wird es in der Tat entweder kompliziert(er) oder (IMHO) sehr unsauber.

Du hast noch zwei Stellen wo Du `z` statt ``f(x)`` schreiben könntest.

Ich hätte es wohl so ausgedrückt:

Code: Alles auswählen

def g(f, a, b, n):
    fmin = fmax = f(a)
    factor = float(b - a) / (n - 1)
    for i in xrange(n):
        f_x = f(a + i * factor)
        fmin = min(fmin, f_x)
        fmax = max(fmax, f_x)
    return fmin, fmax
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

Also wenn ich lambda x: vor eine Zeichenkette schreibe, bedeutet das, dass Python die Zeichenkette als Funktion versteht, die auch noch von x abhängig sein kann?!
Genauso als ob ich f(x) vorher als Funktion definiert hätte, nur mit dem Vorteil, dass ich lambda auch direkt so in mein Argument schrieben kann!?

und wenn ich die Beschreibung zu xrange auf der Pythonseite richtig verstanden habe, dann kann man das genauso benutzen wie range nur arbeitet es effizienter, und gibt halt keine Liste aus. Stimmt das?
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

Noch eine Frage:
Da seh ich einfach nicht was Python nciht mag!

z=int(raw_input("geben sie eine Zahl ein!"))

Python macht ein Häkchen bei z und sagt "invalid syntax"

Was habe ich falsch gemacht?

Hier noch die ganze Aufgabe und der Code:

1.) Ratespiel
Schreiben Sie ein Programm, mit welchem der Benutzer eine Zufallszahl erraten kann. Dies soll so ablaufen: Das Programm erzeugt eine Zufallszahl (z.B. natuerliche Zahlen zwischen 0 und 1000) und der Benutzer kann seine Vermutung eingeben. Das Programm gibt dann entweder "zu gross", "zu klein" oder "richtig" zurueck.
Verwenden Sie z.B. die raw input() Funktion.

Code: Alles auswählen

import random

a=int(random.uniform(0,1000)
z=int(raw_input("Welche Zahl koennte es sein?"))

cout=0
while z!=a:
	if z<a:
		print "Diese Zahl ist zu klein!"
	if z>a:
		print "Zu hoch!"
	a=int(raw_input("Neuer Tipp: ")
	count=count+1
print "Geschafft!" , a, "war die geheime Zahl!"
print "Du hast" + count + "mal geraten"
Antworten