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

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"
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

oh und danke! Wär schön wenns jemand sehn würde was falsch ist!
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Leonidas hat geschrieben:Eine Bitte zuerst: Verwende ab und zu Großbuchstaben.
/me hat geschrieben:Bezüglich der defekten Shift-Taste an deiner Tastatur kann ich dir übrigens die Newsgroup de.comp.hardware.misc empfehlen.
SCNR
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

lena_ hat geschrieben:Also wenn ich lambda x: vor eine Zeichenkette schreibe, ...
Du kannst lambda als Funktion betrachten. Kann auch mehrere Parameter besitzen und nicht nur x heissen. Bsp.:

Code: Alles auswählen

f = lambda a,b:a+b
ist identisch mit

Code: Alles auswählen

def f(a,b):
    return a+b
Ist im Prinzip nicht so wichtig, weil man auch ohne lambda auskommt. Trotzdem gut zu wissen. Wird hin und wieder verwendet um einfache Funktionen an map oder so zu übergeben. Ausserdem ist lambda limitiert auf einen Ausdruck. Mehr Info gibts übrigens in der Doku darüber.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Also mal ein paar kleine Tipps:
1) Jede ( sollte immer mit einer ) geschlossen werden
2) print kann nur strings ausgeben, also str(irgendwas)
3) Namen überprüfen

Und falls vor handen immer TraceBacks Posten

Code: Alles auswählen

import random

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

count = 0

while entry_number != secret_number:
    if entry_number < secret_number:
        print "Diese Zahl ist zu klein!"
    if entry_number > secret_number:
        print "Zu hoch!"
    entry_number = int(raw_input("Neuer Tipp: "))
    count += 1

print "Geschafft!" , secret_number, "war die geheime Zahl!"
print "Du hast " + str(count) + " mal geraten"
Zuletzt geändert von Py-Prog am Montag 28. Februar 2011, 15:54, insgesamt 3-mal geändert.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Py-Prog hat geschrieben:2) print kann nur strings ausgeben, also str(irgendwas)
Quatsch. Schon mal probiert?

Code: Alles auswählen

print 42
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

Ah! Jetzt hab ich mich voll gefreut weils nicht mehr gleich in Zeile 4 hängen geblieben ist, aber jetzt komm ich nciht über Zeile 16:

print "Geschafft!" , a, "war die geheime Zahl!"

bei print mach Python an das t ein Häckchen und sagt wiedermal "invalid syntax" habs jetzt schon in alle Varianten umgeschrieben die mir eingefallen sind! Es tritt immer der geliche Fehler auf, sogar wenn ich die Zeile einfch durch 'print 3' ersetzt!
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Ja, ich war aber wieder mal zu faul zum schreiben, aber wenn man schreibt:

Code: Alles auswählen

print "Text" + 80
geht das schlecht. :wink:

@lena_ bei mir geht der code den ich gepostet habe.
(Wozu Open Anno Unknown Horizons doch alles gut ist :wink: )
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

@py-prog: na ich weiß nciht was da kaputt ist, bei mir läufts nciht wegen dieser Zeile.. naja ich denk mir einfach es hätte funktioniert, und mach mit dem nächsten weiter..
Schade wär so a nettes Spiel gewesen ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Py-Prog hat geschrieben:Ja, ich war aber wieder mal zu faul zum schreiben, aber wenn man schreibt:

Code: Alles auswählen

print "Text" + 80
geht das schlecht. :wink:
Das hat allerdings nichts mit print zu tun, sondern damit, dass du versuchst, einen String mit einem Integer zu addieren. Das sagt dir aber auch schon die Fehlermeldung.
lena_ hat geschrieben:@py-prog: na ich weiß nciht was da kaputt ist, bei mir läufts nciht wegen dieser Zeile.. naja ich denk mir einfach es hätte funktioniert, und mach mit dem nächsten weiter..
Dann zeige doch mal deinen vollständigen Code und die vollständige Fehlermeldung.
Das Leben ist wie ein Tennisball.
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

okay:

Code: Alles auswählen

import random

a=int(random.uniform(0,1000))

z=int(raw_input("Welche Zahl koennte es sein?"))

c=0
while z!=a:
	c = c+1
	if z<a:
		print "Diese Zahl ist zu klein!"
	if z>a:
		print "Zu hoch!"
	a=int(raw_input("Neuer Tipp: ")

print "richtig"

print "Du hast" + str(c) + "mal geraten"
und die Fehlermeldung:
File "C:\pythonaufgaben\ratespiel.py, line 16
print "richtig"
^
SyntaxError: invalid syntax
wobei das ^ auf Höhe vom t ist. Die Einrückung nimmt das Zitat wohl nicht mit.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du hast (schon wieder) eine schließende Klammer vergessen, in der Zeile drüber.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
problembär

Ich würde jeweils Leerzeichen setzen, also z.B.

Code: Alles auswählen

a = 1
Außerdem weist Du der Zufallszahl (a) die Eingabe zu (es müßte vielmehr "z = ..." heißen).
Ich würd's so schreiben:

http://paste.pocoo.org/show/345817/

(Angucken bei Bedarf.)

Gruß
BlackJack

@lena_: Statt `random.uniform()` könntest Du Dir in dem Modul auch eine Funktion suchen die gleich eine ganze Zahl liefert.
lena_
User
Beiträge: 14
Registriert: Sonntag 27. Februar 2011, 11:55

also die Kausur ist vorbei, jetzt kommts auf die Korrektoren an!
Auf jeden Fall viele herzlichen Dank für eure Unterstützung! Es hat mir wirklich geholfen jemanden Fragen zu können!
Gruß,
Lena
Antworten