올해 1월 첫째주 부터 약 6주 간 진행했던 혼공학습단 11기가 끝났습니다. 😎

 

항상 파이썬 공부 해야지 하고 생각만 하고, 책 앞 부분만 몇 번 뒤적거리다가....

회사 다니면서 개인 공부하기 바쁘다는 핑계로 슬그머니 덮어 놓기 일쑤였는데, 이번에는 기본서 한 권을 다 볼 수 있었습니다!!

 

사실 제가 의지박약이라 초반엔 의욕이 넘쳐서 이것 저것 하다가 갈수록 늘어지고 결국 포기했던 경험이 많았어서, 내심 완주를 걱정했었는데 성공해서 너무 뿌듯하고 행복합니다 😊

 

회사 업무에, 이직 준비에 이래저래 바빴던 나날이었지만, 매주 미션을 제출하면 족장님이 장문의 정성스러운 코멘트를 달아 주십니다.

바쁘고 힘들 때는 하기 싫은 마음도 들었지만... 항상 달아주시는 따뜻한 댓글, 폭풍칭찬 덕분에 더 의욕이 샘솟고, 다음 주도 꼭 제출해야지 하는 원동력이 되었던 것 같아요. ❤️

 

또 다른 학습단 분들이 공부하신 내용도 보면서 자극 받을 수도 있었구요.

 

이번 활동을 통해서 많은 것을 얻을 수 있었습니다.

 

매 주 꾸준히 파이썬을 공부하고, 공부한 내용을 나만의 언어로 정리한 것, 그리고 정해진 기간 내에 모두 끝냈다는 것, 파이썬으로 간단한 프로그램을 작성할 수 있게 되었고 파이썬으로 코딩테스트 문제를 풀어볼 수 있게 되었다는 것. 모두 혼공학습단을 하면서 얻게 된 성과입니다.

 

그리고 활동을 시작하면서, "천재지변이 아니면 절대 지각하지 말자" 라고 다짐 했었는데, 이 부분도 지켜진 것 같아 뿌듯합니다.

 

혼공학습단 11기 활동은 여기서 끝나지만, 책 내용을 완벽하게 이해한 것은 아니기 때문에 파이썬 공부는 계속하려고 합니다. 파이썬 마스터가 되는 그 날까지! 🫡

혼공학습단 12기는 올해 6월 중순에 또 모집 한다고 합니다.

12기 모집하면.... 또 신청 할 거에요 👻

혼공학습단 시작이 엊그제 같은데 벌써 마지막 주차가 되었습니다!

벌써 1월이 다 지나가 버렸다니🥲

그리고 파이썬 기본서 한 권을 다 봤다니! 뿌듯합니다 ㅎㅎ

배운 건 계속 써먹어 봐야 하니까 코딩테스트 문제도 요즘 파이썬으로 풀어보고 있어요! 😎


Chapter 07. 모듈

[외부 모듈]

 

✏️ 외부 모듈 : 파이썬이 기본적으로 제공하지 않는, 다른 사람들이 만들어 제공하는 모듈

# 설치 방법
pip install <모듈 이름>

 

[기본 미션 : p.431 [직접 해보는 손코딩:BeautifulSoup 스크레이핑 실행하기] 예제 실행 후 결과 화면 캡처하기]

 

✅ 소스 코드

# 모듈을 읽어 들입니다.
from flask import Flask
from urllib import request
from bs4 import BeautifulSoup

# 웹 서버를 생성합니다.
app = Flask(__name__)
@app.route("/")

def hello():
    # urlopen() 함수로 기상청의 전국 날씨를 읽습니다.
    target = request.urlopen("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")
    # BeautifulSoup을 사용해 웹 페이지를 분석합니다.
    soup = BeautifulSoup(target, "html.parser")
    
    # location 태그를 찾습니다.
    output = ""
    for location in soup.select("location"):
        # 내부의 city, wf, tmn, tmx 태그를 찾아 출력합니다.
        output += "<h3>{}</h3>".format(location.select_one("city").string)
        output += "날씨: {}<br/>".format(location.select_one("wf").string)
        output += "최저/최고 기온: {}/{}"\
            .format(\
                location.select_one("tmn").string,\
                location.select_one("tmx").string\
                )        
        output += "<hr/>"
 
    return output

 

실행 화면


Chapter 08. 클래스

[클래스의 기본]

 

✏️ 객체 지향 프로그래밍 : 객체를 만들고, 객체들의 상호 작용을 중심으로 개발하는 방법론

✏️ 객체 (object) : 속성을 가질 수 있는 모든 것

# 예시 - 학생 객체
student1 = {"name": "kim", "math": 98, "english": 88, "science":95}
student2 = {"name": "Lee", "math": 92, "english": 81, "science":98}

 

✏️ 클래스 (class) : 객체를 효율적으로 생성하기 위해서 만들어진 구문

class 클래스 이름:
      클래스 내용

 

클래스는 생성자 함수(클래스 이름과 같은 함수) 를 사용해서 객체를 생성한다.

이러한 클래스를 기반으로 만들어 진 객체를 인스턴스 (instance) 라고 한다.

  •  붕어빵 틀과 붕어빵에 비유할 수 있다. 붕어빵 틀(클래스) 을 사용해서 실체화 된 붕어빵들이 바로 인스턴스이다.
# 인스턴스 생성
인스턴스 이름 = 클래스이름() 

 

학생 클래스를 정의한 후, 이를 기반으로 학생 3명을 선언하는 예제

# 클래스 선언
class Student:
    pass

# 학생 선언
student = Student()

# 학생 리스트 선언
students = [
    Student(),
    Student(),
    Student(),
]

 

✏️ 생성자 (constructor) : 클래스 이름과 같은 함수

  • 클래스 내부에 __init__ 라는 함수를 만들어서 객체를 생성할 때 처리할 내용을 작성할 수 있다.
  • 클래스 내부의 함수는 첫 번째 매개변수로 self 를 사용한다.
    • self가 가지고 있는 속성이나 기능에 접근할 때는 self.<식별자> 로 접근한다.
class 클래스 이름:
      def __init__(self, 추가적인 매개변수):
            작성할 코드

 

✏️ 메소드 (method) : 클래스가 가지고 있는 함수

class 클래스 이름:
      def 메소드 이름(self, 추가적인 매개변수):
            작성할 코드
# 클래스 선언
class Student:
    # 객체 생성 시 추가할 속성 정의
    def __init__(self, name, math, english, science):
        self.name = name
        self.math = math
        self.english = english
        self.science = science
    
    # Student 클래스의 메소드 get_sum() 정의
    def get_sum(self):
        return self.math+self.english+self.science
    
    def to_string(self):
        return "{}\t{}\t".format(self.name, self.get_sum())

# 학생 리스트 선언
students = [
    Student("kim", 97, 98, 88),
    Student("lee", 92, 98, 96),
    Student("bae", 76, 96, 94)
]

print("이름", "총점", sep="\t")
for student in students:
    print(student.to_string())
    
이름    총점
kim     283
lee     286
bae     266

 

우수 혼공단 선정 너무 기뻐요!! ❤️

벌써 혼공단 활동도 절반을 넘어서 끝이 다가오네요... 시간이 너무 빨리 흐르는 것 같습니당 ㅎㅎ

이번 주도 열심히 공부 해 보겠습니다! 파이썬 공부 너무 재밌어요 👻😎


Chapter 06. 예외 처리

[구문 오류와 예외]

 

✏️ 구문 오류 (syntax error) : 프로그램이 실행되기 전에 발생하는 오류

  • 괄호나 따옴표 개수, 들여쓰기 등의 문제가 있을 때 발생
  • 해결하지 않으면 프로그램 자체가 실행되지 않으므로, 오류가 발생한 코드를 찾아 수정해야 한다.
# 정상적인 실행
print("Hello World")

