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

Python one-liner

Beitragvon Crazed » Sonntag 3. August 2008, 00:40

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

Beitragvon Trundle » Sonntag 3. August 2008, 02:23

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

Beitragvon Crazed » Sonntag 3. August 2008, 11:10

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

Beitragvon EyDu » Sonntag 3. August 2008, 11:39

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 3. August 2008, 11:59

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 Modvoice
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Sonntag 3. August 2008, 15:37

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

Beitragvon lunar » Sonntag 3. August 2008, 16:00

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

Beitragvon Trundle » Sonntag 3. August 2008, 23:27

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

Beitragvon Y0Gi » Mittwoch 13. August 2008, 11:48

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 ;)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder