파이썬에서 멤버 함수의 별칭을 어떻게 지정합니까?


23

파이썬에서는 반복적으로 사용되는 별칭 함수를 사용하여 바이트를 절약 할 수 있습니다. 예를 들면 다음과 같습니다.

r=range
a=r(100)
b=r(200)
c=r(300)

그러나 함수가 멤버 함수 인 경우 체인을 허용하는 방식으로 별칭을 지정하는 방법을 모르겠습니다. 예를 들면 다음과 같습니다.

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

분명히, 내가하려는 것은 유효하지 않습니다. 그리고 이것도 아닙니다 :

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

문자를 저장하는 멤버 함수와 체인 함수의 별칭을 지정하는 다른 방법이 있습니까?


사용하는 클래스의 q의미를 의미하는 방법으로 자신의 클래스를 정의하십시오 replace.
Ypnypn

3
나는 이것이 downvoted되지 않은 것이 기쁘다 :)
TheDoctor

2
나는 지금까지 모든 답변의 위키를 뽑았지만, 우리는 이것과 유사한 질문을 언 위키 할 것을 요구할만큼 충분히 합의에 도달하지 못했다. 참조 : meta.codegolf.stackexchange.com/q/1555/3808
손잡이

3
위에서 언급 한 메타 토론은 반 공식적이거나 (또는 ​​적어도 우리 대부분은 동의합니다), 저는이 글에서 위키를 삭제했습니다.
Doorknob

1
마지막 버전이 작동하지 않습니다. q해당 특정 str인스턴스 의 replace 메소드에 바인딩됩니다 . 또한, 당신이 하나의 문자 교체를 할 수있는 기억"Hello".replace(*"HJ")
gnibbler

답변:


28

문제 없습니다! 메소드의 별명을 지정할 수 있지만 사용 방법을 알아야합니다.

>>> r=str.replace
>>> a='hello'
>>> r(r(r(r(a,'h','j'),'e','i'),'l','m'),'o','y')
'jimmy'

self별명은 다음과 같은 추가 인수를 취하는 일종의 함수이므로 키를 명시 적으로 전달해야합니다 self.

>>> type(r)
<type 'method_descriptor'>

3
전에 이것을 어떻게 보지 못했습니까?
Rainbolt

6

더 짧은 메소드 이름으로 자신의 클래스를 정의하십시오.

예를 들어, 클래스에 replace()속하는 메소드를 사용하는 경우 String자신의 클래스 에 동일한 기능을 S하는 메소드를 만들 수 있습니다 q.

다음은 하나의 구현입니다.

class m(str):
 def q(a,b,c):return m(a.replace(b,c))

훨씬 나은 구현은 다음과 같습니다.

class m(str):q=lambda a,b,c:m(a.replace(b,c))

다음과 같이 사용하십시오.

s="Hello"
s=m(s).q('H','J').q('e','i').q('l','m').q('o','y')

5

어쨌든 몇 문자 더 짧습니다

j=iter('HJeilmoy')
for i in j:s=s.replace(i,next(j))

적은 수의 교체는 더 짧습니다.

for i in['HJ','ei','lm','oy']:s=s.replace(*i)

물론 이것은 하나의 특정 경우에만 적용됩니다. 그러나 코드 골프는 바이트를 절약 할 수있는 특별한 경우를 찾는 것입니다.

일반적인 경우를 처리하는 래퍼 함수를 ​​작성할 수는 있지만 코드가 너무 커서 대부분의 코드 골프 문제를 해결할 수 없습니다.

대신 "str.replace를 사용하여이 변환을 효율적으로 (스트로크 방식으로) 수행 할 수 있습니다. 솔루션의 내부 표현을 활용하여이를 활용할 수 있습니까?


골프 때 좋은 습관을 설명하고 제시된 특정 예를 확실히 해결하기 때문에이 답변을 좋아합니다. 더 일반적인 경우에 적용 가능하기 때문에 다른 답변을 수락했습니다.
Rainbolt

4

reduce기능을 사용할 수 있습니다 .

reduce(lambda s,(a,b):s.replace(a,b),[('H','J'),('e','i'),('l','m'),('o','y')],'Hello')

에서 당신의 대답에 다른 경우 대답은 (지금까지 기술 사용, 반드시에 기록되지 아니 정확히 같은 형태)?
Rainbolt

1
@Rusher 그것은 다르다. 예를 들어 호출 횟수는 링크 된 답변에 하드 코딩되어 있지만 여기에서는 두 번째 인수의 길이 (모든 반복자가 될 수 있음)로 제공됩니다.
Howard

1

많은 교체 작업을 수행하는 경우 다음을 수행 할 수 있습니다.

s=''.join({'H':'J','e':'i','l':'m','o':'y'}[a] for a in list(s))

나는 구체적이지 않은 대답을 바라고있었습니다. 방금 예제로 사용했습니다.
Rainbolt

한 번에 하나의 문자 만 바꿀 수 있지만 여러 문자를 바꿀 수 있습니다. 그리고 이것은 완전히 골프되지 않습니다 (후 공간 제거 [a])
Justin

2
[a]로 교체 할 필요가 .get(a,a)없습니까? 그렇지 않으면 키 오류가 발생합니까? 그리고 왜 list(s)대신에 s?
Justin

1

람다 함수를 정의하는 것은 어떻습니까?

r=lambda s,a,b:s.replace(a,b)

s=r(r(r(r(s,'H','J'),'e','i'),'l','m'),'o','y')

1
필요 없음 : str.replace/ 그 람다! 내 대답을 참조하십시오.
MtnViewMark

1

대체품을 체인으로 묶을 필요가 없다면`str.translate '을 사용할 수 있습니다. 숫자는 ASCII 서수입니다. 이 방법으로 사용하려면 Python 3이 필요합니다.

print("Hello".translate({72:74,101:105,108:109,111:121}))

온라인으로 사용해보십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.