# 구문 오류 발생 - 닫는 따옴표가 없음
# 닫는 따옴표 추가해서 해결
print("Hello World)

 

✏️ 예외 (exception) 또는 런타임 오류 (runtime error) : 프로그램 실행 중에 발생하는 오류이며, 구문 오류 해결법처럼 오류가 발생한 코드를 찾아 수정해야 한다.

 

✏️예외 처리 (exception handling) : 예외를 처리하는 모든 것

    ✔️ 구문 오류는 프로그램 실행 전에 발생하기 때문에 예외처리 방법으로 처리할 수 없다.

 

조건문으로 예외 처리하기

    ✔️ 정수를 입력받는 소스 코드에 문자열을 입력한다면 ? 예외 발생!

    ✔️ '정수를 입력하지 않았을 때' 를 조건으로 구분해서, 해당 상황일 때 프로그램이 죽지 않고 정상 종료되도록 한다.

# 조건문으로 예외 처리
input_num = input("정수 입력 > ")

# 사용자 입력이 숫자로만 구성되어 있을 때
if input_num.isdigit():
    number = int(input_num)
    print("입력받은 숫자: ", number)
else:
    print("정수가 입력되지 않았습니다.")

# 정수 입력한 경우
정수 입력 > 5
입력받은 숫자:  5

# 문자열 입력한 경우
정수 입력 > 문자열
정수가 입력되지 않았습니다.

 

try except 구문을 사용하여 예외 처리하기

  • 파이썬에서 제공하는 예외를 처리할 수 있는 구문
  • 어떤 상황에 예외가 발생하는 지 모두 파악하지 않아도 프로그램이 강제로 죽는 상황을 막을 수 있다.
try:
       예외가 발생할 가능성이 있는 코드
except:
       예외가 발생했을 때 실행할 코드
# try except 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
    print("입력받은 숫자: ", input_num)
except:
    # 예외 발생 시 실행할 구문
    print("정수가 입력되지 않았습니다.")

# 정수 입력
정수 입력 > 6
입력받은 숫자:  6

# 정수가 아닌 문자열 입력
정수 입력 > 안녕하세요
정수가 입력되지 않았습니다.

 

 try except 구문과 pass 키워드를 조합해서 사용하기

  • try except 구문 사용 시 except 구문에 아무것도 넣지 않으면 구문 오류가 발생하므로, pass 키워드를 추가한다.
try:
       예외가 발생할 가능성이 있는 코드
except:
        pass

 

 try except else 구문

  • try except 구문에 else 구문을 넣으면 '예외가 발생 하지 않았을 때 실행할 코드' 를 지정할 수 있다.
  • 예외가 발생할 가능성이 있는 코드만 try 구문 내부에 넣고, 나머지는 else로 빼는 경우가 많다.
# try except else 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
except:
    print("정수가 아닙니다.")
else:
    print("입력받은 숫자: ", input_num)
    
# 정수를 입력한 경우
정수 입력 > 10
입력받은 숫자:  10

# 정수를 입력하지 않은 경우
정수 입력 > hello
정수가 아닙니다.

 

finally 구문

  • 예외 처리 구문에서 가장 마지막에 사용할 수 있는 구문.
  • 예외 발생 여부와 상관 없이 무조건 실행할 때 사용하는 코드
try:
     예외가 발생할 가능성이 있는 코드
except:
      예외가 발생했을 때 실행할 코드
else:
      예외가 발생하지 않았을 때 실행할 코드
finally:
      무조건 실행할 코드
# try except 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
    print("입력받은 숫자: ", input_num)
except:
    print("정수가 아닙니다.")
else:
    print("예외가 발생하지 않았습니다.")
finally:
    print("프로그램이 모두 끝났습니다.")
    
# 정수를 입력한 경우
정수 입력 > 10
입력받은 숫자:  10
예외가 발생하지 않았습니다.
프로그램이 모두 끝났습니다.

# 정수를 입력하지 않은 경우
정수 입력 > 테스트
정수가 아닙니다.
프로그램이 모두 끝났습니다.

 

※ try 구문은 단독으로 사용할 수 없고, 반드시 except 구문이나 finally 구문과 함께 사용해야 한다.

else 구문은 반드시 except 구문 뒤에 사용해야 한다.

 

 finally 키워드를 사용해서 코드를 깔끔하게 만들기

  • finally 키워드는 무조건 실행되기 때문에, 반복문이나 함수 내부에서 사용하면 좋다.
  • 예시) 파일 처리 코드
    • try 구문에서 return 키워드로 빠져 나가거나 예외 발생으로 try 구문 중간에 빠져 나가는 경우에 파일이 제대로 닫히지 않는 문제가 발생할 수 있음
    • finally 구문을 활용하여 try 구문을다 수행하지 않고 빠져나가더라도 무조건 파일이 닫히게 할 수 있다.

[예외 고급]

 

✏️ 예외 객체 (exception object) : 프로그램에서 예외가 발생하면 예외와 관련된 정보가 생긴다. 그리고 예외 정보는 예외 객체에 저장된다.

try:
      예외가 발생할 가능성이 있는 구문
except 예외의 종류 as 예외 객체를 활용할 변수 이름:
      예외가 발생했을 때 실행할 구문 

 

예외의 종류가 뭔지 모를 땐 Exception 을 사용한다.

# try except 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
    print("입력받은 숫자: ", input_num)
except Exception as exception:
	# 예외 객체의 자료형 출력
    print("type(exception): ", type(exception))
    # 예외 객체 출력
    print(exception)
    
# 문자를 입력한 경우 예외 발생
정수 입력 > hi
type(exception):  <class 'ValueError'>
invalid literal for int() with base 10: 'hi'

 

프로그램 실행 중에 여러 개의 예외가 발생할 수 있다. 파이썬에서는 execpt 구문 뒤에 예외의 종류를 입력해서 예외를 구분할 수 있다.

try:
      예외가 발생할 가능성이 있는 구문
except 예외의 종류A:
        예외A가 발생했을 때 실행할 구문
except 예외의 종류B:
        예외B가 발생했을 때 실행할 구문
except 예외의 종류C:
        예외C가 발생했을 때 실행할 구문
list_a = [52, 273, 32, 72, 100]

# try except 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
    print("list의 요소 :", list_a[input_num])
except ValueError:
    # ValueError가 발생하는 경우
    print("정수를 입력해 주세요")
except IndexError:
    # IndexError가 발생하는 경우
    print("인덱스의 값을 벗어났습니다.")
    
# 정수가 아닌 값 입력 : ValueError 발생
정수 입력 > Hello
정수를 입력해 주세요

# 리스트의 인덱스를 넘는 값 입력 : IndexError 발생
정수 입력 > 10
인덱스의 값을 벗어났습니다.

 

✏️ 예외를 구분할 때 각각의 except 구문 뒤에 예외 객체를 붙여 활용할 수 있다. as 키워드를 사용한다.

list_a = [52, 273, 32, 72, 100]

# try except 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
    print("list의 요소 :", list_a[input_num])
except ValueError as excption:
    # ValueError가 발생하는 경우
    print("정수를 입력해 주세요")
    # 예외 객체 출력
    print("exception: ", excption)
except IndexError as excption:
    # IndexError가 발생하는 경우
    print("인덱스의 값을 벗어났습니다.")
    # 예외 객체 출력
    print("exception: ", excption)

# IndexError 발생시킨 경우
정수 입력 > 100
인덱스의 값을 벗어났습니다.
exception:  list index out of range

 

★ except 구문으로 예외를 구분하는 경우, 예외 조건에 일치하는 것이 없다면 프로그램이 종료된다.

    → except 구문의 마지막에는 Exception 을 추가하여 프로그램의 종료를 막는 것이 좋다.

★ '이 코드에서 어떤 예외가 발생할 것인지' 잘 예측하는 것이 중요하다.

list_a = [52, 273, 32, 72, 100]

# try except 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
    print("list의 요소 :", list_a[input_num])
    예외발생()
except ValueError as excption:
    # ValueError가 발생하는 경우
    print("정수를 입력해 주세요")
    # 예외 객체 출력
    print("exception: ", excption)
except IndexError as excption:
    # IndexError가 발생하는 경우
    print("인덱스의 값을 벗어났습니다.")
    # 예외 객체 출력
    print("exception: ", excption)
except Exception as exception:
    # ValueError 와 IndexError가 아닌 예외가 발생한 경우
    print("이외의 예외가 발생하였습니다.")
    print(type(exception), exception)

# IndexError / ValueError가 아닌 예외 발생
정수 입력 > 1
list의 요소 : 273
이외의 예외가 발생하였습니다.
<class 'NameError'> name '예외발생' is not defined

 

✏️ raise 구문 : 예외를 강제로 발생시키고 싶을 때 사용하는 구문이다.

raise 예외 객체

Chapter 07. 모듈

[표준 모듈]

 

✏️ 모듈(module) : 파이썬은 모듈 기능을 활용해 코드를 분리하고 공유한다. 모듈은 여러 변수와 함수를 가지고 있는 집합체 이다.

     1️⃣ 표준 모듈 : 파이썬에 기본적으로 내장되어 있는 모듈 

     2️⃣ 외부 모듈 : 다른 사람들이 만들어서 공개한 모듈

 

✅ 모듈을 가져올 때는 import 구문을 사용하며, 코드의 가장 위에 작성한다.

import 모듈 이름

# 예시 : 수학과 관련된 모듈인 math모듈 가져오기
import math

 

✅ 모듈을 가져온 후 모듈에서 제공하는 변수나 함수를 사용할 수 있다.

import math

# 사인값을 구하는 내장 함수
math.sin(1)

# 0.8414709848078965

 

✅ from 구문

  • 모듈을 읽어들일 때 from 구문을 사용해서, 모듈에서 가져오려는 변수나 함수 앞에 모듈 이름을 생략할 수 있다.
from 모듈 이름 import 가져오고 싶은 변수 또는 함수
from math import sin

# math 를 붙이지 않아도 사용이 가능해 졌다.
sin(1)

# 0.8414709848078965

 

✅ as 구문

  • 모듈을 가져올 때 이름을 변경해서 사용하고 싶은 경우 as 구문을 사용한다.
from 모듈 as 사용하고 싶은 식별자
import math as m

# math 모듈을 m 이라는 이름으로 치환해서 사용한다.
m.sin(1)

# 0.8414709848078965

[기본 미션 : 구문 오류와 예외의 차이 설명하기 (p.379 1번 문제) ]

 

✅ 구문 오류는 프로그램이 실행되기 전에 발생하는 문법적인 오류이며, 해결하지 않으면 프로그램 자체가 실행 되지 않는다. 예외는 프로그램이 실행 중에 발생하는 오류로, 예외 처리 (ex. try except 구문) 를 통해 해결할 수 있다.

 

