{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 컴프리헨션과 제너레이터" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "파이썬에서는 컴프리헨션이라는 구문을 사용할 수 있다.\n", "\n", "컴프리헨션 코딩 스타일은 제너레이터를 사용하는 함수로 확장할 수 있다.\n", "\n", "제너레이터는 함수가 점진적으로 반환하는 값으로 이뤄지는 스트림을 만들어준다.\n", "\n", "이터레이터를 사용할 수 있는 곳이라면 어디에서나 제너레이터 함수를 호출한 결과를 사용할 수 있다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 27. map과 filter 대신 컴프리헨션을 사용하라" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "리스트 컴프리헨션!" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]\n" ] } ], "source": [ "a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n", "squares = []\n", "for x in a:\n", " squares.append(x**2)\n", "print(squares)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]\n" ] } ], "source": [ "squares = [x**2 for x in a]\n", "print(squares)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "alt = map(lambda x: x ** 2, a)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[4, 16, 36, 64, 100]\n" ] } ], "source": [ "even_squares = [x**2 for x in a if x % 2 == 0]\n", "print(even_squares)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "alt = map(lambda x : x**2, filter(lambda x: x % 2 == 0, a))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[4, 16, 36, 64, 100]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "even_squares" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{2: 4, 4: 16, 6: 36, 8: 64, 10: 100}\n", "{216, 729, 27}\n" ] } ], "source": [ "even_squares_dict = {x: x**2 for x in a if x % 2 == 0}\n", "threes_cubed_set = {x**3 for x in a if x % 3 == 0}\n", "print(even_squares_dict)\n", "print(threes_cubed_set)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "alt_dict = dict(map(lambda x: (x, x**2), filter(lambda x: x % 2 == 0, a)))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "alt_set = set(map(lambda x: (x, x**3), filter(lambda x: x % 3 == 0, a)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 기억해야 할 내용\n", "- 리스트 컴프리헨션은 lambda 식을 사용하지 않기 때문에 같은 일을 하는 map과 filter 내장 함수를 사용하는 것보다 더 명확하다.\n", "- 리스트 컴프리헨션을 사용하면 쉽게 입력 리스트의 원소를 건너뛸 수 있다. 하지만 map을 사용하는 경우에는 filter의 도움을 받아야만 한다.\n", "- 딕셔너리와 집합도 컴프리헨션으로 생성할 수 있다." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" } }, "nbformat": 4, "nbformat_minor": 4 }