Date : 2023-07-10
Topic : 리스트 튜플 응용, 서식 formatting, 함수 / + small project (자판기 프로그램) 개발 계획서 작성
Note
리스트 끝에 요소 하나 추가 : append
a=[10,20,30]
a.append(500)
a # [10,20,30,500]
len(a) # 4
# append를 사용해서 빈 리스트에 0~9 요소 추가
a=[]
for i in range(10):
a.append(i)
print(a) # [0,1,2,3,4,5,6,7,8,9]
#1~100 사이 짝수를 요소로 가지는 리스트 만들기
a=[]
for i in range(50):
a.append((i+1)*2)
print(a)
a=[]
for i in range(10):
a.append((i+1)*10)
print(a)
리스트 끝에 다른 리스트 연결하여 확장 : extend
a=[10,20,30]
a.extend([500,600])
a # [10, 20, 30, 500, 600] '연장'되었다.
len(a) # 5
리스트 특정 인덱스에 요소 추가 : insert(인덱스, 요소)
a=[10,20,30]
a.insert(2,500)
a # [10, 20, 500, 30]
len(a) # 4
리스트 요소 삭제 : pop, remove
- pop: 마지막 요소 또는 특정 인덱스의 요소를 삭제
- remove: 특정 값을 찾아서 삭제
a=[10,20,30]
print(a.pop()) # 30 (반환된 값)
a # [10, 20] (요소가 삭제된 뒤 리스트)
# pop() 괄호 아무 것도 없으면 마지막 값 삭제
# 괄호 사이 인덱스 입력->해당 인덱스 요소 삭제한 뒤 삭제한 요소 반환
# pop 대신 del 가능
a = [10, 20, 30]
del a[0]
a # [20, 30]
# pop과 for문을 사용해서 빈 리스트로 만들기
a=[0,1,2,3,4,5]
for i in range(len(a)): # range(상수) 보다 len() 사용이 더 good
a.pop()
print(a) # []
# remove(값)은 리스트에서 특정 값을 찾아서 삭제
a=[10,20,30]
a.remove(10)
a # [20, 30]
# 리스트에 같은 값이 여러 개 있을 경우 처음 찾은 값을 삭제
a = [10, 20, 30, 20]
a.remove(20)
a # [10, 30, 20]
#리스트 a에 20이 2개 있지만 가장 처음 찾은 인덱스 1의 20만 삭제
스택(stack) : LIFO(Last In First Out) 구조
or FILO (First In Last Out, 굴러 들어온 돌이 박힌 돌 뺀다)
큐(queue) : LILO(Last In Last Out) 구조
or FIFO (First In First Out, 선입선출)
리스트 할당과 변수
# 먼저 리스트를 만든 뒤 다른 변수에 할당
a=[0,0,0,0,0]
b=a # 이때 리스트가 두 개가 된 것이 아님. a is b >>> True 확인해보기
a is b # True
a=[i for i in range(10)]
print(a)
b=list(i for i in range(10))
print(b)
a==b # True / 단순하게 값을 비교, 값의 내용이 같다면 True, 그렇지 않다면 False
a is b # False / is연산자는 같은 '객체'인지 비교. a와 b는 메모리의 다른 영역에 위치한 서로 다른 객체
# a와 b는 같으므로 b[2]=99와 같이 리스트 b의 요소를 할당해주면
# a와 b 모두 반영됨
a=[0,0,0,0,0]
b=a
print(a is b)
b[2]=99
print(a)
print(b)
'''op
True
[0, 0, 99, 0, 0]
[0, 0, 99, 0, 0]
'''
a=[0,0,0,0,0]
b=a.copy()
b # [0, 0, 0, 0, 0]
리스트 표현식 사용하기
- [식 for 변수 in 리스트]
- list(식 for 변수 in 리스트)
a=[i for i in range(10)]
print(a) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b=list(i for i in range(10))
print(b) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# range(10)으로 0~9까지 생성하여 변수 i에 숫자를 꺼내고,
# 최종적으로 i를 이용하여 리스트를 만든다는 뜻
# 0~9 중 2의 배수
a=[i for i in range(10) if i%2==0] # if -> 필터
print(a) # [0, 2, 4, 6, 8]
# 0~9 중 홀수에 5를 더해서 리스트 만들기
a=[i+5 for i in range(10) if i%2==1] # 위 사진을 보고 동작 순서 이해하기
print(a) # [6, 8, 10, 12, 14]
서식 지정자(format specifier)와 formatting사용하기
: 문자열 혹은 숫자 안에서 특정 부분을 원하는 값으로 바꿀 때 서식 지정자 또는 포매팅을 사용
- 문자열 넣기
# '%s' % '문자열' -> string의 s
'I am %s.' % 'james' # 'I am james.'
# 문자열 대신 변수 지정
name='maria'
'I am %s.' % name # 'I am maria.'
- 숫자 넣기
# 소수점 이하 자릿수 지정 -> f앞에 .(점)자릿수 지정
fD=3.141592
'%.2f' %fD # 3.14
# 서식 지정자로 숫자 넣기
# '%d' % 숫자 -> 10진 정수 decimal integer의 d
nAge=25
"I'm %d years old." %nAge # I'm 25 years old.
number1, number2=map(int,input("입력: ").split()) # 입력: 3 7
total=number1+number2 # 2개의 입력 변수, 결과 변수 사용
print('%d+%d=%d' %(number1, number2, total)) # 3+7=10
# 여러 변수 넣을 땐 ,(콤마) 구분
# 소수점 이하 자릿수 지정 -> f앞에 .(점)자릿수 지정
# f는 fixed point
fD=3.141592
'%.2f' %fD # '3.14'
print(type(fD)) # <class 'float'> 실수인 것 확인
- 여러 값 넣기 (🔢인덱스 순서 주의!)
# format method로 값을 여러 개 넣기
# 인덱스 순서와 format에 지정된 값의 순서를 주목
'Hello, {0} {2} {1}' .format('Python','Script',3.6)
# Hello, Python 3.6 Script
'{0} {0} {1} {1}' .format('Python','Script')
# Python Python Script Script
# format methon에서 {}에 인덱스 대신 이름 지정하기
'Hello, {language} {version}'.format(language='Python', version=3.6)
# Hello, Python 3.6 -> 딕셔너리 같은 개념
# f포매팅 -> 변수에 값을 넣고 {}에 변수 이름 지정
language='Python'
version=3.6
f'Hello, {language} {version}' # 문자열 앞에 f
name="Park"
age=25
formatted_string=f"이름:{name}, 나이:{age}" # 문자열 앞 f formatting, 그리고 변수 할당
print(formatted_string) # 이름:Park, 나이:25
↑위 아래↓ fomatting check
strName = 'Hong'
nAge = 20
print("이름=%s, 나이=%d" % (strName, nAge)) # 문자열은 '한 줄로' 따옴표
# 이름=Hong, 나이=20
함수 사용하기
: function, 파이썬은 특정 용도 코드를 한 곳에 모아 놓음
ex) print, input 등 미리 만들어 둔 파이썬 내장함수
- 함수 장점
- 코드 용도를 구분
- 코드 재사용 가능
- 실수(mistake)를 줄일 수 있다.
- def에 함수 이름을 지정하고 ()(괄호)와 :(콜론)을 붙인 뒤 다음 줄에 원하는 코드를 작성(들여쓰기 주의)
def 함수이름():
code
def hello():
print("Hello, World!") # 1.우선 함수 정의
hello() # 2.함수 호출(function call)
# Hello, World!
# 함수 여러 번 호출하기
for i in range(10):
hello()
'''op
Hello, World! 0
Hello, World! 1
Hello, World! 2
...
Hello, World! 9
''' # 0~9까지 총 10줄 생성
parameter:매개변수, argument:인수
def 함수이름(매개변수1, 매개변수2):
코드
def add(a,b): # 값을 받으려는 변수:parameter(매개변수)
print(a+b)
add(10,20) # 30 ## function call 넣는 값:argument(인수)
def 함수이름(매개변수):
return 반환값
- return을 사용하면 값을 함수 바깥으로 반환
- return에 값을 지정하지 않으면 None 반환
def add(a,b): # parameter:a,b
return a+b
x=add(10,20) # argument:10,20
x # 30
def x(a,b,c):
x=a*b*c
return x
a,b,c=map(int,input("input_num: ").split()) # input_num: 5 6 4
print(x(a,b,c)) # 120
- 함수에서 값을 여러 개 반환
- return에 값이나 변수를 ,(콤마)로 구분해서 지정
def add_sub(a,b):
return a+b, a-b # a+b와 a-b를 ,로 구분
x,y=add_sub(10,20) # 반환값을 각 x와 y에 할당한다고 했을 때
x # 30 ## x는 a+b이므로 10+20을 한 반환값 30 출력
y # -10 ## y는 a-b이므로 10-20을 한 반환값 -10 출력
- 값을 하나의 변수에 저장하면 튜플이 unpacking
def add_sub(a,b):
return a+b, a-b
x=add_sub(10,20) #값을 하나의 변수에 저장하면 튜플이 반환(unpacking)
x # (30, -10)
< 실습 >
- 함수를 이용하여 두 개의 정수를 입력 받아 각각 +, -, *, / 한 뒤 값을 formatting하여 출력. (각 출력값은 소수점 이하 두 자리까지 나오게 한다.)
def x(a,b):
return a+b, a-b, a*b, a/b
a,b=map(int,input("input_num: ").split())
result1,result2,result3,result4 = x(a,b) # 위에 정의한 함수를 사용할 것!
print("+= %.2f, -= %.2f, *= %.2f, /= %.2f" %(result1,result2,result3,result4)) # 소수점 이하 두 자리
# input_num: 10 20
# += 30.00, -= -10.00, *= 200.00, /= 0.50
- 세 정수를 입력 받은 후 각각 곱과 합을 출력
def add_multi(a,b,c):
return a*b*c,a+b+c
a,b,c=map(int,input("input_num: ").split())
result1, result2 = add_multi(a,b,c) # return 순서대로 result1이 곱, result2가 합
print("곱은 %d, 합은 %d" %(result1,result2)) # 여러 개의 %format 형식을 괄호로 묶어준다.
print(f"곱은 {result1}, 합은 {result2}") # f포매팅은 각 format 형식에 {}을 씌운다.
'''op
input_num: 2 3 4
곱은 24, 합은 9
곱은 24, 합은 9
'''
- 계산기 프로그램 만들기
def add(a,b):
return a+b
def minus(a,b):
return a-b
def multi(a,b):
return a*b
def div(a,b):
return a/b
def rest(a,b):
return a%b
print('='*30)
print('1. 더하기')
print('2. 빼기')
print('3. 곱하기')
print('4. 나누기')
print('5. 나머지 구하기')
print('6. 나가기')
print('='*30)
while True:
a=int(input("원하는 연산자를 입력하세요:"))
if a<=5:
b=int(input("첫번째 숫자를 입력하세요:"))
c=int(input("두번째 숫자를 입력하세요:"))
if a==1:
x = add(b,c)
print("결과는 %d 입니다"%x)
elif a==2:
x = minus(b,c)
print("결과는 %d 입니다"%x)
elif a==3:
x = multi(b,c)
print("결과는 %d 입니다"%x)
elif a==4:
x = div(b,c)
print("결과는 %d 입니다"%x)
elif a==5:
x = rest(b,c)
print("결과는 %d 입니다"%x)
elif a==6:
print("계산기 프로그램을 종료합니다.")
break
else:
print("잘못입력하셨습니다. 다시 입력해 주세요.")
: ↑ 분석해보고 주석 달기. 더 간략하게 줄여보기
- 상기 코드에서 여러 번 정의된 함수를 def cal(a,b) return 여러 반환값으로 한 줄 표시↓
- 따라서 while문 안에 if도 코드 변수를 변경해줘야 함
- 연산자 입력을 여러 번 입력하지 않고 \n 개행으로 한 줄 표시
- 각 cal 함수는 순서대로 +-*/% ( 변수와 반환값 순서를 잘 생각)
- 연산자 이외 나가기 기능 elif, 지정된 기능 이외 숫자 입력 시 (1~6 제외) 오류 표시 및 처음부터 재실행
- 무한루프이므로 break가 걸리기 전까지 반복.
- 조건 충족되면 계속 값을 출력, 충족되지 않으면 처음으로 돌아가서 재실행
def cal(a,b):
return a+b, a-b, a*b, a/b, a%b
# 반환값 여러 개를 변수 여러 개에 저장
print("="*30)
# print 여러 줄 대신 \n 개행으로 기능 한 줄 입력
print("1.더하기\n""2.빼기""\n""3.곱하기""\n""4.나누기""\n""5.나머지구하기""\n""6.나가기")
print("="*30)
# 6.나가기 기능을 쓸 때까지 무한 루프.
while True:
func_in=int(input("원하는 연산자를 입력하세요:")) # func_in : 사용할 계산기 기능(+-*/%) 입력
# 계산기의 기능은 1~5까지 5가지이므로 <=5
if func_in <= 5:
x=int(input("첫번째 숫자를 입력하세요:"))
y=int(input("두번째 숫자를 입력하세요:"))
if func_in==1:
cal = add(x,y) # 저장된 변수의 값을 순서대로 반환(+)
print("결과는 %d 입니다" %cal) # %formatting
elif func_in==2:
cal = minus(x,y) # (-)
print("결과는 %d 입니다" %cal)
elif func_in==3:
cal = multi(x,y) # (*)
print("결과는 %d 입니다" %cal)
elif func_in==4:
cal = div(x,y) # (/)
print("결과는 %d 입니다" %cal)
elif func_in==5:
cal = rest(x,y) # (%)
print("결과는 %d 입니다" %cal)
elif func_in==6:
print("계산기 프로그램을 종료합니다.")
break # 6.나가기 기능
else:
print("잘못입력하셨습니다. 다시 입력해 주세요.")
# 계산기 1~6까지 기능 이외의 숫자 입력 시 재입력 문구 표시 후 처음으로 돌아가기(무한루프니까)
최대한 분석하고 주석 달면서 복습하고 있다. 하지만 아직도 문법이 미숙한건지, 문제 이해가 어려운건지, 작성할 코드에 어떤 기능을 사용할지 바로바로 감이 오지 않아서 아직도 코드를 짤 때 시간이 오래 걸린다. 오로지 연습뿐🥲 매일 복습하고 단계적으로 문제를 풀어보면서 감을 익히도록 해야겠다.
'데이터 분석 학습일지🐣' 카테고리의 다른 글
18일차 - 파이썬 시각화 실습(Numpy, Pandas, Matplotlib, Seaborn) (0) | 2023.07.14 |
---|---|
16일차 - Lambda 표현식, closure, 파일 입출력 (0) | 2023.07.11 |
14일차 - 반복문 (for, while), 디버깅 (0) | 2023.07.11 |
12일차 - 시퀀스 자료형 - 리스트, 튜플, 딕셔너리 (2), if 조건문 (0) | 2023.07.07 |
복습 파이썬 기초 문법(1) (0) | 2023.07.04 |