006. python 튜토리얼_06 - chohankyun/python-django-study GitHub Wiki
4.7.3. 임의의 아규먼트 리스트
마지막으로 함수에서 가장 많이 호출 되는 옵션으로 여러개의 임의 아규먼트를 지정하는 것이다.
여러개의 임의 아규먼트는 튜플에 포함 되어진다. 값의 개수는 없을 수도 있고
여러개일 수도 있다.
def write_multiple_items(file, separator, *args):
file.write(separator.join(args))
일반적으로 이런 가변성 아규먼트는 파라미터 형식의 마지막에 오게 된다. 이러한 아규먼트는
함수에 제공되는 나머지 아규먼트를 모두 포함하기 때문이다. 파라미너 형식상 *args
다음에 올 수 있는건 오직 키워드 아규먼트(**kwargs) 뿐이다. 그리고 이것은 함수 선언시
위치적인 아규먼트만을 사용 할 수도 있다는 것이다.
>>> def concat(*args, sep="/"):
... return sep.join(args)
...
>>> concat("earth", "mars", "venus")
'earth/mars/venus'
>>> concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'
4.7.4. 인수 목록 풀기
함수 호출 시 분리된 위치 인수가 필요 함에도 리스트 또는 튜플이 아규먼트로 제공되면 반대 상황이
발생한다. 예를 들어 내장 range() 함수는 분리된 아규먼트 start, stop 아규먼트를 필요로 한다.
만약 분리가 불가능하다면, 함수 호출 시 리스트 또는 튜플를 풀기 위해서 * 연산자를 붙인다.
>>> list(range(3, 6)) # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args)) # call with arguments unpacked from a list
[3, 4, 5]
동일한 방식으로, 딕셔너리를 아규먼트로 전달할 때는 ** 연산자를 붙인다.
>>> def parrot(voltage, state='a stiff', action='voom'):
... print("-- This parrot wouldn't", action, end=' ')
... print("if you put", voltage, "volts through it.", end=' ')
... print("E's", state, "!")
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
4.7.5. 람다(Lambda) 표현식
작은 익명 함수는 lambda 키워드를 사용해서 만들 수 있다. lambda a,b:a+b, 이 함수는 두개의 인수를
받아서 합을 반환한다. 람다 함수는 함수 객체가 필요되어 지는 곳에 사용 될 수 있다.
람다는 문법적으로 하나의 표현식으로 제약된다. 람다는 일반적인 함수 정의의 첨부일 뿐이다.
중첩 함수 정의와 같이 람다 함수도 그 안에 포함된 변소를 참조 할 수 있다.
>>> def make_incrementor(n):
... return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43
위의 예제는 람다 함수를 일반 함수를 반환하기 위해서 사용했다. 아래의 예제는 람다 함수를
작은 함수의 인수를 전달하고 있다.
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
4.7.6. 문서 문자열
다음은 문서 문자열의 내용과 형식에 대한 몇 가지 규칙입니다.
첫 번째 줄은 항상 대상의 목적에 대한 짧고 간결한 요약이어야합니다. 간략하게 말해서,
첫 번째 라인은 객체의 이름 또는 타입과 같은 상태를 의미하는것이 아니라, 함수의
동작 방식에 대해서 기술한다.(함수의 이름이 동작 방식을 설명한다면 생략 할 수 있다.)
첫 번째 라인은 대문자로 시작하며 마침표로 끝내야 한다.
만약 문서 문자열에 더 많은 문자열이 있다면, 두 번째 라인은 공백이어야 한다.
이유는 첫 번째 라인이 함수의 요약이고 나머지는 설명이라는 것을 시각적으로
분리 하기 위해서이다. 설명 다음으로 한 문단 또는 두 문단은 함수의 호출, 영향도,
기타 등등을 나타낸다.
파이썬 파서는 파이썬 안에 있는 다중 문자열의 들여쓰기를 공백 제거 대상에서 제외된다.
그러므로 만약 문서 문자열에 있는 공백을 제거하기 원한다면 문서 처리시 별도의
작업이 필요 하다. 이것은 다음의 규칙데 따라 처리 된다. 공백 라인 다음에 오는
첫 번째 라인의 들여쓰기 크기가 문서 문자열 전체의 들여쓰기 된다.
(첫 번째 라인은 일반적으로 시작 따옴표와 인접해 있어서 문자열의 들여쓰기를 명확하게
알수 없다.) 문서 문자열의 첫 번째 들여쓰기를 위한 공백은 문서 문자열 사용시 제거된다.
들여쓰기보다 적은 공백이 발생하지 말아야 하지만, 만약 들여쓰기보다 적은 공백이 발생하면,
그 공백은 제거 되어야 한다. 들여쓰기를 위한 일정한 공백은 탭을 사용해서 테스트 한다.
(일번적으로 tab : 8 개의 공백, 나는 tab : 4개의 공백)
다음은 다중 라인의 문서 문자열 예제이다.
>>> def my_function():
... """Do nothing, but document it.
...
... No, really, it doesn't do anything.
... """
... pass
...
>>> print(my_function.__doc__)
Do nothing, but document it.
No, really, it doesn't do anything.
4.7.7. 함수 주석
함수 주석은 사용자 정의 함수의 타입 및 정보를 알 수 있도록 하는 추가적인 메타데이터 정보이다.
(PEP 484 참고)
함수 주석은 annotations 라는 함수 어트리뷰트에 딕셔너리 형태로 저장 되면, 함수의
다른 부분에는 전혀 영향을 주지 않는다. 인수 주석은 인수 이름의 colon(:) 다음에 정의 할 수 있다.
함수 주석의 표현식은 다음과 같다. 함수 주석을 출력 하기 위해서는 -> 표현식을 사용하며,
표현식 -> 는 함수 인수 표현식 과 def 문장의 마지막 colon(:) 사이에 위치 시킨다.
다음의 예제는 위치 인수, 키워드 인수, 반환 값에 대한 주석을 보여준다.
>>> def f(ham: str, eggs: str = 'eggs') -> str:
... print("Annotations:", f.__annotations__)
... print("Arguments:", ham, eggs)
... return ham + ' and ' + eggs
...
>>> f('spam')
Annotations: {'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>}
Arguments: spam eggs
'spam and eggs'
4.8. 막간의 연예: 코딩 스타일
당신은 이제 좀 더 길고 복잡한 파이썬 코드를 작성 할것이다. 그러므로 지금이 코딩 스타일에
대해 말하기 좋은 시기이다. 대부분의 언어는 각자 다른 스타일 대로 쓰여진다.
몇몇은 다른 언어보다 좀더 읽기 쉽다. 다른 사람이 당신의 코드를 쉽게 읽을수 있도록
코딩하는것은 항상 좋은 생각이고, 이런 좋은 코딩 스카일은 다른 사람을 큰 도움이 될 것이다.
파이썬에는 대부분의 프로젝트에 적용된 코딩 스타일은 정리한 PEP8 이 있다.
PEP8 은 매우 읽기 쉬우며 보기 좋은 코딩 스타일이 되도록 도와준다.
모든 파이썬 개발자는 PEP8 을 읽어야 하며, 다음은 중요한 몇가지를 추출한 것이다.
-
들여쓰기는 탭을 사용 하지 말고, 공백 4개를 사용해라.
공백 4개를 들여쓰기로 사용하는것은 작은 들여쓰기와 큰 들여쓰기 사이의 타협점이다.
(더 깊은 중첩을 허용 할 수 있고, 읽기 쉽다)
탭은 혼란을 가중시키므로 사용 안하는게 좋다. -
한 라인은 문자 79개를 넘지 말아야 한다.
문자 79개를 넘지 않는것은 작은 화면 사용자에게 유용하며, 큰 화면 사용자에게는
여러개의 파일의 내용을 나란히 배치 할 수 있다. -
함수 와 클래스를 나눌기 위해 공백 라인을 사용하며, 큰 함수 내부를 블럭 단위라
나누기 위해서도 공백 라인을 사용한다. -
가능하면 주석은 주석이 필요한 라인 위에 작성해라.
-
문서 문자열을 사용해라.
-
콤마 다음에는 공백을 사용하고, 괄호 사용시는 공백을 사용하지 않는다 : a = f(1, 2) + g(3, 4)
-
클래명 또는 함수명은 일관성 있게 만들어라, 클래스명은 CamelCase 를 사용하고 함수명 과
메쏘드명은 lower_case_with_underscores 를 사용한다. 그리고 메쏘드의 첫번째 인자는
항상 self 를 사용한다. -
만약 당신의 코드가 국제적인 환경에서 사용 되기를 원하면 그냥 좋아하는 인코딩을 사용하지
마라, 파이썬의 기본 인코딩은 UTF-8 또는 ASCII 이며, 어떠한 상황에서도 잘 동작한다. -
마찬가지로, 만약 당신의 코드를 조금이라도 다른 언어 사용자가 읽거나 유지보수 해야 한다면,
식별자로 non-ASCII 문자를 사용하지마라.