[SK쉴더스 루키즈 24기] Python(2) 제어문과 함수, 예외처리

아굥·2024년 12월 16일

SK Shieldus Rookies

목록 보기
2/32

프로그램의 흐름제어

1. if문

주어진 조건을 판단한 후 그 상황에 맞게 처리해야 할 경우

1) if문의 기본 구조

  • if 조건문 다음 문장부터는 모든 문장에 들여쓰기
    ㄴ> 무시하는 경우 오류 발생
if 조건문1:
	수행할 문장1
elif 조건문2:
	수행할 문장2
else:
	수행할 문장3
  • 조건문이 참(True)면 if 블록 수행
  • 이전 조건문이 거짓(False)이라면 elif 블록 수행
    ㄴ> elif는 개수 제한 X
  • 모든 조건문이 거짓(False)면 else 블록 수행

2) 조건문

비교 연산자

연산기호설명
x == yx와 y가 같다
x != yx와 y가 다르다
x > yx가 y보다 크다
x < yx가 y보다 작다
x >= yx가 y보다 크거나 같다
x <= yx가 y보다 작거나 같다

논리 연산자

연산기호설명
x and yx와 y 모두 참이어야 참
x or yx와 y 둘 중 하나만 참이면 참
not xx가 거짓이면 참, 참이면 거짓

in, not in

연산기호설명
x in 리스트x가 리스트 안에 있다면 참
x in 튜플x가 튜플 안에 있다면 참
x in 문자열x가 문자열 안에 있다면 참
x not in 리스트x가 리스트 안에 없다면 참
x not in 튜플x가 튜플 안에 없다면 참
x not in 문자열x가 문자열 안에 없다면 참

3) 조건부 표현식

변수 = 참인 겨우 값 if 조건문 else 거짓인 경우 값


2. while문

반복해서 코드를 수행해야 할 경우

1) while문의 기본 구조

while 조건문:
	수행할 문장1
	수행할 문장2
    수행할 문장3
  • 조건문이 참(True)인 동안 내부 코드 반복 수행
    ㄴ> 조건문 부분에 1 or True를 적으면 무한 루프
while 조건문1:
	if 조건문2:
		수행할 문장1
        continue
    else:
    	수행할 문장2
    	break
  • continue: while문을 빠져나가지 않고 맨 처음으로 다시 돌아가야 하는 경우
  • break: 강제로 빠져나가야 하는 경우

3. for문

1) for문의 기본 구조

for 변수 in 리스트(또는 튜플, 문자열):
	수행할 문장1
	수행할 문장2
  • 리스트, 튜플, 문자열의 첫 번째 요소부터 마지막 요소까지 차례로 변수에 대입되어 내부 코드 수행
for 변수 in 리스트(또는 튜플, 문자열):
	if 조건문:
		수행할 문장
        continue
  • continue: for문의 맨 처음으로 다시 돌아가야 하는 경우

2) range() 함수

range(start, end, step)

  • 숫자 리스트를 자동으로 만들어 줌
  • 순서대로 시작 숫자, 끝 숫자(포함되지 않음), 숫자 사이 간격을 의미

3) 리스트 컴프리헨션(list comprehension)

[표현식 for 항목 in 반복 가능 객체 if 조건문]

  • if문 생략 가능
  • for문 여러 개 사용 가능
1_리스트 안에 for문 포함
>>> a = [1, 2, 3, 4]
>>> result = [num * 3 for num in a]
[3, 6, 9, 12]

2_if문 사용
>>> a = [1, 2, 3, 4]
>>> result = [num * 3 for num in a if num % 2 == 0]
[6, 12]

함수

1. 함수란?

입력값을 받아서 어떠한 행동을 취하고 그 결과값을 반환(return)하는 코드

  • 반복되는 코드들이 있는 경우, 해당 부분을 하나로 묶음 -> '약속된 입력 값을 주었을 때 약속된 결과를 반환한다' 형식으로 함수를 생성
  • 프로그램 가독성 향상 + 오류 해결과 유지보수에 좋음