[선택 미션 : p. 381 3번 문제 풀고 인증하기]

1️⃣ 정수형과 문자를 연산할 수 없어서 발생하는 예외

2️⃣ 문자열 "안녕하세요" 를 정수로 변환할 수 없어서 발생하는 예외

3️⃣ 괄호가 제대로 닫히지 않아서 발생하는 구문 오류

4️⃣ 리스트의 인덱스 범위를 벗어난 예외

곧 공채시즌이라 이직을 위한 이력서 업데이트도 하면서 공부도 하려니 이번주는 정신이 없네요...ㅎㅎ

이번 주는 공부를 많이 못한 것 같아 아쉽습니다 🥲

매주 숙제 제출할 때 마다 족장님이 달아주시는 폭풍 칭찬이 쑥쓰럽기도 하고, 또 이번주도 꼭 해야지 라고 다짐하는 원동력이 되기도 합니당! ㅎㅎ 😎 (칭찬 조아..)

올해는 공부와 이직 두 마리 토끼를 다 잡을 수 있도록 열심히 해보겠습니다! 🫡


Chapter 05. 함수

[함수 만들기]

 

✏️ 함수 : '코드의 집합' 을 의미한다. 함수를 사용하는 것을 함수를 호출한다고 표현한다.

def 함수 이름():
      문장
# print 함수를 세번 수행하는 함수 print_test() 생성 후 호출
def print_test():
    print("안녕하세요")
    print("안녕하세요")
    print("안녕하세요")

print_test()

# 출력
안녕하세요
안녕하세요
안녕하세요

[선택 미션 : 매개변수, 기본 매개변수, 가변 매개변수에 대해 간략하게 정리하기]

 

✏️ 매개변수란?

함수를 호출할 때 괄호 사이에 들어가는 자료들을 매개변수라고 한다. 매개변수는 함수 생성 시 입력한다.

★ 함수 생성 시 매개변수를 만들면, 함수를 호출할 때 매개변수 자리에 입력한 값을 함수 내에서 사용할 수 있다.

★ 함수에 매개변수를 만들었는데, 호출 시 매개변수를 넣지 않거나 갯수를 다르게 넣은 경우 오류가 발생한다!

def 함수 이름(매개변수, 매개변수, ...):
      문장
# 매개변수 value, n 추가한 함수 생성
def print_test_number(value, n):
    for i in range(n):
        print(value)

print_test_number("테스트입니다", 3)

# 출력
테스트입니다
테스트입니다
테스트입니다

 

✏️ 가변 매개변수란?

매개변수의 개수가 변할 수 있다는 의미이며, 매개변수를 원하는 만큼 받을 수 있는 함수를 가변 매개변수 함수라고 한다.

가변 매개변수는 하나만 사용할 수 있으며, 가변 매개변수 뒤에는 일반 매개변수가 올 수 없다.

    ✔️ 가변 매개변수는 맨 뒤에 배치하고, 함수 내에서는 리스트처럼 사용한다.

def 함수 이름(매개변수, 매개변수, ... , *가변 매개변수):
      코드
def print_test_number(n, *value):
    for i in range(n):
        print(value)

print_test_number(3, "파이썬", "가변매개변수","테스트입니다")

# 출력
('파이썬', '가변매개변수', '테스트입니다')
('파이썬', '가변매개변수', '테스트입니다')
('파이썬', '가변매개변수', '테스트입니다')

 

✏️ 기본 매개변수란?

매개변수를 입력하지 않았을 경우에 대비해 매개변수에 들어갈 기본값을 지정할 수 있는데, 이를 기본 매개변수라고 한다. 

기본 매개변수 뒤에는 일반 매개변수가 올 수 없다.

def 함수 이름(매개변수매개변수=값):
      문장
def print_test_number(value, n=2):
    for i in range(n):
        print(value)

# 함수 호출 시 매개변수 n을 입력하지 않아서 기본값 2가 사용됨
print_test_number("테스트입니다")

#출력
테스트입니다
테스트입니다

✏️ 키워드 매개변수

기본적으로 가변 매개변수와 기본 매개변수 뒤에는 일반 매개변수가 올 수 없다. 파이썬에서는 매개변수 순서를 원하는 대로 입력하기 위해서 키워드 매개변수를 제공한다.

키워드 매개변수는  함수 호출 시 매개변수 이름을 지정해서 입력한다.

def 함수이름 (매개변수 a, 매개변수 b = 10):
       코드

# 함수 호출
함수이름(10, 매개변수 b = 20)  # 함수 호출 시 매개변수 이름을 지정해서 입력
def function_test(a, b=10, c=20):
        print("{}, {}, {}".format(a,b,c))

# 기본 매개변수만 사용
function_test(10,100,200)
>> 10, 100, 200

# 키워드 매개변수 사용
function_test(a=20, b = 0 , c = 10)
>> 20, 0, 10

# 키워드 매개변수 사용, 매개변수 순서 변경
function_test(c=1, a=2, b=3)
>> 2, 3, 1

# 키워드 매개변수로 일부 매개변수만 지정
function_test(9,c=11)
>> 9, 10, 11

 

★ 키워드 매개변수를 사용하여 필요한 매개변수에만 값을 전달할 수 있다.

 

[리턴]

 

함수를 실행하고 난 후 받아오는 결과를 리턴값(return value) 이라고 한다.

 

✏️ return 키워드

     ✅ 함수 내부에 사용하며, 함수를 실행했던 위치로 돌아가라는 뜻으로 함수가 끝나는 시점 의미한다.

     ✅ return 키워드만 사용 시 자료 없이 리턴하며, return 뒤에 자료를 입력하면 자료를 가지고 리턴한다.

# 자료 없이 리턴하는 예시
def function_1():
    print("첫번째 print")
    return    			# 3번 라인 까지만 수행하고 함수가 종료된다.
    print("두번째 print")

function_1()

# 출력
첫번째 print

 

# 자료를 가지고 리턴하는 예시
def function_test2():
    return 100		# 100 을 반환한다.

value = function_test2()
print(value)

# 출력
100

 

✏️ 함수의 활용

      ✅ 일반적으로 함수 내에서 값을 만들어 리턴하는 형태로 사용

def 함수(매개변수):
      변수=초기값
      # 여러가지 처리
      # 여러가지 처리
      return 변수

     

[기본 미션 : p.287 [직접 해보는 손코딩: 범위 내부의 정수를 모두 더하는 함수] 실행 후 코드가 입력된 화면 및 실행 결과 화면 캡쳐하기 ]


[함수 고급]

 

✏️ 튜플(tuple) : 리스트와 비슷한 자료형으로, 한번 결정된 요소는 바꿀 수 없다.

변수 = (데이터, 데이터, 데이터, ...)

# 주의할 점 : 요소를 하나만 가지는 튜플은 아래와 같이 선언한다!
변수 = (데이터, )
# 튜플 선언
tuple_test = (1,2,3)

print(tuple_test[0])	# 1
print(tuple_test[1])	# 2
print(tuple_test[2])	# 3

 

 ✅ 리스트와 튜플은 다음과 같은 형태로 변수를 선언하고 할당할 수 있다. 또한 튜플은 괄호를 생략할 수도 있다.

# 리스트의 요소 a,b 에 각각 1, 2 할당
[a, b] = [1, 2]

# 튜플의 요소 c,d에 각각 10,20 할당
(c,d) = (10,20)
#리스트 할당 구문
[a,b] = [1,2]
print(a)		# 1
print(b)		# 2

# 튜플 할당 구문
(c,d) = (10,20)
print(c)		# 10
print(d)		# 20

# 괄호가 없는 튜플
tuple_test = 1,2,3,4,5

print(tuple_test)		# (1, 2, 3, 4, 5)
print(tuple_test[2])		# 3

# 괄호가 없는 튜플
a,b,c = 10, 20, 30
print(a)			# 10
print(b)			# 20
print(c)			# 30

 

 ✅ 함수의 리턴에 튜플을 사용하면 여러개의 값을 리턴하고 할당할 수 있다.

# 여러개의 값 리턴
def test():
    return (10,20)

# 리턴한 값 각각 a,b에 할당
a,b = test()

print(a)	# 10
print(b)	# 20

 

✏️ 람다 : 매개변수로 함수를 전달하기 위해 간단하게 1회용 함수를 선언하는 방법

     ✅ 매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것이 번거롭기 때문에 파이썬에서 제공하는 방법

     ✅ 람다를 사용하면 코드를 깔끔하게 작성할 수 있고, 매개변수로 넣어진 함수를 파악하기도 쉽다.

lambda 매개변수 : 리턴값

 

# 람다 함수 선언
lambda_test = lambda x : x < 3

list_a = [1,2,3,4,5]

# 람다는 매개변수로 바로 넣을 수 있다.
output_a = map(lambda x : x * x, list_a)
print(list(output_a))		# [1, 4, 9, 16, 25]

혼공파 3주차! 열심히 공부하다 보니 벌써 3주차 게시물을 올릴 때가 되었네요ㅎㅎ

벌써 절반 공부했다니 뿌듯합니다. 😊😊

점점 많아지는 양이 걱정되긴 하지만... 완주까지 열심히 달려 보겠습니다! 👻


Chapter 04. 반복문

[기본 미션 : 리스트, 딕셔너리, 범위 자료형에 대해 이해한 내용을 바탕으로 포스팅하기]

 

