[혼공 학습단] 혼자공부하는파이썬_2주차

Muun·2025년 7월 12일
0
post-thumbnail

2.3 변수와 입력

  • 변수 : 값을 저장할 때 사용하는 식별자
    • 값을 넣고 빼며 사용하게 됨

변수 만들기 / 사용하기

  • 변수 활용 방법
    • 변수를 선언하는 방법 : 변수를 생성하는 작업
    • 변수에 값을 할당하는 방법 : 변수에 값을 넣는 작업( = 기호를 사용)
    • 변수를 참조하는 방법 : 변수에서 값을 꺼내는 작업

앞에서 배운 것과 마찬가지로 pi는 숫자 자료형이기 때문에 숫자와 문자열을 연산하는 것은 불가능!

-> 오류가 발생하는 것을 확인할 수 있다

복합 대입 연산자

  • 변수는 내부에 들어있는 자료의 연산자를 사용할 수 있음
    • 문자열이 들어 있는 경우 문자열과 관련된 연산자를 사용가능
    • 숫자 자료형이 들어있는 경우 숫자와 관련된 연산자를 사용가능
  • 변수를 활용할 때는 기존의 연산자를 조합해서 사용할 수 있는 연산자가 생기게 되는데, 이를 복합 대입 연산자라고 함
    • 자료형에 기본 연산자와 = 연산자를 함께 사용하여 구성하는 연산자를 의미

-> 이와 같이 a +=10을 하게 되면 a = a+10과 같은 연산을 수행하게 됨

  • 복합 대입 연산자의 종류
    • +=: 숫자 덧셈 후 대입
    • -=: 숫자 뺄셈 후 대입
    • *=: 숫자 곱셈 후 대입
    • /=: 숫자 나눗셈 후 대입
    • %=: 숫자의 나머지를 구한 후 대입
    • **=: 숫자 제곱 후 대입

  • 문자열도 마찬가지로 복합 대입 연산자를 이용 가능
    • +=: 문자열 연결 후 대입
    • *=: 문자열 반복 후 대입

사용자 입력: input()

  • 파이썬이 명령 프롬프트에서 사용자로부터 데이터를 입력받을 때 사용하는 함수
  1. input() 함수로 사용자 입럭 받기
  • 사용자로부터 데이터를 입력 받을 때 사용
    • 이때 input() 함수 괄호 내에 입력하는 내용을 프롬프트 문자열이라고 함
    • 프롬프트 문자열: 사용자에게 입력을 요구하는 안내 내용을 입력

위의 코드를 실행하게 되면 "인사말을 입력하세요> "라는 문자열이 뜨고 프로그램은 종료되지 않고 대기하게 됨

-> 이렇게 종료하지 않고 실행 도중 잠시 멈추는 것을 블록이라고 함

이후 입력을 수행하면 입력한 값이 input함수의 결과로 나타나는데, 이를 리턴값이라고 함

  1. input() 함수의 입력 자료형
  • 대입한 값의 자료형이 어떻게 되는지 궁금한 경우, type() 함수를 사용

input 함수의 자료형은 어떻게 되는지 살펴보자면 아래와 같은 코드를 돌려보면 됨

두가지 변수 모두 type이 str(문자형)인 것을 확인할 수 있음

-> 즉 input에서 입력받은 자료의 자료형은 무조건 문자열 자료형이 되는 것을 확인 가능함

그렇다면 다음 예시를 확인하도록 하자

앞서 우리가 확인했 듯이 input으로 입력받은 변수의 자료형은 무조건 str(문자열)이 되는 것을 알 수 있었음

-> 따라서 해당 변수와 숫자 자료형은 연산이 불가능 하기 때문에 TypeError 발생!

문자열을 숫자로 바꾸기

  • input()함수의 입력 자료형은 항상 문자열이기 때문에 입력 받은 문자열은 숫자로 변환해야 숫자 연산이 가능해짐 -> 이를 캐스트(cast)라고 함
  • 문자열을 숫자로 변환하는 경우 다음과 같은 함수를 사용함
    • int()함수: 문자열을 int 자료형으로 변환 (int: 정수형을 의미)
    • float()함수: 문자열을 float 자료형으로 변환(float: 실수형 또는 부동 소수점을 의미)

