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 등 미리 만들어 둔 파이썬 내장함수

 

  • 함수 장점
    1. 코드 용도를 구분
    2. 코드 재사용 가능
    3. 실수(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("잘못입력하셨습니다. 다시 입력해 주세요.")

: ↑ 분석해보고 주석 달기. 더 간략하게 줄여보기

  1. 상기 코드에서 여러 번 정의된 함수를 def cal(a,b) return 여러 반환값으로 한 줄 표시↓
    • 따라서 while문 안에 if도 코드 변수를 변경해줘야 함
  2. 연산자 입력을 여러 번 입력하지 않고 \n 개행으로 한 줄 표시
  3. 각 cal 함수는 순서대로 +-*/% ( 변수와 반환값 순서를 잘 생각)
  4. 연산자 이외 나가기 기능 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까지 기능 이외의 숫자 입력 시 재입력 문구 표시 후 처음으로 돌아가기(무한루프니까)

최대한 분석하고 주석 달면서 복습하고 있다. 하지만 아직도 문법이 미숙한건지, 문제 이해가 어려운건지, 작성할 코드에 어떤 기능을 사용할지 바로바로 감이 오지 않아서 아직도 코드를 짤 때 시간이 오래 걸린다. 오로지 연습뿐🥲 매일 복습하고 단계적으로 문제를 풀어보면서 감을 익히도록 해야겠다.

박식하기 그지 없고 명석한 두뇌를 가진 수재요!

+ Recent posts