3주차 첫째날입니다.
함수를 배우고 있습니다. 쉬운듯 쉽지 않습니다.
이렇게만 해도 되는거야 라는 의문이 한번씩 듭니다.
예를 들면 함수 이름이 같고, 파라미터도 1개이고, 함수가 호출됐을때 어떻게 구분하지?
파라미터 자료형이 뭔지도 모르니까요. 도대체 어떻게 구분하나 싶어서 막 만들어서 확인해봤습니다.
마지막에 정의된 함수가 쓰이더군요. 이것도 이게 괜찮은 건가 싶네요^^

함수

파라미터 있거나 없거나, 아규먼트 있거나 없거나 이런건 이전에 배운 기억들이 있어서
딱히 어렵지는 않았습니다.
그외 python 만의 특징들이 있어서 헷갈릴 만한 것들이 있었습니다.


def add_element(my_list):
    my_list.append(1)
    print(id(my_list)) # 출력: 135115033605760

a = [2, 3, 4]
add_element(a)
print(id(a)) # 출력: 135115033605760
print(a)  # 출력: [2, 3, 4, 1]

여기서 a 와 my_list 는 같은 주소값을 가진 같은 리스트 라는 겁니다.
그런데 재밌게도


def add_element(my_list):
    my_list = 10
    print(id(my_list)) # 출력: 135115442078224 

a = [2, 3, 4]
add_element(a)
print(id(a)) # 출력: 135115029248768
print(a)  # 출력: [2, 3, 4]

이렇게 리스트로 넘겨줬지만 함수내에서 재할당 했을 경우에 주소값이 바뀝니다.
list와 int형이 당연히 다르겠지만 어쨌든 이런 형변환이 너무 쉽습니다.


# 잘못된 예
# 파이썬은 기본값이 없는 파라미터가 기본값이 없는 파라미터 뒤에 갈 수 없음.
# 기본값이 없는 파라미터는 반드시 값을 전달해야함.

#def f(a=10, b=20, c):
#    print(a, b, c)  # error

# 올바른 예
def f(a, b=20, c=10):
    print(a, b, c)

f(100, 10)
f(100, 200, 300)
f(a=100, b=200, c=300)
f(c=300, b=200, a=300)

기본값을 가지고 있는 파라미터와 없는 파라미터가 혼용되어 함수가 정의되어 있을때

  • 기본값이 있는 파라미터가 기본값이 없는 파라미터 뒤에 갈 수 없다.
  • 기본값이 없는 파라미터는 반드시 값을 전달해야 한다.


# 1.4.2 권장되지 않는 기본값
# 권장하지 않는 방법

def append_to_list(value, lst=[]):
    lst.append(value)
    return lst      # 예상치 못한 결과가 발생할 수 있습니다.

print(append_to_list(1))    # 결과 : [1]
print(append_to_list(2))    # 결과 : [1, 2]

append_to_list(2) 했을때 [2] 가 당연히 나올 줄 알았습니다.
lst[] 는 함수가 정의될때 한번 만 생성 되고 리스트가 변경될때 마다
변경된 내용이 유지됩니다. 재밌어요^^


권장방법은 다음과 같습니다.

# 권장 방법
def append_to_list(value, lst=None):
    if lst is None:
        lst = []
    lst.append(value)
    return lst

print(append_to_list(1))    # 결과 : [1]
print(append_to_list(2))    # 결과 : [2]

파라미터의 기본값을 None 으로 잡고, 함수 내에서 None 값일때 새로운 리스트 lst[] 를 생성해주는 겁니다.


from datetime import datetime

def calculate_days_since(start_date_str):
    # 입력받은 문자열을 날짜 객체로 변환합니다
    start_date = datetime.strptime(start_date_str, '%Y-%m-%d')

    # 현재 날짜를 가져옵니다
    current_date = datetime.now()

    # 두 날짜의 차이를 계산합니다
    difference = current_date - start_date

    # 일수로 변환하여 반환합니다
    return difference.days

# 함수 사용 예시
start_date_input = input("사귀기 시작한 날짜를 입력하세요 (예: 2023-01-01): ")
days_passed = calculate_days_since(start_date_input)
print("오늘까지 사귄지", days_passed, "일이 되었습니다.")

chatGPT에게 추천받은 사귄지 몇일 됐는지 알려주는 코드입니다.
날짜와 시간을 다루는 datetime 클래스가 있어서 간단하게 코드 작성이 가능합니다.
여러 형태로 날짜와 시간을 다룰 수 있습니다.
두 날짜 차이 계산도 객체-객체 로 가능하네요.^^


입력 받은 문자열을 datetime의 객체로 변환하는 strptime 이라는 메소드도 처음봅니다.
'%Y-%m-%d' 처럼 특정 형태만 이뤄진다면 객체로 변환이 됩니다.


좀 더 보강한다면 0000-00-00 형태로 입력을 해야 하는데 00000000 형태로 입력해도
0000-00-00 형태로 문자열을 변경해주고, 그외 예외처리를 해주면 좋을 것 같습니다.
반복문을 배워야겠네요^^