ValueError 예외

  • 자료형 변환 시 '변환할 수 없는 것'을 변환하는 경우, ValueError가 발생
    • 숫자가 아닌 것을 숫자로 변환하려고 하는 경우

해당 코드를 실행하는 경우 예외가 발생!

  • 소수점이 있는 숫자 형식의 문자열을 int()함수로 변환하려고 하는 경우

int의 경우 정수형인데, 실수형을 정수형으로 변환하려고 했기 때문에 오류 발생!

숫자를 문자열로 바꾸기

  • 문자열을 숫자로 변환하는 것과 같이, 숫자를 문자열로 변환하는 것도 가능
    • str()함수 사용

[예제] inch 단위를 cm 단위로 변경하기

<더 알아보기> 파이썬 튜터로 코드 분석하기

  • 파이썬 튜터(python tutor): 프로그래밍 초보자가 코드 흐름을 쉽게 이해할 수 있도록 파이썬 코드를 시각적으로 분석해주는 도구

  • 단순하게 a와 b라는 변수를 입력하고 이들을 교체하여 출력하는 것이 아닌 두 변수 안에 있는 값을 교체하여 출력하는 방법을 스왑(swap)이라고 함
    • 새로운 변수를 도입하여 거기에 하나의 값을 임시저장하는 저장소로 사용해서 스왑을 진행하면 됨

2.4 숫자와 문자열의 다양한 기능

문자열의 format() 함수

  • format()함수는 문자열이 가지고 있는 함수로, 중괄호 {}를 포함한 문자열 뒤에 마침표(.)를 찍고 format() 함수를 사용함
    • 이때 중괄호의 개수와 format()함수 내 매개변수의 개수는 반드시 같아야 함
    • 원리: 앞쪽에 있는 문자열의 {}기호가 format()함수 괄호 내의 매개변수로 차례대로 대체되며 숫자가 문자열이 됨

-> 코드를 실행하면 숫자 10의 자료형은 문자열이 되고, string_a에는 문자열 10이 들어 있는 것을 확인 가능

  • format()함수는 {}기호를 format함수 내 매개변수로 대체하는 것이기 때문에 {}기호 앞뒤 혹은 {}기호와 {}기호 사이에 다양한 문자열을 넣어도 됨

-> 이와 같이 {} 기호 양쪽에 다른 문자열을 같이 넣은 형태 혹은 {}기호와 매개변수를 여러 개 넣은 형태를 실행할 수 있음

IndexError 예외

  • {}기호의 개수가 format()함수의 매개변수 개수보다 많으면 IndexError가 발생

-> {}는 3개인데 format()내 숫자는 2개이므로 IndexError 발생!

format()함수의 다양한 기능
1. 정수 출력의 다양한 형태

  • format()함수를 사용하여 출력할 정수에 기호를 넣어주거나, 숫자 형태를 다양하게 출력 가능

-> 기호와 공백을 조합할 때는 =기호를 앞에 붙임

  • 다음 예시를 보았을 때 =+5의 의미는 5칸의 공간을 잡았을 때 기호를 빈칸 앞에 붙일 것인지 숫자 앞에 붙일 것인지를 지정하는 기호가 된다
  • 조합의 순서가 중요!
  1. 부동 소수점 출력의 다양한 형태
  • float 자료형 출력을 강제로 지정하는 경우, {:f}를 사용

  • 부동 소수점의 경우, 소수점 아래 자릿수를 지정하는 기능이 존재
    • .을 입력하고 뒤에 몇 번째 자릿수까지 표시할지 지정하면 됨
    • 이를 수행하면 자동으로 반올림도 수행됨

  1. 의미없는 소수점 제거하기
  • 파이썬의 경우 0과 0.0을 출력하면 내부적으로 자료형을 달리 출력함
    • 이때 의미 없는 0을 제거한 후 출력하고 싶은 경우, {:g}를 사용

대소문자 바꾸기: upper()과 lower()

  • upper(): 문자열의 알파벳을 대문자로 바꿔줌
  • lower(): 문자열의 알파벳을 소문자로 바꿔줌

-> 이때 a의 원본은 변하지 않는다는 점을 유의! (비파괴적 함수)

