본문 바로가기

Programming/#Python

[Python] 함수와 입출력 (fin) (실습 결과 포함)

본 포스팅은 책 「두근두근 파이썬」을 참고하여 공부한 내용의 정리본입니다. 

 

 

 


이전 게시글

[Python] 함수와 입출력 (2)

2021/01/14 - [Programming/#Python] - [Python] 두근두근 파이썬 Chapter 4 함수와 입출력 (2) (실습 결과 포함)


0. 들어가며

이전 포스팅에서는 함수의 기본 인자 전달 방식부터 키워드 인자 방식, 가변적 인자 방식에 대해 알아보았다. 더불어, 함수 내부에서 자기 자신을 다시 호출하는 재귀함수와 유용하게 사용할 수 있는 여러가지 입출력 메소드에 대해 다루었다. 이번 포스팅에서는 문자열 처리에 필요한 여러 메소드들을 이어서 다뤄보고, 파이썬에서 기본으로 제공하는 내장함수에 대해 알아볼 것이다.

 

1. 여러가지 문자열 처리 메소드

메소드란 함수와 유사한 개념으로, 사전에 정의된 동작을 수행한다는 점에서는 동일하지만, 호출 시 매개변수를 전달받아 동작을 수행하고 결과를 반환할 수 있는 함수와는 달리, 메소드는 프로그래밍에서의 '객체'에 부속되는 함수를 의미한다. 이에, 메소드는 인스턴스(instance)라는 각각의 객체들마다 호출할 수 있다는 특징이 있다. 

>>> s1 = 'aaa'
>>> s2 = 'aaaaaa'
>>> s1.count('a') # s1 인스턴스(객체)에 메소드 적용
3

>>> s2.count('a') # s2 인스턴스(객체)에 메소드 적용
6

 

이와 같은 개념의 메소드 중 문자열을 처리하는 기능의 메소드는 다음과 같이 다양하다. 이때, split() 메소드는 지정한 구분자(seperator)를 기준으로 하나의 문자열을 개별 문자열로 나누는 기능을 한다. 

>>> 'hello'.upper()
'HELLO'

>>> 'HELLO'.lower()
'hello'

>>> 'Guido Van Rossum'.split( )
['Guido', 'Van', 'Rossum']

>>> 'Apple,Banana, Orange'.split(',')
['Apple', 'Banana', 'Orange']

>>> 'Apple|Banana|Orange|Kiwi'.split('|')
['Apple', 'Banana', 'Orange', 'Kiwi']

 

2. format 메소드

또, 유용하게 사용되는 메소드로 format() 메소들가 있다. 이 메소드는 다음과 같이 템플릿 문자열(template string)에서 플레이스 홀더(placeholder) '{}'를 이용해 인자를 출력한다. 아래 예제에서 플레이스 홀더에 0, 1과 같은 인덱스가 지정되어 있는 경우, 해당 인덱스로 출력 순서를 제어할 수 있다. 

>>> '{} Python!'.format('Hello')
'Hello Python!'

>>> '{} Python!'.format('Hi')
'Hi Python!'

>>> '{0} Python!'.format('Hello')
'Hello Python!'

>>> 'I like {} and {}'.format('Python', 'Java')
'I like Python and Java'

>>> 'I like {1} and {0}'.format('Python', 'Java')
'I like Java and Python'

 

이외에도 플레이스 홀더에는 int, float 자료형도 할당될 수 있으며, 동일한 인덱스를 중복해 베이스 문자열에 적용할 수도 있다. 

>>> '{0}, {0}, {0}! Python'.format('Hello')
'Hello, Hello, Hello! Python'

>>> '{0}, {0}, {0}! Python'.format('Hello', 'Hi')
'Hello, Hello, Hello! Python'

>>> '{0} {1}, {0} {1}, {0} {1}!'.format('Hello', 'Python')
'Hello Python, Hello Python, Hello Python!'

>>> '{0} {1}, {0} {1}, {0} {1}!'.format(100, 200)
'100 200, 100 200, 100 200!'

 

더불어, format() 메소드는 위와 같이 문자열, 정수형 리터럴 뿐 아니라 다음과 같이 변수나 객체를 넣을 수도 있다. 이때, 두 번째 예제에서는 사용자로부터 입력받은 값 (name, age, job)을 문자열에 각각 포매팅하여 사용하였다. 

>>> greet = 'Hello'
>>> '{} World!'.format(greet)
'Hello World!'

>>> name = 'Hong GilDong'
>>> print('My Name is {}!'.format(name))
My Name is Hong GilDong!

>>> name = input('당신의 이름을 입력하세요:')
>>> age = input('당신의 나이를 입력하세요:')
>>> job = input('당신의 직업을 입력하세요:')

>>> print('당신의 이름은 {}, 나이는 {}살, 직업은 {}입니다.').format(name, age, job)

 

만일 이러한 포매팅을 사용하지 않고 표현하려면 다음과 같이 코드가 복잡하고 가독성이 떨어지게 된다.

>>> print('당신의 이름은', name, '나이는', age, '살, 직업은', job, '입니다'.)
당신의 이름은 홍길동 나이는 22 살, 직업은 학생 입니다.

 

LAB 4-11: format() 메소드의 활용
# 문항 1-(a)
>>> name = input('당신의 이름을 입력하세요:')
>>> age = input('나이를 입력해주세요:')
>>> job = input('직업을 입력해주세요:')
>>> region = input('사는 곳을 입력해 주세요:')

>>> print('당신의 이름은 {}, 나이는 {}살, 직업은 {}, 사는 곳은 {}입니다.').format(name, age, job, region)


# 문항 1-(b)
>>> name = input('당신의 이름을 입력하세요:')
>>> age = input('나이를 입력해주세요:')
>>> job = input('직업을 입력해주세요:')
>>> region = input('사는 곳을 입력해 주세요:')

>>> print('당신의 이름은', name, ',나이는', age, '살, 직업은', job, '사는 곳은', region, '입니다.')

 

3. 고급 format() 메소드

더 정밀한 문자열 포매팅을 위해 format() 메소드의 고급 기능에 대해 알아보자. format() 메소드는 플레이스 홀더 내에 콜론(':')을 붙여 출력 형식을 지정해줄 수 있다. 우선 다음과 같은 예제에서는 기본 포매팅을 적용해주었기에 결과값에 별도의 정렬 기능이 없다. 

>>> for i in range(2, 15, 2):
	print('{0} {1} {2}'.format(i, i*i, i*i*i))

2 4 8 
4 16 64
6 36 126
8 64 512
10 100 1000
12 144 1728
14 196 2744

 

같은 명령에 대해 다음과 같이 출력 간 크기 지정 기능을 추가하면 훨씬 가독성 있는 출력 결과를 볼 수 있다.

>>> for i in range(2, 15, 2):
	print('{0:3d} {1:4d} {2:5d}'.format(i, i*i, i*i*i))

  2    4     8
  4   16    64
  6   36   216
  8   64   512
 10  100  1000
 12  144  1728
 14  196  2744

 

마찬가지로, 이번엔 소수점의 자리 수를 지정해주는 고급 포매팅 기능을 알아보자. 여기서 지정된 소수점까지 정리해주기 위해 반올림을 적용한다. 

 

 

>>> print('소수점 두 자리로 표현한 원주율 = {0:10.2f}'.format(3.1415926)) # 10칸 띄우고 소수점 둘째자리까지
>>> print('소수점 세 자리로 표현한 원주율 = {0:10.3f}'.format(3.1415926)) # 10칸 띄우고 소수점 셋째자리까지
>>> print('소수점 네 자리로 표현한 원주율 = {0:10.4f}'.format(3.1415926)) # 10칸 띄우고 소수점 넷째자리까지

소수점 두 자리로 표현한 원주율 =       3.14
소수점 세 자리로 표현한 원주율 =      3.142
소수점 네 자리로 표현한 원주율 =     3.1416

>>> print('1/3은 {:3f}'.format(1/3))
1/3은 0.333

>>> print('{:,}'.format(1234567890)) # 1000 단위 쉼표
1,234,567,890

 

키-값 형식을 인자 전달하기

플레이스 홀더에서도 key와 value값을 인자로 하여 지정 출력하는 것도 가능하다. 이때, 각 키가 참조하는 값을 정해주었기 때문에 표현 순서는 중요하지 않다.

>>> print('위도: {0}, 경도: {1}'.format('35.17N', '129.07E'))
위도: 35.17N, 경도: 129.07E

>>> print('위도: {lat}, 경도: {long}'.format(lat = '35.17N', long = '129.07E'))
위도: 35.17N, 경도: 129.07E

>>> print('위도: {lat}, 경도: {long}'.format(long = '129.07E', lat = '35.17N'))
위도: 35.17N, 경도: 129.07E

 

4. 문자열의 다양한 메소드

지금까지 다룬 메소드(method)란 특정 유형의 객체에 적용할 수 있는 특별한 기능들이라고 볼 수 있다. 방금 전까지 다룬 format() 메소드는 문자열 리터럴에 적용할 수 있는 메소드였으며, 이외에도 파싱을 위한 parse()와 기타 capitalize(), count(), encode(), find() 등의 다양한 메소드들이 존재한다. 

>>> 'abc'.upper() 
'ABC' # 대문자로 변환

>>> 'ABC'.lower()
'abc' # 소문자로 변환

>>> 'hobby'.count('h')
1 # 인자가 문자열 내에서 등장하는 횟수

>>> 'hobby'.count('b')
2 

>>> 'hobby'.find('h')
0 # 인자와 동일한 문자가 가장 처음으로 반환되는 위치

>>> 'hobby'.find('b')
2

 

문자열의 메소드 실습
>>> ','.join('ABCD')
'A,B,C,D'

>>> ' hello'.rstrip() # 오른쪽 공백 지우기
' hello'

>>> ' hello'.lstrip() # 왼쪽 공백 지우기
'hello'

>>> ' hello'.strip() # 공백 지우기
'hello'

>>> s1 = 'Long live the King!' # 문자열 교환
>>> s1.replace('King', 'Queen')
'Long live the Queen!'

>>> s1.title() # 모든 글자 첫 문자 대문자로
'Long Live The King!'

>>> s1.capitalize() # 첫 문자만 대문자로
'Long live the king!'

>>> s2 = 'X:Y:Z'
>>> s2.split(':') # 구분자는 콜론
['X', 'Y', 'Z']

>>> 'Hello ' + 'Python!' # 공백 추가되지 않음
'Hello Python!'

 

LAB 4-12: 문자열의 여러 메소드 활용
# 문항 1
>>> '_'.join('ABCD')
'A_B_C_D'

# 문항 2
>>> s = 'My favorite thing is monsters'
>>> s.replace('monsters', 'cartoons')
'My favorite thing is cartoons'

 

5. 내장 함수

보통 함수는 블랙박스(black box)로 자주 비유되곤 한다. 이는 우리가 함수 내부의 동작 메커니즘을 알고 있지 않아도 원하는 기능의 함수에 제대로된 입력값만 부여하면 적절한 결과값을 출력해주기 때문이다. 이에 우리가 지금까지 다룬 파이썬의 다양한 함수 (eg. len(), print() 함수 등)들을 간편히 이용할 수 있었다. 

 

 

 

이와 같은 함수는 파이썬 내부에도 기본으로 구현되어 있는데 이를 내장함수(built-in function)이라고 한다.

 

 

>>> abs(-100) # 절댓값
100

>>> min(200, 100, 300, 400) # 최솟값
200

>>> max(200, 100, 300, 400) # 최댓값
400

>>> str1 = 'FOO'
>>> len(str1) # 문자열의 길이를 반환
3

>>> eval('100+200+300') # 문자열을 수식화해 평가
600

>>> sorted('EABFD') # 문자열 정렬
['A', 'B', 'D', 'E', 'F']

>>> list = [200, 100, 300, 400]
>>> sorted(list) # 오름차순 정렬
[100, 200, 300, 400]

>>> sorted(list, reverse = True) # 내림차순 정렬
[400, 300, 200, 100] 

 

6. 객체의 식별값

파이썬은 대표적인 객체지향 프로그래밍 언어 (object oriented programming language)이다. 이로 인해 파이썬은 다양한 속성 및 기능을 가진 객체들로 프로그램이 구성되는데 이들은 모두 서로 구별되는 고유한 식별값(identity)를 가지고 있다. 그리고 우리는 이를 id() 함수로 받아볼 수 있다. 

>>> a_str = 'Hello Python!'
>>> id(a_str)
2116005922224

>>> n = 300
>>> id(n)
2116005889168

 

이외에도 파이썬 객체의 자료형을 반환해주는 type() 함수와 문자열을 수식화하여 평가하는 eval() 함수, 문자에 할당되어 있는 유니코드 값을 반환하는 chr() 함수가 있다. 이때, eval() 함수는 파이썬 인터프리터가 인자인 문자열 값을 자체적으로 실행하는 등 기능이 매우 강력하다. 

>>> type(123)
<class 'int'>

>>> type('Hello String!')
<class 'str'>

>>> type(120.3)
<class 'float'>

>>> type([100, 300, 600])
<class 'list>

>>> eval('10 + 20')
30

>>> eval('(5 * 20) / 2')
50.0

>>> chr(65)
'A'

>>> ord('A')
65

 


다음 게시글

[Python] 모듈과 활용 (1) (실습결과 추가)

2021/01/23 - [Programming/#Python] - [Python] 모듈과 활용 (1) (실습 결과 포함)

 


 

 

I'm a Senior Student in Data Science ! 

데이터 사이언스를 공부하고 있는 4학년 학부생의 TIL 블로그입니다. 게시글이 도움 되셨다면 구독과 좋아요 :)