3. 임의 인수 리스트(Arbitrary Argument Lists)
가장 잘 사용되지 않은 형태가 임의 변수입니다. 이 인수들은 튜플의 형태를 하고 있습니다. 이 임의 인수가 정의되기 전에, 0개 이상의 인수가 정의될 수 있습니다.
def write_multiple_items(file, separator, *args):
file.write(separator.join(args))
일반적으로, 함수가 진행되면서 모든 남아있는 인수의 입력값을 훔치기 때문에 가변성 인수는 형식 파라미터 리스트의 가장 마지막에 옵니다. *args 파라미터 다음에 오는 형식 파라미터는 위치 변수가 아닌 키워드 인수입니다.
def concat(*name, gubun='/'):
return gubun.join(name)
concat("하나", "둘", "셋")
concat("하나", '둘', '셋', gubun=';')
'하나/둘/셋'
'하나;둘;셋'
4. 인수 리스트 풀기 (Unpacking Argument Lists)
인수가 이미 리스트나 튜플 안에 있지만 분리된 지역 인수를 요구하는 함수 요청에 의해 풀릴 필요가 있을 때 반대 상황이 벌어집니다. 예를 들어 내장함수 range()는 시작과 멈춤 인수를 분리합니다. 만약 별도로 사용할 수 없을 경우엔, * 를 이용해 함수 요청을 기술하여 인수를 튜플이나 리스트에서 풀어줘야 합니다.
>>>list(range(1,5))
[1,2,3,4,5]
>>>args = [1,5]
>>>list(range(*args))[1,2,3,4,5]
같은 방식으로 딕셔너리는 **를 이용해 키워드 인수에 전달할 수 있습니다.
def game(score, name='야구', type='구기종목'):
print("-- 오늘은 ", name, end='\n')
print("점수는", score, "점입니다.", end='\n')
print(1000, name, "!")
d={"score":"1000", "name":"축구", "type":"구기종목"}
game(**d)
-- 오늘은 축구
점수는 1000 점입니다.
1000 축구 !
5. 람다 표현식(Lambda Expressions)
작은 익명의 함수는 lambda 키워드로 작성될 수 있습니다. 이 함수는 두 인수의 합으로 반환됩니다. : lambda a, b: a+b
람다 함수는 함수 객체가 요청할 땐 언제나 사용할 수 있습니다. 이것은 구문적으로 엄격한 하나의 표현식입니다. 의미적으로 그들은 단지 일반적 함수 정의를 위한 문법적 첨가물입니다. 중첩된 함수 정의와 마찬가지로 람다 함수는 포함된 범위의 변수를 참조할 수 있습니다.
def makelambda(n):
return lambda x : x+n
f= makelambda(10)
print(f(1))
print(f(3))
11
13
위의 예시는 함수를 반환하는 람다 표현식을 쓴 것입니다. 다른 용도로는 작은 함수를 인수처럼 전달하는 것입니다.
pair[2]은 (1, '하나')에서 '하나'를 말합니다.
pairs = [(1,'하나'), (2,'둘'), (3,'셋')]
pairs.sort(key=lambda pair:pair[1])
print(pairs)
[(2, '둘'), (3, '셋'), (1, '하나')]
6. 문서 문자열(Documentation Strings)
문서 문자열의 형식과 내용에 관한 몇가지 규칙이 있습니다. 첫 줄은 항상 짧고 간결한 객체의 목적에 대한 요약이어야 합니다. 간결성을 위해서 다른 방법을 사용할 수 있기 때문에 개체의 이름이나 타입을 명시적으로 나타낼 필요는 없습니다. (이름이 함수의 기능을 설명하는 동사인 경우는 제외) 이 줄은 반드시 대문자로 시작해야 하며 마침표로 끝나야 합니다.
더 많은 줄이 있다면, 두번째 줄은 반드시 빈칸으로 두어 나머지 설명과 요약이 분리되게 합니다. 다음 줄은 객체 호출 규약이나 부작용 등을 설명하는 하나 이상의 문단이어야 합니다.
파이썬 파서는 여러줄의 문자열에서 들여쓰기를 제거하지 않습니다. 따라서 원하는 경우 문서 작성도구로 들여쓰기를 제거해야 합니다. 이것은 다음 규칙을 사용하여 수행됩니다. 첫번째 행 뒤에 있는 비어있지 않은 행은 문서 전체의 들여쓰기양을 결정합니다. (첫줄은 일반적으로 문자열의 여는 따옴표와 인접해 있기 때문에 들여쓰기가 명확하지 않아 사용할 수 없습니다.) 이 들여쓰기에 들어간 같은 양의 여백은 문자열의 모든 열의 시작부분에서 제거됩니다. 들여쓰기가 적은 줄은 발생하지 않아야하지만, 발생하게 되면 앞에 있는 공백을 제거해야 합니다. 여백의 동등함은 반드시 탭을 확장한 후 검사해야 합니다. (보통 8개의 공백까지)
여기 여러 줄의 문자열 예시가 있습니다.
def my_string():
"""여자친구의 오늘부터 우리는.
널 향한 설레임을 오늘부터 우리는.
꿈꾸며 기도하는 오늘부터 우리는.
"""
pass
print(my_string.__doc__)
여자친구의 오늘부터 우리는.
널 향한 설레임을 오늘부터 우리는.
꿈꾸며 기도하는 오늘부터 우리는.
7. 함수 주석(Function Annotations)
함수 주석은 이용자가 정의한 함수를 사용하는 타입에 대한 추가적인 메타데이터 정보입니다. 주석은 아무런 효과를 가지지 않은 함수의 속성인 __annotations__ 에 저장됩니다. 매개변수 주석은 매개변수 이름 다음에 콜론으로 정의되고, 그 다음에 주석 값이 입력됩니다. 반환되는 주석(return값에 대한 주석)은 def 선언문의 매개변수 목록과 선언문의 마지막인 콜론 사이의 ->로 정의됩니다. 아래의 예시는 위치 인수와 키워드 인수를 가지고 있으며 주석 처리된 값을 반환합니다.
def func(name:str, school: str = 'highschool') -> str:
print("주석 : ", func.__annotations__)
print("인수 : ", name, school)
return name+'and'+school
func('고등학교')
주석 : {'name': <class 'str'>, 'school': <class 'str'>, 'return': <class 'str'>}
인수 : 고등학교 highschool