문자열 양옆의 공백 제거하기: strip()

  • strip(): 문자열 양옆의 공백을 제거함
    • lstrip(): 문자열 왼쪽의 공백을 제거함
    • rstrip(): 문자열 오른쪽의 공백을 제거함

-> 다음을 출력하면 의도치않은 공백이 들어간 것을 확인할 수 있음

문자열의 구성 파악하기: isOO()

  • isalnum(): 문자열이 알파벳 또는 숫자로만 구성되어 있는지 확인
  • isalpha(): 문자열이 알파벳으로만 구성되어 있는지 확인
  • isidentifier(): 문자열이 식별자로 사용할 수 있는 것인지 확인
  • isdecimal(): 문자열이 정수 형태인지 확인
  • isdigit(): 문자열이 숫자로 인식될 수 있는 것인지 확인
  • isspace(): 문자열이 공백으로만 구성되어 있는지 확인
  • islower(): 문자열이 소문자로만 구성되어 있는지 확인
  • isupper(): 문자열이 대문자로만 구성되어 있는지 확인
    • 출력의 형태는 True 또는 False의 boolean형태로 나타남

문자열 찾기:find()와 rfind()

  • find(): 왼쪽부터 찾아서 처음 등장하는 위치를 찾음
  • rfind(): 오른쪽부터 찾아서 처음 등장하는 위치를 찾음
    • 문자열의 가장 앞글자는 0번째부터 시작한다는 점을 유의!

문자열 in 연산자

  • in 연산자: 문자열 내부에 어떤 문자열이 있는지 확인하기 위해 사용
    • 출력은 마찬가지로 True 또는 False로 나타남

문자열 자르기: split()

  • split(): 문자열을 특정한 문자로 자를 때 사용하는 함수
    • 공백을 넣으면 공백(띄어쓰기)을 기준으로 자름
    • 실행 결과는 리스트(list)형태로 나옴

f-문자열

  • 문자열 내부에 표현식을 {} 괄호로 감싸서 삽입하는 형태
f'문자열 {표현식} 문자열'

-> 여기서 A 지점의 경우, Hello가 출력될 것이고, B지점의 경우 HELLO가 출력될 것이다

  • 이는 upper()함수가 비파괴적 함수이기 때문!

Chapter 03. 조건문

3.1 불 자료형과 if 조건문

  • Boolean: True(참) 또는 False(거짓)의 값만 가지는 자료형
    • 참과 거짓을 그대로 입력한느 경우 큰 의미를 가지지 않음
    • 참과 거짓은 '어떤 명제'의 결과가 될 때 의미를 가짐

불 만들기: 비교 연산자

  • 비교 연산자
    • ==: 같다
    • !=: 다르다
    • <: 작다
    • >: 크다
    • <=: 작거나 같다
    • >=: 크거나 같다

  • 파이썬에선 문자열에도 비교연산자를 적용할 수 있음
    • 한글의 사전 순서 대로 값을 가지게 됨 (가나다라 순)

불 연산하기: 논리 연산자

  • 불끼리는 논리 연산자를 사용할 수 있음
  • 논리 연산자의 종류
    • not(아니다): 불을 반대로 전환함
    • and(그리고): 피연산자 두 개가 모두 참인 경우 True를 출력하고, 그 외에는 모두 False를 출력함
    • or(또는): 피연산자 두 개중에 하나만 참이라도 True를 출력하며, 두 개가 모두 거짓일 때만 False를 출력함
  • 단항 연산자: 피연산자가 한 개라는 의미
  • 이항 연산자: 피연산자가 두 개라는 의미
  • not 연산자: 단항 연산자로, 참과 거짓을 반대로 바꿀 때 사용

  • and 연산자: 양쪽 변의 값이 모두 참일때만 True를 결과로 냄
    • True / True -> True
    • True / False -> False
    • False / True -> False
    • False / False -> False
  • or 연산자: 둘 중 하나만 참이어도 True를 결과로 냄
    • True / True -> True
    • True / False -> True
    • False / True -> True
    • False / False -> False

  • 논리 연산자의 활용

    • and 연산자

      • 예시: 유명 연예인의 공연 티켓을 예매할 때 다음과 같은 두 가지 조건이 존재하는 경우

        • 인당 티켓 1장만 구매 가능
        • 오후 3시 이후 구매 가능

        -> "티켓 1장 이하" and "오후 3시 이후"

    • or 연산자

      • 예시: 결제한 카드가 우리카드나 신한카드라면 10% 할인해주는 경우

        -> "우리카드" or "신한카드"

