Danke Euch beiden,
das habe ich jetzt verstanden.
Aber trotzdem verstehe ich das nun syntaktisch noch nicht so ganz.
Wie genau wird denn aus dieser Zeichenkette "01" die 0 oder die 1 gefiltert bzw. errechnet, dahinter ist doch ein Ausdruck in einer Liste, oder?
Also das n % 2 steht doch in der Liste []. Wie ist da genau der Bezug zu dem String "01", welcher direkt davor steht?
Ich "sehe" da einfach nicht, wie die Berechnung der Liste auf den String einwirkt.
Hoffe, man versteht, was ich meine.
Gruß
ne0h
Dezimalzahlen in Binärdarstellung - Meine Idee
Du kannst ja per Index auf einen String zugreifen und das wird hier gemacht,
erst wird der Modulo ausgerechnet und dieser als Index genutzt
erst wird der Modulo ausgerechnet und dieser als Index genutzt
Code: Alles auswählen
>>>3 % 2
1
>>>4 % 2
0
>>>"AB"[0]
"A"
>>>"AB"[1]
"B"
Das ist einfach die Indizierung eines Strings. Siehe auch Tutorial (3.1.2 Strings).
etc.
Edit: einhändig ist man eben doch viel zu lahm.
Code: Alles auswählen
In [23]: "Spam"[0]
Out[23]: 'S'
In [24]: "Spam"[1]
Out[24]: 'p'
Edit: einhändig ist man eben doch viel zu lahm.
Ok, alles klar. Ich starre heute schon zu lange auf den Bildschirm und habe gerade die ganze Zeit wie ein Vollidiot darüber nachgedacht, wie die Liste da hinter dem String was damit zu tun hat.
Jetzt seh ichs auch, nach Euren Hinweisen, dass da einfach nur der Index des Strings berechnet wird.
Manchmal verrene ich mich echt in so komplizierte Gedanken, wie, was, warum, dass ich das offensichtlichste garnicht mehr erkenne.
Danke, ich geh ins Bett.
ne0h
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ja, uhm, Rekursion ist ein nicht ganz triviales Problem, weil es eben doch recht ungewohnt ist.ne0h hat geschrieben:Also diese rekursiven Aufrufe will ich jetzt gleich mal angehen.
Die Beispiele sind in Scheme einer Sprache von der Python viele Konzepte geerbt hat und die ich grad lerne. Ich wollte eben sehen wie so ein Binärkonverter in Scheme aussieht die ich die Sprache auch erst lerne und mich nach Beispielen umsehe, die ich mir zutrauen kann, so ähnlich wie du in Python. Außerdem starten hier manchmal kleine spontane Wettbewerbe, irgendwelche Probleme in allen möglichen Sprachen zu Lösen und sie dann mit der Python-Lösung zu vergleichen.ne0h hat geschrieben:Was genau ist das für eine Sprache, in der Deine verlinkten Beispiele sind? Bzw.: Was hat das Ganze mit den von Dir gerade geschriebenen Beispielen zu tun?
Übrigens: ``(number->string 21 2)`` wäre natürlich die naheliegendste Lösung gewesen
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Hallo,
Ok, Scheme sagt mir was (nur vom Namen her ). Sieht mir grade aber etwas zu "geklammert" aus.
Ähm, dieses Beispiel hier:
Welche Variante ist denn nun effizienter in der Ausführungsgeschwindigkeit? (Nicht dass es wirklich von Bedeutung für mich wäre im Moment, aber es interessiert mich nun doch.).
Gruß
ne0h
Ok, Scheme sagt mir was (nur vom Namen her ). Sieht mir grade aber etwas zu "geklammert" aus.
Ähm, dieses Beispiel hier:
stammt ja von der ertsen Seite. Läuft das denn nun intern per Rekursion oder greift dies auf Bitverschiebungen zurück. Oder besser gefragt:(number->string 21 2)
Welche Variante ist denn nun effizienter in der Ausführungsgeschwindigkeit? (Nicht dass es wirklich von Bedeutung für mich wäre im Moment, aber es interessiert mich nun doch.).
Gruß
ne0h
@ne0h: In Python, zumindest in CPython, dürften iterative Lösungen immer schneller sein, als Rekursive. Weil Funktionsaufrufe in CPython relativ teuer sind und keine Tail-Call-Optimization gemacht wird.
Wenn es sich um Endrekursion handelt, kann man von einem Scheme-Compiler erwarten, das der das als effiziente Schleife in Maschinensprache übersetzt. Wobei es in Scheme selbst auch gar keine iterativen Schleifen gibt, da *muss* man also Rekursion als Ausdrucksmittel wählen.
Wenn es sich um Endrekursion handelt, kann man von einem Scheme-Compiler erwarten, das der das als effiziente Schleife in Maschinensprache übersetzt. Wobei es in Scheme selbst auch gar keine iterativen Schleifen gibt, da *muss* man also Rekursion als Ausdrucksmittel wählen.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Also, die Codes die ich teste:ne0h hat geschrieben:Welche Variante ist denn nun effizienter in der Ausführungsgeschwindigkeit? (Nicht dass es wirklich von Bedeutung für mich wäre im Moment, aber es interessiert mich nun doch.).
Code: Alles auswählen
def d2b(n):
d = ""
while n:
d += "01"[n & 1]
n >>= 1
return d[::-1]
print d2b(21)
Code: Alles auswählen
(display (string-append (number->string 21 2) "\n"))
Code: Alles auswählen
$ time eval 'i=0; while [ $i -lt 100 ]; do python2.5 d2.py > /dev/null ; i=$(($i + 1)); done'
real 0m1.301s
user 0m0.944s
sys 0m0.424s
$ time eval 'i=0; while [ $i -lt 100 ]; do mzscheme -r d2.scm > /dev/null ; i=$(($i + 1)); done'
real 0m3.010s
user 0m2.596s
sys 0m0.400s
Eine rekursive Python-Lösung wäre sicherlich langsamer, als die iterative. Allerdings ist ``number->string`` in PLT auch in C interpretiert, also eigentlich genauso iterativ.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Hier noch die Ergebnisse auf einem anderen Computer. Die Python-Version ist die selbe, das MzScheme ist etwas älter und der letzte Test ist ein kompiliertes Programm mittels Checken (SCM -> C -> Binary).
Code: Alles auswählen
$ time eval 'i=0; while [ $i -lt 100 ]; do python2.5 d2.py > /dev/null ; i=$(($i + 1)); done'
real 0m1.369s
user 0m0.916s
sys 0m0.468s
$ time eval 'i=0; while [ $i -lt 100 ]; do mzscheme -r d2.scm > /dev/null ; i=$(($i + 1)); done'
real 0m3.988s
user 0m3.500s
sys 0m0.504s
$ time eval 'i=0; while [ $i -lt 100 ]; do ./d2 > /dev/null ; i=$(($i + 1)); done'
real 0m0.439s
user 0m0.288s
sys 0m0.276s
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice