Python - Theory

김기훈·2025년 8월 30일

Python

목록 보기
7/8

전역변수 / 지역변수

전역변수

  • 전역변수를 읽을 때(read) → global 필요 없음.

  • 전역변수에 새로운 값을 할당할 때(write) → global 필요함.

    • 숫자 ,문자열 같은 불변 객체는 함수안에서 새로 할당하는 순간 지역변수(함수 내부 값)로 인식
      • 불변 타입 (int, float, str, tuple …) : global 필요
a = 100 # 전역변수 

def f(): # 함수는 밖에 있는 변수를 안으로 불러오지 못함
    global a # 함수 밖에 있는 전역변수를 안으로 끌고옴
    a = a + 1 # 새로운 값을 할당
    return a
f()

PI = 3.14 
def circle(r,inputpi):
    z = r*r*inputpi
    return z

result = circle(10, PI)
print(result)  
-------------------------------------
a = 100
def f():
    return a + 1   # 전역변수 참조 (OK)

지역변수

  • 딕셔너리,리스트 같은 가변타입의 값은 global을 사용하지 않아도 전역변수의 값을 지역변수로 가져올 수 있음
    • 가변 타입 (list, dict, set …)
won = {'A등급':1000, 'B등급':500, 'C등급':100} # 전역변수 자리
# 전역변수의 값을 지역변수로 가져올 수 있다
def 계산(a, b, c):
    합계 = won['A등급']* a + won['B등급'] *b + won['C등급']*c
    return 합계 # 지역변수 자리 

print(계산(5, 2, 3), '원입니다.')

제너레이터(gen)

  • 파이썬에서 값을 하나씩 만들어내는 객체
  • 리스트처럼 한 번에 모든 값을 메모리에 저장하지 않고, 필요할 때마다(next 호출 시) 값을 생성해서 꺼내줌
def count_up_to(n):
    i = 1
    while i <= n:
        yield i   # return 대신 yield 사용
        i += 1

gen = count_up_to(5)
print(gen)   # <generator object count_up_to at 0x...>
  • def count_up_to(n): ...
    • 일반 함수랑 똑같아 보이지만 함수 안에 yield가 존재하기 때문에 제너레이터 함수로 인식
  • gen = count_up_to(5)
    • 이때 함수가 실행되는게 아님, 특별한 반복기가 만들어져서 gen에 들어간다.
      • 이상태에서 print하면 <generator object count_up_to at 0x...>
gen = count_up_to(5)

print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3
print(next(gen))  # 4
print(next(gen))  # 5
print(next(gen))  # 에러 발생 (StopIteration)

for문

for bread in self.sales:
    total_sales += self.sales[bread] * self.prices[bread]

for bread in self.sales:
    print(f"{bread} 판매: {self.sales[bread]}개")
  • for 변수명이 동일해도 두개의 반복문은 독립적인 반복문 이기 때문에
    • 첫 반복문이 끝나면 bread 변수는 마지막 값만 남아있고
    • 다음 반복문이 시작되면 다시 bread라는 이름의 변수가 새로 사용

  • contact라는 이름의 딕셔너리가 존재하는데 for contact in address_book 이렇게 사용해도 딕셔너리의 이름 contact랑 for 에 들어가는 변수명은 별개로 관리 된다.

  • for contact in address_book

address_book = [
    {"이름": "영희", "번호": "010-3333-4444"},
    {"이름": "민수", "번호": "010-5555-6666"}
]
------------------------------------------------------
address_book = {"이름": "영희", "번호": "010-3333-4444"}
  • address_book가 리스트일 경우 : 한줄씩 출력

    • {'이름': '영희', '번호': '010-3333-4444'}
    • {'이름': '민수', '번호': '010-5555-6666'}
  • address_book가 딕셔너리일 경우

    • 딕셔너리의 키값 : 이름 번호 만 출력

  • 한개의 함수에서 def delete_contact(name):
  • 밑에 다음함수에서 def delete_contact(name):
    • 각각 다른 함수에서 매개변수의 이름이 동일해도 상관없음
      • 함수의 매개변수는 지역변수 이기 때문에 각 함수 안에서만 유효하여 함수가 다르기만 하면 동일해도 전혀 문제 없음

