Python
4. Python 함수와 LEGB rule
개발자 뭄뭄
2022. 8. 1. 00:30
반응형
1. 함수
주로 코드의 재사용을 위해서 함수를 사용한다.
# 함수 선언하기 (정의하기)
def 함수이름(# 선택사항으로 parameter를 넣을 수 있다) :
pass
# 들여쓰기가 되어있는 부분은 함수의 범위에 속한다.
# 예시
def do_nothing():
pass
# 함수 호출하기 (사용하기)
함수이름() 을 사용한다.
# 예시
do_nothing()
return
결과를 반환하는 함수. 변수에 함수의 결과를 저장할 수 있다. 또는 종류에 따라 식에서 함수 그대로를사용할 수 있다.
💡
주의 print는 결과를 출력할 뿐, 결과를 반환하는 것이 아니다!!
두 개 이상의 값을 반환하고 싶다면? tuple 혹은 dictionary 사용
argument (인수) vs parameter (매개변수)
- parameter : 함수 내부에서, 정의할 때 쓰는 변수
- argument : 함수 외부에서, 호출할 때 쓰는 변수
def echo (messgae) :
return message # message는 parameter
echo ( "안녕하세요" ) # 안녕하세요는 argument
인수의 종류
- 위치인수 ( 위치가 어디있는지 알아야 한다.)
- 키워드 인수 ( 순서에 상관없이 상관 가능. 매개변수에 상응하는 이름을 인수에 지정하는 방법)💡주의 위치인수 → 키워드 인수 순서로 사용해야 한다. 키워드 인수 → 위치인수 사용 (x)
정해지지 않은 여러개의 인수를 처리하기
- 가변인자 (*args)
def sum_all(*numbers) # numbers 에 숫자 몇 개가 들어올 지 모르는 상황 result = 0 #총 합 저장하기 for number in numbers: result += number return result print(sum_all(1,2,3)) print(sum_all(1,2,3,4,5,6)) --- def family (father, mother, *others): print("아버지" + father) print("어머니" + mother) print("그외 : ") for name in others: print(name) family("정성남", "신여진", "정하경", "정하림") # 결과는 아버지:정성남 어머니:신여진 그외 : 정하경 정하림 으로 출력이 된다. # family ("정성남") 이런식으로 하나만 적게 되면 error가 발생한다. 즉 순서가 정해져 있다.
- 가변키워드인자 (**kwargs)
# 몇개의 키워드를 받을 지 모르는 함수를 정의할 때 사용한다. # *kwargs는 딕셔너리로 묶어서 처리된다. def family(**kwargs) for key, value in kwargs.items(): print(key, ":", value) family(father="아버지", mother="어머니", son="아들") # 출력결과는 father : 아버지, mother : 어머니, son : 아들 # 이렇게 출력된다. # 입력할 때 순서를 다르게 한다면? 당연히 출력 결과도 다르다!
- 패킹, 언패킹
패킹 : 여러개의 데이터를 묶어서 하나의 변수에 할당 언패킹 : 시퀀스 속의 요소들을 여러개의 변수에 나눠서 할당 패킹 / 언패킹 시에 변수의 개수 == 할당하고자 하는 요소의 개수
2. 범위 (Scope)
LEGB와 에어콘 리모콘을 찾으러 떠나는 여행 이야기를 기억하자!
💡
L : Local Scope (지역범위) : 함수, 조건문, 코드블록 …
E : Enclosed Scope ≠ global scope
G : Global Scope : 파이썬 최상단 (파이썬 파일) 에 위치한 범위
B : Built-in Scope : 모든 것을 담고 있는 범위 (정의하지 않아도 사용할 수 있는 것) ex. print()
a = 0 # Global scope
b = 1 # Global scope
def enclosed(): #여기부터 enclosed scope 시작
a = 10
c = 3
def local (c): #여기부터 local scope 시작
print(a,b,c)
local(300) #여기까지가 local scope의 범위
print(a,b,c) # 여끼까지가 enclosed scope의 범위
enclosed()
print(a,b)
# 결과는 (10, 1, 300) (10, 1, 3) (0, 1)
함수 안에서 함수 밖의 변수를 수정하고 싶다면? → global 키워드를 사용한다.cf) 같은 코드 블록 내에서 global 문 앞에서 같은 이름의 변수 정의 불가능!!
a = 10 global a = 30 # 불가능!!
a = 10
def function ():
a = 15
print(a)
function()
print(a)
# 결과는 15, 10
---
a = 10
def function ():
global(a)
a = 3
print(a)
function()
print(a)
# 결과는 3, 3
# global(a) 와 a = 3 순서를 바꿔서 작성하면 에러!! 주의!!
nonlocal
def function():
global out
out = 3
function()
print(out) # global scope에서 선언한 적이 없음에도 불구하고 3이 출력된다
---
def func1():
def func2():
nonlocal y
y = 2
func2()
print(y)
func1()
# 에러가 발생한다. gobal 범위에서 선언이 되어도! 에러가 발생한다.
# local 범위 안에서 선언을 해 주어야 한다.
함수에서 선언된 변수는 기본적으로 local scope 이다.
해당 scope에서 변수를 찾을 수 없는 경우 L → E → G → B
순으로 변수를 검색한다.
해당 범위에서 찾을 수 없는 변수를 사용할 때 읽기는 할 수 있지만, 수정은 불가능 하다!
→ global, nonlocal 을 이용해서 수정 가능하지만 최소한으로 사용하자.
3. 함수의 응용
list에서 문자열로 바꿀 때 쓰이는 함수 .join
"".join(a) 의 응용
# 앞에는 join 할 때 그 사이사이에 붙을 것
# a는 함수열만 처리 가능하다.
예를 들어서, a = [”there”, “is”, “a”, “mouse”]
“ ”.join(a) = ‘there is a mouse’
“/”.join(a) = ‘there/is/a/mouse]
Uploaded by N2T
반응형