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?
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?
python -c 'print("Yes.")'
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"
Oto mój trik, aby uruchomić wiele instrukcji:
[stmt1, stmt2, expr1][2]
if
wymaga leniwe ocena: [lambda(): stmt1; lambda(): stmt2][not not boolExpr]()
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:~$
Nie możesz. wciskasz 'print'. Wypróbuj go bez wcięcia, a otrzymasz "IndentationError", tak jak powinieneś. – aaronasterling
Wyraziłem to źle. Daje to możliwość wcięcia kodu, bez konieczności tworzenia pliku, edytora itp. – S010
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. –
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
.
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ę!
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.)
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 :)
Tak ??? Dobrym pomysłem jest dokładne określenie, co chcesz zrobić ... –
należy do programmers.stackexchange.com – SilentGhost
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 –