Schrift
[thread]13172[/thread]

Was bedeutet das "-" ? (Seite 2)

Leser: 17


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
hlubenow
 2009-02-24 21:24
#119117 #119117
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
LanX-+2009-02-24 17:06:01--
Na jetzt must du uns aber erklären was "gewöhnliche Funktions-Argumente" in Python/Tkinter sind. Nur positional oder auch benannt?

Aber gern! Ich wollte euch halt nicht gleich ungefragt mit Code in anderen Sprachen belästigen.

Mit denen von http://www.python-forum.de/ hatte ich leider auch Ärger (die sind im allgemeinen schon recht kompetent, aber mehrere von ihnen sind leider sehr unhöflich, ich weiß nicht, warum). Vielleicht ist das auch einer der Gründe, warum ich jetzt mal hier auftauche.

Also: In Python heißt das Schlüsselwort für Funktionen "def" (statt in Perl: "sub").
Bei der Funktionsbeschreibung gibt man an, welche Argumente die Funktion erhalten soll.
Das ist ähnlich wie in C, aber man muß (und kann) nicht den Datentyp angeben.
Man kann also folgendes machen:
Code: (dl )
1
2
3
4
5
6
def myFunc(a, b):

print a
print b

myFunc(5, 7)

(Bitte aufrufen mit "python script.py".)

Beim Funktionsaufruf kann man zudem festlegen, auf welche Argumente sich die Übergabewerte beziehen sollen. Man braucht dann auch die Reihenfolge der Übergabewerte nicht einzuhalten:
Code: (dl )
1
2
3
4
5
6
def myFunc(a, b):

print a
print b

myFunc(b = 7, a = 5)

Außerdem kann man bei der Funktionsbeschreibung zusätzlich Default-Werte für die Argumente angeben:
Code: (dl )
1
2
3
4
5
6
def myFunc(a = 1, b = 2):

print a
print b

myFunc(b = 7)

Ein Klassenkonstruktor ist in Python im Prinzip genau so eine "def"-Funktion (mit dem festgelegten Namen "__init__" und der Klasse selbst als erstem Argument (self)). Man kann dem Konstruktor also auch auf die oben beschriebene Weise Werte übergeben (übrigens auch direkt Listen, Hashes oder sogar größere Objekte, ohne daß diese plattgedrückt werden, so daß man mit ihnen direkt weiterarbeiten kann).

Die Perl/Tk-Zeile
Code (perl): (dl )
my $label = $main->Label(-text => 'Hello, world!');

sähe in Python/Tkinter dann also so aus:
Code: (dl )
label = Tkinter.Label(master = main, text = 'Hello, world!')

Lauffähiger Code dann insgesamt:
Code: (dl )
1
2
3
4
5
6
import Tkinter 

main = Tkinter.Tk()
label = Tkinter.Label(master = main, text = 'Hello, world!')
label.pack()
main.mainloop()

Da die Werte in der Weise wie oben angegeben übergeben werden müssen, muß man hier "master = main" und "text = 'Hello, world!'" schreiben (oder schlicht "main, 'Hello, world!'). Sowas wie "-master => main" geht aber nicht. Also kein Bindestrich.

Hmm, ich hoffe, ich habe mich klar genug ausgedrückt.

Viele Grüße
LanX-
 2009-02-24 21:59
#119118 #119118
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
hlubenow+2009-02-24 20:24:28--
Hmm, ich hoffe, ich habe mich klar genug ausgedrückt.


doch danke! 8 )

eine kleine Nachbemerkung,das "Plattdrücken" ist manchmal sehr praktisch, aber man es in Perl auch unterbinden, indem man explizit Referenzen übergibt:

Code (perl): (dl )
aufruf(\@array,\%hash,...)


es geht also wie in Python nur das Defaultverhalten ist andersrum (ich vermute mal ihr müsst zum Plattdrücken sowas wie ne Methode flatten() aufrufen.)

Hash und Array-Refrenzen gehen auch literal
Code (perl): (dl )
1
2
$hash_ref={key =>"value"};
$arr_ref=[1,2,3]:


das Defaultverhalten wird in Perl6 umgedreht das heißt man muss explizit angeben wenn man flatten möchte!

Flachdrücken ist z.B. praktisch, wenn man bestimmte Parameter nicht ständig wiederholen möchte:

Code (perl): (dl )
1
2
3
4
5
sub superaufruf() {
  @vorbelegt=@_;
  aufruf1(para1,para2,@vorbelegt);
  aufruf2(para1,para2,@vorbelegt);
}


