W Pythonie można zapisywać bajty, używając wielokrotnie używanych funkcji aliasingu. Na przykład:
r=range
a=r(100)
b=r(200)
c=r(300)
Jednak gdy funkcje są funkcjami składowymi razem, nie wiem, jak je aliasować w sposób umożliwiający tworzenie łańcuchów. Na przykład:
s='Hello'
// Plain code
s=s.replace('H','J').replace('e','i').replace('l','m').replace('o','y')
// What I am trying to do
q=replace
s=s.q('H','J').q('e','i').q('l','m').q('o','y')
Oczywiście to, co próbuję zrobić, jest nieprawidłowe. I to też nie jest:
q=s.replace
s=q('H','J') // Replaces the 'H' in 'Hello'
s=q('e','i') // Replaces the 'e' in 'Hello'... and the J is gone.
s=q('l','m')
s=q('o','y')
Czy istnieje inny sposób na alias funkcji składowych i funkcji łańcuchowych, który zapisuje znaki?
q
oznacza, coreplace
w klasie używasz.q
jest związany z metodą zamiany tego konkretnegostr
wystąpienia. Pamiętaj też, że możesz robić zamiany pojedynczych"Hello".replace(*"HJ")
Odpowiedzi:
Bez problemu! Możesz aliasować metodę, ale musisz wiedzieć, jak jej użyć:
Kluczem jest to, że musisz przekazać
self
jawnie, ponieważ alias jest rodzajem funkcji, która wymaga dodatkowego argumentu, który przyjmujeself
:źródło
Zdefiniuj własną klasę za pomocą krótszej nazwy metody.
Na przykład, jeśli używasz metody
replace()
należącej doString
klasy, możesz stworzyć własną klasęS
,q
która ma wywoływaną metodę, która robi to samo.Oto jedna implementacja:
Oto znacznie lepsze wdrożenie:
Używaj go w ten sposób:
źródło
To i tak jest kilka znaków krótszych
jest jeszcze krótszy dla niewielkiej liczby zamienników
oczywiście dotyczy to tylko jednego konkretnego przypadku. Jednak Code Golf polega na znalezieniu specjalnych przypadków, które mogą zaoszczędzić bajty.
Możliwe jest napisanie funkcji otoki, która obsługuje ogólny przypadek, ale kod będzie zbyt duży, aby mógł znaleźć się w większości wyzwań związanych z golfem.
Zamiast tego musisz pomyśleć: „Mogę przeprowadzić tę transformację efektywnie (strokewise) za pomocą str .replace. Czy mogę zmienić wewnętrzną reprezentację mojego rozwiązania, aby z tego skorzystać?
źródło
Możesz użyć tej
reduce
funkcji.źródło
Jeśli wykonujesz wiele wymian, możesz to zrobić:
źródło
[a]
)[a]
trzeba tego zamieniać.get(a,a)
(w przeciwnym razie dostajemy coś z kluczowym błędem)? A dlaczegolist(s)
zamiasts
?Co powiesz na zdefiniowanie funkcji lambda?
źródło
str.replace
/ is / that lambda! Zobacz moją odpowiedź.Jeśli zamienniki nie muszą być powiązane, możesz użyć `str.translate '. Liczby są liczbami porządkowymi ASCII. Używanie go w ten sposób wymaga Python 3:
Wypróbuj online
źródło