본문 바로가기

ABC 부트캠프

[5일차] ABC 부트캠프 - 파이썬 기초 #4 (재귀함수,내장 함수, 표준 라이브러리)

안넝하세오. 서루태에오.

오늘도 힘내서 공부 하자구요!

재귀함수

함수 안에 자신을 호출(재귀)하는 함수

 

이해를 돕기 위해 예시를 들어볼게요

def factorial(x):
    if x > 1:
        return x * factorial(x - 1)
    else:
        return x
    
factorial(4)
=> 24

x를 4라고 하면 우리가 4*3*2*1을 해야 팩토리얼 계산이 되겠죠

 

factorial(4) = 4 * factorial(3) 으로 해주는거에요

그럼 factorial(3)은 3*factorial(2)가 되고

factorial(2)는 2 * factorial(1) ... 

 

한마디로

4 * (3 * (2 * ( 1 ) ) )

의 과정을 함수로 나타낸거에요

 

(피보나치 설명)

 

Python 내장함수

abs
## abs(x)는 어떤 숫자를 입력받았을 때 그 숫자의 절댓값을 리턴하는 함수이다.

all
# # all(x)는 반복 가능한 데이터 x를 입력값으로 받으며 이 x의 요소가 모두 참이면 True, 거짓이 하나라도 있으면 False를 리턴한다.
# # 반복 가능한 데이터란 for 문에서 사용할 수 있는 자료형을 의미한다. 리스트, 튜플, 문자열, 딕셔너리, 집합 등이 있다.

any
## any(x)는 반복 가능한 데이터 x를 입력으로 받아 x의 요소 중 하나라도 참이 있으면 True를 리턴하고 x가 모두 거짓일 때만 False를 리턴한다.

chr
## chr(i)는 유니코드 숫자 값을 입력받아 그 코드에 해당하는 문자를 리턴하는 함수이다.

dir
## dir은 객체가 지닌 변수나 함수를 보여 주는 함수이다. 

divmod
## divmod(a, b)는 2개의 숫자 a, b를 입력으로 받는다. 그리고 a를 b로 나눈 몫과 나머지를 튜플로 리턴한다.

enumerate
## enumerate는 ‘열거하다’라는 뜻이다. 이 함수는 순서가 있는 데이터(리스트, 튜플, 문자열)를 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 리턴한다.
for i, name in enumerate(['body', 'foo', 'bar']): 
    print(i, name)

eval
## eval(expression)은 문자열로 구성된 표현식을 입력으로 받아 해당 문자열을 실행한 결괏값을 리턴하는 함수이다.
# eval('1+2')

filter
## filter란 ‘무엇인가를 걸러 낸다’라는 뜻으로, filter 함수도 이와 비슷한 기능을 한다.
## filter(함수, 반복_가능한_데이터) 

id
## id(object)는 객체를 입력받아 객체의 고유 주솟값(레퍼런스)을 리턴하는 함수이다.

input
## input([prompt])는 사용자 입력을 받는 함수이다. 입력 인수로 문자열을 전달하면 그 문자열은 프롬프트가 된다.

len
## len(s)는 입력값 s의 길이(요소의 전체 개수)를 리턴하는 함수이다.

max
## max(iterable)은 인수로 반복 가능한 데이터를 입력받아 그 최댓값을 리턴하는 함수이다.

min
## min(iterable)은 max 함수와 반대로, 인수로 반복 가능한 데이터를 입력받아 그 최솟값을 리턴하는 함수이다.

pow
## pow(x, y)는 x를 y제곱한 결괏값을 리턴하는 함수이다.

round
## round(number [,ndigits])는 숫자를 입력받아 반올림해 리턴하는 함수이다.

sorted
## sorted(iterable)는 입력 데이터를 정렬한 후 그 결과를 리스트로 리턴하는 함수이다.

sum
## sum(iterable)은 입력 데이터의 합을 리턴하는 함수이다.

type
## type(object)는 입력값의 자료형이 무엇인지 알려 주는 함수이다.

zip
## zip(*iterable)은 동일한 개수로 이루어진 데이터들을 묶어서 리턴하는 함수이다.
list(zip([1, 2, 3], [4, 5, 6]))
list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))
list(zip("abc", "def"))

이외에도 다양한 내장 함수가 존재하지만 자주 쓰이는 몇 가지만 가져왔어요

좀 더 알고싶은 함수들이 있다면 공식문서를 참고하시는 걸 추천드려요

 

Python 표준 라이브러리

기본적으로 라이브러리는 import를 통해서 불러오고 as로 이름을 재정의 할 수 있어요

import (라이브러리) as (별칭)

 