2. 파이썬의 함수 구조

def 함수명(매개변수):
	수행할 문장1
	수행할 문장2
	return

함수명(인자)
  • def: 함수 생성 시 사용하는 예약어
    ㄴ> 함수명은 임의로 생성 가능 (이름이 없는 익명 함수도 존재)
  • 인자(arguments): 함수 호출 시 전달하는 값
  • 매개변수(parameter): 함수에 입력 받는 값을 저장하는 변수 (함수 내부에서 사용)
  • return: 결과값을 돌려주는 명령어
    ㄴ> 반환값은 무조건 하나뿐 (함수의 종료를 의미하므로)

1) 입력값-반환값에 따른 함수의 형태

  • 함수의 형태는 입력값과 반환값 존재 유무에 따라 구분하여 사용
1_일반적인 함수: 입력값 O, 반환값 O
def 함수명(매개변수):
	수행할 문장
	return 반환값
>>> 함수명(인자)

2_입력값이 없는 함수: 처리의 목적인 데이터를 받아서 처리하지 않는 경우
def 함수명():
	수행할 문장
	return 반환값
>>> 함수명()

3_반환값이 없는 함수: None 데이터 반환
def 함수명(매개변수):
	수행할 문장
>>> 함수명(인자)

4_입력값, 반환값 모두 없는 함수
def 함수명():
	수행할 문장
>>> 함수명()

2) 매개변수 지정하여 호출

  • 함수 호출 시 매개변수 지정 가능
    ㄴ> 매개변수의 순서에 상관없이 사용할 수 있음
def sub(a, b):
	return a - b
    
>>> result = sub(a=7, b=3)
>>> print(result)
4

3) *args

def 함수명(*매개변수):
	수행할 문장
  • 일반 함수 형태에서 괄호 안의 매개변수 부분이 *매개변수로 변경
    ㄴ> 입력값을 모아 튜플로 만들어 줌
1_*args
def add_many(*args):
	result = 0
    for i in args:
    	result += i
    return result

>>> result = add_many(1, 2, 3)
>>> print(result)
6

2_*args 앞에 다른 매개변수 추가:, *args가 무조건 맨 뒤에 와야 함
def add_many(choice, *args):
	if choice == "add"
      	result = 0
      	for i in args:
          	result += i
	return result

>>> result = add_many("add", 1, 2, 3)
>>> print(result)
6

4) **kwargs

def 함수명(**kwargs):
	수행할 문장
  • 일반 함수 형태에서 괄호 안의 매개변수 앞에 **를 붙임
    ㄴ> 딕셔너리 형태로 저장
def print_kwargs(**kwargs):
	print(kwargs)
    
>>> print_kwargs(a=1)
{'a': 1}

5) 매개변수에 초기값 설정

def say_myself(name, age, man=True):
	if man:
    	print('남자')
    else:
    	print('여자')
  • 단, 초기화할 매개변수는 항상 뒤쪽에 놓아야 함
    ㄴ> 매개변수를 어느 곳에 대입해야 할지 판단이 어려워 오류 발생

6) 함수의 효력 범위

a = 1
def vartest(a):
	a += 1
vartest(a)
print(a)
  • 매개변수는 함수 안에서만 사용하는 변수 -> 함수 밖 변수와는 상관 X
    ㄴ> 함수 안에서 사용한 변수를 밖에서 사용할 지 오류
a = 1
def vartest(a):
	global a
	a += 1
vartest(a)
print(a)
  • global 명령어: 함수 밖에서 선언된 변수를 함수 안에서 사용 가능
    ㄴ> 변수 값이 무분별하게 바뀔 수 있으므로 되도록 피하는 것이 좋음

7) lambda 예약어

