[코드잇] 파이썬 프로그래밍 기초 - 프로그래밍 핵심 개념 in Python
1. 자료형
숫자형
### 정수형끼리리 계산
### → 정수형이 나옴
# 덧셈
print(3 + 9) # 12
# 뺄셈
print(2 - 4) # -2
# 곱셈
print(5 * 3) # 15
# 나머지
print(7 % 3) # 1
# 거듭제곱
print(2 ** 3) # 8
### 소수형끼리 계산
### → 소수형이 나옴
# 덧셈
print(3.0 + 9.0) # 12.0
# 뺄셈
print(2.0 - 4.0) # -2.0
# 곱셈
print(5.0 * 3.0) # 15.0
# 나머지
print(7.0 % 3.0) # 1.0
# 거듭제곱
print(2.0 ** 3.0) # 8.0
### 한쪽은 정수형, 다른쪽은 소수형
### → 두 수 중 하나라도 소수형이면 소수형으로 나옴
# 덧셈
print(3 + 9.0) # 12.0
# 뺄셈
print(2 - 4.0) # -2.0
# 곱셈
print(5 * 3.0) # 15.0
# 나머지
print(7.0 % 3) # 1.0
# 거듭제곱
print(2 ** 3.0) # 8.0
나눗셈은 정수형이든 소수형이든 계산 결과가 모두 소수형으로 나옴.
# 나눗셈
print(7 / 2) # 3.5 (정수 ÷ 정수)
print(6 / 2) # 3.0 (정수 ÷ 정수)
print(7.0 / 2) # 3.5 (소수 ÷ 정수)
print(6.0 / 2.0) # 3.0 (소수 ÷ 소수)
나눗셈 결과값이 정수가 되게 하려면 형변환이 필요함.
# 파이썬도 일반적인 사칙연산을 따른다다
print(2 + 3 * 2) # 8
print(2 * ( 2 + 3)) # 10
floor division (버림나눗셈) / round (반올림)
# floor division (버림 나눗셈)
print(7 / 2) # 일반 나눗셈 (/) → 3.5
print(7 // 2) # 버림 나눗셈 (//) → 3
print(8 / 3) # 2.666665
print(8.0 / 3) # 2.666665
# 버림나눗셈에서도 둘 중 하나가 소수형이면 결과값이 소수로 나옴.
print(8.0 // 3) # 2.0
print(8 // 3.0) # 2.0
# round (반올림)
print(round(3.1415926535)) # 3
print(round(3.1415926535, 2)) # 3.14 (소수 둘째자리까지 반올림)
문자형
키보드로 쓸 수 있는 문자들을 표현하는 자료형
따옴표('')로 둘러쌓여 있는 것들
# 문자열 연결 (String Concatenation)
print("Hello" + "World") # HelloWolrd
print("Hello" * 3) # HelloHelloHello
print("3" + "5") #35 (문자열 삼오)
"""
문자열 안에 작은 따옴표, 큰따옴표 섞여 있으면?
→ 역슬래시를 붙여야 됨.
"""
print("I'm excited to learn Python!")
# I'm excited to learn Python!
print("I\'m \"excited\" to learn Python!")
# I'm "excited" to learn Python!
"""
백슬래시를 사용한 따옴표 인식
영화 '신세계'에서 "드루와~"라는 대사가 유행했다.
"""
print("영화 '신세계'에서 \"드루와~\"라는 대사가 유행했다.")
print('영화 \'신세계\'에서 "드루와~"라는 대사가 유행했다.')
print('영화 \'신세계\'에서 \"드루와~\"라는 대사가 유행했다.')
형변환(Type Casting / Type Conversion)
값을 한 자료형에서 다른 자료형으로 바꾸는 것
ex. 정수 7 → 문자열 "7"
# 숫자 → 숫자
print(int(3.8)) # 3
print(float(3)) # 3.0
# 문자 → 숫자
print(int("2") + int("5")) # 7
print(float("1.1") + float("2.5")) # 3.6
# 문자열
print(str(2) + str(5)) # 25
"""
age = 7
print("제 나이는 " + age + "살입니다.")
→ 문자열과 정수형을 결합시킬 수 없다고 오류가 남.
"""
age = 7
print("제 나이는 " + str(age) + "살입니다.")
# 제 나이는 7살입니다.
"""
print(int("Hello world!"))
→ Hellow wolrd!를 정수로 바꿀 수 없다고 오류가 남.
"""
format을 이용한 문자열 포매팅
# 오늘은 2019년 10월 29일입니다.
year = 2019
month = 10
day = 29
print("오늘은 " + str(year) + "년 " + str(month) + "월 " + str(day) + "일입니다.")
## 오늘은 2023년 7월 28일입니다.
# 코드가 작성하기 불편하고 읽기에도 번거로움
"""
문자열 포맷팅 - format
"""
year = 2023
month = 7
day = 28
print("오늘은 {}년 {}월 {}일입니다.".format(year, month, day))
## 오늘은 2023년 7월 28일입니다.
date_string = "오늘은 {}년 {}월 {}일입니다."
print(date_string.format(year, month, day))
## 오늘은 2023년 7월 28일입니다.
date_string1 = "내일은 {}년 {}월 {}일입니다."
print(date_string.format(year, month, day + 1))
## 오늘은 2023년 7월 29일입니다.
format 다루기
print("저는 {}, {}, {}를 좋아합니다!".format("박지성", "유재석", "빌게이츠"))
# 저는 박지성, 유재석, 빌게이츠를 좋아합니다!
print("저는 {1}, {0}, {2}를 좋아합니다!".format("박지성", "유재석", "빌게이츠"))
# 저는 유재석, 박지성, 빌게이츠를 좋아합니다!
num_1 = 1
num_2 = 3
print("{0} 나누기 {1}은 {2}입니다.".format(num_1, num_2, num_1 / num_2))
# 1 나누기 3은 0.3333333333333333입니다.
print("{0} 나누기 {1}은 {2: .2f}입니다.".format(num_1, num_2, num_1 / num_2))
# 소수점 둘째자리로 반올림
# 1 나누기 3은 0.33입니다.
print("{0} 나누기 {1}은 {2: .0f}입니다.".format(num_1, num_2, num_1 / num_2))
# 정수로 반올림
# 1 나누기 3은 0입니다.
문자열을 포매팅하는 다양한 방식
"""
% 기호
- 현재 잘 사용하지 않음 (C언어 스타일)
"""
name = "배꼽파"
age = 100*8
print("제 이름은 %s이고 %d살입니다." % (name, age))
"""
f-string
- 파이썬 3.6부터 나온 방식
"""
name = "배꼽파"
age = 100*8
print(f"제 이름은 {name}이고, 나이는 {age}입니다.")
불 대수
불대수의 값, 진리값
명제 : 참, 거짓이 확실한 문장
- 대한민국의 수도는 서울이다. (참인 명제)
- 2는 1보다 작다. (거짓인 명제)
- 한국의 수도는 어디입니까? (명제가 아님)
- 배꼽파는 뚱뚱하다. (명제가 아님)
AND 연산
X와 Y가 모두 참일 때만 X AND Y가 참
X | Y | X AND Y |
True | True | True |
True | False | False |
False | True | False |
False | False | False |
대한민국의 수도는 서울이다. AND 2는 1보다 작다.
대한민국의 수도는 서울이고, 2는 1보다 작다.
→ 거짓 (False)
OR 연산
X와 Y 중 하나라도 참이면 X OR Y는 참
X | Y | X OR Y |
True | True | True |
True | False | True |
False | True | True |
False | False | False |
대한민국의 수도는 제주도이다. AND 대한민국의 수도는 서울이다.
대한민국의 수도는 제주도이거나 서울이다.
→ 참 (True)
NOT 연산
X | NOT X |
True | False |
False | True |
NOT 대한민국의 수도는 서울이다.
대한민국의 수도는 서울이 아니다.
→ 거짓 (False)
불린형
# 불린 (Boolean)
# 따옴표 붙이면 문자열로 출력됨
print("True") # True
print("False") # False
# and 연산
# -> 양쪽 같이 모두 True일 때만 True가 나옴
print(True and True) # True
print(True and False) # False
print(False and True) # False
print(False and False) # False
# OR 연산
# -> 둘 중 하나가 True일 때만 True가 나옴
print(True or True) # True
print(True or False) # True
print(False or True) # True
print(False or False) # False
# NOT 연산
# -> 결과값이 반대로 나옴
print(not True) # False
print(not False) # True
# 명제
print(2 > 1) # True
print(2 < 1) # False
print(3 >= 2) # True
print(3 <= 3) # True
print(2 == 2) # True (2는 2와 같다)
print(2 != 2) # False (2는 2와 같지 않다)
print("Hello" == "Hello") # True
print("Hello" != "Hello") # False
print(2 > 1 and "Hello" == "Hello")
# True and True 이므로 --> True
print(not not True) # not False --> True
print(not not False) # not True --> False
print(7 == 7 or (4 < 3 and 12 > 10))
# True or False --> True
x = 3
print(x > 4 or not (x < 2 or x == 3))
# False or not(False or True)
# ---> False
print(not True or (True and False))
# not True or False
# False or False ---> False
type 함수
print(type(3)) # <class 'int'>
print(type(3.0)) # <class 'float'>
print(type("3")) # <class 'str'>
print(type("True")) # <class 'str'>
print(type(True)) # <class 'bool'>
def hello():
print("Hello world!")
print(type(hello)) # <class 'function'>
print(type(print)) # <class 'builtin_function_or_method'> (내장된 함수)
2. 추상화
변수 제대로 이해하기
"""
= : 지정연산자 (assignment operator)
오른쪽에 있는 값을 왼쪽 변수에 넣어라 (O)
오른쪽 값과 왼쪽 값이 같다 (X)
"""
name = "배꼽파"
x = 7
x = x + 1
print(x) # 8
y = 7
y = y - 4
print(y) # 3
함수의 실행 순서
def hello():
print("Hello!")
print("Welcome to Codeit!")
print("함수 호출 전")
hello()
print("함수 호출 후")
# 함수를 정의한다고 바로 실행되는 것이 아님
"""
함수 호출 전
Hello!
Welcome to Codeit!
함수 호출 후
def square(x):
return x * x
print("함수 호출 전")
print(square(3) + square(4))
print("함수 호출 후")
"""
함수 호출 전
25
함수 호출 후
return문 제대로 이해하기
def square(x):
print("함수 시작")
return x * x
print("함수 끝")
print(square(3))
print("Hello World!")
"""
return 문의 역할
- 값 돌려주기
- 함수 즉시 종료하기
"""
"""
함수 시작
9
Hello World!
"""
# Line 4는 사용될 일이 없음 --> Dead Code(의미 없는 코드)
return과 print의 차이
def print_square(x):
print(x * x)
def get_square(x):
return x * x
print(print_square(3))
"""
9
None (리턴값이 없음)
"""
print(get_square(3))
# 9
옵셔널 파라미터
파라미터에 기본값 설정해 두어서 함수 호출 시 반드시 파라미터 전달을 안 해도 되는 것
개수 상관없이 무조건 일반 파라미터 뒤, 꼭 마지막에 있어야 함.
def myself(name, age, nationality="코리아"):
print("내가 누규? {}!".format(name))
print("나는 몇 짤?! {}살!".format(age))
print("어느 나라 출신?! {}!".format(nationality))
# 옵셔널 파라미터 제공 O
myself("배꼽파", 800, "깐따삐아")
"""
내가 누규? 배꼽파!
나는 몇 짤?! 800살!
어느 나라 출신?! 깐따삐아!
"""
# 옵셔널 파라미터 제공 X
myself("배꼽파", 800)
"""
내가 누규? 배꼽파!
나는 몇 짤?! 800살!
어느 나라 출신?! 코리아!
"""
Syntactic Sugar
자주 쓰이는 표현을 더 간략하게 쓸 수 있게 하는 문법
# 다음 두 줄은 같습니다
x = x + 1
x += 1
# 다음 두 줄은 같습니다
x = x + 2
x += 2
# 다음 두 줄은 같습니다
x = x * 2
x *= 2
# 다음 두 줄은 같습니다
x = x - 3
x -= 3
# 다음 두 줄은 같습니다
x = x / 2
x /= 2
변수의 scope
• scope : 변수가 유효한(사용 가능한 범위)
• 로컬변수 : 변수를 정의한 함수 내에서만 사용 가능 (파라미터 포함)
• 글로벌 변수 : 모든 곳에서 사용 가능
함수에서 변수를 사용하면, 로컬변수를 먼저 찾고 나서 글로벌변수를 찾음
def my_function():
x = 3
print(x)
my_function() #3
"""
def my_function():
x = 3
print(x)
my_function()
print(x)
---> 이름오류 : 'x'라는 이름이 정의된 적 없음.
"""
"""
로컬 변수 : 함수 내에서만 사용할 수 있는 변수
글로벌 변수 : 함수 밖에서 정의한 변수, 모든 곳에서 사용 가능함.
"""
x = 2 # 글로벌변수
def my_function():
x = 3
print(x) # 로컬변수
my_function()
print(x)
"""
3
2
"""
"""
함수에서 변수를 사용하면
항상 로컬변수가 있는지 먼저 확인 후
글로벌변수가 있는지 확인함.
"""
# 파라미터도 로컬변수임
def square(x) :
return x * x
print(square(3))
# 9
상수
# 파이썬에서는 상수 표기법에 const 같은 접두사가 없어서 "대문자"를 씀
PI = 3.14 # 원주율 '파이'
# 반지름을 받아서 원의 넓이 계산
def calculate_area(r):
return PI * r * r
radius = 4 # 반지름
print("반지름이 {}면, 넓이는 {}".format(radius, calculate_area(radius)))
radius = 5 # 반지름
print("반지름이 {}면, 넓이는 {}".format(radius, calculate_area(radius)))
radius = 6 # 반지름
print("반지름이 {}면, 넓이는 {}".format(radius, calculate_area(radius)))
스타일
# 원의 둘레와 넓이
# 1
print(6.28 * 4)
print(3.14 * 4 * 4)
print(6.28 * 8)
print(3.14 * 8 * 8)
# 2
# 변수 생성
a = 3.14
b = 4
print(2 * a * b)
print(a * b * b)
b = 8
print(2 * a * b)
print(a * b * b)
# 3
# 코멘트
a = 3.14 # 원주율(파이)
b = 4 # 반지름
print(2 * a * b)
print(a * b * b)
b = 8 # 반지름
print(2 * a * b)
print(a * b * b)
# 4
# 변수 이름 변경
pi = 3.14 # 원주율(파이)
radius = 4 # 반지름
print(2 * pi * radius)
print(pi * radius * radius)
radius = 8 # 반지름
print(2 * pi * radius)
print(pi * radius * radius)
# 5
# 상수는 대문자로로
PI = 3.14 # 원주율(파이)-->상수
radius = 4 # 반지름
print(2 * pi * radius)
print(pi * radius * radius)
radius = 8 # 반지름
print(2 * pi * radius)
print(pi * radius * radius)
# 6
# 화이트스페이스(띄어쓰기, 엔터)가독성을 높임
PI = 3.14 # 원주율(파이)-->상수
radius = 4 # 반지름
print(2 * pi * radius)
print(pi * radius * radius)
radius = 8 # 반지름
print(2 * pi * radius)
print(pi * radius * radius)
# 7
# 함수를 정의, 코멘트 추가
PI = 3.14 # 원주율(파이)-->상수
radius = 4 # 반지름
# 반지름이 r인 원의 둘레 계산
def calculate_circumference(r):
return 2 * PI * r
# 반지름이 r인 원의 넓이 계산산
def calculate_area(r):
return PI * r * r
radius = 4 # 반지름
print(calculate_circumference(radius))
print(calculate_area(radius))
radius = 8 # 반지름
print(calculate_circumference(radius))
print(calculate_area(radius))
파이썬 스타일 가이드 (PEP 8)
https://peps.python.org/pep-0008/
PEP 8 – Style Guide for Python Code | peps.python.org
PEP 8 – Style Guide for Python Code Author: Guido van Rossum , Barry Warsaw , Nick Coghlan Status: Active Type: Process Created: 05-Jul-2001 Post-History: 05-Jul-2001, 01-Aug-2013 Table of Contents This document gives coding conventions for the Python co
peps.python.org
1. 이름짓기
모든 변수와 함수 이름은 소문자로 쓰고, 여러 단어일 경우 _로 나눠주세요.
some_variable_name = 1
def some_function_name():
print("Hello")
모든 상수 이름은 대문자로 쓰고, 여러 단어일 경우 _로 나눠주세요.
PI = 3.14159
GRAVITY_ACCELERATION = 9.8
변수와 함수 이름은 의미 있는 이름으로 붙이기
radius = 2
PI = 3.14
print(PI * radius * radius)
2. 화이트스페이스
들여쓰기 | 들여쓰기는 무조건 스페이스 4개를 사용하세요. |
함수정의 | 함수 정의 위아래로 빈 줄이 두 개씩 있어야 합니다. 하지만 파일의 첫 줄이 함수 정의인 경우 해당 함수 위에는 빈 줄이 없어도 됩니다. |
괄호 바로 안 | 괄호 바로 안에는 띄어쓰기를 하지 마세요. |
함수 괄호 | 함수를 정의하거나 호출할 때, 함수 이름과 괄호 사이에 띄어쓰기를 하지 마세요. |
쉼표 | 쉼표 앞에는 띄어쓰기를 하지 마세요. |
지정 연산자 | 지정 연산자 앞뒤로 띄어쓰기를 하나씩 넣어 주세요. |
연산자 | 기본적으로는 연산자 앞뒤로 띄어쓰기를 하나씩 합니다. 하지만 연산의 '우선 순위'를 강조하기 위해서는, 연산자 앞뒤로 띄어쓰기를 붙이는 것을 권장합니다. |
코멘트 | 일반 코드와 같은 줄에 코멘트를 쓸 경우, 코멘트 앞에 띄어쓰기 최소 두 개를 입력해 주세요. |
def add_numbers(a, b):
# 함수 정의 위에는 빈 줄이 없어도 됨
result = a + b # 지정 연산자 앞뒤로 띄어쓰기를 하나씩 넣어 줌
return result
def multiply_numbers(x, y):
# 함수 정의 위아래로 빈 줄이 두 개씩 있음
return x * y
def main():
num1 = 10
num2 = 5
sum_result = add_numbers(num1, num2) # 함수 이름과 괄호 사이에 띄어쓰기를 하지 않음
product_result = multiply_numbers(num1, num2)
print(f"The sum is: {sum_result}, and the product is: {product_result}")
if __name__ == "__main__":
main()
거스름돈 계산기
def calculate_change(payment, cost):
change = payment - cost # 거스름돈 총액
# 지폐 개수 계산
fifty_count = change // 50000 # 50,000원 지폐 개수
ten_count = (change % 50000) // 10000 # 10,000원 지폐 개수
five_count = (change % 10000) // 5000
one_count = (change % 5000) // 1000
# 지폐 개수 출력
print("50000원 지폐: {}장".format(fifty_count))
print("10000원 지폐: {}장".format(ten_count))
print("5000원 지폐: {}장".format(five_count))
print("1000원 지폐: {}장".format(one_count))
3. 제어문
while 반복문
"""
while 조건 부분:
수행 부분 (반복적으로 실행하고 싶은 명령)
1. 조건 부분이 true이면 수행 부분 실행
2. 수행 부분이 끝나면 다시 조건 부분을 계산함.
3. 조건 부분이 false면 반복문에서 나오게 됨.
"""
i = 1
while i <= 3:
print("나는 잘생겼다!")
i += 1
"""
나는 잘생겼다!
나는 잘생겼다!
나는 잘생겼다!
"""
if문
"""
if 조건 부분:
수행 부분
◆ 조건 부분 : 불린 값으로 계산되는 식 (ex. x < 3)
◆ 수행 부분 : 조건을 충족했을 때, 실행하고 싶은 명령
"""
"""
temperature = 8
if temperature <= 10:
print("자켓을 입는다.")
자켓을 입는다.
"""
temperature = 16
if temperature <= 10:
print("자켓을 입는다.")
else:
print("자켓을 입지 않는다.")
elif문
"""
◆ if만 사용한 코드
if 점수가 90점 이상이다:
A를 준다
else:
if 점수가 80점 이상이다:
B를 준다
else:
if 점수가 70점 이상이다:
C를 준다
else:
if 점수가 60점 이상이다:
D를 준다
else:
F를 준다
"""
"""
◆ elif를 사용한 코드
if 점수가 90점 이상이다:
A를 준다
elif 점수가 80점 이상이다:
B를 준다
elif 점수가 70점 이상이다:
C를 준다
elif 점수가 60점 이상이다:
D를 준다
else:
F를 준다
"""
피보나치 수열
# 코드잇 모범답안
previous = 0
current = 1
i = 1
while i <= 50:
print(current)
temp = previous # previous를 임시 보관소 temp에 저장
previous = current
current = current + temp # temp에는 기존 previous 값이 저장돼 있음
i += 1
# 코드잇 모범답안 깔끔한 버전
previous = 0
current = 1
i = 1
while i <= 50:
print(current)
previous, current = current, current + previous # 한 줄로 변수 교환
i += 1
# 작성한 코드
A = 1
B = 1
C = 0
i = 1
while i <= 49 :
if i == 1:
print(A)
print(B)
i += 1
C = A + B
A = B
B = C
print(C)
i += 1
# i가 2일 때 3번째 수
# 50번째 수 -> i가 49일때까지 반복
구구단 만들기
# 정답
i = 1
while i <= 9:
j = 1
while j <=9:
print("{} * {} = {}".format(i, j, i * j))
j += 1
i += 1
# 오답
i = 1
j = 1 # j가 바깥에 있으면 1단을 마친 후 i값 증가한 다음 j <= 9 조건 미충족
while i <= 9:
while j <=9:
print("{} * {} = {}".format(i, j, i * j))
j += 1
i += 1
제어문 꿀팁
break문
while문의 조건 부분과 상관없이 반복문에서 나오고 싶으면, break문을 사용
i = 100
while True:
# i가 23의 배수면 반복문을 끝냄
if i % 23 == 0:
break
i = i + 1
print(i) # 115
continue문
현재 진행되고 있는 작동 부분을 중단하고 바로 조건 부분으로 돌아감.
i = 0
while i < 15:
i = i + 1
# i가 홀수면 print(i)하지 않고 바로 조건 부분으로 돌아감
if i % 2 == 1:
continue
print(i)