Python에서 기본으로 제공하는 라이브러리들을 소개할게요

# datetime - 날짜와 관련된 기능
## datetime.date는 연, 월, 일로 날짜를 표현할 때 사용하는 함수

import datetime
day1 = datetime.date(2021, 12, 14)
day2 = datetime.date(2023, 4, 5)
diff = day2 - day1
diff.days

=> 477

datetime 라이브러리를 가져와서 .days로 날짜를 가져다 쓸 수 있어요

# math - 수학연산 관련 기능
## math.gcd는 최대 공약수(gcd, greatest common divisor)를 쉽게 구할 수 있어요

import math
math.gcd(60, 25)

=> 5

math 라이브러리에는 gcd말고도 수학적 연산을 위한 함수들이 많이 존재해요

# random - 난수

import random
random.random()
random.randint(1, 10)

=> (1부터 10까지 임의의 값 출력)

랜덤값을 쓰고싶을때 자주 사용되는 함수에요

# glob - 디렉토리 파일 리스트를 조회해요

import glob
glob.glob("./*.ipynb")

프로그램 내에서 파일을 조회하고 출력할 수 있답니다

 

이제 실습으로 넘어가 볼까요?

 


파이썬 베이스볼 게임 만들기

  • 임의의 숫자 생성: 컴퓨터가 0-9 사이의 서로 다른 3개의 숫자를 임의로 생성합니다.
  • 사용자 입력: 사용자가 3자리 숫자를 입력합니다.
  • 스트라이크 및 볼 계산: 사용자가 입력한 숫자와 위치를 비교하여 스트라이크와 볼의 개수를 계산합니다.
  • 결과 출력: 스트라이크와 볼의 개수를 사용자에게 알려줍니다.
  • 게임 종료: 사용자가 숫자를 모두 맞추면 게임을 종료하고, 재시작 여부를 묻습니다.
# 임의의 숫자 3개 생성 (0~9,3)
# while문 사용 / 조건은 (3s가 아니면) 
#     input함수로 3자리 숫자 입력
#     split으로 3자리 숫자를 끊어서 받아줌
#     if 임의의 숫자랑 입력 숫자가 겹치는게 있는가 ?
#     그 중에서도 인덱스가 같은게 있는가 ?
#     없다면 아웃 !

def search_dup(list): # 리스트에 중복이 있는지 확인하는 함수
    temp = 0
    for i in range(len(list)-1):
        if list[i] == list[i+1]:
            temp += 1
    if temp != 0:
        return True
    else:
        return False

def single_int(list): # 리스트의 값이 0~9까지의 정수인지 확인하는 함수
    for i in list:
        if int(i) >= 0 and int(i)<10:
            continue
        else:
            return False
    return True


#랜덤 라이브러리 임포트
import random as ran

#재시작 변수
str_retry = 'Y'

#재시작을 위한 while문
while (str_retry == 'Y'):
    
    #맞춘 카운트 선언
    s_count = 0
    b_count = 0
    
    #변수 선언
    list_prob_num = []
    temp = 0

#겹치지 않게 랜덤 숫자 3개 생성
    while (len(list_prob_num) < 3):
        temp = ran.randint(0,9)
        if (temp not in list_prob_num):
            list_prob_num.append(temp)

    # 3스트라이크 될때까지
    while (s_count<3):
    # 카운트 초기화
        s_count = 0
        b_count = 0
    # 입력값 받기
        str_my_num = input("숫자 세개를 한칸씩 띄워서 적어주세요 ")
        list_my_num = str_my_num.split()
    # 입력한 값이 양식에 맞는지 확인하고 틀렸다면 다시 입력받기 ( 중복, 길이, 한자릿수 )
        while (search_dup(list_my_num) == True) or (len(list_my_num) != 3) or (single_int(list_my_num) == False):
            str_my_num = input("숫자 세개를 한칸씩 띄워서 '다시' 적어주세요 ")
            list_my_num = str_my_num.split()
    # 인덱스와 값이 모두 같다면 s_count 증가 그게 아니고 값이 들어 있기는 하면 b_count 증가
        for i in range(3):
            if str(list_prob_num[i]) == list_my_num[i]:
                s_count += 1
            elif str(list_prob_num[i]) in list_my_num:
                b_count += 1
        print(f"{s_count} 스트라이크, {b_count} 볼")
    
    str_retry = input(f"\n3 스트라이크! 정답입니다! 게임을 다시 시작하시겠습니까? (Y/N)")

 

코드를 하나씩 뜯어서 보고 '직접' 해보는 걸 추천드려요!

 

오늘은 ! 여기까지 ~

다음 글에서 만나요~