2010-03-15 14 views
5

Sorry, wenn dies ganz noobish dir ist, aber ich bin gerade erst aus Python zu lernen, nach C++ & Java zu lernen, und ich frage mich, wie in der Welt konnte ich nur Variablen wie id = 0 und name = 'John' s ohne int‘erklären oder string ist vorne! Ich habe herausgefunden, dass es vielleicht daran liegt, dass es keine ''s in einer Zahl gibt, aber wie würde Python das in etwas wie def increase(first, second) anstelle von etwas wie int increase(int first, int second) in C++ herausfinden ?!Wie unterscheidet Python zwischen den verschiedenen Datentypen?

+2

Nur ein Hinweis: Benennen Sie Ihre Variablen Sachen wie "ID" nicht, es wird die eingebaute Funktion ID() überschreiben. In Python sind Funktionen erstklassige Objekte, daher teilen sie sich den Namensraum mit Variablen. –

+0

Danke! Ich werde das im Hinterkopf behalten – wrongusername

+0

eine Sache, die ich von Python gelernt :: Boost ist, dass alles, ich meine __everything__ in Python ist vom Typ Object (Python-Objekt). So ist es möglich, dass ein int String oder char oder float oder was auch immer sein kann, alles ein Objekt und auf diese Weise behandelt wird. str, int usw. sind nur Ableitungen von Objekten und können somit transformiert werden. –

Antwort

13

Die literalen Objekte, die Sie erwähnen, tragen (Zeiger auf ;-) ihre eigenen Typen mit ihnen natürlich, wenn also ein Name an dieses Objekt gebunden ist, tritt das Problem des Typs nicht auf - das Objekt hat immer einen Typ, den name does not - delegiert das nur an das Objekt, an das es gebunden ist.

Es gibt kein „herauszufinden,“ in def increase(first, second): - nennen increase an eine Funktion Objekt gebunden wird, Namen first und second werden als Parameter-Namen aufgezeichnet und wird gebunden bekommen (möglicherweise auf Objekte unterschiedlicher Typen an verschiedenen Punkten) als increase wird aufgerufen.

sagen So ist der Körper return first + second - ein Aufruf an increase('foo', 'bar') wird dann 'foobar' gerne wiederkommen (die Übertragung der zusätzlich zu den Objekten, die in diesem Fall Strings sind), und vielleicht später ein Anruf an increase(23, 45) wird genauso gerne wieder 68 - erneut durch Delegieren des Zusatzes zu den Objekten, die an diese Namen gebunden sind, in diesem Fall sind sie Ints. Und wenn Sie mit inkompatiblen Typen aufrufen, erhalten Sie eine Ausnahme, da die delegierte Addition keinen Sinn ergibt - keine große Sache!

+0

Danke an Sie und alle anderen, die dazu beigetragen haben! :) – wrongusername

+0

+1 Dies ist eine großartige Antwort. –

4

Wenn es darum geht wörtliche Variablen Werte zu zuordnen, können die Art des wörtlichen Wertes zum Zeitpunkt der lexikalischen Analyse abgeleitet werden. Zum Beispiel kann alles, das mit dem regulären Ausdruck (-)?[1-9][0-9]* übereinstimmt, als Ganzzahl-Literal erkannt werden. Wenn Sie es in einen Float konvertieren möchten, muss eine explizite Umwandlung erfolgen. In ähnlicher Weise ist ein Zeichenfolgenliteral eine beliebige Folge von Zeichen, die in einfache oder doppelte Anführungszeichen eingeschlossen sind.

Bei einem Methodenaufruf werden die Parameter nicht typgeprüft. Sie müssen nur die richtige Anzahl von ihnen eingeben, um die Methode aufrufen zu können. Solange der Hauptteil der Methode keine Fehler in Bezug auf die Argumente verursacht, können Sie dieselbe Methode mit vielen verschiedenen Arten von Argumenten aufrufen.

+0

+1 Für "lexikalische Analyse" - kurz und korrekt! –

+0

(Natürlich sind die tatsächlichen lexikalischen Analyse-Regeln für das Parsing ein bisschen komplizierter als das.) –

+0

Auch um pedantisch zu sein, '(-)? [1-9] [0-9] *' wäre was ein * Dezimal * Ganzzahl Literal sieht aus wie. –

0

In Python, anders als in C++ und Java, sind Zahlen und Zeichenfolgen beide Objekte. So folgt aus:

id = 0 
    name = 'John' 

entspricht:

id = int(0) 
    name = str('John') 

Da Variablen id und name sind Referenzen, die jedes Python-Objekt ansprechen können, brauchen sie nicht mit einem bestimmten Typ deklariert werden.

+0

Warum der Downvote? – wrongusername

+1

Es gibt ein paar Dinge, die über diesen Beitrag irreführend sind. 1) Es ist wahr, dass Ints und Strs Objekte in Python sind und C++ und Java einige primitive Typen sowie Objekte haben, aber das ist nicht der Grund, warum Sie keine Variablen in Python deklarieren müssen. 2) Der entsprechende Code wäre 'id = int (0)' und 'name = str ('John')' '; 'Number' und' String' sind nicht die Namen von irgendetwas in Python, und es ist auch nicht wirklich klar, dass solche Dinge umformuliert werden müssen, wenn man bedenkt, dass dies noch das Erzeugen von 'int'- und' str'-Objekten aus Literalen erfordert. 3) "Objekt Zeiger" ist kein technischer Begriff im Zusammenhang mit Python AFAIK –

+0

Danke Mike! :) – wrongusername

7

Python ist dynamisch typisiert: alle Variablen können sich auf ein Objekt eines beliebigen Typs beziehen.id und name kann alles sein, aber die tatsächlichen Objekte sind von Typen wie int und str. 0 ist ein Literal, das geparst wird, um ein int Objekt und 'John' ein Literal zu machen, das ein str Objekt macht. Viele Objekttypen haben keine Literale und werden von einer aufrufbaren Funktion zurückgegeben (wie frozenset - es gibt keine Möglichkeit, einen literal eingefrorenen Satz zu erstellen, müssen Sie frozenset aufrufen.)

Folglich gibt es keine Deklaration von Variablen, da Sie definieren nichts über die Variable. id = 0 und name = 'John' sind nur Zuweisung.

increase gibt eine int zurück, weil das ist, was Sie darin zurückgeben; nichts in Python zwingt es, kein anderes Objekt zu sein. first und second sind nur ints, wenn Sie sie so machen.

Objekte haben bis zu einem gewissen Grad eine gemeinsame Schnittstelle. Sie können dieselben Operatoren und Funktionen für alle verwenden, und wenn sie diese bestimmte Operation unterstützen, funktioniert es. Es ist eine gängige, empfohlene Technik, verschiedene Typen zu verwenden, die sich in ähnlicher Weise austauschbar verhalten; Dies nennt man Ente Eingabe. Zum Beispiel, wenn etwas ein file Objekt nimmt, können Sie stattdessen ein cStringIO.StringIO Objekt übergeben, das die gleiche Methode wie eine Datei unterstützt (wie read und write), aber ein komplett anderer Typ ist. Dies ist eine Art Java-Schnittstelle, erfordert jedoch keine formelle Verwendung, Sie definieren nur die geeigneten Methoden.

+0

Danke! Ich würde Sie total auf den neuesten Stand bringen, aber leider wurde mein tägliches Wahllimit erreicht. – wrongusername

Verwandte Themen