contact["name"].lower() == name.lower():

  • 딕셔너리의 name의 values값의 대소문자 의 구분없이 입력된 이름과 동일할 경우

address_book.sort(key=lambda contact: contact["name"].lower())

  • list.sort()는 원래 원소 자체를 기준으로 정렬

    • key=을 주면 기준값을 정할 수 있음
    • 리스트 안의 각 contact 딕셔너리에서 대소문자 구분없이 name값을 기준으로 정렬
  • 일반 함수 형태

def get_name(contact):
    return contact["name"].lower()

address_book.sort(key=get_name)

```![](https://velog.velcdn.com/images/nike6736/post/7808d6ff-ffd6-40e1-bdfb-464164e7a49c/image.png)


---
### 행맨을 제작하면서 

- result = "" : 문자열인데 안에 글자가 전혀 없는 상태 

- if all( i in self.guesses for i in self.word):
  - all()안에 모든 값이 True일 경우 True를 돌려줌
  - i in self.guesses for i in self.word 
    - 단어 안의 모든 글자가 self.guesses 안에 있는지 검사

---
### 타입 힌팅(type hinting)
- 코드 가독성 ↑, 버그 예방 ↑, IDE 자동완성 ↑.
- 강제성은 없음 : 그냥 "주석" 같은 개념 

#### 변수에 타입 힌트
```python
name: str = "철수"
age: int = 20
is_student: bool = True

함수에 타입 힌트

def add(x: int, y: int) -> int:
    return x + y
  • x: int, y: int → 매개변수 타입
    • -> int → 반환 타입

여러 타입 가능할 때 (Union)

from typing import Union

def repeat(text: str | int, times: int) -> str:
----------------------------------------------------------
def repeat_text(text: Union[str, int], times: int) -> str:
    return str(text) * times
  • text: Union[str, int] : text는 str이거나 int일 수 있음.
  • Python 3.10 이상 (추천 방식)
    • Union[str, int] 대신 파이프(|) 연산자로 여러 타입을 표현

리스트, 딕셔너리 같은 컬렉션

from typing import List, Dict

scores: List[int] = [90, 85, 70]
student: Dict[str, int] = {"철수": 90, "영희": 85}
  • Dict[str, int] : str → 키(key)의 타입/int → 값(value)의 타입

선택적 매개변수 (Optional)

from typing import Optional

def find_student(name: str) -> Optional[int]:
    # 못 찾으면 None 반환
    return None
  • 못 찾으면 None 반환

트랜잭션

  • 데이터베이스에서 여러 작업을 하나의 “논리적인 작업 단위”로 묶어서 처리하는 것
    • 여러 쿼리를 실행했을 때 전부 성공하거나, 아니면 전부 실패해야 하는 상황에서 사용
  • 트랜잭션은 여러 개의 SQL 작업을 하나의 묶음으로 보장해서 데이터 불일치나 오류를 막음
1. 은행 계좌 이체
                    - A 계좌에서 돈을 빼고 → B 계좌에 돈을 넣는 과정이 있음.
                    - 중간에 오류가 나면 한쪽만 실행되면 안 됨 → 트랜잭션 필요.
2. 주문 처리
                    - 상품 재고 감소 → 결제 내역 추가 → 주문 기록 저장.
                    - 이 세 가지 중 하나라도 실패하면 전부 취소해야 함.
3. 게시판/블로그
                    - 글 작성 + 첨부파일 저장 + 태그 연결을 묶어서 처리.
-- 트랜잭션 시작
START TRANSACTION;

    UPDATE accounts SET balance = balance - 1000 WHERE id = 1;  -- A에서 출금
    UPDATE accounts SET balance = balance + 1000 WHERE id = 2;  -- B에 입금

-- 문제 없으면 확정
COMMIT;

-- 중간에 에러 나면 취소
ROLLBACK;
  • COMMIT: 트랜잭션을 확정해서 DB에 반영
  • ROLLBACK: 트랜잭션을 취소해서 원래 상태로 되돌림
profile
안녕하세요.

0개의 댓글