기타/Python

250610_파이썬 함수를 계속 파볼까요?

baektree 2025. 6. 10. 21:21

요약/나만의 인사이트

  • 전처리, 시각화 강의를 들으며 데이터 분석을 배우는 이유는 무엇인지 생각해봤다.
  • 과거 직장생활 경험을 비추어보면 프로젝트/프로덕트의 문제의 원인을 파악해서 개선해 나가는데 희열을 느꼈기 때문에 이것과 가장 유사한 프로덕트 분석가가 되고 싶은 것 같다.
  • 따라서 프로덕트 분석가가 되려면 일생 생활에서 문제를 직접 정의해보고, 분석, 인사이트, 액션 플랜 수립의 과정을 깊게 고민해보는 과정을 거쳐보는 것이 중요하다고 하는데!
  • 아직은 주제 설정을 뭐로 하면 좋을지 감이 안온다.
  • 조급해 하지 말고, 천천히 가보자고!

 

새롭게 알게 된 것

함수

 

def 함수이름(parameter): '''코드구문''' return # <- 필수는 아니나 명시하는게 좋음.

 

 

  • 함수이름: 영어 또는 _ 로 만드는 게 일반적, 내장함수와 중복된 이름 사용하지 말 것
  • 매개변수(paremeter) : 함수 내부 코드의 변수 역할
  • return: 반환, 함수 종료 기능이 있음.
    • 함수가 반드시 어떤 값을 return 해야 하는 것은 아님
    • 기본적을 return None이 숨겨져 있음.
  • 전달인자(argument): 파라미더에 전달하는 값
  • def 함수이름(parameter): '''코드구문''' return # <- 필수는 아니나 명시하는게 좋음.

전역변수, 지역변수

  • 전역변수(Global Variable): 함수 밖 / 파이썬 코드 전체에서 적용
b = 3
def get_square():
    return b**2

get_square()
'''
9
'''
  • 지역변수(Local Variable): 함수 안 / 함수 구문 내에서만 적용
def get_sqaure(x):
	a = 3
	return x, x**2

print(a)
'''
---->  print(a)

NameError: name 'a' is not defined
'''

전달 인자 (개념 파악이 잘 안되어서 추후 복습 필요)

  • 위치 전달인자
  • 키워드 전달인자
  • 우선순위: 위치 전달인자 > 키워드 전달인자

Docstring, Type Hint

  • Docstring
    • 함수는 재사용성을 위해 만들어져 있으므로 그에 대한 설명서가 있으면 이해하기 좋음
    • 쌍따옴표 3쌍 ‘’’ ‘’’ 으로 선언
  • Type Hint(타입 힌트)
    • 함수에 들어가는 전달인자와 나오는 리턴 값의 자료형을 명시하는 기법
    • 강제는 아님
    • 위의 사진의 경우 x에 anything 자료형이 들어가서 반환할 때 anything 자료형이 나온다.

 

  •  

특히 어려웠던 것

함수 내부에서 어떤 변수를 할당(=)하면 지역 변수로 간주한다.

  • 문제
new_numbers = [4, 5, 6, 7, 8, 9]	
total = 0  #궁금한 점 'total = 0'이라고 함수 밖에 정의하면 전역변수로 활용할 수 있는 것 아닌지, 
           # 왜 에러가 나는지 궁금합니다. 
      total += i
  return total

solution(new_numbers)

