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

반응형