Seite 1 von 1
Prüfen ob Zahl mit Xy anfängt
Verfasst: Dienstag 11. September 2007, 14:50
von Shihan
Hallo,
ich möchte überprüfen ob eine Zahl z.B. 780464541 mit "7" anfängt.
Ich habe das so implementiert:
Code: Alles auswählen
currentAccNo = int(currentRow[1])
if str(currentAccNo)[0] != str(7):
# Anweisungen hier :-)
Das funktioniert auch. Ich frage mich nur ob das eine saubere Lösung ist, oder ob man das auch gescheiter hätte machen können (ohne Stringumwandlung). Wenn ich das aber ohne str() mache, bekomme ich nen Traceback, der sagt, dass currentAccNo unscriptable ist (oder sowas).. jedenfalls unzerteilbar.
Dachte, da alles Objekte wären, müsste das auch bei Integern funktionieren?
Gruss, Shi
Verfasst: Dienstag 11. September 2007, 14:59
von keppla
Ich frage mich nur ob das eine saubere Lösung ist, oder ob man das auch gescheiter hätte machen können (ohne Stringumwandlung)
Rein technisch gibts da sicher noch mehr Lösungen, aber ich halte deine für recht sauber, da gut lesbar. Für Lesbarkeit verzichte ich persönlich gerne auf numerische Eleganz.
Wenn ich das aber ohne str() mache, bekomme ich nen Traceback, der sagt, dass currentAccNo unscriptable ist (oder sowas).. jedenfalls unzerteilbar.
Es empfiehlt sich, die echten Fehlermeldungen zu Posten. Deine dürfte
TypeError: 'int' object is unsubscriptable
gewesen sein, und sagt nicht, dass es unzerteilbar ist, sondern, dass int keinen zugriff per [] unterstützt.
Dachte, da alles Objekte wären, müsste das auch bei Integern funktionieren?
Dann hast du eine falsche Vorstellung von Objektorientierung.
"Alles sind Objekte" heist, dass alles mindestens das kann, was ein Objekt kann (also z.B. dir(x)), nicht, dass jedes Objekt all das kann, was ein anderes objekt kann.
In deinem Beispiel unterstützt ein String den Zugriff auf die einzelnen Zeichen, aus denen er besteht, per [], ein Int jedoch "besteht" nicht aus zeichen (das ist lediglich eine Darstellung), und unterstützt kein [].
Verfasst: Dienstag 11. September 2007, 15:06
von Shihan
jaa soo, dachte das Object kann das per se.. wasn das für ne Lusche.
Ok, in Java funzt das ja auch nicht so (dort wo ich her komme... nein nicht die Insel).
Aber Danke, wieder was gelernt. Btw, ich habe es nun übrigends so eingebaut:
finde es so am logisten, da 7 nunhalt mal eine Zahl repräsentieren soll - aber ja, das sind Details.
Verfasst: Dienstag 11. September 2007, 15:16
von CM
Hoi und willkommen im Forum,
eigentlich ok, aber ich frage mich, warum Du die ganzen Umwandlungen vornimmst - die kosten ja auch Zeit.
Wenn currentRow[1] ein String ist, was ich vermute, ginge:
oder - ebenso lesbar

