파이썬 LEGB 규칙

2024. 5. 19. 16:21Python/Python Programming

반응형

파이썬 LEGB 규칙: 코드 이해를 위한 다양한 예제

파이썬 LEGB 규칙은 변수 범위를 명확하게 정의하여 코드 오류를 방지하고, 코드 가독성을 향상시키며, 코드 효율성을 증대하는 데 중요한 역할을 합니다.

이 규칙을 이해하기 위해서는 다양한 예제를 통해 살펴보는 것이 가장 효과적입니다.

 

1. LEGB 규칙 기본 예제

1.1 로컬 변수

def add_numbers(a, b):
  sum = a + b
  print(sum)  # 7 출력

add_numbers(3, 4)  # 함수 호출
add_numbers(5, 6)  # 함수 호출
 

위 예시에서:

  • def add_numbers(a, b): 는 add_numbers라는 함수를 정의합니다.
  • sum = a + b 는 함수 내에서 로컬 변수 sum을 선언하고 값을 할당합니다.
  • print(sum) 는 함수 내에서 로컬 변수 sum을 사용합니다.
  • add_numbers(3, 4) 와 add_numbers(5, 6) 는 함수를 두 번 호출합니다. 각 호출 시마다 로컬 변수 sum은 새롭게 생성되고 해당 호출 내에서만 사용됩니다.

1.2 내포된 범위

def outer_function():
  message = "안녕하세요!"

  def inner_function():
    print(message)  # "안녕하세요!" 출력

  inner_function()

outer_function()
 

위 예시에서:

  • outer_function() 은 외부 함수입니다.
  • message = "안녕하세요!" 는 외부 함수의 로컬 변수 message를 선언하고 값을 할당합니다.
  • def inner_function(): 는 외부 함수 내에 정의된 내포된 함수입니다.
  • print(message) 는 내포된 함수에서 외부 함수의 로컬 변수 message에 접근하여 출력합니다.

1.3 전역 변수

message = "환영합니다!"

def greet():
  print(message)  # "환영합니다!" 출력

greet()
 

위 예시에서:

  • message = "환영합니다!" 는 모듈의 맨 위에서 전역 변수 message를 선언하고 값을 할당합니다.
  • def greet(): 는 함수를 정의합니다.
  • print(message) 는 함수 내에서 전역 변수 message에 접근하여 출력합니다.

1.4 내장 범위

print("Hello, World!")  # "Hello, World!" 출력
 

위 예시에서:

  • print("Hello, World!") 는 내장 함수 print()를 사용하여 문자열을 출력합니다. print() 함수는 파이썬 언어에 기본적으로 포함된 내장 함수입니다.

2. LEGB 규칙 활용 예제

2.1 로컬 변수 사용

def calculate_area(length, width):
  area = length * width
  return area

rectangle_area = calculate_area(5, 3)
print(rectangle_area)  # 15 출력
 

위 예시에서:

  • def calculate_area(length, width): 는 length와 width를 입력 값으로 받아 사각형의 넓이를 계산하는 함수를 정의합니다.
  • area = length * width 는 함수 내에서 로컬 변수 area를 선언하고 사각형의 넓이를 계산합니다.
  • return area 는 계산된 넓이를 함수 리턴값으로 지정합니다.
  • rectangle_area = calculate_area(5, 3) 는 calculate_area 함수를 호출하여 5 x 3 사각형의 넓이를 계산하고 결과를 rectangle_area 변수에 저장합니다.
  • print(rectangle_area) 는 rectangle_area 변수의 값을 출력합니다.

2.2 내포된 함수 활용

  even_numbers = []
  for number in numbers:
    if is_even(number):
      even_numbers.append(number)
  return even_numbers

numbers = [1, 2, 3, 4, 5, 6]
even_result = find_even_numbers(numbers)
print(even_result)  # [2, 4, 6] 출력
 

위 예시에서:

  • def find_even_numbers(numbers):numbers 리스트를 입력 값으로 받아 리스트 내의 짝수만 추출하는 함수를 정의합니다.
  • def is_even(number): 는 내포된 함수로, 입력 값 number가 짝수인지 판단합니다.
  • even_numbers = [] 는 짝수를 저장할 빈 리스트를 생성합니다.
  • for number in numbers:numbers 리스트의 각 요소를 반복합니다.
  • if is_even(number): 는 현재 반복되는 요소가 짝수인지 판단합니다.
  • even_numbers.append(number) 는 현재 반복되는 짝수 요소를 even_numbers 리스트에 추가합니다.
  • return even_numbers 는 추출된 짝수 리스트를 함수 리턴값으로 지정합니다.
  • numbers = [1, 2, 3, 4, 5, 6] 는 입력 리스트를 생성합니다.
  • even_result = find_even_numbers(numbers)find_even_numbers 함수를 호출하여 numbers 리스트 내의 짝수만 추출하고 결과를 even_result 변수에 저장합니다.
  • print(even_result)even_result 변수의 값을 출력합니다.