[리스트]

 

✏️ 리스트 : 여러 가지 자료를 저장할 수 있는 자료

★ 이전 장에서 활용한 숫자,문자 등은 '개별적인 자료' 이며, 리스트는 이러한 자료들을 모아서 사용할 수 있게 해주는 '특별한 형태의 자료' 이다.

 

✏️ 리스트 생성 방법

  ✔️ 대괄호 [ ] 안에 자료를 쉼표 ( , ) 로 구분해서 입력하여 리스트를 생성한다. 대괄호 내부에 넣는 자료를 요소 (Element) 라고 한다. 리스트는 N개의 자료형으로 구성할 수 있다. (1개 ~ N개)

# 리스트 생성 방법
list = [요소, 요소, 요소, ... ]

 

✏️ 리스트 인덱스

  ✔️ 리스트 안에 있는 요소를 각각 사용하려면 리스트 이름 바로 뒤에 대괄호 [ ] 를 입력하고, 그 안에 선택한 요소의 위치를 나타내는 숫자를 입력한다. 이 숫자를 인덱스(index) 라고 한다.

파이썬의 인덱스는 0부터 시작하기 때문에 각각의 요소는 다음과 같은 형태로 저장된다.

list_a = [1, 2, 3, 4, 5]

✏️ 리스트 사용법

  ✔️ 리스트의 특정 요소를 변경할 수 있다.

리스트명[인덱스 번호] = "바꿀 값"
list_a = [1,2,3]
# list_a의 첫번째 요소를 "change" 로 변경
list_a[0] = "change"
print(list_a)  # ['change', 2, 3]

 

  ✔️ 파이썬의 인덱스 값은 양수와 음수를 모두 사용할 수 있으며, 음수로 입력할 경우 리스트의 끝부분 부터 탐색한다. 인덱스 -1의 경우 가장 마지막 요소를 출력한다.

list_a = [1, 2, 3, 4, 5]

 

  ✔️ 리스트 접근 연산자는 이중으로 사용할 수 있다.

  ✔️ 리스트 안에 리스트를 사용할 수 있다.

list_a = [1,2,3,"test",True,False]

# list_a의 3번째 인덱스 "test" 출력
print(list_a[3])	# test

# 'test' 문자열의 첫번째 요소 't' 출력
print(list_a[3][0])

# 리스트 안에 리스트를 사용할 수 있다.
list_b = [ [1,2,3], [4,5,6], [7,8,9] ]

print(list_b[0]) # [1, 2, 3]
print(list_b[1]) # [4, 5, 6]
print(list_b[2]) # [7, 8, 9]

print(list_b[0][2]) # 3

[리스트의 연산]

 

✏️ 문자열에 적용할 수 있는 연산자는 리스트에서도 활용이 가능하다.

  ✔️ 연결 ( + ) , 반복 ( * ) , len()

list_a = [1,2,3]
list_b = [4,5,6]

# 연결 연산자 ( + ) 를 사용해서 list_a 와 list_b의 자료를 연결한다.
print(list_a+list_b) # [1, 2, 3, 4, 5, 6]

# 반복 연산자 ( * ) 를 사용해서 list_a의 자료를 3번 반복한다.
print(list_a * 3)    # [1, 2, 3, 1, 2, 3, 1, 2, 3]

# len(리스트) 는 리스트에 저장된 요소의 개수를 세어 준다.
print(len(list_a))   # 3

 

[리스트에 요소 추가하기]

 

✏️ append() : 리스트 뒤에 요소를 추가한다.

✏️ insert() : 리스트의 지정한 위치에 요소를 추가한다.

✏️ extend() : 한 번에 여러 요소를 추가할 때 사용하며, 매개변수로 리스트를 입력한다. 원래 리스트 뒤에 새로운 리스트의 요소를 모두 추가한다.

# 리스트 뒤에 요소 추가
리스트명.append(요소)

# 리스트 중간에 요소 추가
리스트명.insert(위치, 요소)

# 한 번에 여러 요소 추가
리스트명.extend( [ 리스트] )
# 리스트 선언
list_a = [1,2,3]

# 리스트 뒤에 요소 추가
list_a.append(4)
print(list_a) # [1, 2, 3, 4]

# 리스트 중간에 요소 추가
# 인덱스 '0' 위치에 '10' 추가
list_a.insert(0,10)
print(list_a) # [10, 1, 2, 3, 4]

# 한 번에 여러 요소 추가
list_a.extend([5,6,7])
print(list_a) # [10, 1, 2, 3, 4, 5, 6, 7]

★ 리스트 연결 연산자를 사용하는 경우 원본 리스트에 변화가 없으나 (비파괴적 처리) extend() 함수 사용 시 원본 리스트가 변경된다. (파괴적 처리)

 

[리스트에서 요소 제거하기]

 

✏️ 인덱스로 제거 : 매개변수로 주어진 인덱스 위치에 있는 요소를 제거한다.

# del 키워드 사용
del 리스트명[인덱스]

# pop() 사용
리스트명.pop(인덱스)

★ pop() 은 매개변수를 입력하지 않으면 -1 로 간주하여, 마지막 요소가 제거된다.

 

✏️ 값으로 제거 : 리스트 내부에 저장된 값을 지정해서 제거한다.

# remove() 사용
리스트.remove()

★ remove() 는 매개변수로 받은 값이 리스트 내부에 여러 개 있어도 가장 먼저 발견되는 것 하나만 제거한다!

# 리스트 선언
list_a = [1,2,3,4,5,6,7,8,9]

# 0번째 인덱스 요소 삭제
list_a.pop(0)
print(list_a)	# [2, 3, 4, 5, 6, 7, 8, 9]

# 매개변수를 입력하지 않았으므로 -1 로 간주하여 마지막 요소 삭제
list_a.pop()
print(list_a)	# [2, 3, 4, 5, 6, 7, 8]

# 2번째 인덱스 요소 삭제
del list_a[2]
print(list_a)	# [2, 3, 5, 6, 7, 8]

# 값 '3' 삭제
list_a.remove(3)
print(list_a)	# [2, 5, 6, 7, 8]

 

[리스트 슬라이싱]

 

✏️ [ : ] 연산자로 리스트 범위를 지정하여 여러 요소를 선택할 수 있다. 

마지막 위치에 '단계'를 추가하여 지정한 숫자만큼 인덱스를 건너 뛰면서 요소를 가져올 수 있다.

단계는 기본값이 1이므로, 인덱스를 건너뛰어야 하는 경우가 아니면 생략 가능하다.

리스트[시작 인덱스 : 끝 인덱스 : 단계]
# 리스트 선언
num = [1,2,3,4,5,6,7,8]

# num 리스트의 첫번째 인덱스 부터 4번째 인덱스 까지 출력하는데, 2씩 건너뛴다.
print(num[0:5:2])	#[1, 3, 5]

 

[clear() / sort() 함수]

 

✏️ 리스트 내부의 요소를 모두 제거할 때는 clear() 함수를 사용하며, 정렬 시에는 sort() 함수를 사용한다. sort() 는 기본 오름차순 정렬이다.

# clear()
리스트.clear()

# sort()
리스트.sort()

 

[in / not in 연산자]

 

✏️ 특정 값이 리스트 내부에 있는 지 확인하려면 in 연산자를 사용한다.

리스트 내부에 값이 있으면 True , 없으면 False를 출력한다.

# 사용법
in 리스트

 

✏️ 특정 값이 리스트 내부에 없는 지 확인할 때는 not in 연산자를 사용한다. (in 연산자와 반대로 동작한다.)

# 사용법
not in 리스트
# 리스트 선언
list_a = [1,2,3,4,5]

# list_a 에 1 이 있으므로 True
print(1 in list_a)	# True

# list_a에 6이 없으므로 False
print(6 in list_a)	# False

# list_a 에 1 이 있으므로 False
print(1 not in list_a)	# False

# list_a에 6이 없으므로 True
print(6 not in list_a)	# True

 

[전개 연산자]

 

✏️ 리스트 내용을 전개해서 입력할 수 있는 연산자. 리스트 앞에 * 기호를 사용하여 작성한다.

전개 연산자는 기본적으로 리스트 내부 , 함수의 매개변수에 사용한다.

a = [1,2,3]

# 리스트 내부에 전개 연산자 사용 가능.
# *a 는 [1,2,3] 로 전개해서 입력한 것과 같은 효과를 낸다.
b = [*a, *a]
print(b) 	# [1, 2, 3, 1, 2, 3]

# 함수 매개변수에 전개 연산자 사용 가능.
# print(1,2,3,1,2,3) 처럼 동작한다.
print(*b)	# 1 2 3 1 2 3

[딕셔너리]

 

✏️ 딕셔너리 : 키(key) 를 기반으로 값(value) 을 저장하는 것

      ✔️ 키는 딕셔너리 내부에서 값에 접근할 때 사용하며, 값은 딕셔너리 내부에 있는 각각의 내용이다.

✏️ 중괄호 {} 로 선언하며, 키:값 형태를 쉼표(,) 로 연결해서 생성한다.

변수 = {
         키 : 값,
         키 : 값,
...
         키 : 값
}
# 딕셔너리 선언
dict_a = {
    "name": "kim", # 문자열을 키로 사용
    "age" : 20,
    1 : 30,        # 숫자를 키로 사용
    False: 10       # bool 값을 키로 사용
}