'''
erro
cannot access local variable 'total' where it is not associated with a value
"값과 관련되지 않은 로컬변수 'total'에 접근 할 수 없다.

'''
  • 궁금한점
    • 함수 밖에 total = 0이라고 할당하면 전역변수니까 함수 안에서도 사용가능한거 아닌가?
  • 해설
    • nope!
    • 할당(=)하면 지역 변수로 간주한다.
    • 파이썬은 함수 내부에서 어떤 변수에 값을 할당하면, 해당 변수는 지역변수로 취급한다. 따라서 total += i에서 total은 함수 안의 지역 변수로 간주된다. 따라서 함수 내부적으로 지역변수를 찾으려 하지만 아직 선언되지 않아서 오류가 발생하는 것
    • 전역변수는 읽기만 가능하다.
    • 전역변수 일지라도 함수 내부에 사용하려면 global이라고 써야 함.
  • 정리
    1. 함수 내부에서 어떤 변수에 값을 할당해?
    2. okay 그 변수는 지역변수, 함수내부에서 작동
    3. 외부에서 할당한 전역변수는 함수 내부에선 읽기만 가능
    4. 만약 쓰고 싶다면 global 써야함.

 

for문 안에 if가 있을 때

  • for는 모든 요소를 차례대로 순회한다.
  • if 조건이 참인 경우에만 변수에 저장한다.
  • 조건이 거짓이면 저장하지 않고 그냥 넘어간다.
  • 결국 변수에는 “조건을 만족했던 마지막 값”이 저장되어 있기 때문에 그 변수를 return 하면 마지막으로 조건을 만족했을 때 저장한 값이 반환된다.
  • last_even([1, 2, 5, 8, 9]) #8
    
    def last_even(numbers):
    	for x in numbers:
    		if x % 2 == 0:
    			last_even_num = x
    	return last_even_num
    	
    	# for문은 리스트의 모든 요소를 순회한다.
    	# 이때 if문은 조건이 참일 경우에만 실행된다.
    	# 따라서 2, 8일 때는 if문 블록이 실행되고,
    	# 그때마다 last_even_num에 해당 값이 할당된다.
    	# 가장 마지막으로 조건을 만족한 값은 8이므로, 
    	# 함수는 8을 반환하게 된다.
    	
    	'''리스트를 순회하며 짝수를 찾고, 
    	마지막 짝수를 반환한다.'''
    

SQL - UNION

  • UNION에 대한 개념정립
    • 용도 : 두 개 이상의 SELECT 쿼리의 결과를 세로로 결합
    • 차이 : UNION ALL _ 중복포함 UNION _ 중복제거
    • 주의
      1. 결합하는 SELECT 쿼리들의 컬럼 개수, 데이터 타입, 컬럼 순서가 일치
      2. 결과 집합의 컬럼명은 첫번째 SELECT 쿼리의 컬럼명이 사용
      3. ORDER BY는 전체 UNION 결과에 대해 마지막 한 번 만 사용 가능
      4. LIMIT도 전체 UNION 결과에 대해 마지막 한 번 만 사용 가능
    • 개념 참고 : https://bruders.tistory.com/169
    • 관련 문제 풀이
      -- 1. 22년 3월 온, 오프 상품 리스트 조회
      SELECT DATE_FORMAT(sales_date, "%Y-%m-%d") AS sales_date,
             product_id,
             user_id,
             sales_amount
      FROM online_sale
      WHERE sales_date BETWEEN '2022-03-01' AND '2022-03-31'
      --- 2. 중복 없이 UNION ALL 하기 단 컬럼명, 컬럼개수, 컬럼데이터 타입 동일하게 구성
      --- 컬럼명이 없는 경우 NULL AS user_id로 
      UNION ALL
      SELECT DATE_FORMAT(sales_date, "%Y-%m-%d") AS sales_date,
             product_id,
             NULL AS user_id,
             sales_amount
      FROM offline_sale
      WHERE sales_date BETWEEN '2022-03-01' AND '2022-03-31'
      -- 3. 전체 테이블에 order by 한번만, 단 컬럼명은 첫번째 테이블 기준으로 적용됨
      ORDER BY sales_date, product_id, user_id
      

다음에 적용해 볼 것

  • 문제를 모두 못 풀더라도 로직 설계까지 해보는데 의의를 두자
  • 그것 또한 나의 역량을 향상시키는 방법이니까!
  • 논리적, 구조적 사고를 키우는데 도움 되는 책을 서치해보자