2.3 전역 변수 사용 제한

def greet():
  global message  # 'global' 키워드 사용
  message = "반갑습니다!"
  print(message)  # "반갑습니다!" 출력

message = "안녕하세요!"  # 전역 변수 선언
greet()
print(message)  # "안녕하세요!" 출력
 

위 예시에서:

  • def greet(): 는 함수를 정의합니다.
  • global message 는 함수 내에서 전역 변수 message를 사용할 것을 선언합니다.
  • message = "반갑습니다!" 는 함수 내에서 전역 변수 message의 값을 변경합니다.
  • print(message) 는 함수 내에서 변경된 전역 변수 message의 값을 출력합니다.
  • message = "안녕하세요!" 는 모듈의 맨 위에서 전역 변수 message를 선언하고 값을 할당합니다.
  • greet() 는 함수를 호출합니다.
  • print(message) 는 함수 호출 후에도 전역 변수 message의 값이 변경되지 않았음을 확인합니다.

2.4 변수 범위 변경

  • result = calculate_square(5)calculate_square 함수를 호출하여 5의 제곱을 계산하고 결과를 result 변수에 저장합니다.
  • print(result)result 변수의 값을 출력합니다.

3. LEGB 규칙 오류 예제

3.1 로컬 변수 접근 오류

def add_numbers(a, b):
  sum = a + b
  print(sum)  # 7 출력

def subtract_numbers(c, d):
  sum = c - d  # 오류: 'sum' 변수가 정의되지 않음

subtract_numbers(10, 5)
 

위 예시에서:

  • def add_numbers(a, b):ab를 더하는 함수를 정의합니다.
  • sum = a + b 는 함수 내에서 로컬 변수 sum을 선언하고 값을 할당합니다.
  • print(sum) 는 함수 내에서 로컬 변수 sum을 사용합니다.
  • def subtract_numbers(c, d):cd를 빼는 함수를 정의합니다.
  • sum = c - d 는 함수 내에서 sum 변수를 사용하려고 하지만, add_numbers 함수 내에서 선언된 로컬 변수 sum에 접근할 수 없기 때문에 오류가 발생합니다.

3.2 전역 변수 변경 오류

message = "환영합니다!"

def greet():
  print(message)  # "환영합니다!" 출력

message = "반갑습니다!"  # 전역 변수 값 변경
greet()
print(message)  # "반갑습니다!" 출력

def change_message():
  global message  # 'global' 키워드 사용하지 않음
  message = "안녕하세요!"

change_message()
print(message)  # "반갑습니다!" 출력

 

위 예시에서:

  • message = "환영합니다!" 는 모듈의 맨 위에서 전역 변수 message를 선언하고 값을 할당합니다.
  • def greet(): 는 함수를 정의합니다.
  • print(message) 는 함수 내에서 전역 변수 message의 값을 출력합니다.
  • message = "반갑습니다!" 는 모듈의 맨 위에서 전역 변수 message의 값을 다시 변경합니다.
  • greet() 는 함수를 호출합니다.
  • print(message) 는 함수 호출 후에도 전역 변수 message의 값이 변경되었음을 확인합니다.
  • def change_message(): 는 함수를 정의합니다.
  • message = "안녕하세요!" 는 함수 내에서 전역 변수 message의 값을 변경하려고 하지만, global 키워드를 사용하지 않기 때문에 변경되지 않습니다.
  • change_message() 는 함수를 호출합니다.
  • print(message) 는 함수 호출 후에도 전역 변수 message의 값이 변경되지 않았음을 확인합니다.

4. LEGB 규칙 관련 추가 정보

  • 변수 범위 확인 도구: PyCharm과 같은 IDE는 변수 범위를 시각적으로 확인할 수 있는 도구를 제공합니다.
  • 코드 리뷰: 코드 리뷰를 통해 LEGB 규칙 위반 여부를 확인하고 개선할 수 있습니다.
  • 테스트 코드 작성: 테스트 코드를 작성하여 LEGB 규칙 위반으로 인한 오류를 방지할 수 있습니다.

5. 요약 및 마무리

 

파이썬 LEGB 규칙은 변수 범위를 명확하게 정의하여 코드 오류를 방지하고, 코드 가독성을 향상시키며, 코드 효율성을 증대하는 데 중요한 역할을 합니다.

본 블로그 게시글에서 다양한 예제를 통해 LEGB 규칙을 이해하고, 실제 코딩 실무에 적용하는 방법을 익혔기를 바랍니다.

반응형