겉바속촉

[PYTHON] 파이썬_지역변수, 새로운 함수 디자인 본문

IT 일기 (상반기)/PYTHON

[PYTHON] 파이썬_지역변수, 새로운 함수 디자인

겉바속촉 2021. 1. 4. 17:29
728x90
반응형

 

안녕하세요

겉바속촉입니다

!^^!

 

 

!!파이썬 시작하기!!

 

 

 

 

 


 

 

 

 

임시 저장 공간으로 지역 변수 사용

 

 

지역 변수

 

  • 함수를 호출할 때마다 생성
  • 함수가 반환될 때 제거
  • 지역 변수의 유효 범위 : 변수가 정의된 행부터 함수 끝까지 --> 함수 밖에서는 사용 불가
  • 함수의 매개변수도 지역변수이기 때문에 함수 정의 밖에서는 사용 불가

 

 

메모리 모델로 함수 호출 추적

 

  • 파이썬은 함수 호출을 실행할 때마다 그 호출에 쓰이는 지역변수를 저장할 네임스페이스를 생성합니다
  • 다음 함수를 보면 x가 여기저기서 쓰이고 있는데 모두 같은 변수일 지 고민해봐야합니다!!!
  • 함수 f의 매개변수인 x와 셸에 잇는 변수 x는 서로 다릅니다

 

 

 

 


 

 

TDD : 테스트 주도 개발

 

어떠한 기능을 만들때

테스트 코드를 먼저 만듭니다

 

이러한 것을 TDD라고 하는데요

 

 

새로운 함수 디자인 : 방법

 

1. 예제 -> 함수에 어떤 이름 붙일지, 함수에 어떤 인수 필요할 지, 함수가 어떤 정보를 반환할 지 생각

2. 헤더 -> 예제에서 정한 것을 기반으로 매개변수 이름과 매개변수 타입, 반환 타입 정하고 함수 헤더를 작성 

3. 설명 -> 해당 함가 어떤 기능을 하는지 문서화하는 것, 문서화 문자열* 사용

4. 본문 -> 코드 작성

5. 테스트 -> 만들었던 예제들이 본문을 모두 통과하는 지 예제를 실행해서 올바른 지 확인!! : TDD

 

 

문서화 문자열*

: documentation string, docstring --> 세 개의 따옴표를 사용하여 그 중간에 있는 내용이 바로 설명서!!

 

 

함수 디자인 방법은 위에서처럼 총 5단계로 구성되어있고

복잡한 함수 개발할 때에 오히려 시간을 절약시켜줍니다:)

 


 

Visual Studio 활용해서 해보기

 

 

저는 이제 vscode를 사용하려고 합니다

 

C 밑에 python이라는 폴더를 만들었습니다:)

 

 

 

vscode를 열어서 저 python폴더를 open!!

다음과 같이 days_difference.py 라는 명의 파일을 만들었습니다:)

 

 

 

 

그럼 필요한 것들 설치해주시고!!

시작해볼게요~

 

 

혹시 vscode 설치해야한다면 다음 포스팅 참고

 

2021/01/04 - [IT 일기 (상반기)/PYTHON] - [PYTHON] 파이썬 설치 및 VScode 설치

 

[PYTHON] 파이썬 설치 및 VScode 설치

파이썬 설치하기 https://www.python.org/downloads/ Download Python The official home of the Python Programming Language www.python.org PATH 꼭 추가해주신 후에 Install Now 나머지는 디폴트로 모두 해..

2-juhyun-2.tistory.com

 

 

 

 

 


참고로 vscode에서 코드를 작성하고 실행 방법은 두가지입니다

본격적으로 하기 전에 실행 방법 먼저 살펴볼게요:)

 

 

디버깅 모드 ; F5

 

내가 걸어둔 브레이크 포인트에서 실행이 멈춤!!

디버그 모드로 프로그램을 실행하는 건데 스텝 단위로 프로그램을 실행하고 값의 변화 확인이 가능

 

 

 

 

실행 모드 ; Ctrl + F5

 

실행이 더 중요하다면 우선 디버깅 없이 실행시키는 것

그럼 그냥 값이 콘솔창에 찍히는 것입니다

하지만 내가 원하는 구성대로 값이 들어가고 찍히는 지 궁금하다면 디버깅 모드로 봐주시는 게 더 좋겠죠??

 


 

 

이제 새로운 함수 디자인을 5단계에 걸쳐서 해보도록 하겠습니다!!

 

 

EX1) 미래요일 계산하기

 

1. 예제 작성

 

2. 헤더 작성

 

3. 설명

 

4. 본문

 

5. 테스트

 

콘솔창 확인

즉 우리가 설명부분에서 작성한 테스트 코드들에 대한 예상값이 다음 실제 결과값과 동일한 지 확인!!

 

 

 

전체 코드 참고

def days_difference(day1: int, day2: int) -> int:
    '''
    day1과 day2 간 날짜수 차이를 반환한다.
    이떄 day1과 day2는 (그 해의 몇 번째 날인지 가리키는) 1에서 365사이의 값이다.

    >>> days_difference(200, 224)
    24
    >>> days_difference(50, 50)
    0
    >>> days_difference(100, 99)
    -1
    '''
    
    return day2 - day1

 print(days_difference(200, 224) == 24)
 print(days_difference(50, 50) == 0)
 print(days_difference(100, 99) == -1)

 


 

