Python one-liner

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
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Hallo :)!

Ich bin auf den Geschmack gekommen Python "one-liner" (Scripte die nur aus einer einzigen Zeile code bestehen) zu schreiben als ich mit meinem irc-bot herumexperimentiert habe, der ein kommando namens !exec unterstützt das mir erlaubt direkt Python Code auszuführen.

Z.b habe ich mir so den Google-quelltext schicken lassen:

Code: Alles auswählen

!exec import mechanize;connection.privmsg(event.source().split('!')[0], mechanize.Browser().open('http://www.google.de').read())
output:
<html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><style>body,td,a,p,.h{font-family:arial,sans-serif}.h{font-size:20px}.h{color:#3366cc}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}.lnc:link,.lnc:visited{color:#00c}.pgtab,.pgtab:hover,.pgtabselected,.pgtabside{text-align:center;text-decoration:none;color:#00c;display:block;height:27px;float:left;overflow:hidden;backgro...
Jetzt kann man ja sogar Funktions definitionen mit einem one-liner machen.

Code: Alles auswählen

def test():print 'Hello World';print 'Second Line';return True
Leider kann man jetzt die Funktion nicht am ende mittels test() aufrufen da test() noch im Scope der Funktionsdefinition steht (glaube ich). Gibts da nen work-around?

EDIT: So gehts:

Code: Alles auswählen

In [1]: exec("def test():print 'Hello';print 'World';return True");test()
Hello
World
Out[1]: True
Ist zwar alles andere als schön aber es geht :), soll ja nen "dirty" one-liner sein ^^.


PS: Kennt ihr noch lustige, unmöglich kompliziert/lange/nützliche One-Liner? Wenn ja würde ich mich freuen wenn ihr sie mir vorstellen würdet.

MfG,
CracKPod
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Da hätte ich

Code: Alles auswählen

(lambda x,k=''.join(map(chr,range(65,91)+range(97,123)+range(48,58)))+
'+/=',o=['']:(lambda x=x.strip():(map(lambda i,x=x:o.__setitem__(0,o[0].__add__
(''.join(map(lambda x:x!=64 and chr(x)or '',map(lambda b:((b[0]<<2)|(b[1]>>4),(
(b[1]&15)<<4)|(b[2]>>2),((b[2]&3)<<6)|b[3]),[map(lambda c:k.index(c),x[i:i+4])]
)[0])))),range(0,len(x),4)),x.endswith('==')and[o[0][:-1]]or o[:],o.__setitem__
(0,'')))()[1][0])('RGFzIGtvZW5udGUgbWFuIGFsbGVzIGluIGVpbmVyIFplaWxlIHNjaHJlaWJ'
'lbiB1bmQgaXN0IGV2YWwtZmFlaGlnLg==')
im Angebot (warum auch immer ich das einmal geschrieben habe). Geht aber bestimmt noch kürzer und erheblich schöner und ist wahrscheinlich auch nicht bugfrei.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Ehrm. Was machst es denn? *Ehrfurcht* ^^
Steckt auf jeden Fall ein bisschen base64 mit drin. Decodiert es den base64 string?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Eine Einzeiler der Anweisungen durch Semikolons trennt ist wirklich kein echter Einzeiler mehr. Dann könnte man jedes Programm in nur eine Zeile quetschen.

"Google-Quelltext" finde ich aber echt niedlich :P
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

EyDu hat geschrieben:Eine Einzeiler der Anweisungen durch Semikolons trennt ist wirklich kein echter Einzeiler mehr. Dann könnte man jedes Programm in nur eine Zeile quetschen.
Vor allem mit Java ist das sehr einfach, wo man nur die ``\n`` weglassen muss. Aber das ist nicht sonderlich elegant und Einzeiler sollten schon etwas elegantes an sich haben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wie immer geht es auch ohne exec:

Code: Alles auswählen

>>> reduce((lambda x,y: (__import__("sys").stdout.write(x+"\n"), y)[1]), ("hallo", "welt", True))
hallo
welt
True
>>>

Code: Alles auswählen

>>> (map(lambda x:__import__("sys").stdout.write(x+"\n"), ("hallo", "welt")), True)[1]
hallo
welt
True
>>> 
lunar

Was wohl Tim Peters dazu sagen würde?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Crazed hat geschrieben:Decodiert es den base64 string?
Ja (sollte es zumindest).
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Crazed hat geschrieben:Ehrm. Was machst es denn? *Ehrfurcht* ^^
Steckt auf jeden Fall ein bisschen base64 mit drin. Decodiert es den base64 string?
Ich hatte erst an rot13 gedacht (``some_string.decode('rot13')``), doch dafür war es etwas lang. Auf base64 bin ich durch das verräterische `==` am Ende des Strings gekommen. Und ja, es funktioniert (für den gegebenen String).

Zugegeben, eine bestehende Funktionalität hätte ich wohl nicht neu implementiert ;)
Antworten