Snippet of the moment II · Jan 15, 15:40 von stargaming
Falls ihr mal wieder True mit False überschrieben haben solltet, hilft euch eventuell folgendes oder ähnliches:
- >>> id(True)
- 505171652
- >>> id(False)
- 505171640
- >>> True = False
- >>> id(True)
- 505171640
- >>> True is False
- True
- >>> id(True is False)
- 505171652
..oder auch 1 is 1.

Snippet of the moment I · Jan 14, 00:48 von stargaming
\r ist das neue Lieblingszeichen der Woche. \r ist der carriage return oder auch “Wagen- oder Zeilenrücklauf”. (Wer mal eine Schreibmaschine hatte, erinnert sich dran: Rücklauf & Zeilenvorschub)
Wie man ihn für lustige Konsolenspielereien benutzen kann, sieht man hier:
- >>> print "Wer das liest ist doof\rHallo Welt! "
- Hallo Welt!
Der aufmerksame Leser wird sich fragen “Nanu, was sollen die vielen Leerzeichen da?” Bravo, Sie haben die Lücke in dieser Verhaltensweise gefunden:
- >>> print "Wer das liest ist doof\rHallo Welt!"
- Hallo Welt!st ist doof
Wenn man jetzt da noch ein paar Spielereien drumwrappt, kriegt man da ganz hübsche Sachen heraus:
- from time import sleep
- for i in xrange(101):
- print "\r" + "%03i %s" % (i, ('|', '/', '-', '\\')[i%4]),
- sleep(0.1)
Wenn man das dann noch erweitert, hat man eine Progressbar, die sich sehen lassen kann.
- from time import sleep
- width = 65
- templ = "[%%-%ds] %%s %%s" % width
- for i in xrange(101):
- print "\r" + templ % (
- '|'*(i*width/100),
- 'done' if i == 100 else '% 3d%%' % i,
- ('|', '/', '-', '\\')[i%4]
- ),
- sleep(0.08)

namespaces are one honking great idea · Dez 3, 19:46 von stargaming
- >>> import this
- """
- The Zen of Python, by Tim Peters
- [...]
- Namespaces are one honking great idea -- let's do more of those!
- """
Genau das denkt man sich, wenn man ein Wochenende lang die Globalisierung von PHP genießen durfte.
Es ist einfach ein schrecklicher Zustand bei PHP, der die Funktionen so wirr auseinanderreißt.
Allein schon die Stringoperationen sind wild durch die Bibliothek und Namensgebung verteilt. Manche fangen mit str an (z. B. strcmp, strpos, strtoupper), manche mit str_ (z. B. str_replace, str_word_count, str_repeat), manche hängen einfach so irgendwo (z. B. substr und Stringfunktionen). Unübersichtlich, aufgeblasen und verworren.

2.5 functools.partial gegen lambda · Sep 25, 17:18 von stargaming
Mit dem Release von 2.5 und der functools-Bibliothek stehen einem jetzt zwei Wege zur Verfügung, einen Wrapper für eine Funktion zu schreiben, der Standardwerte für einige Argumente mitliefert:
- import functools
- wrapper = functools.partial(function, kwarg=defaultval)
- wrapper = lambda *x, **y:function(*x, **y, kwarg=defaultval)
Der Vergleich
Ich hab mich mal gefragt, wie die beiden im Belastungstest abschneiden und ein kleines Benchmark geschrieben:
- #!/usr/bin/env python
- #encoding: latin-1
- from timeit import Timer
- def bench(expr, times=10000, rep=500, pre=""):
- x = Timer(expr, pre).repeat(rep, times)
- print "%s times %s*%s gave min/max/avg: %s / %s / %s" % \
- (rep, times, expr, min(x), max(x), sum(x) / rep)
- bench("f = lambda x:int(x, 2); f('1'*20)")
- bench("f = partial(int, base=2); f('1'*20)", pre="from functools import partial")
Resultat:
$ partialVSlambda.py
10000 times 500*f = lambda x:int(x, 2); f('1'*20) gave min/max/avg: 0.000659022305907 / 0.0168946053199 / 0.000875234533998
10000 times 500*f = partial(int, base=2); f('1'*20) gave min/max/avg: 0.000935593769601 / 0.0132583889852 / 0.00122811871341
Lambda ist für so Kleinkrams also wohl eindeutig noch schneller.

