global 필요 없음.global 필요함.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)
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), '원입니다.')
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...>
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 bread in self.sales:
total_sales += self.sales[bread] * self.prices[bread]
for bread in self.sales:
print(f"{bread} 판매: {self.sales[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가 리스트일 경우 : 한줄씩 출력
address_book가 딕셔너리일 경우
contact["name"].lower() == name.lower():
address_book.sort(key=lambda contact: contact["name"].lower())
list.sort()는 원래 원소 자체를 기준으로 정렬
일반 함수 형태
def get_name(contact):
return contact["name"].lower()
address_book.sort(key=get_name)
```
---
### 행맨을 제작하면서
- 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
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일 수 있음.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)의 타입from typing import Optional
def find_student(name: str) -> Optional[int]:
# 못 찾으면 None 반환
return None
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;