2011-01-23 2 views
2

람다 사용법을 이해하는 동안 포스터는 람다를 사용하여 할 수있는 일이 없다고 한 번 대답했습니다. 일반적인 기능을 사용하면 할 수 없습니다.람다를 Python의 일반 함수로 변환

저는 파이썬에서 전문가가 아닌 함수를 호출하기 위해 열심히 노력했지만 아직 배우고 있습니다. 재귀 함수를 사용해야하는 몇 가지 문제에 직면했습니다. 특정 답변.

사람이 람다 함수를 사용하여 그것을 이해하려고했지만 실패 했으므로 함수가 정상 함수를 사용하여 구현 될 수 있다면 그 점에서 람다를 이해하기가 더 쉬울 것입니다. .

이의 예를 들어이 문장을 보자 : 이것은 페이스 북 해커 컵에 사용 된

print"\n".join(" ".join([(lambda f:(lambda x:f(lambda*r:x(x)(*r)))(lambda x:f(lambda*r:x(x)(*r))))(lambda f:lambda q,n:len(q)<=n and q or f(q[len(q)/2:],n)+f(q[:len(q)/2],n))(k,z+1)for z,k in enumerate(i[:-1].split())]) for i in list(s)[1:]) 

내가 루프에 분실되었다, 나는이 문제를 해결할 수 있습니다.

이 문장은 몇 마디 소요

,의 말을하자 "유래 바위와는 중대하다"

페이스 북의 문제 설명은 다음과 같습니다

당신은 재미 있고 바보를 사용하여 암호화 전송의 시리즈를 차단했습니다 메서드를 사용하여 해독 할 수 있습니다. 메시지는 공백과 소문자 영문 문자 만 포함하며 다음과 같이 암호화됩니다. 문장의 모든 단어에 대해 i 번째 단어 (1 기반)는 다음 재귀 작업 f (word, i)를 적용하여 생성 된 단어로 바뀝니다. :

단어의 길이가 i보다 작거나 같으면 단어를 반환합니다. 그렇지 않으면 f (단어의 오른쪽 절반, i) + f (단어의 왼쪽 절반, i)를 반환하십시오.

단어의 길이가 홀수 인 경우 오른쪽이 길어 지도록 분할됩니다. 메시지를 보내는 사람이라면 누구나 쉽게 재미있게 놀고, 사용중인 것과 동일한 스타일로 암호화 된 메시지를 브로드 캐스트하기로 결정했습니다.

입력 입력은 정수 N으로 시작하고 줄 바꿈, N 테스트 사례로 시작됩니다. 각 사례는 공백과 소문자 만 포함 된 암호화되지 않은 문장으로 구성되며, 사례는 줄 바꿈으로 구분됩니다. 한 문장 안에 선행 또는 후행 공백이 없으며 인접 문자 사이에 최대 하나의 공백 문자가 있습니다.

출력 출력 각각의 경우와 줄 바꿈으로 구분하여 출력 한 후 암호화 된 문장의 내용 인코딩 방법은 위에 설명되어 있습니다. 전통적인 대소 문자 규칙을 무시하고 모든 소문자를 고수 할 수 있습니다.

제약 조건 5 ≤ N ≤ 25 문장은 100자를 초과 할 수 없습니다.

+3

흥미로운 문제 (페이스 북에서 나온 것). 문제 (솔루션을 이해하는 문제)는 n 배 중첩 된 람다, 지나치게 긴 줄, 짧은 이름 및 기타 많은 것들이 그것을 읽을 수없는 혼란으로 만듭니다. – delnan

+0

당신이 인용 한 예제는 실제 세계에서 온 것이 아니며 질문을하지 않아도됩니다 ... –

+4

이것은 람다와 관련이 없으며 언롤 코드 난독 화와 더 관련이 있습니다. – Falmarri

답변

2

파이썬 람다는 단순히 구문 설탕입니다. "Regular"함수는 클로저와 같은 기능을 가지고 있습니다. 왜냐하면 람다 (lambda)처럼 다른 함수 안에서 정의 할 수 있기 때문입니다.람다 객체를 검사 할 때 그 제외

def some_func(): 
    some_expr_using(lambda args: 42) 

# becomes: 

def some_func(): 
    def unique_name(args): 
    return 42 
    some_expr_using(unique_name) 

는, 그 이름은 위와 unique_name보다는 "< 람다>"로 설정되고, 다른 표면 정보는 실제 소스 코드가 동작으로 대신 철자 방법에 관한 .

귀하의 코드는 다음과 같이 작성할 수 있습니다 :

def y(f): 
    def a(x): 
    def b(*r): 
     return x(x)(*r) 
    return f(b) 
    return a(a) 