# 딕셔너리 출력
print(dict_a)
>> {'name': 'kim', 'age': 20, 1: 30, False: 10}

# 빈 딕셔너리 선언
dict_b = {}

 

딕셔너리의 키를 문자열로 사용 시 따옴표 (" ") 를 붙여야 한다.

 

[딕셔너리 요소에 접근하기]

 

 딕셔너리를 선언할 때는 { } 를 사용하지만, 요소에 접근할 때는 딕셔너리 뒤에 [ ] 를 입력하고 괄호 내부에 인덱스처럼 키를 입력한다.

✏️ 딕셔너리 내부에는 문자열, 숫자, bool, 리스트, 딕셔너리 등 다양한 자료를 넣을 수 있다.

# 딕셔너리 선언
dict_a = {
    "name" : "포카칩",
    "price" : 1500,
    "store" : ["편의점", "대형마트", "슈퍼"],
    "flavor" : "original"
}

print(dict_a)
>> {'name': '포카칩', 'price': 1500, 'store': ['편의점', '대형마트', '슈퍼'], 'flavor': 'original'}

print(dict_a["name"])
>> 포카칩

print(dict_a["store"])
>> ['편의점', '대형마트', '슈퍼']

# 인덱스를 지정하여 딕셔너리 안의 리스트에 대한 특정 값을 출력할 수 있다.
print(dict_a["store"][0])
>> 편의점

 

[딕셔너리에 값 추가/제거]

 

✏️ 딕셔너리에 값을 추가할 때는 키를 기반으로 입력한다.

딕셔너리[새로운 키] = 새로운 값

# 딕셔너리에 이미 존재하는 키를 지정하고 값을 넣으면 기존의 값을 새로운 값으로 변경한다.
딕셔너리[기존 키] = 새로운 값

 

✏️ 딕셔너리에 값을 제거할 때는 del 키워드를 사용한다.

# 해당 키와 요소 제거
del dict_a[]

 

# 딕셔너리 선언
dict_a = {
    "name" : "포카칩",
    "price" : 1500,
    "store" : ["편의점", "대형마트", "슈퍼"],
    "flavor" : "original"
}

# 딕셔너리 값 추가
dict_a["manufacturer"]="오리온"
print(dict_a)
>> {'name': '포카칩', 'price': 1500, 'store': ['편의점', '대형마트', '슈퍼'], 'flavor': 'original', 'manufacturer': '오리온'}

# 딕셔너리 값 변경
dict_a["flavor"]="onion"
print(dict_a)
>> {'name': '포카칩', 'price': 1500, 'store': ['편의점', '대형마트', '슈퍼'], 'flavor': 'onion', 'manufacturer': '오리온'}

# 딕셔너리 값 삭제
del dict_a["manufacturer"]
print(dict_a)
>> {'name': '포카칩', 'price': 1500, 'store': ['편의점', '대형마트', '슈퍼'], 'flavor': 'onion'}

 

[딕셔너리에 값이 있는 지 확인]

 

✏️ in 키워드

  ✔️ 딕셔너리 내부에 키가 있는지 확인할 때 in 키워드를 사용할 수 있다.

 

✏️ get() 함수

  ✔️ get() 은 딕셔너리의 키로 값을 추출하는 함수인데, 존재하지 않는 키에 접근할 경우 None 을 출력한다.

 

# 딕셔너리 선언
dict_a = {
    "name" : "포카칩",
    "price" : 1500,
    "store" : ["편의점", "대형마트", "슈퍼"],
    "flavor" : "original",
    "manufacturer" : "오리온"
}

# 키가 존재하는지 확인 : in 연산자 사용
if "name" in dict_a:
    print(dict_a["name"])

>> 포카칩

# 존재하지 않는 경우
if "test" in dict_a:
    print(dict_a["test"])
else:
    print("존재하지 않는 키입니다.")
    
>> 존재하지 않는 키입니다.

# 키가 존재하는지 확인 : get() 사용
value = dict_a.get("name")

if value == None:
    print("존재하지 않는 키입니다.")
else:
    print(value)

>> 포카칩

# 키가 존재하지 않는 경우 : value 값이 None
value = dict_a.get("test")

# value 값이 None인지 확인
if value == None:
    print("존재하지 않는 키입니다.")
else:
    print(value)    

>> 존재하지 않는 키입니다.

 

★ 리스트와 딕셔너리 비교

  리스트 딕셔너리
의미 인덱스를 기반으로 값을 저장함 키를 기반으로 값을 저장함
가리키는 위치 인덱스
선언 형식 변수=[] 변수={}
값 사용 방식 list_a[1] dict_a["name"]
값 추가 방식 list_a.append(5) list_a["age"]=20
list_a.insert(1, 5)
값 제거 방식 del list_a[1] del dict_a["name"]
list_a.pop(1)

[범위 자료형]

 

✏️ 범위(range) : 정수의 범위를 나타내는 값으로, 특정한 횟수 만큼 반복해서 돌리고 싶을 경우 for 반복문과 범위를 조합해서 사용한다. range() 함수를 사용하여 범위를 만들 수 있다.

 

[range() 사용법]

1️⃣ 매개변수에 숫자 한 개 입력

# 0부터 N-1 까지의 정수로 범위 생성
range(N)

 

2️⃣ 매개변수에 숫자 두 개 입력

# N 부터 M-1 까지의 정수로 범위 생성
range(N,M)

 

3️⃣ 매개변수에 숫자 세 개 입력

# N 부터 M-1 까지의 정수로 범위 생성, 앞 뒤 숫자가 C 만큼의 간격이 있다.
range(N,M,C)

 

# 범위 선언
range_a = range(5)	# 1번 방법, 0부터 4까지 정수로 범위 생성
range_b = range(1,5)	# 2번 방법, 1부터 4까지 정수로 범위 생성
range_c = range(1,10,2)	# 3번 방법, 1부터 2씩 증가하면서 9까지 정수로 범위 생성

# 범위를 리스트로 변경하여 범위 내부에 어떤 값이 들어있는 지 확인 가능하다. 
print(list(range_a))
>> [0, 1, 2, 3, 4]
print(list(range_b))
>> [1, 2, 3, 4]
print(list(range_c))
>> [1, 3, 5, 7, 9]

 

★ 범위 생성 시 매개변수로 무조건 정수를 입력해야 한다.

