print('Hello!')
#print 함수 팁: 코드잇 '패트와매트' 님
#print 함수는 다음과 같이 이루어져 있음
#print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
#seq = (함수의 인자들이 쉼표(,)로 연결되어 있을 때, 출력되는 문자를 지정 가능 (기본 '스페이스'[ ])
#end = print문이 끝날 때, 출력되는 문자를 지정 가능 (기본 '줄바꿈' [\n])
# 정수형, 정수형 연산 => 정수형 [나눗셈 제외][값이 유리수로 떨어질 때 제외 => 소수형]
# 정수형, 소수형 연산 => 소수형
# 기본적인 사칙 연산의 우선순위는 산술연산과 동일
# 덧셈 +
print(1 + 2) # 3
print(1.9 + 3.1) # 5.0
# 뺄셈 -
print(1 - 2) # -1
print(3 - 0.2) # 2.8
# 곱셈 *
print(11 * 3) # 33
print(3.2 * 3) # 9.6
# 나눗셈 /
# 정수형과 정수형의 연산도 나눗셈은 항상 소수형으로 나옴
print(12 / 4) # 3.0
print(1 / 3) # 0.3333333333333333
#나머지 %
print(5 % 3) # 2
print(5.0 % 3) # 2.0
# 몫[버림나눗셈, floor division] //
print(5 // 3) # 1
print(8.0 // 3) # 2.0
# 거듭제곱 **
print(2 ** 3) # 2^3 = 8
# 반올림(round) round()
# 가장 가까운 정수로 반올림
round(숫자)
round(1.8) #2.0
# 입력된 소숫점 자릿수 까지 반올림
round(숫자, 소수점자릿수)
round(3.141592, 4)
#3.1416
# 반올림 관련하여 여러 방식이 있는데, python 3.xx 부터 채택하고 있는건
# round to nearest even 이라 하여 가장 가까운 짝수로 만들기 위해 출력하게됨
round(3.5) #4
round(4.5) #4
round(5.5) #6
#절대값
print(abs(-3)) # 3
#거듭제곱
print(pow(3, 2)) # 9 3 ** 2 와 동일
#(몫, 나머지)
print(divmod(3, 2)) # (1, 1) (x // y, x % y)
# 복소수
number = 3 + 2j
print(number.real) # 3 실수부
print(number.imag) # 2 허수부
print(number.conjugate()) # 켤레복소수
python(bin(10)) # 0b1010 10진수 -> 2진수 문자열
python(oct(10)) # 0o12 10진수 -> 8진수 문자열
python(hex(10)) # 0xa 10진수 -> 16진수 문자열
# https://www.codeit.kr/community/threads/10458
> python 연산자의 우선순위
나). 문자열(string)
같은 종류의 따옴표로 이루어진 문장
#다음과 같이 꼭 같은 종류의 따옴표(" ", ' ')로만 감싸주어야 함
"우리가 서로 사랑함은"
'그가 먼저 우리를 사랑하셨음이라'
# 같은 종류의 따옴표를 문장 내에 사용하려면 \(역슬래시)를 앞에 기입해주어야 가능
'Don\'t be afraid, I\'ll be with you'
# 혹은 ''' ''' 이나 """ """과 같이 따옴표를 세 번 써주어 만든 블록문자열을 사용하기
""" "두려워 하지 말라 내가 너와 함께함이라" """
''' '놀라지 말라 나는 네 하나님이 됨이라' '''
print('%(name)s은 %(month)d월 %(date)d일 입니다.' % {'name': '성탄절', 'month': 12, 'date' : 25})
#성탄절은 12월 25일 입니다.
👉 변환 플래그: 일부 변환 유형에 영향을 주는 항목
플래그는 여러 플래그가 동시에 존재할 수 있으며 일부 플래그의 경우 상위 플래그에 의해 효과가 중첩되지 않고 사라집니다.
변환 플래그
뜻
'#'
값 변환에 있어서 특정 대체 형식을 사용합니다 8진수 변환, 16진수 변환 에서 숫자 앞에 붙는 '0o' '0x'가 여기에 해당합니다.
'0'
'최소 필드 폭' 으로 인하여 왼쪽 여백이 생길경우 해당 자리를 0으로 채웁니다.
'-'
변환 된 값을 왼쪽으로 정렬합니다. [ '0' 플래그보다 상위 플래그이며, 최소너비폭이 변환된 출력결과보다 길 경우, 출력결과의 뒤에 그 차이 만큼 ' '(공백)으로 자리를 채웁니다.
' '(공백)
양수 일경우 변환 결과 앞에 빈 칸을 남겨둡니다. (음수와 문자열은 상관 없습니다)
'+'
부호 문자 ('+' 혹은 '-' )가 변환된 결과 앞에 놓입니다. [ ' '(공백) 플래그 보다 상위 플래그입니다.] (문자열은 상관 없습니다)
# □ = 공백 입니당 (실제로는 빈 여백이나 이해를 돕기위해 □를 활용합니다.)
#1. '#' 플래그
print('%o' %(613)) # 1145
print('%#o' %(613)) # 0o1145
print('%x' %(1225)) # 4c9
print('%#x' %(1225)) # 0x4c9
#2. '0' 플래그
print('%05d' %(613)) # 00613
# 길이수정자는 변환형식을 포함하여 계산합니다
#'613' 3글자의 남은 부분을 '0'으로 채워 5글자로 만듭니다.
#3. '-' 플래그
print('%-5d' %(613)) # 613□□
#'0 플래그와 - 플래그 둘 다 같이 사용할 경우 '-' 플래그가 우선됩니다.
print('%-05d' %(613)) # 613□□
#4. ' '(공백) 플래그
print('% d' %(613)) # □613
print('% d' %(-613)) # -613
# ' '(공백) 플래그 & 최소 필드폭 수정시
print('% 5d' %(613)) # □613□
print('% 5d' %(-613)) # -613□
#5. '+' 플래그
print('%+d' %(613)) # +613
print('%+d' %(-613)) # -613
# '+' 플래그와 ' '(공백) 플래그가 같이 사용될 경우 '+' 플래그가 우선됩니다.
print('%+ d' %(613)) # +613
# '+'플래그와 '-'플래그(왼쪽 정렬을 위해서 -> 추가 공백이 뒤에 붙도록),
#' '플래그 & 길이 수정자 를 변환하면?
print('%+- 5d' %(613)) # +613□
👉 최소 필드 폭: 해당 문자열의 출력 너비를 지정함 (현재 변환 결과의 너비를 포함 합니다)
너비가 변환 길이보다 클 경우엔 차이 만큼 왼쪽에 여백을 추가합니다. [플래그에 따라 여백의 위치가 달라짐]
너비가 변환 길이보다 작을 경우엔 아무일도 일어나지 않습니다.
# □ = 공백 [이해하기 쉽도록 ' '를 '□'으로 바꾸어 표기합니다]
#플래그가 없는 경우
print('%7d'% 1225) # □□□1225 [길이: 7 글자]
print('%5s' % '성탄절') # □□성탄절 [길이: 5 글자]
#'0' 플래그: 문자열엔 영향을 주지 못함
print('%07d'% 1225) # 0001225 [길이: 7글자]
print('%05s' % '성탄절') # □□성탄절 [길이: 5글자]
#'-' 플래그: 왼쪽 정렬
print('%-7d' % 1225) # 1225□□□ [길이: 7글자]
print('%-5s' % '성탄절') # 성탄절□□ [길이: 5글자]
#' ' 플래그: 양수일경우 공백 추가 음수일 경우 효과 X
print('% 7d' % 1225) # □□□1225 [길이: 7글자]
print('% 7d' % -1225) # □□-1225 [길이: 7글자]
#최소 너비 폭이 변환 결과의 길이보다 작아도 ' '플래그에서
#양수앞에 더하여 준 공백은 사라지지 않음
print('% 3d' % 1225) # □1225 [길이: 5글자 , 최소너비폭: 3]
#'+' 플래그: 양수일 경우'+' 음수일 경우 '-' 부호를 붙여줌
print('%+7d' % 1225) # □□+1225 [길이: 7글자]
print('%+7d' % -1225) # □□-1225 [길이: 7글자]
#최소 너비 폭이 변환 결과의 길이 보다 짧은 경우:
#여백도 추가되지 않고 아무런 효과가 없음
print('%2d' % 1225) #1225 [길이: 4글자, 최소너비폭: 2] <- 최소너비폭이 무효화됨
print('%1s' % '성탄절') #성탄절 [길이: 3글자, 최소너비폭: 1] <- 최소너비폭이 무효화됨
👉 .정밀도: 반올림하여 '정밀도' 자리까지 표기합니다.
d와 같이 소수점이 없으나 숫자형인 경우엔 왼쪽에 0을, s와 같은 문자열 표기방식엔 공백으로 채웁니다.
s와 같은 문자열 에서 정밀도가 문자열의 길이보다 작다면, 문자열의 길이가 정밀도 만큼만 출력됩니다.
#실수형: 소수점 아래 '정밀도' 자리까지 반올림하여 표기
print('%.2f' % 3.141592) # 3.14
#정수형: 변환 결과의 길이가 '정밀도' 보다 짧을경우
#그 차이만큼 변환 앞에 0을 추가해줌
# '0플래그''최소너비폭'과 비슷
print('%.5d' % 613) # 00613
print('%05d' % 613) # 00613
#문자열: 문자열의 길이가 '정밀도'보다 길 경우 '정밀도' 만큼 잘림
print('%.2s' % '안녕하세요') # '안녕' [정밀도: 2, 글자 길이: 2]
👉 길이수정자: 길이 수정자 (h, l, L)를 사용할 수 있으나, 파이썬에선 필요하지 않기 때문에 사용해도 별 다른 효과가 없습니다
print('%i' %(613)) 👉 613 print('%i' %(-613)) 👉 -613 python에선 %d 와 %i가 서로 같음 : [링크]
o
부호 있는 8진수 값
print('%o' %(613)) 👉 1145 print('%o' %(-613)) 👉 -1145 🌟'#' 플래그 사용시 변환 앞에 '0o'가 추가됨 print('%#o' %(613)) 👉 0o1145
u
부호 있는 십진수 정수 표기
print('%u' %(613)) 👉 613 print('%u' %(-613)) 👉 -613 PEP 237에 따라 %d 와 동일하게 변경됨 : [링크]
x
부호 있는 16진수 (소문자)
print('%x' %(1225)) 👉 4c9 print('%x' %(-1225))👉 -4c9 🌟'#' 플래그 사용시 변환 앞에 '0x'가 추가됨 print('%#x' %(1225))👉0x4c9
X
부호 있는 16진수 (대문자)
print('%X' %(1225)) 👉 4c9 print('%X' %(-1225))👉 -4c9 🌟'#' 플래그 사용시 변환 앞에 '0X'가 추가됨 print('%#X' %(1225))👉0X4c9
e
부동 소수점 지수 형식 (소문자)
[시간 관계상 잠시 보류]
E
부동 소수점 지수 형식 (대문자)
f
F
g
G
c
단일 문자(정수 또는 길이가 1인 문자열)
print('%c' , %
r
s
a
%
변환되지 않고, 결과에 '%' 문자가 표시됨
print('%%' %(1))
※ 8진수와 16진수의 '#'는 변환 플래그로 '0o' '0x' 등과 같이 정해진 형식을 추가해주는 역할
자세한 내용은 아래 사이트에서 확인 가능
^ str.format 에서 치환 필드 이용방법
^ % format vs str.format()에 관련하여
^ f-string 에서 치환 필드 이용방법 (위로 스크롤 할 시 'r, b' 접두사에 관련한 정보도 포함되어 있음)
라). 불 대수
- 수학자 '조지 불(George Boole)'의 이름을 따서 만든 2진법 논리학 수리 구조
- 일상적인 '논리'를 수학적으로 표현한 것
- 불 대수의 값: 진리 값[True, False]
- 불 대수의 기본 연산: and or not
연산 종류
x
y
결과 값
AND [x and y]
True
True
True
True
False
False
False
True
False
False
False
False
OR [x or y]
True
True
True
True
False
True
False
True
True
False
False
False
NOT [not x]
NOT 연산은 입력되는 값과 정 반대 값이 반환됨. (True -> False , False -> True)
True
False
False
True
마). 불린형(Boolean)
# 불린 (Boolean)
# 따옴표(", ') 없이 입력해주어야 함
print(True)
print(False)
# AND 연산: 양쪽 모두 True일 때만 True
print(True and True) # True
# OR 연산: 양쪽 중 하나라도 True가 있을 경우 True
print(True or False) # True
# NOT 연산: 결과 값 반전 (False -> True / True -> False)
print(not True) # False
# 기본 적인 숫자 비교 (초과, 미만, 이상, 이하, 일치 불일치)
print( 2 > 1 ) #True
print( 2 < -1 ) #False
print( 2 >= 2 ) #True
print( 3 <= 2 ) #False
print( 2 == 2 ) #True
print( 2 != 2 ) #False
# 특별한 경우(ex 괄호)가 아닐 경우엔 왼쪽에서 부터 오른쪽으로 계산
print(7 == 7 or (4 < 3 and 12 > 10))
# False and True -> False
# True or False -> True
# True
#1. 변수 [지정 연산자(=)를 통해 오른쪽에 있는 값을 왼쪽에 있는 이름에 저장(할당)]
이름 = 값
x = 3
myAge = 23
myName = "J4BEZ"
# 추가
x = 7
x = x +1
# x 에 저장되는 값은 x에 1이 증가된 8 이 저장됨
^변수 명명 규칙
^변수 할당시 처리 순서
^ 변수에 다른 값을 할당할 때 저장의 물리적 위치가 달라짐에 대하여
나). 함수(Function):
- 행동을 저장
- 내장 함수(builtin_function_or_method): print()함수 와 같이 python 개발자들이 미리 구현해놓은 함수들
- 파라미터(Parameter): 함수의 동작에 변화를 주기 위해 넘겨주는 값
#2. 함수
함수(파라미터)
print(hello)
#함수 정의
def 함수이름(파라미터): # 이 부분을 첫 줄을 '함수의 헤더'라고 함
함수내용
함수내용
def 함수이름(파라미터1, 파라미터2):
함수내용
함수내용
def hello(name):
print("Hello, " + name)
def returnAge(name, age):
print(name + "is" + age + "years old")
#함수 호출
함수이름(파라미터)
hello("J4BEZ")
#Hello, J4BEZ
returnAge("J4BEZ", 23)
#J4BEZ is 23 years old
+ return 문:
- 함수에서 전달해주는 결과를 특정 자료형으로 반환해주는 값
[python에선 함수에 따로 return 값을 설정해주지 않으면 None이 return됨]
- 함수를 즉시 종료: pass 와 같은 역할
def square(x):
print("함수 시작")
return x * x # return으로 함수는 종료됨
print("함수 끝") # <- 실행되지 않는 DeadCode
- return과 print의 차이
return: 함수를 선언한 위치에 함수의 계산 결과를 돌려주는 키워드
print(): (괄호)안의 내용을 콘솔에 출력시켜주는 함수
def print_square(x):
print( x * x )
def get_square(x):
return x * x
print_square(3) #print( 3 * 3 ) -> 콘솔에 9가 출력됨
#console#: 9
get_square(3) # 3 * 3 -> get_square(3) 호출 자리에 9가 반환됨 콘솔엔 출력 X
#console#:
print(get_square(3)) # print( 3 * 3 ) -> get_square(3) 호출자리에 9가 반환됨
# 그 이후 콘솔에 9가 출력됨
#console#: 9
print(print_square(3)) #print(print(3 * 3)) -> print(3 * 3)으로 콘솔에 9가 출력됨
# print함수는 설정된 반환 값이 없어서 None이 반환됨
# print(None) -> 콘솔에 None이 출력됨
#console#: 9
# None
+ 옵셔널 파라미터(Optional Parameter)
- 파라미터에게 '기본값(default value)'을 설정해주는 것
- 기본값을 설정해두면 함수를 호출할 때 해당 파라미터엔 값을 꼭 넘겨주지 않아도 됨
- 모든 옵셔널 파라미터는 가장 마지막에 있어야함
#optional parameter
def cat(name, age, color = "노란색"):
print(f"이름은 {name}, 현재 나이는 {age}살 이고")
print(f"색깔은 {color}인 고양이예요")
# *args 가변 인자를 이용하는 방법
#추가로 전해지는 인자 값들이 tuple 자료구조로 전해짐
#tuple형으로 전해지기 때문에 % 포맷팅 대신 f-string 방식을 권장
def tabby_cat(name, age, *colors):
print(f"이름은 {name}, 현재 나이는 {age}살 이고")
print(f"색깔은 {colors}인 고양이예요")
# **kwargs 가변 인자를 이용하는 방법
# 추가로 전해지는 인자 값들이 dictionary = {키 : 값} 자료구조로 전해짐
#dictionary형으로 전해지기 때문에 % 포맷팅 대신 f-string 방식을 권장
def kw_tabby_cat(name, age, **colors):
print(f"이름은 {name}, 현재 나이는 {age}살 이고")
print(f"색깔은 {colors}인 고양이예요")
cat("J4BEZ", 0.2) #옵셔널 파라미터[default parameter] 이용시
#이름은 J4BEZ, 현재 나이는 0.2살 이고
#색깔은 노란색인 고양이예요
cat("러블", 1, "회색") #옵셔널 파라미터 변경
#이름은 러블, 현재 나이는 1살 이고
#색깔은 회색인 고양이예요
tabby_cat("고등어", 2, "검정색", "흰색") # *args 이용
#이름은 고등어, 현재 나이는 2살 이고
#색깔은 ('검정색', '흰색')인 고양이예요
kw_tabby_cat("삼색이", 2, fur_color1 = "노란색", fur_color2 = "흰색", fur_color3 = "검정색") #**kwargs 이용
#이름은 삼색이, 현재 나이는 2살 이고
#색깔은 {'fur_color1': '노란색', 'fur_color2': '흰색', 'fur_color3': '검정색'}인 고양이예요
^_ 가변 파라미터 *args와 **kwargs에 대하여
^_ positional only vs positional or keyword vs keyword only
^_ 가변 positional 인자, 가변 keyword 인자 개념 및 호출 방법과 순서 & 지키지 않을시 오류
^_ positional only 방식 (pos1, pos2, /, pos_or_key)이 처음 등장한 'PEP 570' [Python 3.8 ~ ]
^_ parameter 호출 순서에 관하여
^_ python 함수에 대한 모든 것
+ 다). Syntactic Sugar
- 자주 쓰이는 표현을 더 간략하게 쓸 수 있게 해주는 문법
ex). 확장치환문 (다른 산술 연산자들도 가능)
기존
x = x + 1
x = x - 2
x = x * 3
x = x / 4
x = x % 5
sugar
x += 1
x -= 2
x *= 3
x /= 4
x %= 5
- Python에선 Python 만의 Pythonic한 Synatic Sugar들이 존재함
#1. 논리 연산자 병합
#기존
if((a < b) and (b <= c)):
...
#sugar
if(a < b <= c):
...
#2. 삼항 연산자 (Ternary expressions)
#기존
if(condition):
x = true_option
else:
x = false_option
#sugar
x = true_option if condition else false_option
#3. 다중 할당 (Multiple Assignment): 같은 값일 경우
# 기존
a = 100
b = 100
c = 100
# sugar
a = b = c = 100
#4. Tuple unpacking
# 서로 다른 값을 다중 할당해줄 때 유용함
# 기존
a = 1
b = 2
c = 3
#sugar
a, b, c = 1, 2, 3
# 리스트 혹은 튜플과 같은 자료구조
# 기존
li = [1, 2, 3, 4]
a = li[0]
b = li[1]
c = li[2]
d = li[3]
# sugar
# 단, 할당하는 요소의 갯수와 자료구조의 길이가 서로 일치해야 합니다.
li = [1, 2, 3, 4]
a, b, c, d = li
# 만약 다를 경우
li = [1, 2, 3, 4, 5]
# *로 넘기거나
a, *b, c = li
# a = 1, b = [2, 3, 4], c = 5
# 슬라이싱 하기
a, b, c = li[:3]
# a = 1, b = 2, c = 3
#5. pythonic swap
- tuple unpacking을 응용한 변수 교환 방법
# 기존
tmp = a
a = b
b = tmp
# sugar
a, b = b, a
#6. '문자열'[index] 응용 방법
- syntactic sugar 라고 하기엔 애매하지만 그래도 꽤 유용한 방법
# '문자열' 은 [index]로 접근할 수 있음과
# True는 1 .False는 0 값을 갖는 것을 응용한 방법입니다.
print('FT'[True]) # T
print('NY'[False]) # N
#7. Comprehension + List Comprehension
- 새로운 '리스트'를 만들 때 사용할 수 있는 간단한 표현식
li = []
for 요소 in 범위:
if 조건:
li.append(계산된요소)
# 을 다음과 같이 변환 가능
li = [계산된요소 for 요소 in 순환가능한객체 if 조건]
# if 조건: 는 필요에따라 생략 가능
# 다음과 같이 if문이 필요없는경우
li = [x * x for x in range(1, 10)]
# li = [1, 4, 9, 16, 25, 36, 49, 64, 81]
# 홀수 리스트 생성하기
#기존
li = []
for odd in range(1, 10):
if odd % 2 != 0:
li.append(odd)
print(li) # [1, 3, 5, 7, 9]
#sugar
li = [odd for odd in range(1, 10) if odd % 2 != 0]
print(li) # [1, 3, 5, 7, 9]
- 다중 for문 등에 유용▼
x = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]
q = [q for y in x for z in y for q in z]
print(q)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+ Set Comprehension
- list Comprehension과 생김새는 비슷하나 set 자료구조 생성
#기존
st = set()
for 요소 in 범위:
if 조건:
st.add(계산된요소)
#sugar
st = {계산된요소 for 요소 in 순환가능한객체 if 조건}
# 역시 if문 불필요시 생략 가능
- 중복된 요소를 허용하지 않는 set 이니 순서는 중요하지 않아도 중복된 요소가 없어야할 경우에 사용하면 유용
# 256의 약수 구하기
# 기존
st = set()
for num in range(1, 257):
if 256 % num == 0:
st.add(num)
print(st) # {32, 1, 2, 64, 4, 128, 256, 8, 16}
# sugar
st = {num for num in range(1, 257) if 256 % num == 0}
print(st) # {32, 1, 2, 64, 4, 128, 256, 8, 16}
+ Dict Comprehension
- dict 자료구조를 생성
- dict의 특성상 "키: 값" 형태의 쌍으로 등록 되어야함
# 기존
dic = {}
for 요소 in 범위:
if 조건:
dic[계산된키] = 계산된값
# sugar
dic = {계산된요소_key: 계산된요소_value for 요소 in 순환가능한객체 if 조건}
# 역시 if문 불필요시 생략 가능
# 숫자(key)가 정수 제곱근(value)을 가질 경우 "수: 제곱근" 쌍을 담은 dict 만들기
# 기존
dic = {}
for num in range(1, 101):
if num ** 0.5 == int(num ** 0.5):
dic[num] = int(num ** 0.5)
print(dic)
#sugar
dic = {num : int(num ** 0.5) for num in range(1, 101) if num ** 0.5 == int(num ** 0.5)}
print(dic)
- 만약 Comprehension을 사용할 때 if-else 문이 필요하다면?
- 삼항 연산자(ternary expressions)를 통해 응용가능
#기존
li = []
for 요소 in 범위:
if 조건:
li.append(참)
else:
li.append(거짓)
#sugar
li = [ 참 if 조건 else 거짓 for 순환가능한객체 in 범위]
+ 라). scope(변수 적용 범위)
- 변수를 사용할 수 있는 범위
- 전역 변수(global variable): 함수 밖에서 정의되어 모든 곳에서 사용 가능한 변수
# 전역 변수 [global variable]
bread = 5
def bakery():
print(bread)
# 함수 안에서 전역 변수 사용가능
print(bread) # 5
bakery() # 5
- 지역 변수(local variable): 함수 안에서 정의된 변수로 정의된 함수 안에서만 사용 가능한 변수
#지역 변수[local variable]
def bakery()
bread = 5
# bakery 함수 안에서 선언한 지역 변수, bread
# bakery 함수 안에서만 사용 가능
print(bread)
bakery() # 5
print(bread) # NameError: name 'bread' is not defined
# 해당 지역 변수를 선언한 함수의 외부에선 접근 불가능
- 함수 안에서 변수 사용시 그 이름의 지역 변수가 있는지 먼저 확인하고,
함수 내에 그 이름의 지역 변수가 있으면 지역 변수를 사용, 지역 변수가 없다면 전역 변수를 사용
bread = 5 # 전역 변수
def bakery():
bread = 7 # 'bread'라는 이름의 지역변수 생성
print(bread) # bakery함수 내에 정의된 지역변수 'bread'를 우선적으로 사용
bakery() # 7
print(bread) # 5 # 전역 변수 bread
- 함수내에 동일한 이름의 지역 변수가 감지되었다면,
지역 변수 사용 위치가 선언 위치보다 위 쪽이라도 전역 변수가 아닌 무조건 지역 변수를 우선으로 찾게됨 👉 오류발생
bread = 5
def bakery():
print(bread)
# local variable 'bread' referenced before assignment
# 5가 출력될 것 같지만, 함수 내에 동일한 이름의 지역 변수가
# 아래서 선언되어 전역 변수 bread가 아닌 지역 변수 bread를 사용하기로 결정
# 하지만 아직 bread가 선언되지 않아 오류를 반환
bread = 7
print(bread) # 7
bakery() #
print(bread) # 5
- 함수의 파라미터 또한 지역변수로 함수 내에 선언된 지역변수와 같은 scope가 적용됨
- 함수 안에서 전역 변수를 사용하려면? -> global 키워드를 통해 사용가능
def foo():
global 변수이름
global 키워드를 이용하여 전역 변수 사용임을 명시할 때
해당 이름의 전역 변수가 있다면 그 전역 변수를 사용하며 없다면 해당 이름으로 전역 변수를 생성
# 전역 변수가 있는 경우
bread = 5 # 전역변수
def bakery():
global bread # 전역변수 'bread'를 사용할 것을 명시
bread = 7
print(bread)
print(bread) # 5 <- 아직 bakery() 함수가 호출되기 이전
bakery() # 7
print(bread) # 7
# global 키워드를 통해 전역변수 'bread'의 값이
# 함수 안에서 사용되고 수정됨
# 전역 변수가 없는 경우
def bakery():
global bread # bread 이름의 전역 변수가 없으니
# 전역변수 'bread'를 생성하기로 결정
bread = 7 # 전역변수 'bread' 선언
print(bread)
# print(bread) # 아직 bakery() 함수 호출 이전이라 전역 변수 'bread'가 선언되지 않음
bakery() # 7
print(bread) # 7
- 전역 변수와 지역 변수냐는 함수 외부인가 함수 내부인가로 구분 (while & for 반복문 , if 조건문 과는 X )
+ 추가: 새로운 scope 'non-local'과 'global' 키워드
어떤 방식이 더 권장되는가? => 파라미터 방식이 조금 더 권장 됨
+ 마). 상수(Const, Final)
기본 적으로 Python에선 상수라는 개념이 없음 하지만 다음을 통해 비슷하게 이용할 수 있음
#1. 변수를 대문자로 선언
# 1. 변수를 대문자로 선언
# 하지만 java나 c#의 final이나 const 처럼
# 수정 할 수 없는 상수가 아닌
# 사용자간의 약속
PI = 3.141592
#2. 함수로 선언하기
#2. 함수로 선언하여 return 하도록 하기
def PI():
return 3.141592
print(PI())
# 3.141592
PI() = 3
#SyntaxError: cannot assign to function call
#3. Python3.8에서 추가된 방법(typing.Final)
from typing import Final
a: Final[int] = 1
# Executes fine, but mypy will report an error if you run mypy on this:
a = 2
MAX_SIZE: Final = 9000
MAX_SIZE += 1 # Error reported by type checker
class Connection:
TIMEOUT: Final[int] = 10
class FastConnector(Connection):
TIMEOUT = 1 # Error reported by type checker