EX2) 미래 요일 계산하기

 

 

1. 예제 작성

 

2. 헤더 작성

 

3. 설명

 

4. 본문

 

5. 테스트

콘솔창 확인

즉 우리가 설명부분에서 작성한 테스트 코드들에 대한 예상값이 다음 실제 결과값과 동일한 지 확인!!

 

하지만 예측한대로 나오지가 않쥬? ㅠㅠㅠㅠㅠ

 

그럼 본문이 틀렸다는 겁니다

return문을 고쳐줘야겠네요!!

 

 

요거에서

당연히 사칙연산 중에서 나눗셈이 우선순위이기 때문에 우리가 원하는 답이 나오지 않습니다;;

그럼 괄호가 필요하겠네요 --> (current_weekday + days_ahead) % 7

근데 또 문제가 get_weekday(6,1)의 값이 0이 나와버립니다

그래서.....

 

요고로!!!

 

그리고서 테스트해봤더니  제대로 나왔습니다

 

 

 

 

오류 잡기 전 전체코드

#미래 요일 계산


def get_weekday(current_weekday: int, days_ahead: int) -> int:
    '''
    current_weekday에서 days_ahead만큼 지나면 무슨 요일인지 반환한다.

    >>> get_weekday(3, 1)  # 오늘이 화요일(3)이라면 1일 후는 무슨 요일인가?
    4                      # 수요일(4)
    >>> get_weekday(6, 1)
    7
    >>> get_weekday(7, 1)  # 특정 값을 기준으로 처리가 달라지는 경우, 그 값을 경계값이라고 함
    1
    >>> get_weekday(1, 0)
    1
    >>> get_weekday(4, 7)
    4
    >>> get_weekday(7, 72) # 오늘이 토요일(7)인 경우, 7주하고 2일 후는 무슨 요일인가?
    2
    '''

    return current_weekday + days_ahead % 7


print(get_weekday(3, 1))
print(get_weekday(6, 1))
print(get_weekday(7, 1))    # 예측: 1,  실측: 8
print(get_weekday(1, 0))
print(get_weekday(4, 7))
print(get_weekday(7, 72))   # 예측: 2, 실측: 9

 

 

오류 잡은 후 전체 코드

#미래 요일 계산


def get_weekday(current_weekday: int, days_ahead: int) -> int:
    '''
    current_weekday에서 days_ahead만큼 지나면 무슨 요일인지 반환한다.

    >>> get_weekday(3, 1)  # 오늘이 화요일(3)이라면 1일 후는 무슨 요일인가?
    4                      # 수요일(4)
    >>> get_weekday(6, 1)
    7
    >>> get_weekday(7, 1)  # 특정 값을 기준으로 처리가 달라지는 경우, 그 값을 경계값이라고 함
    1
    >>> get_weekday(1, 0)
    1
    >>> get_weekday(4, 7)
    4
    >>> get_weekday(7, 72) # 오늘이 토요일(7)인 경우, 7주하고 2일 후는 무슨 요일인가?
    2
    '''

    return ( current_weekday + days_ahead -1 ) % 7 + 1


print(get_weekday(3, 1))
print(get_weekday(6, 1))
print(get_weekday(7, 1))    # 예측: 1,  실측: 8
print(get_weekday(1, 0))
print(get_weekday(4, 7))
print(get_weekday(7, 72))   # 예측: 2, 실측: 9

 

 

 


 

EX3) 내 생일 요일 계산하기

 

 

1. 예제 작성

 

2. 헤더 작성

 

3. 설명

 

4. 본문

(days_difference는 맨위의 꺼 활용, get_weekday는 바로 위의 꺼 활용)

 

 

5. 테스트

콘솔창 확인

즉 우리가 설명부분에서 작성한 테스트 코드들에 대한 예상값이 다음 실제 결과값과 동일한 지 확인!!

 

 

전체 코드

# 내 생일은 무슨 요일일가요?
def get_birthday_weekday(current_weekday: int, current_day: int, birthday_day: int) -> int:
    '''
    요일은 current_weekday, 그 해의 몇 번째 날인지는 current_day, birthday_day가 무슨 요일인지를 반환한다.

    current_weekday는 현재 요일로서 1 ~ 7 이며, 오늘이 일요일(1)인지, 월요일(2), 토요일(7)인지 등을 나타낸다.

    >>> get_birthday_weekday(5, 3, 4)  # 오늘이 올해의 3번째 날이고 목요일(5)이라면 생일(올해의 4번째날)은 무슨 요일일까?
    6                                  # 4 - 3 이후의 날짜의 요일은 금요일(6)
    >>> get_birthday_weekday(5, 3, 10) # 날짜 차이가 7일(10 - 3)이면 같은 요일
    5
    >>> get_birthday_weekday(6, 116, 3) # 오늘이 올해의 116번째 날이고 금요일(6)이라면 생일(올해의 3번째날)은 무슨 요일? (3-116) 이전의 날짜 요일은 17주 이전(119일 이전)으로 이동 후 6일 경과
    5
    '''

    days_diff = days_difference(current_day, birthday_day)
    return get_weekday(current_weekday, days_diff)
    

print(get_birthday_weekday(5, 3, 4))
print(get_birthday_weekday(5, 3, 10))
print(get_birthday_weekday(6, 116, 3))

 

728x90
반응형