n = 10
a = range( 0, int( n / 2 ) ) # n/2 의 결과 값인 실수를 정수로 바꿔주거나
a = range( 0, n // 2 )     # 정수 나누기 연산자를 사용해서 몫만 가져온다!

 


[반복문]

 

특정 코드를 반복해서 실행할 때 사용하는 구문.

 

[for 반복문]

 

✏️ 딕셔너리 , 리스트, 범위 자료형 등과 함께 사용된다.

# for 반복문의 기본적인 형태

for 반복자 in 반복할 수 있는 것:    # 반복할 수 있는 것에는 문자열, 리스트, 딕셔너리, 범위 등이 있다.
     코드

 

list_a = [1,2,3,4,5]

# list_a 에 있는 요소 하나 하나가 element 변수 안에 들어간다
# 리스트의 요소를 차례차례 출력
for element in list_a:
    print(element)
 
# 출력
1
2
3
4
5

 

✏️ 딕셔너리와 for 반복문 사용하기

딕셔너리 내부에 있는 키가 변수에 들어간다는 점에 유의한다!

for 키 변수 in 딕셔너리:
    코드
dict_a = {
    "name" : "포카칩",
    "price" : 1500,
    "store" : ["편의점", "대형마트", "슈퍼"],
    "flavor" : "original",
    "manufacturer" : "오리온"
}

for key in dict_a:
    print(key ,":", dict_a[key])

[출력]
name : 포카칩
price : 1500
store : ['편의점', '대형마트', '슈퍼']
flavor : original
manufacturer : 오리온

 

✏️ 범위 자료형과 for 반복문 사용하기

for 숫자 변수 in 범위:
     코드
# 기본적인 범위 자료형과 for 반복문 조합
for i in range(5):
    print(i)

[출력]
0
1
2
3
4


# 리스트와 범위를 조합해서 사용 가능
# 현재 몇번째 요소를 출력하는지 알 수 있다.
array = [1,2,3,4,5]
for i in range(len(array)):
    print("{} 번째 요소 {}".format(i, array[i]))

[출력]
0 번째 요소 1
1 번째 요소 2
2 번째 요소 3
3 번째 요소 4
4 번째 요소 5

 

[while 반복문]

 

✏️ 조건을 활용해서 반복할 때 사용한다. for 반복문은 특정 코드를 N번 반복하며, while 반복문은 <불 표현식> 이 참인 동안 문장을 계속 반복한다.

while 불 표현식:
      문장

# 무한루프
while True:
      문장
i = 0
# i < 5 를 만족하는 동안만 실행한다.
while i < 5:
    print("{} 번째 반복입니다.".format(i))
    i += 1

[출력]
0 번째 반복입니다.
1 번째 반복입니다.
2 번째 반복입니다.
3 번째 반복입니다.
4 번째 반복입니다.

 

✏️ break 키워드는 반복문을 벗어날 때 사용하는 키워드이다.

# break 사용 예시
i = 0
# 무한루프
while True:
    print("i 의 값 : {}".format(i))
    # i 값 1씩 증가
    i += 1
    # i 값이 5보다 커지면 반복문 종료
    if i > 5:
        print("무한루프 종료")
        break
        
[출력]
i 의 값 : 0
i 의 값 : 1
i 의 값 : 2
i 의 값 : 3
i 의 값 : 4
i 의 값 : 5
무한루프 종료

 

✏️ continue 키워드는 현재 반복을 생략하고 다음 반복으로 넘어갈 때 사용하는 키워드이다.

# continue 사용 예시
list_a = [10,4,20,1,15,9,30]

for item in list_a:
	# item 이 10보다 작으면 다음 반복으로 넘어간다.
    if item < 10:
        continue
    print(item)

[출력]
10
20
15
30

[선택 미션 : p.213 쪽의 1번 문제의 답 쓰고 인증하기]

✔️ list의 extend 함수는 리스트 뒤에 매개변수로 받은 리스트 요소를 모두 추가해 준다.

✔️ list의 append 함수는 리스트 뒤에 매개변수로 받은 요소를 추가한다.

✔️ list의 insert 함수는 첫 번째 매개변수로 위치, 두 번째 매개변수로 요소를 받는다. 따라서 위 예제에서는 list_a의 3번째 인덱스에 '0' 을 추가해 준다.

✔️ list의 remove 함수는 매개변수로 받은 요소를 제거한다. 매개변수로 받은 값이 리스트 내에 여러 개 있어도 처음 발견하는 하나만 제거한다.

✔️ list의 pop 함수는 매개변수로 받은 인덱스 위치의 요소를 제거한다.

✔️ list의 clear 함수는 리스트 내부의 요소를 모두 제거한다.

Chapter 03. 조건문

[불 자료형과 if 조건문]

 

✏️ Bool 자료형 : 파이썬의 기본 자료형으로, True (참) / 거짓 (False) 을 나타내는 값. 비교 연산자를 통해 얻을 수 있다.

 

[비교 연산자의 종류]

연산자 설명 연산자 설명
== 같다 > 크다
!= 다르다 <= 작거나 같다
< 작다 >= 크거나 같다

 

✏️ 숫자 또는 문자열에 비교 연산자를 적용하여 참/거짓을 출력할 수 있다.

  • 한글 비교는 사전 순서 (가나다 순) 로 앞에 있는 것이 작은 값을 갖는다.
  • 영어 비교는 알파벳 순으로 비교한다. 같은 단어라도 대소문자가 다르면 다른 문자열로 판단한다.
# 10과 100은 다르므로 False
print (10 == 100)

# 10은 100보다 작으므로 True
print (10 < 100)

# 10과 100은 다르므로 True
print( 10 != 100)

# 10은 100보다 작으므로 False
print (10 >= 100)
False

# "가방" 과 가방은 같은 단어이므로 True
print("가방" == "가방")

# "ㄱ" 이 "ㅎ"보다 앞에 있으므로 True
print("가방" < "하마")

# "ㄱ" 이 "ㅎ"보다 앞에 있으므로 False
print("가방" > "하마")

# "a" 가 "b" 보다 알파벳 순서상 앞이므로 True
print("apple" < "banana")

# "a" 가 "b" 보다 알파벳 순서상 앞이므로 True
print("apple" > "banana")

# 같은 단어이지만 "p" 가 소문자/대문자인 차이가 있으므로 False
print("python" == "Python")

 

★ bool 끼리는 논리 연산자를 사용할 수 있다.

[논리 연산자의 종류]

연산자  사용 예 의미 설명
not not A 아니다 (부정) A 의 값을 반대로 전환한다. (A가 True면 False로, False면 True 로)
and A and B 그리고 A 와 B가 모두 참일 때만 True를 출력하며, 그 외는 모두 False를 출력한다.
or A or B 또는 A 와 B 둘 중 하나라도 참이면 True 를 출력하며, A와 B가 모두 거짓일 때만 False를 출력한다.

 

x = 10
under_20 = x < 20
print(under_20)		# True
print(not under_20)	# False

print(True and True)	# True
print(True and False)	# False
print(False and True)	# False
print(False and False)	# False

print(True or True)	# True
print(True or False)	# True
print(False or True)	# True
print(False or False)	# False

✏️ if 조건문 : 조건에 따라 코드를 실행하거나, 실행하지 않게 만들고 싶을 때 사용한다.

# 사용 예

if bool 값이 나오는 표현식:  # if 조건문 뒤에 콜론( : )을 붙여준다.
    True일 때 수행할 문장1   # if 문 아래 문장은 4칸 들여쓰기 후 입력한다.
    True일 때 수행할 문장2
x = 10
if x > 0:
    print("양수입니다")  # 양수입니다 출력
    
if x < 0:
    print("음수입니다")  # 거짓이므로 아무 값도 출력되지 않는다.

 

✏️ if ~ else 구문 : if 조건문 뒤에 else 구문을 사용하여, if 조건문의 값이 False인 경우 else 구문 값을 실행한다.

# 사용 예

if 조건:
    True일 경우 실행할 문장
else:
    False일 경우 실행할 문장
number = int(input("정수 입력> ")) # 정수 입력> 13

if number % 2 == 0:
	# number % 2 가 0인 경우 (True) "짝수입니다" 출력
    print("짝수입니다")
else:
	# number % 2 가 0이 아닌 경우 (False) "홀수입니다" 출력
    # 13은 홀수이므로 이 문장 실행
    print("홀수입니다")

 

✏️ elif 구문 : 조건이 두 가지 만으로 구분되지 않는 경우, if ~ elif ~ else 구문을 사용하여 여러 조건에 대한 분기를 수행

# 사용 예

if 조건 A:
    조건 A 가 True일 경우 실행할 문장
elif 조건 B:
    조건 B가 True일 경우 실행할 문장
elif 조건 C:
    조건 C가 True일 경우 실행할 문장
else:
    조건 A,B,C에 걸리지 않는 경우 ( 모든 조건이 False인 경우) 실행할 문장

 

# 날짜/시간과 관련된 기능을 가져온다
import datetime

# 현재 날짜 시간을 구한다
now = datetime.datetime.now()
# 비교할 수 있도록 월 정보를 month 변수에 저장한다.
month = now.month

# 조건문으로 현재 계절을 확인한다.
if 3 <= month <= 5:
    print("봄입니다")
elif 6 <= month <= 8:
    print("여름입니다")
elif 9 <= month <= 11:
    print("가을입니다")
else:
    print("겨울입니다")
# 파이썬 조건문을 효율적으로 구성하기
# 점수를 입력 받아 학점을 계산해 주는 프로그램

score = int(input("학점입력: "))

if score >= 90:
    print("A 학점")
# 위에서 score가 90보다 큰 지 검사했으므로 하위 값만 검사한다.
# 이 조건문은 80 =< score =< 90 과 같은 의미이다.
elif score >= 80:
    print("B 학점")
# 위에서 score가 90,80보다 큰 지 검사했으므로 하위 값만 검사한다.
# 70 <= score <= 80
elif score >= 70:
    print("C 학점")
# 위에서 score가 90,80,70보다 큰 지 검사했으므로 하위값만 검사한다.
# 60<= score <= 70
elif score >= 60:
    print("D 학점")
# 모든 조건식에 해당되지 않는 경우
else:
    print("F 학점")

 

✏️ False 로 변환되는 값 : if 조건문의 매개변수가 bool 값이 아닌 다른 값을 사용하는 경우 자동으로 이를 bool 값으로 변환해서 처리한다.

  • False로 변환되는 값 : None, 숫자 0, 0.0 , 빈 컨테이너 (빈 문자열, 빈 바이트열, 빈 리스트, 빈 튜플, 빈 딕셔너리 등)
  • True로 변환되는 값 : 그 외 나머지
# if 조건문에 0 넣기
if 0:
    print("0은 True 를 반환한다.")
else:
	# 조건문에 0이 들어오면 False를 반환하므로 else 구문이 실행된다.
    print("0은 False를 반환한다.")

# if 조건문에 빈 문자열 넣기
if "":
    print("빈 문자열을 True를 반환한다.")
else:
	# 조건문에 빈 문자열이 들어오면 False를 반환하므로 else 구문이 실행된다.
    print("빈 문자열은 False를 반환한다.")

 

✏️ pass 키워드 : 프로그래밍의 전체 골격을 잡아 두고, 내부에 처리할 내용은 나중에 만들고자 할 때 pass 키워드 입 


[2주차 기본 미션] 

사용자에게 태어난 연도를 입력받아 띠를 출력하는 프로그램 작성하기

 

- 소스 코드

 

- 출력 화면

 

지난 주 1주차 공부를 마친 후에, 갑자기 노트북이 버벅이더니 아예 맛이 가버려서...

그 동안 멘붕 그 자체였다.ㅠㅠ 공부도 계속 못하고...ㅠㅠㅠㅠ

급하게 새 노트북을 구매했는데, 이전 노트북에 있던 자료들은 어떻게 해야 할지 모르겠다...

평일에 노트북 이슈로 공부를 못했으니 주말에 빡세게 했다.ㅎㅎ

 


Chapter 02. 자료형

[변수와 입력]

 

✏️ 변수 : 값을 저장할 때 사용하는 식별자이며, 모든 자료형의 값을 저장할 수 있다.

변수를 사용하기 위해서는 ① 변수를 선언하고, ② 선언한 변수에 값을 할당해야 한다. 그 후 ③ 변수 안의 값을 사용할 수 있다.

 

✔️ 변수 선언 : 변수를 생성하는 것.
       - 파이썬에서 사용할 변수 이름을 적어 주면 변수를 선언할 수 있다.

 

✔️ 변수에 값 할당 : 생성한 변수에 값을 저장하는 것

       - 선언한 변수에 ' = ' 기호를 통해 값을 할당할 수 있다.  

 

✔️ 변수의 사용 ( = 변수 참조) : 생성한 변수에 있는 값을 사용한다.

# 변수의 선언 및 할당
# 변수 pi를 선언하고, 값 (3.14)을 할당한다.
pi = 3.14

# 변수의 사용
# 변수 pi에 저장한 값을 출력할 수 있다.
print(pi)	# 3.14

# 변수 pi에 저장된 값으로 연산한다.
pi + pi

 

 파이썬은 다른 프로그래밍 언어와는 다르게 변수에 자료형을 지정하지 않기 때문에 변수 선언 시 자료형을 선언할 필요가 없다.


[복합 대입 연산자의 사용]

 

✏️ 변수는 내부에 들어 있는 자료의 연산자를 사용할 수 있다.

✏️ 문자열이 할당된 경우 문자열 연산자를 사용할 수 있으며, 숫자가 할당된 경우 숫자 연산자를 사용할 수 있다.

✏️ 자료형의 기본 연산자와 '=' 연산자를 조합해서 사용할 수 있는 연산자이다.

예시 ) a += 10 은 a = a + 10 과 같다.

 

