Prüfen ob Zahl mit Xy anfängt

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.
Antworten
Shihan
User
Beiträge: 4
Registriert: Montag 10. September 2007, 08:45
Kontaktdaten:

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
be the change you want to see in the world
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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 [].
Shihan
User
Beiträge: 4
Registriert: Montag 10. September 2007, 08:45
Kontaktdaten:

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:

Code: Alles auswählen

if int(str(currentAccNo)[0]) != 7:
finde es so am logisten, da 7 nunhalt mal eine Zahl repräsentieren soll - aber ja, das sind Details.
be the change you want to see in the world
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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:

Code: Alles auswählen

if currentRow[1][0] != '7':
oder - ebenso lesbar ;-) -

Code: Alles auswählen

if not currentRow[1].startswith('7'):
Gruß,
Christian

PS CamelCase ist in Python nicht so en vogue. ;-)

edit: Logik und PS
Shihan
User
Beiträge: 4
Registriert: Montag 10. September 2007, 08:45
Kontaktdaten:

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
be the change you want to see in the world
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'>]
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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
Zuletzt geändert von Joghurt am Dienstag 11. September 2007, 21:22, insgesamt 1-mal geändert.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Oops. es muss natürlich "self.baz = self.bar" heißen. Hab den Originalpost entsprechend gefixt
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten