파이썬은 여러분이 사용할 수 있는 함수들과 모듈들을 많이 준비해놓고 있다.
든든한 망치나 드라이버처럼, 내장된 도구(정말로 거대한 코드)는 프로그램을 훨씬 쉽게 작성하도록 해줄 것이다.
모듈은 사용하기 전에 임포트되어야 한다.
하지만 파이썬의 내장 함수는 임포트할 필요가 없다.
파이썬 쉘을 시작하자마자 사용될 준비가 된 것이다.
여기서는 파이썬 프로그래머들이 자주 사용하는 유용한 12개의 내장함수들에 대해서 살펴볼 것이다.
그 함수들이 수행하는 작업과 사용 방법을 설명할 것이며, 그런 다음 여러분의 프로그램에 어떤 도움을 줄 수 있는지 예제를 보여줄 것이다.
아래의 함수들을 클릭하면 자세한 설명이 나온다.
ABS 함수
abs 함수는 숫자의 절대값(부호가 없는 숫자값)을 반환한다.
예를 들어 10의 절대값은 10이며, -10의 절대값도 10이다.
abs 함수를 사용하기 위해서 다음과 같은 숫자나 변수를 호출해보자.
>>> print(abs(10)) 10 >>> print(abs(-10)) 10
abs 함수는 게임에 있는 캐릭터가 방향에 상관없이 얼만큼 움직였는지를 계산하는 것과 같은 작업에 사용될 것이다.
예를 들어, 캐릭터가 오른쪽으로 3발짝(양수 3)을 움직인 다음에 왼쪽으로 10발짝(음수 10, 즉 -10) 움직였을 때 방향(양수 또는 음수)을 고려하지
않는다면 그 움직임에 대한 절대값은 3과 10이 될 것이다.
어쩌면 두 개의 주사위를 굴려서 그 주사위의 합만큼 어느 방향으로든지 움직일 수 있는 보드 게임에서 사용할 수도 있을 것이다.
만약에 어떤 변수에 움직인 횟수를 저장한다면 다음과 같은 코드로 캐릭터가 움직였는지를 확인할 수 있다.
캐릭터가 움직이는 것을 플레이어가 결정할 때 어떤 정보를 보여줄 수 있다(여기서는 "Character is moving"이라고 표시할 것이다).
>>> steps = -3 >>> if abs(steps) > 0: print('Character is moving')
만약 abs를 사용하지 않는다면 if문은 다음과 같이 될 것이다.
>>> steps = -3 >>> if steps < 0 or steps > 0: print('Character is moving')
이 코드에서 알 수 있듯이, abs를 사용하면 if문이 조금 더 짧아지고 이해하기 쉬워진다.
BOOL 함수
bool 함수는 참과 거짓의 두 가지 값 중에 하나만 가질 수 있는 데이터 타입을 설명할 때 프로그래머가
사용하는 단어인 불리언(Boolean)의 약자다.
bool 함수는 단 하나의 매개변수를 받으며 그 값으로 True 또는 False를 반환한다.
숫자에 bool을 사용하면 0은 False를 반환하고, 그 외의 값은 True를 반환한다.
다음은 여러 가지 숫자에 bool을 사용하는 방법이다.
>>> print(bool(0)) False >>> print(bool(1)) True >>> print(bool(1123.23)) True >>> print(bool(-500)) True
문자열과 같은 다른 값들에 bool을 사용하면 문자열에 값이 없을 경우(다시 말해서 None, 즉 빈 문자열)에 False를 반환한다.
그렇지 않으면 다음과 같이 True를 반환한다.
>>> print(bool(None)) False >>> print(bool('a')) True >>> print(bool(' ')) True >>> print(bool('')) False >>> print(bool('What do you call a pig doing karate? Pork Chop!')) True
bool 함수는 아무런 값을 가지고 있지 않은 리스트와 거북이, 맵에 대해 False를 반환할 것이며,
값을 가지고 있다면 True를 반환할 것이다.
>>> my_silly_list = [] >>> print(bool(my_silly_list)) False >>> my_silly_list = ['s', 'i', 'l', 'l', 'y'] >>> print(bool(my_silly_list)) True
값이 설정되어있는지 아닌지를 결정해야 할 경우에 bool을 사용하게 될 것이다.
예를 들어 여러분의 프로그램을 사용하는 사람들에게 태어난 년도를 입력하도록 한다면 사용자가 값을 입력했는지를
검사하기 위해서 if 문에 bool을 사용할 수도 있을 것이다.
>>> year = input('Year of birth: ') Year of birth: >>> if not bool(year.rstrip()): print('you need to enter a value for your year of birth') you need to enter a value for your year of birth
이 예제에서 첫 번째 줄은 사용자가 키보드로 입력한 것을 year라는 변수에 저장하기 위해서 input을 이용한다.
다음 줄에서 아무것도 입력하지 않고 엔터(ENTER)를 누르면 그 변수에 엔터 키의 값이 저장된다.
(이와 동일한 동작을 하는 또 다른 방법으로 sys.stdin.readline()이 있다.)
다음 줄에서 if 문은 그 변수의 rstrip 함수를 사용한 다음에 불리언 값을 검사한다.
(rstrip 함수는 문자열의 모든 공백과 문자열의 끝에 있는 엔터 문자를 제거하는 함수다.)
이번 예제에서는 사용자가 아무것도 입력하지 않기 떄문에 bool 함수는 거짓을 반환한다.
if 문은 not 키워드를 사용하고 있으므로 "이 함수가 참을 반환하지 않는다면 실행하라."라는 말이며,
다음 줄에서 you need to enter a value for your year of birth를 출력한다.
DIR 함수
dir(directory의 약자) 함수는 모든 값에 대한 정보를 반환한다.
기본적으로 이 함수는 알파벳순인 값과 함께 사용될 수 있는 함수다.
예를 들어, 사용할 수 있는 함수들을 리스트 값으로 표시하기 위해서 다음과 같이 입력해보자.
>>> dir(['a', 'short', 'list']) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
dir 함수는 문자열과 숫자, 함수, 모듈, 객체, 클래스를 포함한 거의 모든 것들에서 동작한다.
하지만 때로는 이 함수가 반환하는 정보가 전혀 유용하지 않을 수 있다.
예를 들어 숫자 1에 대한 dir을 호출하면 파이썬 자체는 사용하지만 우리에게는 정말로 유용하지 않은 수많은 특별한 함수들을 표시할 것이다.
(대부분은 보통 무시해도 될 것들이다.)
>>> dir(1) ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
dir 함수는 어떤 변수에서 사용할 수 있는 것들이 무엇인지를 빠르게 알려고 할 경우에 유용하다.
예를 들어, 문자열 값을 가지고 있는 popcorn 변수를 가지고 dir을 실행하면 string 클래스가 제공하는 모든 함수 목록들을 얻을 수 있다.
(모든 문자열은 string 클래스의 구성원이다.)
>>> popcorn = 'I love popcorn!' >>> dir(popcorn) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
여기서 목록에 있는 어떤 함수에 대한 짧은 설명을 얻고 싶다면 help를 사용하면 된다,
다음의 예제는 upper 함수에 대한 help를 실행한 것이다.
>>> help(popcorn.upper) Help on built-in function upper: upper(...) method of builtins.str instance S.upper() -> str Return a copy of S converted to uppercase.
결과로 나온 정보가 약간 혼란스러울 수도 있으니 좀 더 자세하게 살펴보자.
생략 부호인 (...)은 upper가 string 클새스의 내장 함수라는 의미이며 매개변수를 받지 않는다는 뜻이다.
다음 줄에 있는 화살표(->)는 이 함수가 문자열(str)을 반환한다는 의미다.
마지막 줄에서는 이 함수가 하는 동작을 간단하게 설명해준다.
EVAL 함수
eval(evaluate의 약자) 함수는 매개변수로 문자열을 받으며, 파이썬의 표현식인 것처럼 실행된다.
예를 들어, eval('print("wow")')는 사실 print("wow") 구문을 실행할 것이다.
eval 함수는 다음과 같이 오직 간단한 표현식과 함께 동작한다.
>>> eval('10*5') 50
보통 다음의 if 문처럼 한 줄 이상으로 나눠진 표현식은 실행되지 않을 것이다.
>>> eval('''if True: print("this won't work at all")''') Traceback (most recent call last): File "<pyshell#39>", line 2, in <module> print("this won't work at all")''') File "<string>", line 1 if True: ^ SyntaxError: invalid syntax
eval 함수는 사용자의 입력을 파이썬의 표현식으로 바꿀 때 종종 사용된다.
예를 들어, 파이썬에 입력된 방정식을 읽은 다음 그 답을 계산(평가)하는 간단한 계산기 프로그램을 만드는데 사용될 수 있다.
사용자 입력은 문자열로 읽혀지기 떄문에 파이썬은 계산을 하기 전에 그것을 숫자와 연산자로 변환해야 한다.
eval 함수는 이러한 변환을 쉽게 해준다.
>>> your_calculation = input('Enter a calculation: ') Enter a calculation: 12*52 >>> eval(your_calculation) 624
이 예제에서는 사용자가 입력한 값을 읽기 위해 input을 사용해 your_calculation 변수에 저장한다.
다음 줄에는 12*52 라는 표현식을 입력한다. (여러분의 나이에 52주를 곱해보라.)
eval을 이용해 이 계산을 하고 그 결과가 마지막 줄에 출력된다.
EXEC 함수
exec 함수는 eval과 같다. 다만, 좀 더 복잡한 프로그램들을 실행할 때 사용될 수 있다는 것만 다르다.
두 함수의 차이점은, eval은 값(변수에 저장할 수 있는 것)을 반환하지만 exec는 그렇지 않는다는 것이다.
다음의 예제를 살펴보자.
>>> my_small_program = '''print('ham') print('sandwich')''' >>> exec(my_small_program) ham sandwich
처음 두 줄은 두 개의 print 구문을 가진 여러 줄의 문자열의 변수를 생성하고, exec를 사용해 그 문자열을 실행한다.
파이썬 프로그램이 파일로 읽어 들인 작은 미니 프로그래램을 실행하려고 할 때 exec를 사용할 수 있다.
이건 정말로 프로그램 속의 프로그램이다!
이 방법은 매우 길고 복잡한 애플리케이션을 개발할 때 매우 유용할 것이다.
예를 들어, 두 개의 로봇이 화면 위에 움직이며 서로 공격하는 로봇 결투 게임을 만들고
게임 플레이어가 파이썬 미니 프로그램처럼 자신의 로봇에 대한 명령들을 그
게임에 제공했다면
로봇 결투 게임은 제공된 스크립트를 읽어서 exex를 사용해 그것을 실행할 것이다.
FLOAT 함수
float 함수는 문자열이나 숫자를 실수(real number)라고 하는 소수점이 있는 부동 소수점(floating-point) 숫자로 변환한다.
예를 들어 숫자 10은 범자연수(whole number)라고도 불리는 정수(integer)이지만 10.0이나 10.1 또는 10.253은 부동 소수점 수다.
문자열을 실수로 변환하기 위해서는 다음과 같이 float를 호출하면 된다.
>>> float('12') 12.0
문자열에 소수점이 있는 것도 마찬가지다.
>>> float('123.456789') 123.456789
프로그램에 입력된 값을 적절한 숫자로 변환하기 위해서 float를 사용하게 될 것이다.
이것은 사용자가 입력한 값을 다른 값들과 비교해야 할 경우에 특히 더 유용하다.
예를 들어, 사용자의 나이가 몇 살 이상인지를 확인할 때 다음과 같이 할 수 있다.
>>> age = float(your_age) >>> if age > 13: print('Your are %s years too old' % (age - 13)) Your are 7.0 years too old
INT 함수
int 함수는 문자열이나 숫자를 범자연수(즉, 정수)로 변환해준다.
이것은 기본적으로 소수점이하의 모든 것들을 버린다는 의미다.
예를 들어 부동 소수점 수를 정수로 변환하면 다음과 같다.
>>> int(123.456) 123
다음 예제는 문자열을 정수로 변환한다.
>>> int('123') 123
하지만 부동 소수점 수를 가지고 있는 문자열을 정수로 변환하려고 하면 에러 메시지가 나올 것이다.
예를 들어 int 함수를 이용해 부동 소수점 수를 포함하는 문자열을 변환하려고 하면 다음과 같이 된다.
>>> int('123.456') Traceback (most recent call last): File "<pyshell#55>", line 1, in <module> int('123.456') ValueError: invalid literal for int() with base 10: '123.456'
이와 같이 ValueError 메시지가 나온다.
LEN 함수
len 함수는 객체(문자열)의 길이(글자 개수)를 반환한다.
예를 들어 this is a test string이라는 문자열의 길이는 다음과 같이 얻을 수 있다.
>>> len('this is a test string') 21
리스트나 튜플에서 사용하면 거기에 있는 항목들의 개수를 반환한다.
>>> create_list = ['unicorn', 'cyclops', 'fairy', 'elf', 'dragon', 'troll'] >>> print(len(create_list)) 6
맵(map) or 딕셔너리(dic) 에서 사용하면 들어있는 항목들의 개수를 반환한다.
>>> enemies_map = {'Batman' : 'Joker', 'Superman' : 'Lex Luthor', 'Spiderman' : 'Green Goblin'} >>> print(len(enemies_map)) 3
len 함수는 루프(loop) 작업을 할 때 특히 유용하다.
예를 들면 다음과 같은 리스트에 있는 항목들의 인덱스 위치를 표시할 때 사용될 수 있다.
>>> for x in range(0, length): print('the fruit at index %s is %s' % (x, fruit[x])) the fruit at index 0 is apple the fruit at index 1 is banana the fruit at index 2 is clementine the fruit at index 3 is dragon fruit
이 코드에서 우리는 변수 length에 리스트의 길이를 담는다.
그런 다음, 루프를 만들기 위해서 range 함수에서 그 변수를 사용한다.
for문에서는 리스트의 각 항목을 가져와서 그 항목의 인덱스 위치와 값을 출력하는 메시지를 표시한다.
len 함수는 문자열들의 리스트에 있는 두 번째 혹은 세 번째 항목을 출력하고자 할 때도 사용할 수 있다.
MAX 함수와 MIN 함수
max 함수는 리스트, 튜플 또는 문자열에 있는 가장 큰 항목을 반환한다.
다음의 코드는 숫자들의 리스트에서 이 함수를 사용하는 방법을 보여준다.
>>> numbers = [5, 4, 10, 30, 22] >>> print(max(numbers)) 30
콤마나 공백으로 구분된 글자들로 구성된 문자열에서도 동작한다.
>>> strings = 's,t,r,i,n,g,S,T,R,I,N,G' >>> print(max(strings)) t
이 예제에서처럼 문자들은 알파벳 순서가 있으며, 소문자는 대문자 다음에 나오리 때문에 t가 T보다 더 크다.
하지만 반드시 리스트나 튜플 또는 문자열을 사용해야만 하는 것은 아니다.
바로 직접 max 함수를 호출할 수도 있으며, 비교하고자 하는 항목들을 매개변수처럼 괄호 안에 넣어서 사용하면 된다.
>>> print(max(10, 300, 450, 50, 90)) 450
min 함수는 max 함수처럼 동작하지만, 리스트나 튜플 또는 문자열에 있는 가장 작은 항목을 반환한다는 것이 다르다.
숫자들을 사용했던 처음 예제에서 max 대신 min을 사용해보자.
>>> numbers = [5, 4, 10, 30, 22] >>> print(min(numbers)) 4
예를 들어, 네 명의 플레이어로 구성된 팀과 여러분이 숫자 맞추기 게임을 하고 있다.
플레이어들이 생각한 숫자는 여러분이 생각한 숫자보다 작아야 하는 게임이다.
만약에 플레이어들이 생각한 숫자가 여러분의 숫자보다 크면 모두가 지게 되는 것이고,
여러분의 숫자가 제일 크다면 모두가 이기는 것이다.
이 모든 숫자들이 높은지 낮은지를 빠르게 찾기 위해서 다음과 같이 max 함수를 사용할 수 있다.
>>> guess_this_number = 61 >>> player_guesses = [12, 15, 70, 45] >>> if max(player_guesses) > guess_this_number: print('Boom! You all lose') else: print('You win') Boom! You all lose
이 예제에서는 guess_this_number 변수를 사용해 생각한 숫자를 저장한다.
팀 멤버들이 새각한 숫자들은 player_guesses라는 리스트에 저장한다.
if 문은 guess_this_number에 있는 숫자와 리스트에 있는 최대 숫자를 비교하며,
어떤 플레이어가 생각한 숫자가 더 크다면 "Boom! You all lose."라는 메시지를 출력하게 된다.
RANGE 함수
앞에서 본 range 함수는 특정 횟수만큼 코드를 반복하는 for 루프에 주로 사용된다.
range 함수에 주어지는 처음 두 개의 매개변수는 시작(start)과 끝(stop)이라고 불린다.
우리는 루프와 함께 len 함수를 사용하는 예제에서 두 개의 매개변수를 사용한 range 함수를 보았다.
range 함수가 만든 숫자들은 첫 번째 매개변수로 주어진 숫자부터 시작해 두 번째 매개변수보다 하나 작은 숫자에서 끝난다.
예를 들어, 다음의 예제는 0과 5 사이의 숫자를 생성하는 range 함수가 출력하는 것들을 보여준다.
>>> for x in range(0, 5): print(x) 0 1 2 3 4
range 함수는 작업을 여러 번 반복하는 이터레이터(iterator)라고 불리는 특정 객체를 반환한다.
여기에서는 호출될 때마다 그 다음의 큰 숫자를 반환한다.
이터레이터를 list 함수를 사용한 리스트로 변환할 수 있다.
만약에 range를 호출할 때 반환되는 값을 출력한다면 다음과 같을 것이다.
>>> print(list(range(0, 5))) [0, 1, 2, 3, 4]
range에 증가값(step)이라는 세 번째 매개변수를 추가할 수도 있다.
만일 증가값 없다면 디폴트로 1을 사용하게 된다.
증가값을 2로 하면 어떻게 될까? 다음은 그 결과를 보여준다.
>>> count_by_twos = list(range(0, 30, 2)) >>> print(count_by_twos) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
리스트에 있는 숫자는 앞에 있는 숫자보다 2씩 증가하며, 30보다 2 작은 28에서 리스트가 끝난다.
증가값으로 음수를 사용할 수도 있다.
>>> count_by_twos = list(range(40, 10, -2)) >>> print(count_by_twos) [40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12]
SUM 함수
sum 함수는 리스트에 있는 항목들을 더해서 그 합계를 반환한다.
다음의 예제를 살펴보자.
>>> count_by_twos = list(range(40, 10, -2)) >>> print(count_by_twos) [40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12] >>> my_list_of_numbers = list(range(0, 500, 50)) >>> print(my_list_of_numbers) [0, 50, 100, 150, 200, 250, 300, 350, 400, 450] >>> print(sum(my_list_of_numbers)) 2250
첫 번째 줄에서는 0부터 500 사이 숫자로 된 리스트를 생성하며 증가값은 50을 사용한다.
다음 줄은 그 결과를 보기 위하여 리스트를 출력한다.
마지막으로, my_list_of_numbers 변수를 sum 함수에 전달하여 리스트에 있는 모든 항목들을
더하는 print(sum(my_list_of_numbers))를 호출하면 2250이라는 합계가 나온다.
'Python > Python 기초' 카테고리의 다른 글
파이썬 버전 2와 버전 3의 차이점 (3) | 2014.12.06 |
---|---|
유용한 파이썬 모듈 (0) | 2014.11.04 |
클래스와 객체를 사용하는 방법 (0) | 2014.10.26 |
튜플 (Tuple) (0) | 2014.10.26 |
파이썬의 문자열 (0) | 2014.10.24 |