[숫자 자료형에 적용할 수 있는 복합 대입 연산자]

연산자 이름 설명
+= 숫자 덧셈 후 대입
-= 숫자 뺄셈 후 대입
*= 숫자 곱셈 후 대입
/= 숫자 나눗셈 후 대입
%= 숫자의 나머지를 구한 후 대입
**= 숫자 제곱 후 대입

 

number = 10
number += 10

print(number)	# 20

number -= 10
print(number)	# 10

number *= 2
print(number)	# 20

 

[문자 자료형에 적용할 수 있는 복합 대입 연산자]

연산자 이름 설명
+= 문자열 연결 후 대입
-= 문자열 반복 후 대입
string = "안녕하세요"
string += "!"

print(string)	# 안녕하세요!

string *=2
print(string)	# 안녕하세요!안녕하세요!

✏️ input( ) 함수 : 콘솔 창 (명령 프롬프트) 에서 사용자로부터 데이터를 입력받을 때 사용하는 함수이다.

input 함수 실행 시 콘솔 창에 사용자로부터 입력값이 들어올 때 까지 대기 상태가 된다. 값을 입력하고 엔터키를 누르면 다음 로직을 수행한다.

>>>> input("입력하세요")
입력하세요:

 

★ 사용자가 입력한 값은 input() 함수의 결과값이 된다. 이 값은 다른 변수에 할당해 사용할 수 있다.

>>>> string = input("인사말을 입력하세요: ")
인사말을 입력하세요: 안녕
>>>> print(string)
인사말을 입력하세요: 안녕

 

✏️ input() 함수의 입력 자료형 : input() 함수는 입력한 값을 무조건 문자열로 처리한다.

number = input("숫자를 입력하세요: ")
	# 숫자를 입력하세요: 123

print(number)	# 123
print(type(number))	# <class 'str'>

 

★ input() 함수로 숫자를 입력받는 경우, 입력받은 문자열을 숫자로 변환하는 작업이 필요하다. (캐스트 작업)

문자열을 숫자로 변환할 때는 다음 함수를 사용한다.

  • int() : 문자열을 정수형(int) 으로 변환한다.
  • float() : 문자열을 실수형(float) 으로 변환한다.

이와 반대로 숫자를 문자열로 변환할 때는 다음 함수를 사용한다.

  • str(숫자)
# input() 값을 입력받은 후, int 로 형변환하여 사용할 수 있다.
string_a = input("입력>")
int_a = int(string_a)
print(type(int_a))	# <class 'int'>

# 입력 받을 때 부터 int로 형변환하여 사용할 수 있다.
a = int(input("입력>"))
print(type(a))	# <class 'int'>

# 숫자 123을 string으로 형변환하여 사용할 수 있다.
int_b = str(123)
print(type(int_b)

[숫자와 문자열의 다양한 기능]

 

✏️ 문자열의 format() 함수

  • 숫자와 문자열을 다양한 형태로 출력할 수 있는 함수
  • 중괄호 { } 를 포함한 문자열 뒤에 마침표 (.) 를 찍고 format() 함수를 사용한다.
  • 중괄호 개수와 format() 함수 괄호 안 매개변수의 개수는 반드시 같아야 한다.
  • { } 기호를 format() 함수 안의 괄호 안에 있는 매개변수로 대체하는 것이기 때문에 { } 앞이나 뒤, { } 와 { } 사이에 다양한 문자열을 넣을 수 있다.
format_a = "{}".format(10)			# 10
format_b = "{} 만원".format(5000)	  # 5000 만원
format_c = "{} {} {}".format(300, 400, 500) # 300 400 500
  • format() 함수는 정수, 실수형도 지정해서 출력할 수 있다.
    • 정수형은 {:d} , 실수형은 {:f} 사용.
# 정수 출력
output_a = "{:d}".format(32)
# 음수 출력
output_b = "{:+d}".format(-32)
# 특정 칸 출력 
output_c = "{:5d}".format(11)
# 빈칸을 0으로 채우기
output_d = "{:05d}".format(11)

# 실수 출력
output_e = "{:f}".format(52.12)
# 음수 출력
output_f = "{:f}".format(-52.12)
# 소수점 아래 자릿수 지정
output_g = "{:.2f}".format(52.1234)
# 의미 없는 소수점(.0) 제거
output_h = "{:g}".format(52.0)

# 출력
32
-32
   11
00011
52.120000
-52.120000
52.12
52

 

✏️ 대소문자 변환 : upper(), lower()

  • upper() : 문자열의 알파벳을 대문자로 변경
  • lower() : 문자열의 알파벳을 소문자로 변경
a = "Hello World"
# a에 저장된 문자열을 모두 대문자로
print(a.upper())	# HELLO WORLD
# a에 저장된 문자열을 모두 소문자로
print(a.lower())	# hello world

 

✏️ 문자열 공백 제거 : strip()

  • strip() : 문자열 양 옆의 공백을 제거 (이 때 공백은 띄어쓰기, 탭, 줄바꿈 모두 포함)
  • lstrip() : 문자열 왼쪽의 공백을 제거
  • rstrip() : 문자열 오른쪽의 공백을 제거
input_a = """
        안녕하세요, 반갑습니다
"""
print(input_a)
print(input_a.strip())
# 출력
        안녕하세요, 반갑습니다

안녕하세요, 반갑습니다

 

✏️ 문자열 구성 파악 함수 : isXXX()

  • 문자열의 구성을 파악할 때는 is로 시작하는 함수를 사용한다. 예를 들어서 문자열이 알파벳으로만 구성되어 있는지, 숫자로만 구성되어 있는지, 소문자로만 구성되어 있는지 등을 확인할 때 유용하다. 출력은 True / False 를 반환한다.
    • isalnum() : 문자열이 알파벳 또는 숫자로 구성되어 있는 지 확인
    • isalpha() : 문자열이 알파벳으로만 구성되어 있는 지 확인
    • isdigit() : 문자열이 숫자로 인식될 수 있는지 확인

✏️ 문자열 찾기 함수 : find()

  • 문자열 내부에 특정 문자가 어디 위치하는 지 확인하기 위해 find() 함수와 rfind() 함수를 사용한다.
  • find() : 문자열의 왼쪽부터 찾아서 처음 등장하는 위치 반환
  • rfind() : 문자열의 오른쪽부터 찾아서 처음 등장하는 위치 반환
output_a = "안녕안녕하세요".find("안녕")	# 0
output_b = "안녕안녕하세요".rfind("안녕")	# 2

 

✏️ in 연산자

  • 문자열 내부에 어떤 문자열이 있는 지 확인하려면 in 연산자를 사용한다.
  • 문자열이 있으면 True , 없으면 False를 리턴한다.
print("안녕" in "안녕하세요")	# True
print("잘자" in "안녕하세요")	# False

 

✏️ 문자열 자르기 : split()

  • split() 함수를 사용해서 문자열을 특정 문자로 자를 수 있다.
# 문자열 a 를 공백을 기준으로 자른다.
a = "10 9 8 7 6 5 4 3 2 1".split(" ")

print(a)
['10', '9', '8', '7', '6', '5', '4', '3', '2', '1']

 

✏️ f-문자열

  • 문자열 안에 값을 format() 보다 간단하게 삽입할 수 있다.
  • 파이썬 3.6 버전 이상부터 사용 가능하며, 문자열 앞에 f를 붙여서 만든다. 문자열 내부에 표현식을 { } 로 감싸서 삽입할 수 있다.
f ' 문자열 {표현식} 문자열 '

 

# format 함수 사용
a = "{}".format(10)
# f문자열 사용
b = f'{10}'	# 10
# {} 안에 표현식 사용
c = f"3 + 4 = {3+4}"
# 출력
3 + 4 = 7

 

2024.01.13 - [개발/혼공학습단_11기] - [혼공파] 혼자 공부하는 파이썬_2주차 (2)

새해를 맞아, 재작년에 잠깐 시도했으나 결국 끝내지 못한 파이썬 공부를 다시 시작했다.

또 작심삼일로 끝날까봐 나를 채찍질해 줄 무언가가 필요했는데, 혼공학습단 11기에 선정되어서 다행이었다.

앞으로 한달 반 정도 시간 동안 열심히 공부해 보려고 한다.


Chapter 01. 파이썬 시작하기

[자주 나오는 파이썬 용어들]

 

✏️ 문장 (statement) : 실행할 수 있는 코드의 최소 단위. 문장들이 모여서 프로그램이 된다.

✏️ 표현식 (expression) : 어떠한 값을 만들어 내는 간단한 코드. 값이란 숫자, 수식, 문자열 등을 의미한다.

✏️ 키워드 (keyword) : 파이썬에서 특정 의미로 사용하겠다고 미리 정의해 놓은 단어들.

# 키워드 확인 방법
import keyword
print(keyword.kwlist)

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else',
 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise',
 'return', 'try', 'while', 'with', 'yield']

 

