Datentyp Array in Python

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.
FranzKaiser
User
Beiträge: 7
Registriert: Donnerstag 22. November 2007, 13:49

Guten Tag,
Da es in Python keinen explizipen Datentyp Array gibt, wollte ich dafür ein Programm schreiben.
Die Idee dahinter ist eine Liste derart zu modifizieren, dass sie genau wie bei Arrays nur für eine bestimmte Länge und einen bestimmten Datentyp zugänglich sein soll.
Nun habe ich folgendes Programm:

Code: Alles auswählen

import types

class Array:
    def __init__(self, size, datatype):
        
        self.size=size
        l=[]
        for s in range(1,size+1):
            s=l.append(None)
        self.size=len(l)
        self.datatype=type(l)
        print len(l)

    def insertElementAT(self, pos, element):
        self.pos=pos
        self.element=element
        if pos <= size-1:
            l.insert(pos,element)
        else:
            print("Error")
            
            
            



        




a = Array(4,int)
Leider gingen mir bei der Methode zum Einfuegen die Ideen aus.
Wie kann ich die Objekte die ich in Init belegt habe auch in meiner neuen Methode verfügbar machen?
Hat jemand vielleicht ein passendes Beispiel wie man den Datentyp Array in Python realisieren kann?
Schon mal danke für Eure Hilfe!
Sollte dieses Problem für euch trivial sein so entschuldige ich mich, ich bin noch nicht lange dabei.

Gruß FranzKaiser ein Python anfänger
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Moin & willkommen im Forum,
FranzKaiser hat geschrieben:Guten Tag,
Da es in Python keinen explizipen Datentyp Array gibt,
Das nicht, aber es gibt ein array-Modul welches zu den Standardmodulen gehört.

Und dann gibt es da noch http://numpy.scipy.org/ für die etwas anspruchsvolleren Unternehmungen. Der Quellcode enthält sicher eine fülle von Anregungen für Dein Projekt. Aber warum das Rad neu erfinden?

Gruß,
Christian
BlackJack

@FranzKaiser: Wozu brauchst Du denn so ein `Array`? Um den Typ von den Objekten zu beschränken, die man da hinein stecken kann? Das ist relativ "unpythonisch" weil es dem "duck typing" zuwiderläuft.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Du kannst deine Klasse auch so gestalten, dass sie sich wie eine Sequenz verhaelt, also dass man drueber iterieren kann und mit auf Elemente zugreifen kann (Stichwort: __setitem__, __getitem__, ...). Schau mal hier:
http://docs.python.org/ref/specialnames.html
http://docs.python.org/lib/module-operator.html

Eventuell macht es auch Sinn, von einer Liste zu erben und nur einige Funktionen zu aendern...

Aber wie gesagt wurde, falls das nicht nur zu Uebungszwecken ist, schau dir erstmal an, was es schon an vorhandenen Mittel gibt.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
FranzKaiser
User
Beiträge: 7
Registriert: Donnerstag 22. November 2007, 13:49

BlackJack hat geschrieben:@FranzKaiser: Wozu brauchst Du denn so ein `Array`? Um den Typ von den Objekten zu beschränken, die man da hinein stecken kann? Das ist relativ "unpythonisch" weil es dem "duck typing" zuwiderläuft.
Ich weiß, ich habe hier bereits eine Queue(Schlange) und einen Stack(Kellerspeicher) realisiert jetzt möchte ich sehen wie ich für Python ein Array realisieren kann.

Ich werd mir die Links aus der Doc mal durchlesen
Danke
Ich bin noch etwas Pythonfremd komme eher aus dem Java Bereich^^
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Ich bin noch etwas Pythonfremd komme eher aus dem Java Bereich^^
Merkt man. Ein Tipp (ich kam auch von Java): Gib nicht so viel auf typsicherheit. Das mag sich am Anfang "gefährlich" anfühlen, ist aber im endeffekt nichts, was man in python vermisst.
Wenn dir, warum auch immer Typsicherheit absolut wichtig ist, verwende lieber eine Sprache die das bietet.
Ich kann aber sagen, dass Typsicherheit häufig extrem überbewertet ist

http://www.mindview.net/WebLog/log-0052 Keine Ahnung, obs der Text ist, an den ich mich erinnere, aber Bruce Eckel hat da ganz interessante Sachen zu geschreiben.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

FranzKaiser hat geschrieben:Ich bin noch etwas Pythonfremd komme eher aus dem Java Bereich^^
Ja. Das merkt man :-)
TUFKAB – the user formerly known as blackbird
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

FranzKaiser hat geschrieben:Ich weiß, ich habe hier bereits eine Queue(Schlange) und einen Stack(Kellerspeicher) realisiert jetzt möchte ich sehen wie ich für Python ein Array realisieren kann.
:D

Code: Alles auswählen

class StackListBase(list):
    def push(self, elem):
        self.append(elem)

class Stack(StackListBase):
    def pop(self):
        return list.pop(self, -1)

class Queue(StackListBase):
    def pop(self):
        return list.pop(self, 0)
Man kann es natürlich noch allgemeiner machen..
BlackJack

