코드잇 Codeit/Python / ML / DL

[코드잇] 파이썬 프로그래밍 기초 - 프로그래밍 핵심 개념 in Python

꼽파 2023. 7. 31. 09:16


  • 1. 자료형

  • 2. 추상화

  • 3. 제어문

  • 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)
    728x90