def fx(f): 
    def x(q, n): 
    # changed "a and b or c": different semantics if b can be falsy 
    if len(q) <= n: 
     return q 
    else: 
     return f(q[len(q)/2:], n) + f(q[:len(q)/2], n) 
    return x 

print "\n".join(
    " ".join(y(fx)(k, z + 1) for z, k in enumerate(i[:-1].split())) 
    for i in list(s)[1:]) 

(하지만 제대로 번역 한 경우에만, 더블 체크를 :. P)

이 코드는 fixed-point combinator의 예이다 나는 단지 간신히 이해하고 있으며, 더 많은 내용을 알지 못하면서 더 나은 이름을 부여하기가 어렵습니다 (실제 문제 설명을 해독하려하지 않았습니다). 이름으로 직접 호출하는 재귀 함수로 풀릴 수 있습니다. 당신은 당신이 그것을 정의 같은 줄에 람다를 사용할 수 있습니다

+0

제발 용서해주세요. 올바른 코드에 대해 잘못된 문제를 복사했습니다. 원래 게시물을 편집하고 올바른 페이스 북 문제를 포함 시켰습니다.죄송합니다, 정직하게 – ma2moun

+0

@ ma2moun : 내 대답은 문제가 아닌 코드 줄을 기반으로하며, 해당 코드 줄을 변경하지 않았으므로 여전히 적용되어야합니다. –

+0

나는 그 사실을 알아 채고 그 답을 답으로 표시했다. 그러나 나는 모든 경우에 대한 사과에 대해 사과했다. brilliant, thanks :) – ma2moun

3

는 와우 파이썬의 추한 라인 :

기능과 람다 사이의 유일한 차이입니다. 정상적인 함수를 정의하고 exec를 사용하지 않고 라인의 중간에서 호출하는 방법은 없습니다. 비슷하게 추천하지 않습니다.

람다 대 기능의

예 - 다음 구현은 대부분 동일합니다

# the shortest numbers of lines required to define and call a normal function: 2 
def foo(bar): return bar 
print foo('baz') 

# this lambda has the exact same effect as the function "foo" above 
foo = lambda bar: bar 

# the shortest number of lines required to define and call a lambda: 1 
# note you can also call the lambda on the same line you define it 
# and you aren't required to even name a lambda 
print (lambda bar: bar)('baz') 

주면서 당신이 코드를 읽을 열심히 작성할 수 있습니다. 예 :

a = (lambda x: x+x)(1) # very long-winded way of saying "a = 1+1" 

페이스 북의 문제는 정리 해보자. 이에 내 원래의 솔루션이었다

and great is rocks stackoverflow 
is king land of redundancy redundant the the 
a bar baz cannot foo, the without you 
거의 시적

: 참고로

:

andgreatisrocksstackoverflow 
iskinglandofredundancyredundantthethe 
abarbazcannotfoo,thewithoutyou 

이 있었다 정렬 된 단어 :

# for simplicity, let's say we're getting a single string 
# with a sentence on each line. 
text = ''' 
stackoverflow rocks and is great 
redundancy is the redundant king of the land 
without a foo, you cannot bar the baz 
''' 

# first, we'll strip() the text to remove the spaces at the edges 
# as these would create blank lines when splitting the text 
text = text.strip() 

# next, we'll split the text on the newline character, '\n' 
lines = text.split('\n') 

# now we have a list of lines, which we can easily walk through with a for loop 
for line in lines: 
    # now we're going to split all of the words from each line 
    # this is easy, just split with a space as the delimiter 
    words = line.split(' ') 

    # then we want to sort the words alphabetically 
    # list.sort() will easily sort a list in place 
    words.sort() 

    # now we want to recombine the line 
    # we're going to use join() for this 
    # we call join on a string, with a list: like 'foo'.join(list) 
    # join combines the list into a string 
    # placing the string between each item 

    # we're going to join with a blank string 
    # so our words will be all in a row with no spaces 
    sentence = ''.join(words) 

    # that's it! now we can just print the sorted result 
    print sentence 

는 결과입니다 Facebook 질문 :

import sys 
q = open(sys.argv[1]).read().strip() 
for line in q.split('\n')[1:]: 
    print ''.join(sorted(line.split(' ',1)[1].split(' '))) 

일반적으로 람다를 사용하지 말 것을 권장합니다. 이것은 단지리스트 독해와 결합/분할을 사용한 나의 한 행 버전이었습니다 :

print '\n'.join([''.join(sorted(line.split(' '))) for line in text.split('\n') if line]) 
+0

제발 용서해주세요. 올바른 코드에 대해 잘못된 문제를 복사했습니다. 원래 게시물을 수정하고 올바른 Facebook 문제를 포함 시켰습니다. 죄송합니다. 솔직히. – ma2moun

관련 문제