@FranzKaiser: Was ist Dir denn an einer Liste nicht "Array" genug? Listen bieten doch auch ein "Array-Interface". Listen mit einer bestimmten Grösse sind mit ``*`` oder einer "list comprehension" schnell erzeugt, man kann per Index auf die Elemente zugreifen und die Länge abfragen. Ich sehe da keinen Grund unbedingt eine Klasse für zu schreiben.

Da Du von Java kommst: Die Implementierung von Python's Listen entspricht ungefähr einer `java.util.ArrayList`.
FranzKaiser
User
Beiträge: 7
Registriert: Donnerstag 22. November 2007, 13:49

BlackJack hat geschrieben:@FranzKaiser: Was ist Dir denn an einer Liste nicht "Array" genug? Listen bieten doch auch ein "Array-Interface". Listen mit einer bestimmten Grösse sind mit ``*`` oder einer "list comprehension" schnell erzeugt, man kann per Index auf die Elemente zugreifen und die Länge abfragen. Ich sehe da keinen Grund unbedingt eine Klasse für zu schreiben.

Da Du von Java kommst: Die Implementierung von Python's Listen entspricht ungefähr einer `java.util.ArrayList`.
Jip hab ich mir gedacht
Ich weiß auch das es in python überflüssig ist aber wissen wie es möglich ist möcht ichs trotzdem.
Man schreibt ja auch ne Ki für ein TicTacToe nur um zu zeigen das man es eben machen kann (oder brauch die Menschheit noch mehr Ki für TicTacToe?^^)

Edit: Sagtmal heißt es nicht Python: "Pseudocode that actually runs!"
Ich hab u.A. in C/C++/VB/JAVA(inkl. EE-Entwicklung) und Ocaml programmiert aber nichts fiel mir so schwer zu lernen wie Python

Gruß fK
Zuletzt geändert von FranzKaiser am Donnerstag 22. November 2007, 20:08, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Als Basisklasse würde ich ein Dictionary verwenden (schneller Zugriff und man bekommt auch gleich eine Meldung, falls ein Feld nicht initialisiert ist). Dann solltest du vielleicht noch die Methoden "__getitem__" und "__setitem__" kennen, so wie die Funktion "isinstance". Damit sollte sich alles machen lassen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

FranzKaiser hat geschrieben:Edit: Sagtmal heißt es nicht Python: "Pseudocode that actually runs!"
Ich hab u.A. in C/C++/VB/JAVA(inkl. EE-Entwicklung) und Ocaml programmiert aber nichts fiel mir so schwer zu lernen wie Python
Das mag sein, wenn man "vorbelastet" ist. Mir fällt es ebenso schwer wirklich funktional zu denken.
Vielleicht gehst du aber auch von der falschen Perspektive ran: in anderen Sprachen mag es üblich sein, sich Datentypen zu implementieren, in python hat man ja schon viele brauchbare.

Ich habe mal ein etwas umfangreicheres Beispiel geschrieben: #11942. Man hätte es vereinfachen können, wenn man das Array-Objekt etwas mehr eingeschränkt hätte. Ist natürlich so noch nicht ganz fertig (`extend`, die an `list.__item__` übergebenen Parameter), aber irgendwas muss ich dir ja auch überlassen ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

FranzKaiser hat geschrieben:Edit: Sagtmal heißt es nicht Python: "Pseudocode that actually runs!"
Ich hab u.A. in C/C++/VB/JAVA(inkl. EE-Entwicklung) und Ocaml programmiert aber nichts fiel mir so schwer zu lernen wie Python
'Tschuldigung wenn das jetzt etwas hart klingt, aber der Quelltext im ersten Beitrag lässt eher vermuten Du hättest gar keine Ahnung vom Programmieren. Oder Du bist der Meinung "Pseudocode that actually runs!" bedeutet man könnte wahllos irgendetwas hinschreiben und das tut dann was man sich denkt was es tun sollte.

Die `Array.__init__()` sieht nicht aus als wenn da auch nur eine Sekunde drüber nachgedacht wurde. Was die Zuweisung an `s` in der Schleife oder das Zuweisen von `self.size` auf die Länge der Liste, die ja so lang ist wie der alte Wert von `self.size` bewirken soll, ist mir absolut schleierhaft. Genauso Zeile 11: In Zeile 7 wird `l` an eine Liste gebunden. Was wird in Zeile 11 dann wohl der Typ von dem Objekt sein? Richtig: `list`. Immer.

Die Probleme sehe ich da weniger bei der Sprache, sondern eher grundsätzlich bei der sprachunabhängigen Logik. Ich sehe jedenfalls nicht dass Du in der Lage wärst das in Java zu formulieren. Typische Umsteigerprobleme sehen jedenfalls anders aus.

Und so weit ist Python nun auch wieder nicht von den anderen imperativen Sprachen entfernt. Das Tutorial durcharbeiten und die Doku zu Funktionen lesen muss man trotzdem.
FranzKaiser
User
Beiträge: 7
Registriert: Donnerstag 22. November 2007, 13:49