Werden in Python eigentlich einfache Werte ("Skalare) byReference oder byValue übergeben?

also wird mit
Code: (dl )
1
2
def aufruf(a):
a="x"

die ursprüngliche Variable für a verändert, oder nur die lokale Kopie?

Datenstrukturen werden doch sicher byReference übergeben, wie kopiere ich die dann, wenn ich die ursprünglichen Daten nicht verändern möchte?

also das ist in Perl eine (flache) Kopie
Code (perl): (dl )
1
2
3
@a=@b;
%a=%b;
@a=%b; #geht übrigens auch 

Cheers
rolf
LanX-
 2009-02-24 22:06
#119119 #119119
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
hlubenow+2009-02-24 20:24:28--
Beim Funktionsaufruf kann man zudem festlegen, auf welche Argumente sich die Übergabewerte beziehen sollen. Man braucht dann auch die Reihenfolge der Übergabewerte nicht einzuhalten:
Code: (dl )
1
2
3
4
5
6
def myFunc(a, b):

print a
print b

myFunc(b = 7, a = 5)


kann man auch mischen?
also st das dann das gleiche?

Code: (dl )
myFunc(b = 7, 5)


aja ... habs rausbekommen ... geht so nicht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
>>> myFunc(b="A","B")
File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
>>> myFunc("A",a="B")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: myFunc() got multiple values for keyword argument 'a'
>>> myFunc("A",b="B")
A
B
neniro
 2009-02-24 23:03
#119120 #119120
User since
2008-12-14
79 Artikel
BenutzerIn
[default_avatar]
Hallo Rolf,
LanX-+2009-02-24 20:59:11--
Werden in Python eigentlich einfache Werte ("Skalare) byReference oder byValue übergeben?

immer als Referenz.
LanX-+2009-02-24 20:59:11--
Datenstrukturen werden doch sicher byReference übergeben, wie kopiere ich die dann, wenn ich die ursprünglichen Daten nicht verändern möchte?

Bei Listen per vollständigem List-Slice, ansonsten gibt es irgendwo einen deepcopy-Methode um Objekte zu klonen (müsste nachschauen).

Gruß,
Ronnie
-- yet another amateur perl hacker
hlubenow
 2009-02-25 01:43
#119121 #119121
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
Hi,

noch ein kurzes Code-Beispiel zu den Fragen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# By reference:

def myFunc(a):

print a
a = 15

a = 5
myFunc(a)
print a

print "List-cloning:"

l = [1, 2, 3, 4]
# m = l[1:3] bei Listenteil.
m = l[:]

for i in m:
print i


Beim Programmieren taucht die Frage "Übergabe per Referenz" jedenfalls bei mir aber irgendwie kaum auf.
Listen kopieren muß man manchmal: Es kann sein, daß man ein Element aus einer Liste entfernen will, während man mit einer for-Schleife über sie iteriert. Das gibt schwer zu findende Fehler, weil die for-Schleife dadurch unbemerkt verkürzt wird. In dem Fall muß man also eine Kopie der Liste machen und nur aus dieser Kopie Elemente entfernen. Am Ende, d.h. nach der Schleife, ggf. auf die Ursprungsliste zurückkopieren. Mit "del l2" kann man dann noch die zweite Liste explizit löschen, wenn man nicht auf die Garbage-Collection warten will.

Viele Grüße
LanX-
 2009-02-25 11:55
#119125 #119125
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
hlubenow+2009-02-25 00:43:18--
...
[code]# By reference:
>>> def myFunc(a):
... print a
... a = 15
...
>>> a = 5
>>> myFunc(a)
5
>>> print a
5


by mir kommt in der Pythonshell 5 raus, muss also by-value sein.

Cheers Rolf

PS: wg 3 Tagen Deutschen Perl Workshop werd ich jetzt erstmal offline sein...
FoolAck
 2009-02-25 12:49
#119126 #119126
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Quote
immer als Referenz.

Quote
by mir kommt in der Pythonshell 5 raus, muss also by-value sein.

Dazu hab ich für python mal die Formulierung "call by object reference" (edit: ist tatsächlich aus dem zweiten Link) gehört.
Ein paar Links:
Python Call by Value and Call by Reference
Call by Object
Wer's sich antun möchte
LanX-
 2009-02-25 13:17
#119128 #119128
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
ah ich erinnere mich, durch ne zuweisung wird automatisch ne lokale variable a im scope angelegt, als ob die "my"'s in perl automatisch erzeugt würden. (davor kann man noch darauf zugreifen)

das wird imho erst mit python 3000 gelöst ("nonlocal" oder so), sonst brauchts hacks ...

würd mich wahrscheinlich nerven, obwohl man sich die "my"s spart!
hlubenow
 2009-02-26 18:24
#119182 #119182
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
Oh, ich sehe gerade, da hatte ich wohl oben Übergabe "per Referenz" und "per Kopie" verwechselt.

Übrigens werde ich, glaube ich, Perl-Code ab jetzt mit

http://search.cpan.org/~fxn/Acme-Pythonic-0.46/lib...

schreiben und mir so die () und {} automatisch erzeugen lassen, indem ich den Code mit
Code (perl): (dl )
perl -c -MFilter::ExtractSource pythonicscript.pl > realperl.pl

in reguläres Perl umwandeln lasse ...

Viele Grüße
LanX-
 2009-02-26 20:03
#119186 #119186
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Denk dran was dem Roadrunner passiert wenn er ACME Produkte benutzt... *fg*

Und IMHO ist doch byReference in Python, man hat aber nix davon ohne nonlocal.

http://blog.gungfu.de/archives/2008/12/14/python-3...
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2009-02-22 22:54.