-
Gruß,
Christian
PS CamelCase ist in Python nicht so en vogue.
edit: Logik und PS
Verfasst: Dienstag 11. September 2007, 15:26
von Shihan
naja, hab gestern mit Python angefangen. Ein Problem war erstmal eine gescheite IDE zu finden, bei der die IntelliSens auch funktioniert.
Habe auch mal an sowas wie "startswith" gedacht, doch kommt so Zeug bei mir gar nicht zur Auswahl.
Im Moment verwende ich Komodo, bin eigentlich ganz zufrieden. Eclipse mit PyDev war sehr traurig, IDLE sieht aus wie ne Win3.11 Anwendung hatte ne gute Intelisense aber ne schlechte "Springe zu Definition von Xy" Funktionalität.
Ob currentRow[1] ein String ist, weiss ich nicht.. da blick ich noch zu wenig durch. Also ich habe ja ne DB Afrage die mir ein Result zurückliefert (Tupel, wenn ich das richtig kapiert habe).
Über den Tupel mache ich eine for-Schlaufe, die mir die aktuelle Zeile in currentRow schreibt und mit [] greiffe ich dann auf die Spalten zu.
Gruss, Shi
Verfasst: Dienstag 11. September 2007, 16:08
von BlackJack
`str.startswith()` hat den Vorteil, dass es auch funktioniert wenn man es auf die leere Zeichenkette anwendet:
Code: Alles auswählen
In [331]: ''[0] != '7'
---------------------------------------------------------------------------
<type 'exceptions.IndexError'> Traceback (most recent call last)
/home/bj/<ipython console> in <module>()
<type 'exceptions.IndexError'>: string index out of range
In [332]: not ''.startswith('7')
Out[332]: True
Ich nehme an `currentRow` ist eine Liste? Kannst Du nicht mit dem Tupel arbeiten? Eine ``for``-Schleife ist jedenfalls nicht nötig um aus einem Tupel eine Liste zu machen. `list()` macht aus jedem "iterierbaren" Objekt eine Liste und den Typ von einem Objekt kann man mit der `type()`-Funktion herausbekommen:
Code: Alles auswählen
In [335]: a = (42, 'spam', None)
In [336]: list(a)
Out[336]: [42, 'spam', None]
In [337]: map(type, a)
Out[337]: [<type 'int'>, <type 'str'>, <type 'NoneType'>]
Verfasst: Dienstag 11. September 2007, 19:18
von Joghurt
Shihan hat geschrieben:naja, hab gestern mit Python angefangen. Ein Problem war erstmal eine gescheite IDE zu finden, bei der die IntelliSens auch funktioniert.
Das ist in Python allgemein sehr schwierig, da Python eine dynamische Sprache ist, z. B.
Code: Alles auswählen
class Foo(object):
def bar(self):
self.baz = self.bar # jetzt ist baz ein alias für bar
a = Foo()
# jetzt müsste a.ba<TAB> zu bar ergänzt werden
a.bar()
# jetzt müsste bei a.ba<TAB> gefragt werden, ob bar oder baz gemeint ist
Abgesehen davon, scheint WingIDE wohl die beste Expansion zu haben. Leider ist WingIDE kommerziell
Edit: "self.baz = bar" durch "self.baz = self.bar" ersetzt
Verfasst: Dienstag 11. September 2007, 20:02
von pyStyler
Hallo Joghurt,
bist du dir sicher, dass es beim aufruf von self.baz keinen Fehler gibt?
Ich kann es gerade leider nicht testen.
Joghurt hat geschrieben:Code: Alles auswählen
class Foo(object):
def bar(self):
self.baz = bar # jetzt ist baz ein alias für bar
a = Foo()
# jetzt müsste a.ba<TAB> zu bar ergänzt werden
a.bar()
# jetzt müsste bei a.ba<TAB> gefragt werden, ob bar oder baz gemeint ist
Danke und Gruss
pyStyler
Verfasst: Dienstag 11. September 2007, 21:22
von Joghurt
Oops. es muss natürlich "self.baz = self.bar" heißen. Hab den Originalpost entsprechend gefixt
Verfasst: Dienstag 11. September 2007, 22:08
von Leonidas
pyStyler hat geschrieben:bist du dir sicher, dass es beim aufruf von self.baz keinen Fehler gibt?
Doch, gibt es. ``self.baz = self.bar`` wäre richtig.
Aber ich schiebe noch ein besseres Beispiel rein:
Code: Alles auswählen
In [9]: class Getmesome(object):
...: def __getattr__(self, name):
...: if name == 'chips':
...: return 'Here you got your chips'
...: object.__getattr__(self, name)
...:
In [10]: getmesome = Getmesome()
In [11]: getmesome.chips
Out[11]: 'Here you got your chips'
Wobei ``dir(getmesome)`` keine ``chips`` anzeigt, weil dieses Attribut erst zur Lookup-Zeit erzeugt wird und danach auch wieder verfällt.