2013-03-04 2 views
8

오늘 컴퓨터 과학에서 나는 함수를 변수로 사용하는 것에 대해 물었습니다. 예를 들어 returnMe (i)와 같은 함수를 생성하고이를 호출하는 데 사용할 배열을 만들 수 있습니다. h = [help, returnMe]와 마찬가지로 h1을 말하면 returnMe ("Bob")가 호출됩니다. 미안 나는 이것에 대해 약간 흥분했다. 내 질문은 h.append (def 함수)처럼 호출하고 배열에만 존재하는 함수를 정의하는 방법이 있는가?목록 내의 파이썬 함수

편집 :

여기에 내가 작성한 코드가 있습니다. 그래서이 솔루션으로 멋진 FizzBuzz를 완성했습니다. 다시 한 번 감사드립니다!
(SECURITY) 기능을 비활성화 = [] 의의 = ""

def newFunct(str, num): 
    return (lambda x: str if(x%num==0) else "") 

funct.append(newFunct("Fizz",3)) 
funct.append(newFunct("Buzz",5)) 

for x in range(1,101): 
    for oper in funct: 
     s += oper(x) 
    s += ":"+str(x)+"\n" 

print s 

답변

12

당신은 lambda 키워드를 사용하여 익명 함수를 만들 수 있습니다 예를 들면 다음과 같습니다로 그 코드입니다.

def func(x,keyword='bar'): 
    return (x,keyword) 

은 거의 비슷하다 :

func = lambda x,keyword='bar':(x,keyword) 

그래서, 당신이 그것에 기능 목록을 만들려면 :

my_list = [lambda x:x**2,lambda x:x**3] 
print my_list[0](2) #4 
print my_list[1](2) #8 
+0

이렇게 대단합니다! 정말 고마워! 우리는 또한 fizzBuzz에 대해서 이야기하고 있었고 이것이 이것을 해결하기에 너무 차가울 것이라고 생각했습니다! – Hovestar

3

별로 파이썬한다. mgilson이 보여 주듯이 사소한 기능으로이 작업을 수행 할 수 있지만 표현식이 아닌 표현식 만 포함 할 수 있으므로 매우 제한적입니다 (예 : 변수에 할당 할 수 없음).

이것은 물론 다른 언어에서도 지원됩니다. 예를 들어, 자바 스크립트에서 상당한 익명 함수를 생성하고 전달하는 것은 매우 관례 적입니다.

+0

그냥 완료 : 이것은 Python과 Javascript (기능적 접근을 허용하는 다른 언어들 중에서도)의 특징 중 하나입니다. 이는 가독성을위한 유연성을 제공하는 디자인 선택입니다. – jsbueno

+1

사이드 노트. 람다 용어는 반드시 "사소한"것은 아닙니다. 그들이 진술을 포함 할 수 없다는 사실은 그것들을 전혀 제한하지 않는다면 진리를 제한하지 않는다. (많은 진술은 순수한 기능적 접근을 사용하여 불필요하다). 람다 용어 안에 변수에 할당 할 수 없다는 사실은 전혀 제한하지 않습니다. 이러한 측면이 정말로 제한적이라면 순수한 기능 언어는 매우 제한적 일 것입니다 (그렇지 않습니다).파이썬 프로그램이 Lambda 용어로 쓰여질 수 없다는 것조차 확신 할 수 없다. (파이썬이 LCO를하지 않는다는 사실이 아니라면). – Hyperboreus

+0

나는 또한 @Hyperboreus에 동의합니다. 저는 파이썬에서 lambdas를 많이 사용했으며, 두 라인 만 가져온 유전자 알고리즘을 썼고, 다른 하나는 무작위로 가져 왔고 다른 하나는 약 2000 자였습니다. – Hovestar

2

원래 범위에서 함수를 만들고 배열에 할당 한 다음 원래 범위에서 함수를 삭제할 수 있습니다. 따라서 배열에서 실제로는 호출 할 수 있지만 로컬 변수로는 호출 할 수 없습니다. 이것이 귀하의 요구 사항을 충족하는지 확실하지 않습니다.

#! /usr/bin/python3.2 

def a (x): print (x * 2) 
def b (x): print (x ** 2) 

l = [a, b] 

del a 
del b 

l [0] (3) #works 
l [1] (3) #works 
a (3) #fails epicly 
당신은 lambda 기능의 목록과 같이 0부터 9까지의 모든 숫자가 증가하기 위해 만들 수있는
2

:

increment = [(lambda arg: (lambda x: arg + x))(i) for i in range(10)] 
increment[0](1) #returns 1 
increment[9](10) #returns 19 

사이드 참고 :

내가 그이 유의하는 것이 중요하다고 생각합니다 (함수 포인터가 아닌 lambdas)는 파이썬이 대부분의 클래스에서 메소드를 보유하는 것과 다소 비슷합니다.리스트 대신 함수를 가리키는 함수 이름을 가진 사전입니다. 모든 경우가 아닌 대부분의 경우 instance.func(args)instance.__dict__['func'](args) 또는 type(class).__dict__['func'](args)과 같습니다.