함수명 = lambda 매개변수1, 매개변수2 : 매개변수 이용한 표현식

  • 함수를 한 줄로 간결하게 생성하고자 할 때 사용
    ㄴ> 함수를 매개변수로 받아서 처리하는 함수에도 사용됨
  • def와 동일한 역할
1_lambda
>>> add = lambda a, b: a + b

2_일반적인 함수
def add(a, b):
	return a + b

내장(built-in)함수

  • 아무런 설정없이 바로 사용 가능 (import 필요 X)
함수명설명
abs(x)x의 절대값을 돌려줌
all(x)x의 요소가 모두 참이면 True, 하나라도 거짓이면 False 반환
any(x)x의 요소가 하나라도 참이면 True, 모두 거짓이면 False 반환
chr(i)유니코드 숫자값을 입력 -> 그 코드에 해당되는 문자를 반환
dir(x)객체가 지닌 변수, 함수를 보여줌 (list, dict가 지닌 함수)
divmod(a, b)a를 b로 나눈 몫과 나머지를 튜플로 반환
enumerate(x)시퀀스 데이터를 입력 -> 인덱스 값을 포함하는 enumerate 객체 반환
hex(x)정수 값을 입력 -> 16진수 문자열 반환
id(object)객체를 입력 -> 객체 고유 주소 값 반환
filter(함수(논리값), 반복 가능 데이터)시퀀스 데이터의 요소 값을 순서대로 함수에 전달, 호출했을 때 반환값이 참인 것만 묶어서 반환
map(함수, 반복 가능 데이터)입력 받은 데이터의 각 요소를 함수에 전달, 결과를 받아서 리스트로 반환
int(x)문자열 형태 숫자나 소수점이 있는 숫자 -> 정수로 반환
str(Object)문자열 형태로 객체를 변환하여 반환
list(iterable)시퀀스 데이터를 입력 -> 리스트로 반환
tuple(iterable)시퀀스 데이터를 입력 -> 튜플로 반환
max(iterable)시퀀스 데이터를 입력 -> 최대 값 반환
min(iterable)시퀀스 데이터를 입력 -> 최소 값 반환
sum(iterable)입력 데이터의 합을 반환
sorted(iterable)입력 데이터를 정렬 -> 그 결과를 리스트로 반환
len(s)입력값 s의 길이(요소 전체 개수)를 반환
type(Object)입력값의 자료형을 알려줌
round(number[, ndigits]number를 반올림하여 반환(, ndigits는 소수점 자릿수)

파이썬의 입출력

1. 사용자 입출력

1) input() 사용

  • 사용자가 키보드로 입력한 데이터를 문자열로 반환
>>> a = input()

2) 프롬프트를 띄워 사용자 입력 받기

  • 사용자가 키보드로 입력한 데이터를 문자열로 반환
>>> a = input("숫자를 입력하세요: ")
숫자를 입력하세요: 3

3. print()

  • 데이터를 출력하는데 사용됨
  • 큰 따옴표("")로 둘러싸인 문자열은 + 연산과 동일함
  • 문자열 띄어쓰기는 쉼표(,)로 함

2. 파일 읽고 쓰기

1) 파일 생성하기

파일 객체 = open(파일 이름(경로), 파일 열기 모드)

  • 파일을 통한 입출력도 가능함
  • 파일을 생성하기 위해 내장 함수 open() 사용
    ㄴ> 프로그램 실행한 디렉터리에 새로운 파일 생성됨
f = open("파일명.txt", 'w')
f.close()								# 열려있는 파일 객체 닫아줌
파일 열기 모드설명
r읽기 모드: 파일을 읽기만 할 때 사용
w쓰기 모드: 파일에 내용을 쓸 때 사용
a추가 모드: 파일의 마지막에 새로운 내용을 추가할 때 사용
  • w(쓰기 모드)는 기존 데이터를 덮어쓰기 때문에 기존 데이터가 날라감
    ㄴ> 해당 파일이 존재하지 않으면 새 파일 생성

