상단 메뉴 중에 파란색 Downloads 버튼 클릭스크롤을 아래로 내린 뒤 컴퓨터와 맞는 버전 다운로드(!중요) Add Python 3.9 to PATH 클릭 [환경 변수에 파이썬 경로 추가]
print('Hello!')
#print 함수 팁: 코드잇 '패트와매트' 님
#print 함수는 다음과 같이 이루어져 있음
#print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
#seq = (함수의 인자들이 쉼표(,)로 연결되어 있을 때, 출력되는 문자를 지정 가능 (기본 '스페이스'[ ])
#end = print문이 끝날 때, 출력되는 문자를 지정 가능 (기본 '줄바꿈' [\n])
#다음과 같이 꼭 같은 종류의 따옴표(" ", ' ')로만 감싸주어야 함
"우리가 서로 사랑함은"
'그가 먼저 우리를 사랑하셨음이라'
# 같은 종류의 따옴표를 문장 내에 사용하려면 \(역슬래시)를 앞에 기입해주어야 가능
'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)를 사용할 수 있으나, 파이썬에선 필요하지 않기 때문에 사용해도 별 다른 효과가 없습니다
^ 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
- 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
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 범위]
- 전역 변수(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
해당 이름의 전역 변수가 있다면 그 전역 변수를 사용하며 없다면 해당 이름으로 전역 변수를 생성
# 전역 변수가 있는 경우
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 )
기본 적으로 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