고차 함수

이것은 Data Science from Scratch (Joel Grus 작성)을 통한 진행 상황을 문서화한 두 번째 게시물입니다. 이 책의 2장에서는 Python의 빠른 "중급 과정"을 제공합니다.

(R에서) Python을 처음 접한 사람으로서 제 목표는 두 가지입니다. 먼저 이 책을 훑어보고 그 부산물로 파이썬을 배워보자. 둘째, 데이터 과학 프로세스에서 무언가를 성취하기 위해 Pythonic 방식의 작업이 필요한 영역을 찾아 강조 표시합니다.

저는 데이터 정리 또는 사전 처리, 모델링을 위한 데이터 준비, 탐색적 데이터 분석 또는 모델 교육, 검증 및 테스트 역학에서 일부 작업을 수행하는 데 필요한 Python 언어의 특정 기능을 살펴보겠습니다.

함수에 대한 그의 범위에서 Grus는 Python에서 함수가 어떻게 일류이고 다른 함수에 인수로 전달될 수 있는지 강조합니다. 나는 책의 예에서 그림을 그릴 것이고 다른 각도에서 동일한 개념을 조사하기 위해 외부 소스를 보완할 수 있습니다.

인수로 전달되는 함수의 그림은 아래에 설명되어 있습니다. 함수double가 생성됩니다. 함수apply_to_one가 생성됩니다. double 함수는 my_double 를 가리킵니다. my_doubleapply_to_one 함수에 전달하고 x 로 설정합니다.

어떤 함수가 apply_to_one 에 전달되든 그 인수는 1입니다. 따라서 my_double 전달은 1을 두 배로 늘리는 것을 의미하므로 x는 2입니다.

그러나 중요한 것은 함수가 다른 함수(고차 함수라고도 함)로 전달되었다는 것입니다.


def double(x):
    """
    this function doubles and returns the argument
    """
    return x * 2

def apply_to_one(f):
    """Calls the function f with 1 as its argument"""
    return f(1)

my_double = double

# x is 2 here
x = apply_to_one(my_double)


다음은 위의 예를 확장한 것입니다. 정수 5를 인수로 사용하여 함수를 반환하는 apply_to_five 함수를 만듭니다.


# extending the above example
def apply_five_to(e):
    """returns the function e with 5 as its argument"""
    return e(5)

# doubling 5 is 10
w = apply_five_to(my_double)


함수가 광범위하게 사용될 것이기 때문에 여기에 또 다른 복잡한 예가 있습니다. 나는 이것을 Trey Hunner's site 에서 찾았습니다. squarecube의 두 가지 기능이 정의됩니다. 두 함수 모두 operations 라는 목록에 저장됩니다. 다른 목록numbers이 생성됩니다.

마지막으로 for 루프를 사용하여 numbers 를 반복하고 enumerate 속성을 사용하면 숫자의 인덱스와 항목 모두에 액세스할 수 있습니다. 이것은 actionsquare인지 cube인지를 찾는 데 사용됩니다. square 목록.


# create two functions
def square(n): return n**2
def cube(n): return n**3

# store those functions inside a list, operations, to reference later
operations = [square, cube]

# create a list of numbers
numbers = [2,1,3,4,7,11,18,29]

# loop through the numbers list
# using enumerate the identify index and items
# [i % 2] results in either 0 or 1, that's pointed at action
# using the dunder, name, retrieves the name of the function - either square or cube - from the operations list
# print __name__ along with the item from the numbers list
# action is either a square or cube

for i, n in enumerate(numbers):
    action = operations[i % 2]
    print(f"{action.__name__}({n}):", action(n))

# more explicit, yet verbose way to write the for-loop
for index, num in enumerate(numbers):
    action = operations[index % 2]
    print(f"{action.__name__}({num}):", action(num))


for 루프는 다음을 출력합니다.

정사각형(2): 4
큐브(1): 1
정사각형(3): 9
큐브(4): 64
정사각형(7): 49
큐브(11): 1331
정사각형(18): 324
큐브(29): 24389

다른 함수에 인수로 전달되는 함수의 특별한 예는 Python 익명 함수cube입니다. 그러나 numbers 로 함수를 정의하는 대신 lambda 를 사용하면 다른 함수 내부에 바로 정의됩니다. 다음은 예시입니다.


# we'll reuse apply_five_to, which takes in a function and provides '5' as the argument
def apply_five_to(e):
    """returns the function e with 5 as its argument"""
    return e(5)

# this lambda function adds '4' to any argument
# when passing this lambda function to apply_five_to
# you get y = 5 + 4
y = apply_five_to(lambda x: x + 4)

# we can also change what the lambda function does without defining a separate function
# here the lambda function multiplies the argument by 4
# y = 20
y = apply_five_to(lambda x: x * 4)

lambda 함수는 편리하고 간결하지만 대신 def로 함수를 정의해야 한다는 합의가 있는 것 같습니다.

다음은 Trey Hunnerlambda 함수의 외부 예입니다. 이 예에서 def 함수는 두 개의 인수를 취하는 lambda 함수 내에서 사용됩니다.


# calling help(filter) displays an explanation

class filter(object)
 |  filter(function or None, iterable) --> filter object

# create a list of numbers
numbers = [2,1,3,4,7,11,18,29]

# the lambda function will return n if it is an even number
# we filter the numbers list using the lambda function
# wrapped in a list, this returns [2,4,18]
list(filter(lambda n: n % 2 == 0, numbers))


파이썬 함수에 대해 쓸 수 있는 책 전체 또는 적어도 전체 장이 있지만 지금은 함수가 다른 함수에 대한 인수로 전달될 수 있다는 아이디어로 논의를 제한할 것입니다. 책을 진행하면서 이 섹션에 대해 다시 보고하겠습니다.

좋은 웹페이지 즐겨찾기