2) 파일 열어서 내용 쓰기

f = open("파일명.txt", 'w')

f = open("파일명.txt", 'w')
for i in range(1, 11):
	data = f'{i}번째'
    f.write(data)
f.close()							
  • write()를 활용하여 파일을 쓰기 모드로 열어서 내용 입력 가능
  • 문자열 데이터를 파일에 직접 써서 출력

3) 파일 읽기

f = open("파일명.txt", 'r')

1_readline(): 파일의 첫 번째 라인 읽음
f = open("파일명.txt", 'r')
while True:
	line = f.readline()
    if not line: break
    print(line)
f.close()

2_readlines(): 파일의 모든 줄을 읽고 각각의 줄을 요소로 가지는 리스트 반환
f = open("파일명.txt", 'r')
lines = f.readlines()

for line in lines:
    print(line)
f.close()

3_read(): 파일의 전체 내용을 문자열로 리턴
f = open("파일명.txt", 'r')
data = f.read()
print(data)
f.close()

4) 파일에 새로운 내용 추가

f = open("파일명.txt", 'a')

  • 원래 있던 값을 유지하면서 새로운 값만 추가하는 경우
f = open("파일명.txt", 'a')
for i in range(11, 20):
	data = f'{i}번째'
    f.write(data)
f.close()							

5) with문과 함께 사용

f = open("파일명.txt", 'w')
f.write("hello")
f.close()							
  • 기존 방법은 쓰기 모드로 열었던 파일을 닫지 않은 상태에서 다시 사용하면 오류 발생
    ㄴ> close()를 사용하여 열려있는 파일을 닫아주어야 함
with open("파일명.txt", 'w') as f:
	f.write("hello")
  • with문은 파일을 자동으로 열고 닫아줌
    ㄴ> with 블록을 벗어나는 순간 파일 객체 f가 close됨

예외처리

1. 오류 예외 처리 기법

try-except문

1_try-except: 오류 종류 상관 X, 오류 발생 시 except 블록 수행
try:
	예외 발생 예상 코드
except:
	예외 처리 코드

2_ 발생 오류를 포함한 except: 작성한 오류와 동일한 경우만 except 블록 수행
try:
	예외 발생 예상 코드
except 발생 오류:
	예외 처리 코드
    
3_ 발생 오류, 오류 변수를 포함한 except: 작성한 오류와 동일한 경우만 except 블록 수행
try:
	예외 발생 예상 코드
except 발생 오류 as 오류 변수:
	예외 처리 코드
    
4_여러 개의 오류 처리: 2개 이상의 오류를 동일하게 처리하는 경우, ()로 묶어 처리 가능
try:
	예외 발생 예상 코드
except 발생 오류1:
	예외 처리 코드
except 발생 오류2:
	예외 처리 코드

try-finally문

try:
	f = open('foo.txt', 'w')
    ...
finally:
	f.close()
  • try문 수행 도중 예외 발생 여부와 상관 X, 항상 수행됨
    ㄴ> finally은 보통 사용한 리소스를 close 하는 경우 사용

try-else문

try:
  예외 발생 예상 코드
except [발생 오류 [as 오류 변수]]:
	예외 처리 코드
else:
	오류X인 경우 실행 코드

2. 오류 회피하기

특정 오류 발생 시 통과

try:
	f = open('없는파일.txt', 'r')
except FileNotFoundError:
	pass
  • pass를 사용하면 통과 가능

3. 오류 강제 발생시키기

  • raise 명령어를 사용하면 오류 강제 발생 가능
    ㄴ> 프로그래머가 의도적으로 발생시키는 오류

4. 예외 만들기

사용자 정의 예외 만들기

  • Exception 클래스를 상속하여 생성
class MyError(Exception):
	pass

def say_nick(nick):
	if nick == '바보':
    	raise MyError()
    print(nick)

say_nick('바보')
profile
열심히 살아보아요

0개의 댓글