[TIL: 0118] 파이썬 함수

ryun·2023년 1월 18일
0

TIL

목록 보기
6/34

함수

특정한 기능을 하는 코드의 조각(묶음)
기능을 분해하고, 재사용 가능하게 만든다

  • 분해
    특정 기능 단위로 분해해서 함수를 사용한다

  • 추상화
    복잡한 내용을 모르더라도 사용할 수 있도록 재사용성과 가독성, 생산성을 높인다
    내부 구조를 몰라도 무방하다

함수 기본 구조

  • 선언과 호출
  • 입력
  • 문서화
  • 범위
  • 결과값
    함수를 정의한다는 def, 함수의 이름인 식별자, 함수의 인자, 함수 바디, 함수의 아웃풋(return) 형식

선언과 호출

함수는 함수명으로 호출하여 사용
함수의 이름을 통해 기능을 유추할 수 있다

함수는 호출되면 코드를 실행하고 return 값을 반환하며 종료

값에 따른 함수의 종류

  • Void function
    명시적인 리턴 값이 없는 경우, None을 반환하고 종료
  • Value returning function
    함수 실행 후, 리턴문을 통해 값 반환
    반환 후 함수가 바로 종료

주의 - print vs return
프린트를 사용하면 호출될 때마다 값이 출력됨
데이터 처리를 위해 리턴 사용
리턴 안하고 변수에 할당하면 None이 할당됨

두 개 이상의 값 반환

리턴은 항상 한개의 값만 반환할 수 있다
두개 이상 리턴하고 싶다면,
반환 값으로 튜플 사용

파라미터와 아규먼트

  • 아규먼트
    함수 호출시 함수의 파라미터를 통해 전달되는 값
    - 포지셔널 아규먼트
    기본적으로 함수 호출시 아규먼트는 위치에 따라 함수 내에 전달됨
    - 키워드 아규먼트
    직접 변수의 이름으로 특정 아규먼트를 전달할 수 있음키워드 아규먼트는 항상 포지션 인자 뒤에 와야 한다

  • Default Arguments Values
    기본값을 지정해 함수 호출 시 인자 값을 설정하지 않도록 함

파이썬의 범위

네임 스페이스
어떤 것을 할당했을 때 저장해두는 공간 / 기억하는 공간
네임 스페이스가 여러 개가 있다는 것은 같은 이름이 가능하다는 뜻

  • 빌트인
    내장된 네임스페이스 (크다)
  • 글로벌
    하나의 파이썬 스크립트(프로그램) 내에서 생성된 네임스페이스
  • 엔클로징
    필요하다면 어떤 함수 안쪽에 다른 함수를 또 정의해서 쓸 수 있다
    중첩된 함수의 바깥쪽의 부분
  • 로컬
    내가 함수를 실행할 때 생성되는 네임 스페이스

찾는 순서는 LEGB 순서로 찾는다
가장 작은 범위부터 찾는다

함수는 코드 내부에 로컬 스코프를 생성하며 그 외의 공간인 글로벌 스코프로 구분한다

  • scope
    - global scope: 코드 어디에서든 참조할 수 있는 공간
    - local scope: 함수가 만든 scope, 함수 내부에서만 참조 가능

변수 수명주기

변수는 각자의 수명주기가 존재

  • 빌트인 스코프
    파이썬이 실행된 이후부터 영원히 유지
  • 글로벌 스코프
    모듈이 호출된 시점 이후 혹은 인터프리터가 끝날 때까지 유지
  • 로컬 스코프
    함수가 호출될 때 생성되고, 종료될 때까지 유지
    함수 밖에서 함수 안쪽에 있는 변수에 접근해라 라고 하면 에러가 난다

첫번째 func2() 실행시 아무것도 안나옴
두번째 fun1() 실행시 세 문장 모두 출력


로컬에서 없어서 인클로징에서 찾음


파이썬은 인자를 넘기면 매개변수에 넘어온 값이 할당되어서 로컬 변수가 된다


함수 안쪽에서 참조하는 x는 글로벌 변수를 가져와서 사용한다


my_list[1] = 5554
로컬에 마이 리스트 있는가? 없다, 인클로징에 있나? 없다, 글로벌에서 가져와서 안쪽에 있는 값을 바꿔준다 (함수 내부 로컬에서만)



출력은 1
호출한 시점이 글로벌이니까 1



출력은 3 2 3



nonlocal은 나를 감싸고 있는 가장 가까운 함수의 네임스페이스에 접근하는 것



출력은 20 error
두번째 프린트 x는 글로벌 x가 없기 때문에 에러

global(글로벌 변수 키워드)는 알고리즘 할 때 도움이 된다, 함수가 여러개 중첩이 된 경우와 같은 특수한 상황에서만 사용된다
함수로 값을 바꾸고자 한다면 매개변수로 넘겨서 사용해라

0개의 댓글