2010-10-23 11 views
9

Przechodziłem przez pytanie dotyczące kodu golfowego tutaj na przepełnieniu stosu i widziałem wiele rozwiązań perl one liner.Czy można napisać jednolinijkowe w języku Python?

Moje pytanie brzmi: czy coś takiego jest możliwe w Pythonie?

+2

Tak ??? Dobrym pomysłem jest dokładne określenie, co chcesz zrobić ... –

+2

należy do programmers.stackexchange.com – SilentGhost

+1

Istnieje wiele pythonów z jedną linerami z tagiem cods-golf. Nie tak wiele jak Perl, ale jestem zaskoczony, że nie widziałem _any_ z nich –

Odpowiedz

14

Jest możliwe napisanie jednej wkładki w Pythonie, ale jest to niewygodne (Python zachęca dobrze wcięty kod, który jest nieco w sprzeczności z „one-liner” koncepcja). W Pythonie 3 jest nieco łatwiej, ponieważ print() jest funkcją, a nie instrukcją. Oto jeden:

python -c "fact = lambda x: x * fact(x-1) if x > 1 else 1; print(fact(5))" 

Oto jak można napisać grep jak funkcja (Ten przykład drukuje linie z wejścia zawierające „foo”):

python -c "for s in __import__('fileinput').input(): __import__('sys').stdout.write(s) if 'foo' in s else None" 
0

Oto mój trik, aby uruchomić wiele instrukcji:

[stmt1, stmt2, expr1][2] if wymaga leniwe ocena: [lambda(): stmt1; lambda(): stmt2][not not boolExpr]()

4

W Bourne shel l można użyć czegoś, co nazywa heredoc obejść zależność Pythona na tiret:

[email protected]:0:~$ python << 'EOF' 
> for i in range(3): 
> print i 
> EOF 
0 
1 
2 
[email protected]:0:~$ 
+1

Nie możesz. wciskasz 'print'. Wypróbuj go bez wcięcia, a otrzymasz "IndentationError", tak jak powinieneś. – aaronasterling

+1

Wyraziłem to źle. Daje to możliwość wcięcia kodu, bez konieczności tworzenia pliku, edytora itp. – S010

+0

Tak naprawdę nie ma czegoś takiego jak "poruszanie się" w "pytaniu o wcięcia" dla Pythona, ponieważ uniemożliwiłoby to pisanie większości nietrywialnych programów. To, co większość czytelników szuka, to jak wskazać wcięcie/dedenty w sposób jednolinijkowy. –

7

skończę chcąc to zrobić, gdy robi rzeczy z powłoki dość często. Nie jest to bardziej kompaktowe iw wielu przypadkach łatwiej jest po prostu napisać wielowarstwową komendę powłoki niż pisać wszystko jako lambda. W zasadzie nie można używać żadnych instrukcji Pythona zakończonych dwukropkiem. Tak skończyć konieczności

  • pisać żadnych for -jak kod jako genexp lub listowego. Robię to w każdym razie dla większości rzeczy, ale jest to denerwujące mieć do import sys i wcisnąć wszystko sys.stdout.writelines w przypadkach, gdzie można było inaczej tylko

    for tree in forest: 
        print tree 
    
  • zapisu lambdas zamiast definicje funkcji. Jest to często wykonalne i ma użyteczny efekt uboczny, polegający na zmuszaniu cię do pisania bardzo ukierunkowanych funkcji, które naprawdę robią tylko jedno. Jednak nie jest to szczególnie wygodne i nie działa dla niczego, co zmienia wartość (na przykład dict.update), a następnie zwraca jakiś element.

  • nie przeszkadza robienie rzeczy właściwie z menedżerów kontekstowych

  • nie robić żadnych obsługę wyjątków.

  • Skorzystaj ze słownika lambdas zamiast z dowolnych sekcji if/else.

  • Użyj type(name, bases, dict), aby zadeklarować dowolne zajęcia. Jest to całkiem zabawne, ale działa tylko wtedy, gdy deklarujesz klasę, której metody można wyrazić jako lambdas.

Tak więc dla niektórych rzeczy to działa, ale generalnie jest to duża trudność, ponieważ w końcu trzeba użyć stylu funkcjonalnego, którego Python tak naprawdę nie obsługuje.Większość czasu po prostu napisać multilinii poleceń powłoki jak

[email protected] ~ $ python -c $' 
import some_module 
for v in some_module.whatever(): 
    print "Whatever: \'{0}\'".format(v) 
' 

$' jest bash cytując składnia, alternatywny do jego '...' i "..." cytując konstruktów. Jest to przydatne, ponieważ działa tak jak '...', ale pozwala uciec w postaci ' znaków z \'. Możesz także osadzić znaki nowej linii, aby powyższy kod mógł być również zapisany jako python -c $'import some_module\nfor v in some_module.whatever():\n print "Whatever: \'{0}\'".format(v)'. Jednak jest to coś z nabytego smaku.

Jeden irytującą rzeczą o pisaniu multilinii poleceń w bash jest HOME i END przejść do początku polecenia, a nie na początku wiersza. Może być lepszy sposób, aby to zrobić, ale zwykle skanuję tylko, przytrzymując klawisze CTRL i strzałki w lewo/prawo. Prawdopodobnie pewna osoba mogłaby mnie tutaj ustawić, ponieważ jest to miejsce, z którego pochodzą normalne klawisze Basha.

Jeśli chcesz wstawić podział wiersza podczas edytowania polecenia wielowierszowego, możesz to zrobić za pomocą^V-^J. Które będzie można umieścić w przerwie linii w taki sposób, że nadal można skanować z powrotem do poprzedniej linii, zamiast konfiguracji

$ first line of the command 
> second line 
> third line 

które można dostać w inny sposób, gdzie nie można wrócić do poprzednich linii .

Sztuczka z^V-^J działa również w ipython, dzięki czemu jest przydatna do edycji definicji klas lub funkcji. Może również działać w podstawowej wersji REPL (prawdopodobnie), po prostu nie wiem, ponieważ prawie zawsze używam ipython.

-1

Tak, w rzeczywistości jest bardzo często. Używam jednej wkładki, kiedy muszę napisać szybki kod. To zależy od tego, co chcesz zrobić. Oto mała linia, którą właśnie użyłem tego wieczoru. Jest to stworzenie przycisku Tkintera w jednej linii.

a = Button(root, text="Button", command=com1).pack() 

Jeśli potrzebujesz konkretnego kodu, daj mi znać, chętnie pomogę!

1

Naprawdę ładne Python jedno-liner (jak w "bardzo przydatne"):

python -c 'import SimpleHTTPServer as foo; foo.test()' 23433 

Natychmiastowa podstawowy serwer WWW w bieżącym katalogu. (Właśnie wprowadzono do tego dzisiaj, bardzo poręczne.)

0
exec("if 6 * 9 == int('42', 13):\n\tprint('Yes!')") 

Dzięki takiemu podejściu, każdy Program Python można zapisać w postaci jednego-liner :)

Powiązane problemy