if 조건문

  • if 조건문: 조건에 따라 코드를 실행하거나, 실행하지 않게 만들고 싶은 경우 사용하는 구문
    • 조건을 기반으로 실행 흐름을 변경하는 경우로, 조건 분기라고도 나타냄
  • if 조건문의 기본적인 구조
if 불 값이 나오는 표현식:
  불 값이 참일 때 실행할 문장
  불 값이 참일 때 실행할 문장

-> 불 값이 거짓인 경우에는 들여쓰기 된 명령문이 있더라도 아무것도 실행되지 않는 것을 확인 가능

[예제] 날짜/시간 활용하기

  • 모듈 활용하기
    • datetime: 날짜를 가지고 오는 모듈
      • datetime.datetime.now(): 현재 시간을 구해주는 함수로, 현재시간을 기반으로 하기 때문에 실행할 때마다 값이 달라짐

  • format() 함수: 날짜를 한 눈에 볼 수 있도록 출력해주는 함수

[예제] 짝수와 홀수 구분하기

-> 만일 여기서 last_number == 0 or 2 or 4 or 6 or 8 이라고 쓰면 인간의 언어 표현에서는 가능한 표현이지만, 프로그래밍 언어에선 불가능!!

  • or 연산자를 사용한 순간, 프로그래밍에서는 양쪽 피 연산자를 불 자료형이 들어올 것이라 예측

    • 즉 0 뒤에 or이 붙으므로 이후 숫자는 모두 True로 인식하게 됨

      -> 무조건 True인 연산이 수행되게 됨 (틀린 연산!)

  • in 연산자: 문자열 내부에 찾고자 하는 문자열이 있는지 확인할 때 사용

  • 나머지 연산자를 활용한 구분

3.2 if ~ else와 elif 구문

else 조건문의 활용

  • else 구문: if 조건문 뒤에 사용하며, if 조건문의 조건이 거짓인 경우 실행되는 부분
  • if ~ else 조건문의 예시
if 조건:
  조건이 참일 때 실행할 문장
else:
  조건이 거짓일 때 실행할 문장

  • 조건문이 오로지 두 가지로만 구분될 때, if else 구문을 사용하면 조건 비교를 한 번만 할 수 있어 효율적인 코드를 짤 수 있음

elif 구문

  • 세 개 이상의 조건을 연결해서 사용하는 경우, elif 구문을 사용
  • elif 구문 예시
if 조건A:
  조건A가 참일 때 실행할 문장
elif 조건B:
  조건B가 참일 때 실행할 문장
elif 조건C:
  조건C가 참일 때 실행할 문장
  ...
else:
  모든 조건이 거짓일 때 실행할 문장

[예제] if 조건문을 효율적으로 사용하기

-> 앞의 코드와는 다르게 하위 조건만 검사하고 상위조건은 검사하지 않기 때문에 코드의 가독성이 올라가게 됨

False로 변환되는 값

  • None
  • 숫자 0, 0.0
  • 빈 컨테이너(빈 문자열, 빈 바이트열, 빈 리스트, 빈 튜프르 빈 딕셔너리 등)

Pass 키워드

  • 전체 골격을 잡아 놓고 내부에서 처리할 내용은 차근차근 생각하며 만들겠다는 의도로 접근하는 경우 Pass 키워드를 사용하기도 함

-> 위와 같이 그냥 아무것도 안넣은 미구현 상태로 두게된다면 IndentationError가 발생함

  • IndentationError: 들여쓰기가 잘못되어 있다는 오류

raise NotImplementedError

  • 'raise 키워드 + 미구현 상태'를 표현하는 NotImplementedError을 조합한 오류
  • 해당 구문을 보고 아직 구현이 안된 상태라는 것을 확인할 수 있음

# 2. 나누어 떨어지는 숫자
number = int(input("정수를 입력해주세요: "))