BlackJack, du scheinst mir ein wenig Ungehalten und deine Krtik scheint mir doch überzogen, als Moderator solltest du deine Wort mit ein wenig mehr bedacht wählen.
Ich weiß ja nicht wie du programmiert oder wie es dir einfällt meinen Programmierstil anhand eines Programfetzens zu Analysieren und komplett kritisieren zu können. Das ist aber keine gute Etikette mein Lieber.
Ich werde es dir dennoch nicht Übel nehmen und deine Entschuldigug (wenn auch sehr unglücklich formuliert) akzeptieren.

Gruß
fK
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich kann BlackJack leider nur Recht geben. Über Array.__init__ scheinst Du Dir wirklich keinerlei Gedanken gemacht zu haben. Ein Argument zu übergeben (datatype), dies aber überhaupt nicht zu verwenden, ist sicher kein Problem des Umstiegs einer anderen Sprache auf Python.
FranzKaiser
User
Beiträge: 7
Registriert: Donnerstag 22. November 2007, 13:49

HWK hat geschrieben:Ich kann BlackJack leider nur Recht geben. Über Array.__init__ scheinst Du Dir wirklich keinerlei Gedanken gemacht zu haben. Ein Argument zu übergeben (datatype), dies aber überhaupt nicht zu verwenden, ist sicher kein Problem des Umstiegs einer anderen Sprache auf Python.
Du gibst mir aber schon recht das man aufgrud dieses Quelltextes nicht sagen kann das meine Java Fähigkeiten schlecht wären.
Das ist nunmal einfach kein Maßstab hier.
Ich konnte mich bislang erst etwa 10 Stunden mit Python als Sprache beschäftigen, normal reicht mir das um Formal in eine Sprache einzusteigen, wenn ich alles auf einen Blick habe.
Aber in Python fiel mir das schwerer.
Und der Bezug auf diesen Satz bzw dieses Statement war auch eher nicht so ernst gemeint.
Aber ich seh es nicht ein, dass sich manche Menschen einfach das Recht nehmen andere zu kritisieren.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ja!
BlackJack hat die Kritik wohl etwas heftig fromuliert.
Mfg
HWK
BlackJack

@FranzKaiser: Ich hab ja gesagt es mag heftig klingen, aber ich habe nicht auf Deine Java-Fähigkeiten sondern auf Programmierfähigkeiten im allgemeinen geschlossen. Der Code sieht einfach nicht so aus als wenn Du drüber nachgedacht hast, und das muss man in Java auch machen. Wenn ich mir die Klasse anschaue dann schliesse ich halt, dass Du in Java so etwas geschrieben hättest:

Code: Alles auswählen

import java.util.ArrayList;

class MyArray
{
    public int size;
    public Class datatype;
    public int pos;
    public Object element;
    
    public MyArray(int size, Object datatype)
    {
        this.size = size;
        ArrayList l = new ArrayList(0);
        for (int s = 1; s < size + 1; s++) {
            s = l.add(null);
        }
        this.size = l.size();
        this.datatype = l.getClass();
        System.out.println(l.size());
    }
    
    public void insertElementAT(int pos, Object element)
    {
        this.pos = pos;
        this.element = element;
        if (pos <= size - 1) {
            l.add(pos, element);
        } else {
            System.out.println("Error");
        }
    }
}
Java nimmt hier ein wenig Denkarbeit ab, weil der Quelltext zwei Fehler enthält, die aufgrund statischer Typisierung vom Compiler gemeldet werden.

Falls Du in Java so etwas nicht geschrieben hättest, frage ich mich warum dann in Python? So verschieden sind die Sprachen bei diesem Beispiel nicht.
FranzKaiser
User
Beiträge: 7
Registriert: Donnerstag 22. November 2007, 13:49

So hätte ich natürlich in Java niemals meinen Quelltext formuliert...
Ich sehe aber langsam wo bei mir der Denkfehler liegt.
Dennoch DARFST du es dir nicht herausnehmen jemanden auf diese weiße, mit den Informationen die du hast, derart zu kritisieren und persönlich anzugreifen (nichts anderes hast du versucht zu tun).
Ich stelle auch in Frage, dass du diese Kritik persönlich hättest äußern können.
In diesem Sinne möcht ich hier auch die Diskussion aber nun zum Ende kommen lassen, ich denke wir haben wohl alle besseres zu tun.
Danke für Eure Hilfe
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

FranzKaiser, du kennst halt unseren BlackJack nicht. :) Er hat wirklich viel Ahnung, hillft jedem weiter und nimmt sich immer Zeit, anderer Leute Quelltext zu lesen und zu kritisieren (und dass jemand den Code, den man hier reinstellt, kritisiert, damit muss man rechnen!). Dass er bei der Muehe, die er sich fuer andere Leute macht, auf "gesellschaftlichen Zucker" verzichtet und direkt seine Meinung sagt, ist vlt. etwas gewoehnungsbeduerfitg, aber man kann damit gut leben, man muss einfach wissen, das er das nicht persoenlich meint. Kommt vlt. noch dazu, dass Dinge geschrieben oftmals anders rueberkommen als gesprochen...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Antworten