✏️ 식별자(identifier): 프로그램 작성 시 이름을 붙일 때 사용하는 단어. 주로 변수명/함수명 등으로 사용한다. 식별자에는 키워드를 사용할 수 없으며 공백을 포함할 수 없다.

 

     ✔️ 스네이크 케이스 : 단어 사이에 언더바 ( _ ) 기호를 붙여 만든 식별자. 주로 함수/변수등에 사용

phone_number = "01012345678"

 

     ✔️ 캐멀 케이스 : 단어들의 첫 글자를 대문자로 만든 식별자. 주로 클래스 작성 시 사용

PhoneNumber  = "01012345678"

     


Chapter 02. 자료형

[자료형이란?]

 

✏️ 자료 : 프로그램이 처리할 수 있는 모든 것

✏️ 프로그램 : 자료를 처리하기 위한 모든 행위

✏️ 자료형 : 기능과 역할에 따라 자료를 구분한 자료의 형식. 기본적으로 문자열, 숫자, bool 등이 있다. type() 함수를 사용하여 자료형을 확인할 수 있다.

 

[문자열]

 

✏️ 문자열(string) : 문자들이 나열된 자료형. 큰따옴표 (" ") 나 작은 따옴표 (' ') 로 감싸서 만든다.

      ✔️ 이스케이프 문자 : 문자열 내부에서 특수한 기능을 수행하는 문자. 역슬래시 ( \ ) 기호와 함께 조합해서 사용한다.

# 따옴표로 감싸 입력하는 것들은 모두 문자열이다.
print("Hello Python Programming..") # Hello Python Programming.. 
print('안녕하세요') # 안녕하세요

# 문자열 내부에 따옴표를 넣으려면
print(" '안녕하세요' 반갑습니다 ") # '안녕하세요' 반갑습니다
print(' "안녕하세요" 반갑습니다 ') # "안녕하세요" 반갑습니다

# 문자열 내부에 역슬래시 (\) 와 함께 사용하면 내부에 따옴표를 넣을 수 있다.
print('\"안녕하세요\" 반갑습니다') # "안녕하세요" 반갑습니다
print("\'안녕하세요\' 반갑습니다") # '안녕하세요' 반갑습니다

# 줄바꿈, 탭 기능
print("안녕하세요\n 반갑습니다")
안녕하세요
반갑습니다

print("안녕하세요\t 반갑습니다")
안녕하세요	반갑습니다

 

[문자열 연산자]

 

숫자에 더하기, 곱하기, 빼기, 나누기 연산자를 적용할 수 있는 것처럼, 문자열에도 적용할 수 있는 연산자가 있다.

 

✔️ 문자열 연결 연산자 ( + ) : 두 문자열을 연결하여 새로운 문자열을 만들 수 있다.

💡 “문자열” + “문자열”

 

✔️ 문자열 반복 연산자 ( * ) : 문자열을 숫자와 * 연산자로 연결하여 숫자만큼 문자열을 반복할 수 있다.

💡 문자열 * 숫자

 

# 연결 연산자 기본 사용법
print("안녕"+"하세요")   # 안녕하세요

# 문자열과 연결하지 않으면 에러가 발생한다!
print("안녕하세요" + 1 )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be str, not int

# 문자열과 숫자를 연결하려면 숫자에 큰따옴표를 붙여서 문자로 인식시켜야 한다.
print("안녕하세요" + "1" )  # 안녕하세요1

# 반복 연산자 사용 방법 1
print("안녕하세요"*2)    # 안녕하세요안녕하세요

# 반복 연산자 사용 방법 2 (순서를 바꿔서도 가능)
print(2*"안녕하세요")    # 안녕하세요안녕하세요

 

✏️ 문자열 연산자의 우선순위 : 반복 연산자 ( * ) 가 연결 연산자 ( + ) 보다 우선이다.

print("안녕"+"하세요"*3)     # 안녕하세요하세요하세요

print(("안녕"+"하세요")*3)   # 안녕하세요안녕하세요안녕하세요

 

✏️ 인덱싱 ( [ ] )

 

     ✔️ 문자열 내부의 문자 하나를 선택하는 연산자이다.

     ✔️ 대괄호 [ ] 안에 선택할 문자의 위치를 지정하며, 이 숫자를 인덱스 (index)라고 한다.

     ✔️ 문자열의 위치는 무조건 0부터 시작한다. ( 제로 인덱스 유형 )

     ✔️ 양수와 음수 모두 가능하며, 음수로 입력할 경우 뒤에서 부터 접근할 수 있다.

# 양수 인덱스
print("안녕하세요"[0])  # 안
print("안녕하세요"[1])  # 녕
print("안녕하세요"[2])  # 하
print("안녕하세요"[3])  # 세
print("안녕하세요"[4])  # 요

# 음수 인덱스
print("안녕하세요"[-1]) # 요
print("안녕하세요"[-2]) # 세
print("안녕하세요"[-3]) # 하
print("안녕하세요"[-4]) # 녕
print("안녕하세요"[-0]) # 안

 

✏️ 슬라이싱 ( [ : ] )

 

     ✔️ 문자열의 특정 범위를 선택할 때 사용하는 연산자이다.

     ✔️ 범위는 대괄호 안에 위치를 콜론 ( : ) 으로 구분해서 지정한다.

     ✔️ 파이썬은 범위 지정 시 “마지막 숫자를 포함하지 않음”

💡 “문자열”[시작 인덱스 : 끝 인덱스 -1]

 

# 문자열 슬라이싱
# 파이썬은 범위 지정 시 마지막 숫자를 포함하지 않기 때문에, 1번째+2번째+3번째글자 까지만 출력
print("안녕하세요"[1:4])  #녕하세

print("안녕하세요"[0:2])  #안녕

# 대괄호 안에 넣는 범위 둘 중 하나를 생략 가능
# 마지막 인덱스를 생략하는 경우, 시작 인덱스 부터 가장 최대 위치 (마지막 글자) 까지 선택
print("안녕하세요"[1:])   # 녕하세요

# 시작 인덱스를 생략하는 경우, 처음부터 (마지막 인덱스 -1) 까지 선택
print("안녕하세요"[:3])   # 안녕하

 

✏️ len() : 문자열에 들어 있는 문자의 개수 (문자열의 길이) 를 세어 주는 함수

print(len("안녕하세요"))  # 5

 

[숫자 자료형]

 

✏️ 정수형 (int) : 소숫점이 없는 숫자 자료형

✏️ 실수형 (float) : 소숫점이 있는 숫자 자료형

 

[수 자료형의 연산]

 

✏️ 사칙연산 ( +, -, *, / ), 나머지 연산자 ( % ), 정수 나누기 연산자 ( // ), 제곱 연산자 ( ** )

     ✔️ 정수 나누기 연산자는 나눗셈 후 몫만 남기는 연산자이다.

 

[수 자료형의 우선순위]

 

✏️ 곱하기( * ), 나누기( / ) 가 우선이고, 더하기( + ) , 빼기( - ) 연산자가 그 다음으로 우선이다.

✏️ 같은 우선 순위를 가지는 연산자는 왼쪽에서 오른쪽으로 계산한다.


[1주차 기본 미션]

p.101 3~5번 실행 결과 쓰고 인증하기

 

나는 ebook으로 구매해서 공부하고 있기 때문에 캡쳐하여 아이패드로 실행 결과를 작성했다. (혹시 문제가 된다면 댓글 부탁 드립니다...)

☑️ 파이썬은 문자열의 위치를 0부터 계산하기 때문에 위 예제의 경우 0~4 까지의 인덱스를 선택할 수 있다. 이 범위를 넘는 인덱스 선택 시 인덱스 에러( IndexError) 가 발생한다.

☑️ 파이썬에서 문자열 범위를 선택할 때는 마지막 숫자를 포함하지 않는다. 따라서 위 예제처럼 [1:3] 선택 시 1번째~2번째 인덱스 값만 출력한다. 또한 마지막 인덱스를 생략하는 경우, 시작 인덱스(0번째) 부터 문자열의 끝까지 선택하며, 시작 인덱스를 생략하는 경우 처음부터 (마지막 인덱스-1) 까지 선택한다.

+ Recent posts