if number % 2 == 0:
  if number % 3 == 0:
    if number % 4 == 0:
      if number % 5 == 0:
        print("{}은 2로 나누어 떨어지는 숫자입니다.".format(number))
        print("{}은 3으로 나누어 떨어지는 숫자입니다.".format(number))
        print("{}은 4로 나누어 떨어지는 숫자입니다.".format(number))
        print("{}은 5로 나누어 떨어지는 숫자입니다.".format(number))
      else:
        print("{}은 2로 나누어 떨어지는 숫자입니다.".format(number))
        print("{}은 3으로 나누어 떨어지는 숫자입니다.".format(number))
        print("{}은 4로 나누어 떨어지는 숫자입니다.".format(number))
        print("{}은 5로 나누어 떨어지지 않는 숫자입니다.".format(number))
    elif number % 5 == 0:
      print("{}은 2로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 3으로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 4로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 5로 나누어 떨어지는 숫자입니다.".format(number))
    else:
      print("{}은 2로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 3으로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 4로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 5로 나누어 떨어지지 않는 숫자입니다.".format(number))
  elif number % 4 == 0:
    if number % 5 == 0:
      print("{}은 2로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 3으로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 4로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 5로 나누어 떨어지는 숫자입니다.".format(number))
    else:
      print("{}은 2로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 3으로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 4로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 5로 나누어 떨어지지 않는 숫자입니다.".format(number))
  else:
    if number % 5 == 0:
      print("{}은 2로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 3으로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 4로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 5로 나누어 떨어지는 숫자입니다.".format(number))
    else:
      print("{}은 2로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 3으로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 4로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 5로 나누어 떨어지지 않는 숫자입니다.".format(number))
else:
  if number % 3 == 0:
    if number % 4 == 0:
      if number % 5 == 0:
        print("{}은 2로 나누어 떨어지지 않는 숫자입니다.".format(number))
        print("{}은 3으로 나누어 떨어지는 숫자입니다.".format(number))
        print("{}은 4로 나누어 떨어지는 숫자입니다.".format(number))
        print("{}은 5로 나누어 떨어지는 숫자입니다.".format(number))
      else:
        print("{}은 2로 나누어 떨어지지 않는 숫자입니다.".format(number))
        print("{}은 3으로 나누어 떨어지는 숫자입니다.".format(number))
        print("{}은 4로 나누어 떨어지는 숫자입니다.".format(number))
        print("{}은 5로 나누어 떨어지지 않는 숫자입니다.".format(number))
    elif number % 5 == 0:
      print("{}은 2로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 3으로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 4로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 5로 나누어 떨어지는 숫자입니다.".format(number))
    else:
      print("{}은 2로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 3으로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 4로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 5로 나누어 떨어지지 않는 숫자입니다.".format(number))
  elif number % 4 == 0:
    if number % 5 == 0:
      print("{}은 2로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 3으로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 4로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 5로 나누어 떨어지는 숫자입니다.".format(number))
    else:
      print("{}은 2로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 3으로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 4로 나누어 떨어지는 숫자입니다.".format(number))
      print("{}은 5로 나누어 떨어지지 않는 숫자입니다.".format(number))
  else:
    if number % 5 == 0:
      print("{}은 2로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 3으로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 4로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 5로 나누어 떨어지는 숫자입니다.".format(number))
    else:
      print("{}은 2로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 3으로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 4로 나누어 떨어지지 않는 숫자입니다.".format(number))
      print("{}은 5로 나누어 떨어지지 않는 숫자입니다.".format(number))

이 코드와 같이 나는 if 문에 한번에 2, 3, 4, 5를 실행하라는 줄 알고 작성을 했었으나, 코드가 수상한거 같아서 답지를 보았더니 답지는 훨씬 간단하게 되어있었다...(허무)
다음은 답지를 참고해서 짠 도전문제 2번 코드이다.

코드를 짤 때는 같은 내용이어도 가독성이 좋고, 간결한 코드가 잘 짜여진 코드이기 때문에 앞으로는 코드를 짤 때 어떻게 하면 더욱 간결하고 깔끔하게 짤 수 있을지를 고민하는 과정이 필요할 것 같다고 생각했다.

지금은 연습하는 과정이니까 내가 코드를 잘 짰다고 생각해도 꾸준히 답지와 비교하면서 어떤부분이 다른지, 어떤 코드가 더욱 좋은 코드일지 고민하는 시간을 가지는게 좋을 것 같다!

0개의 댓글