[파이썬 기본 1-2] 자료형(문자열/콜렉션), 함수 정의
1. 파이썬의 자료형
1) 문자열
- 사전에 정의된 명령어나 따옴표와 같은 특수문자를 문자열로 사용하기 위해
확장 문자(Escape sequence)라고 부르는 역슬래시 기호(\)를 사용함
<예시1>
#코드 2-15
strings_1 = 'This is String!'
strings_2 = "This is String!"
strings_3 = '''This is String!'''
strings_4 = """This is String!"""
print(strings_1)
print(strings_2)
print(strings_3)
print(strings_4)
<출력 결과>
<예시2>
#코드 2-16
string_5 = "This is String! \"따옴표\" 기호:!@#$%^" #따옴표 표시를 위해서 이스케이프문자 필요함
print(string_5)
string_6 = '''This is String!
"따옴표" 기호:!@#$%^''' #따옴표 표시를 위해서 이스케이프문자 필요없음, 엔터로 줄바꿈도 가능
print(string_6)
<출력 결과>
2) 콜렉션 자료형
① 튜플(Tuple)
- 튜플은 무괄호 또는 소괄호'( )'로 정의한다.
- 튜플은 한번 정의하고 나면 변경이 불가능하다. (상수처리)
- 튜플은 순서가 있는 데이터 목록으로, 순서가 중요하다.
- 튜플은 다양한 자료형을 한번에 담을 수 있다.
<예시1>
#코드 2-17
#튜플은 한번 정의하면 값 변경이 불가능하다.(상수처리)
#튜플은 순서가 중요하다.
tuple_1 = 1, 2, 3, 4, 5
tuple_2 = ('가', '나', '다', '라', '마')
tuple_3 = '파이썬', 10000, False
tuple_4 = '파이썬', (10000, '만큼','어려워'), False
print(tuple_1, type(tuple_1))
print(tuple_2, type(tuple_2))
print(tuple_3, type(tuple_3))
print(tuple_4, type(tuple_4))
<출력 결과>
<예시2>
#코드 2-18
#튜플은 한번 정의하면 값 변경이 불가능하다.(상수처리)
#튜플은 순서가 중요하다.
tuple_1 = 1, 2, 3, 4, 5
tuple_1[2] = 100
print(tuple_1)
<출력 결과>
(L4) 값 변경이 불가능하다는 에러가 난다.
② 세트(Set)
- 세트는 중괄호'{ }' 또는 set({ }) 또는 set([ ])로 정의한다.
- 세트는 데이터의 중복을 허용하지 않는 콜렉션 자료형이다.(데이터는 유일함)
- 세트는 순서가 중요하지 않다. (데이터의 순서가 예시와 다르게 출력될 수 있다.)
- 세트는 많이 사용되지 않는 자료형이다.
*.add(데이터) : *세트에 데이터 추가
*.remove(데이터) : *세트에 데이터 삭제
변수=*.copy() : *세트를 복사하여 변수에 대입
*.clear() : *세트에 데이터 모두 삭제
<예시1>
#코드 2-20
#세트는 데이터 중복을 허용하지 않고, 데이터 입력 순서는 중요하지 않음. (데이터의 순서가 예시와 다르게 출력될 수 있음)
#세트는 많이 사용하지 않음.
set_1 = {1, 2, 3, '가', '나', '다', 1, 2}
set_2 = set({1, 2, 3, '가', '나', '다', 1, 2})
set_3 = set([1, 2, 3, '가', '나', '다', 3])
print(set_1)
print(set_2)
print(set_3)
<출력결과>
<예시2>
#코드 2-21
#세트는 데이터 중복을 허용하지 않고, 데이터 입력 순서는 중요하지 않음. (데이터의 순서가 예시와 다르게 출력될 수 있음)
#세트는 많이 사용하지 않음.
set_1 = {1, 2, 3, '가', '나', '다'}
set_1.add('추가')
print(set_1)
set_1.remove('가')
print(set_1)
set_copy_1 = set_1.copy()
print(set_copy_1)
set_copy_1.clear()
print(set_copy_1)
<출력결과>
③ 리스트(List)
- 리스트는 대괄호'[ ]' 로 정의한다.
- 리스트는 데이터를 다루기 편리하다는 장점으로 가장 많이 사용되는 콜렉션 자료형이다.
- 리스트는 데이터의 순서가 중요하다.
- 리스트는 다양한 내장함수로 데이터를 추가(Append), 삽입(Insert), 삭제(Remove), 정렬(Sort)이 쉽게 가능하다.
*.append(데이터) : *리스트 마지막 항목에 데이터 추가
*[n] = x : *리스트의 n번 항목을 x로 변경
*.remove(데이터) : *리스트에 데이터 삭제 (리스트에 같은 데이터가 여러개라면, 순서가 가장 앞에있는 데이터를 삭제)
*.insert(n, 데이터) : *리스트의 n번 자리에 데이터 추가
변수=*.copy() : *리스트를 복사하여 변수에 대입
*.sort() : *리스트 데이터를 오름차순 정렬
*.sort(reverse=True) : *리스트 데이터를 내림차순 정렬
<예시1>
#코드 2-22
#리스트 생성하기
#리스트는 가장 많이 활용되는 콜렉션 자료형으로, 데이터를 다루기 가장 편하다.
#(순서도 있고, 삽입/삭제/갱신을 위한 내장함수들도 많다.)
list_1 = [1, 2, 3, 4, 5, 1, 3]
list_2 = []
print(list_1)
print(list_2)
print(len(list_1))
#리스트 변경하기
list_1[3] = 9999
print(list_1)
list_1.append(100)
print(list_1)
list_1.append(9999)
print(list_1)
list_1.remove(9999)
print(list_1)
list_1.insert(0,777)
print(list_1)
#리스트 복제하기
list_2 = list_1.copy()
print(list_2)
<출력결과>
<예시2>
#코드 2-23
list_1 = [897, 2, 1, 4, 99, 5.24, 17]
print(list_1)
#뒤집기
list_1.reverse()
print(list_1)
#오름차순 정렬하기
list_1.sort()
print(list_1)
#내림차순 정렬하기
list_1.sort(reverse=True)
print(list_1)
<출력결과>
④ 딕셔너리(Dictionary)
- 딕셔너리는 {키:값} 으로 정의한다.
- 딕셔너리는 단어 그대로 사전과 같이 값(value)과 키(key)가 한 쌍을 이루는 콜렉션 자료형이다.
- 딕셔너리는 키를 이용하여 쌍을 이루는 값에 접근할 수 있으므로 신속하게 값을 찾아낼 수 있다.
- 딕셔너리는 값을 단일 값을 사용할수도 있지만, 배열 형태 [a, b, c ..]로 정의도 가능하다.
*['a'] = b : 딕셔너리의 a키 값을 b으로 변경(매치되는게 없으면, 새로 생성)
*.update({ 'a' : n, 'b' : m}) : 딕셔너리의 a키 값을 n으로, b키 값을 m으로 변경(매치되는게 없으면, 새로 생성)
del *['a'] : 딕셔너리의 a키를 삭제(당연히 값도 삭제됨)
<예시>
#코드 2-24
#딕셔너리 생성하기
dict_1 = {'name': '홍길동', 'birth': 1990, 'addr': 'KR'}
print(dict_1)
print(dict_1['birth'])
#키와 값 추가하기
dict_1['weight'] = 60.5
dict_1['family'] = ['아빠', '엄마', '여동생']
print(dict_1)
#여러 키와 값을 동시에 추가하기
dict_1.update({'weight':67.8,'hobby': ['게임', '독서']})
print(dict_1)
#딕셔너리 값 변경하기
dict_1['hobby'] = ['축구','등산']
print(dict_1)
#데이터 삭제하기
del dict_1['weight']
del dict_1['birth']
del dict_1['addr']
print(dict_1)
<출력결과>
<Practice> :: 리스트를 활용하여 식재료 관리 프로그램 만들기
입력 받은 이름을 식재료 목록에 추가.
입력 받은 식재료가 냉장고에 있으면 삭제. 없으면 “식재료 재고 없음” 출력.
1. 식재료 목록을 리스트형으로 정의
menu = 0
food = [ ]
while menu != 5:
print('-'*10)
print('''1.보관 식재료 출력
2.식재료 추가
3.식재료 삭제
4.식재료 변경
5.종료''')
print('-'*10)
2. input( ) 명령어로 메뉴를 선택하라고 안내
menu = int(input('관리 메뉴를 선택하시오: '))
if menu == 1:
print(food)
4. 메뉴 번호가 2이면 리스트에 원소를 추가하는 input( ) 명령어를 작성
elif menu == 2:
name = input('추가할 식재료를 입력하시오: ‘)
food.append(name)
print(food)
5. input( ) 명령어로 메뉴를 선택하라고 안내
elif menu == 3:
eli_name = input('삭제할 식재료를 입력하시오: ‘)
if eli_name in food:
food.remove(eli_name)
else:
print('식재료 재고 없음')
elif menu == 4:
exch_name = input('교환할 식재료를 입력하시오: ‘)
if exch_name in food:
idx = food.index(exch_name)
new_name = input('새로운 식재료를 입력하시오: ‘)
food[idx] = new_name
else:
print('식재료 재고 없음')
7. 메뉴 번호가 5이면 프로그램을 종료
elif menu == 5:
break
<소스코드>
menu = 0
food = []
while menu != 5:
print('-'*10)
print('''1.보관 식재료 출력
2.식재료 추가
3.식재료 삭제
4.식재료 변경
5.종료''')
print('-'*10)
menu = int(input('관리 메뉴를 선택하시오: '))
if menu == 1:
print(food)
elif menu == 2:
name = input('추가할 식재료를 입력하시오: ')
food.append(name)
print(food)
elif menu == 3:
eli_name = input('삭제할 식재료를 입력하시오: ')
if eli_name in food:
food.remove(eli_name)
else:
print('식재료 재고 없음')
elif menu == 4:
exch_name = input('교환할 식재료를 입력하시오: ')
if exch_name in food:
idx = food.index(exch_name)
new_name = input('새로운 식재료를 입력하시오: ')
food[idx] = new_name
else:
print('식재료 재고 없음')
elif menu == 5:
break
<처리결과>
2. 함수 정의
1) 함수 정의 방법
가상 이름을 작성
def 함수명(a)
return b
:: 함수의 인자로 a를 집어넣으면 b로 반환하는 함수 생성
<예시1>
제곱을 구하는 get_square함수를 생성하여 3을 인자로 넣어 9를 반환받음
<예시2>
합을 출력하는 함수 정의하여 1~10까지 합 구하기
#코드 2-26
def sum_list(a):
j = 0
for i in a:
j = j + i
print(j)
list_a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sum_list(list_a)
<출력결과>
<예시3>
(L1~4) 때린 횟수와 전체 공의 횟수를 인자로 받아서 타율을 리턴해주는 함수이다.
(L6~7) 함수를 실행하는 부분이다.
(L8~12) 함수의 정보를 help문으로 물어보는 부분이다. 주석과, 함수의 정의부분을 시현해준다.
<예시4>
파이썬에서는 별도로 main함수라는게 없다. 파이썬에서는 메인함수는 그냥 이름이 main인 사용자정의함수 중 하나로 인식하기에, main() 함수를 본문에서 콜해줘야 한다. 단, main 함수에서 사용됐던 함수들은 main함수보다 위에 먼저 선언이 되어있어야 한다.
2) void 함수 선언
★ 참고 ★
void 타입의 함수일지라도 파이썬은 'None' 타입을 리턴해준다. None 타입의 값의 기능은 어떤것도 없고, 단지 void 타입의 함수의 반환값(무(無)의 값)이라고 생각하면 된다. 다른 언어에서는 void 타입의 함수는 진짜 반환값이 없다.
아래 예시에는 print문(print문도 함수이므로)의 반환값은 None타입이라는 설명이다.
<예시1 : void 함수의 생성 방법>
(L1~6) void함수는 별도의 return 명령 자체를 만들지 않는 방법으로 생성이 가능하다.
(L7~19) void함수는 별도의 return 명령은 있지만 리턴해주는 값을 정의하지 않는 방법으로 생성이 가능하다.
<예시2>
아래와 같이 함수 정의 아랫줄에 주석문을 넣어주면 help문 실행시 같이 시현해준다.
(L11) 여기서 다른 언어와 다른점이 리턴을 다중으로 리턴받을 수 있다는 점이다. 파이썬은 다중으로 리턴하면 튜플형태로 값이 리턴된다. 다른언어였다면.. 각각 값들을 각각 다른 메모리에 Call by Reference 해주어 변수값 자체를 저장해줘야 하지만(포인터를 안쓰면 값이 날아가버림), 파이썬은 너무 편하다!
<예시3>
(L17) 함수의 다중 리턴을 이용하면 각각 변수에 나눠서 저장도 가능하다. (다른 언어에 비해 코드가 훨씬 짧아짐)
3) 함수/변수/인자의 사용 범위
함수 내에서 사용하는 변수와 인자는 함수 내에서만 유효하다. 이를 로컬변수/로컬인자라고 한다. 변수/인자의 사용범위(scope)와 관련하여 아래 예시를 보자.
<예시1>
로컬변수인 weight와 height를 함수 바깥에서 출력하려고 하면 변수가 정의되지 않았다는 에러를 띄운다.
<예시2>
함수 바깥에서 사용하는 일반 변수(L1) weight와 함수 내에서 사용하는 로컬변수(L3)의 weight는 이름은 같지만 완전히 다른 함수이다. (L3)의 로컬변수는 def문 안에서만 유효하며, 함수가 종료되면 소멸하는 변수이다.
<예시3>
함수 내에서 사용하는 함수 역시, 로컬함수로써 정의된 함수 내에서만 사용할 수 있는 함수이다.
g0(x) 함수 역시, f0(x)함수 내에서 정의되어 사용하는 함수로 f0(x)함수가 끝나면 소멸하는 함수이다.
따라서, (L8) 처럼 일반 프롬프트에서 함수내에 정의된 함수인 g0(x)를 불러오니 함수가 정의되지 않았다는 에러를 띄운다.
4) 인자 디폴트값 설정 방법
사용자 정의 함수를 콜할때 특정 인자를 넣지 않으면, 디폴트로 설정하는 방법이다.
def 함수명(a=x)
return b
:: 함수의 인자 a가 입력되지 않으면, x로 정의되어 함수가 실행되며, b를 반환하는 함수 생성
<예시1>
제곱을 구하는 함수인 power 함수를 정의하고, 계수를 인자로 받지 못하는 경우, 2를 디폴트값으로 정의하였다.
(L4) power(10) = 10^2 = 100이 나온다.
.. 중략 ..
(L16) 인자를 뒤집어서 기입하는 경우, 각각 인자를 명시적으로 대입해줘야 한다.
(L18) 각각 인자를 명시적으로 대입하지 않는 경우, 정의된대로 순서를 잘 맞춰서 넣지 않으면 에러가 난다.
<예시2>
1차함수를 정의한 예시이다. 기울기 m과 y절편 b값을 디폴트로 정의하였고, m이나 b를 직접적으로 바꿔주고 싶을때,
(L10, L12)처럼 사용자는 인자를 명시적으로 정의해주는 것이 좋다.
<Practice> :: 사용자에게 숫자를 입력 받고 숫자가 소수(Prime number)인지 판별하는
프로그램 만들기
• 나누어 떨어지는 수가 하나라도 있으면 소수가 아니며, 없으면 소수입니다.
<소스코드>
def check_prime_num(x):
for i in range(2, x):
if x % i == 0:
#x가 i로 나누어떨어지면 실행하기
return False
return True
while True :
number = int(input('판별할 자연수를 입력하세요: '))
print(check_prime_num(number))
<처리결과>
<Practice> :: 예금 이자 계산기
[문제]
대학을 졸업하고 취업에 성공한 난생이는 1년 동안 3천만 원을 모았습니다.
난생이는 모은 돈을 고금리 예금에 예치하기로 했습니다. 은행에서 연 5.1%
금리인 3년짜리 예금 상품에 가입했을 때, 함수를 이용하여 만기 시 수령할
원금과 이자를 계산해 봅시다.
[해결]
그러므로 원금에 연간 이율을 거치연수만큼 곱한 p'가 복리 예금의 원리금.
p′ = p ∗ (1 + r)^n
p′: 원리금, p: 거치금액, r: 연간 이율, n: 거치 연수
<소스코드>
def interest_year(p, r, n):
return p * (1+r)**n
p = 30000000
r = 0.051
n = 3
result = interest_year(p, r, n)
print('원금: {0}, 이자: {1}'.format(p, result-p))
<처리결과>
'IT > 머신러닝 & 인공지능 & 데이터사이언스' 카테고리의 다른 글
[파이썬 기본 4] 머신러닝 필수 라이브러리 :: 판다스 총정리 (0) | 2023.10.05 |
---|---|
[파이썬 기본 3] 머신러닝 필수 라이브러리 :: 넘파이 총정리 (1) | 2023.10.05 |
[파이썬 기본 2] 조건문(If/else/elif문), 반복문(while문/for문) (0) | 2023.10.05 |
[파이썬 기본 1-1] 초기 세팅 및 변수, 연산자, sep, input, 형변환, eval() (0) | 2023.09.25 |