1. 가상 환경
파이썬 프로젝트는 서로 다른 패키지 버전을 요구하는 경우가 많다. 동일한 시스템에 여러 프로젝트를 구동하는 경우, 각 프로젝트에서 요구하는 패키지 버전이 서로 달라 충돌을 유발할 수 있다. 따라서 이러한 충돌을 방지하고 각 프로젝트의 독립성을 유지하기 위해 가상 환경을 사용한다.
1.1. 가상 환경 생성
venv 모듈은 가상 환경을 제공하는 대표적인 모듈이다.
c:\python> python -m venv my_venv(본인이 설정한 가상환경 이름)
1.2. 가상 환경 활성화
- windows
c:\python> .\my_venv\Scripts\activate
- mac / linux
c:\python> source my_venv/bin/activate
1.3. 가상 환경 비활성화
(myenv) c:\python> deactivate
c:\python>
2. 변수
2.1. Python 변수의 특징
(1) 동적 타이핑 (dynamic typing) 지원
- 변수 지정 시 데이터 타입을 명시적으로 지정할 필요 없음
- 변수에 값을 할당할 때 변수의 타입이 자동으로 결정됨
int i= 10 # 정수
int i = "abc" # 문자열
x = 10
print(type(x)) # <class 'int'>
x = "Hello"
print(type(x)) # <class 'str'>
(2) 강력한 타입 검사 (strong typing) 지원
- 변수가 특정 타입을 가질 경우, 그 타입이 자동으로 변환되지 않음
x = "123" # 문자열
y = 456 # 정수
# TypeError: can only concatenate str (not "int") to str
# print(x + y)
# ~ ~ 문자열이 와야 하는 자리에 정수가 와서 오류가 발생
# |
# +-- 문자열 결합 연산자
# TypeError: unsupported operand type(s) for +: 'int' and 'str'
# print(y + x)
# ~ ~ 숫자(정수)가 와야 하는 자리에 문자열이 와서 오류가 발생
# |
# +-- 덧셈 연산자
# 오류 해결 방안
# 필요로 하는 데이터 타입으로 명시적으로 변환해야 함
# str() 함수를 사용하여 정수를 문자열로 변환
print(x + str(y)) # 123456
# int() 함수를 사용하여 문자열을 정수로 변환
print(int(x) + y) # 579
(3) 변수를 초기화하지 않고 선언할 수 없음
# NameError: name 'x' is not defined
# x
# print(x)
# 변수는 선언과 동시에 초기화해야 함
x = None
print(x) # None
2.2. 명명 규칙
- 변수 이름은 문자(A-Z, a-z), 숫자(0-9), 밑줄(_)로 구성
- 변수 이름은 숫자로 시작할 수 없음
- 변수 이름은 대소문자를 구분
- 파이썬의 예약어(키워드)는 변수 이름으로 사용할 수 없음
2.3. 지역 변수와 전역 변수
(1) 지역 변수
- 함수 내부에서 선언된 변수
- 해당 함수에서만 접근 가능
def my_function():
local_variable = "I am a local variable"
print(local_variable) # 함수 내에서 지역 변수에 접근이 가능
my_function()
print(local_variable) # 함수 밖에서는 함수 내부의 지역 변수에 접근할 수 없음
# NameError: name 'local_variable' is not defined
(2) 전역 변수
- 함수 외부에서 선언된 변수
- 프로그램 전체에서 접근 가능
- 함수 내부에서 전역 변수 값을 변경하려면 global 키워드 이용
global_variable = "I am a global variable"
def my_function():
# 전역 변수의 값을 변경(수정)하는 것이 아니고,
# 함수 내부에 전역 변수의 이름과 동일한 지역 변수를 정의
global_variable = "I am modifed global variable"
print(global_variable) # I am modifed global variable
# 지역 변수의 값을 출력
my_function()
print(global_variable) # I am a global variable
# 전역 변수의 값을 출력
global_variable = "I am a global variable"
def my_function():
# 전역 변수를 함수 내부에서 수정 가능하도록 설정
global global_variable
# 전역 변수의 값을 수정
global_variable = "I am modifed global variable"
print(global_variable) # I am modifed global variable
# 수정된 전역 변수의 값을 출력
my_function()
print(global_variable) # I am modifed global variable
# 함수 내부에서 수정된 전역 변수의 값을 출력
3. 데이터 타입
3.1. 데이터 타입 유형
구분 | 데이터 | 설명 |
숫자형 | 정수형(int) | 소수점이 없는 숫자 |
실수형(float) | 소수점을 포함하는 숫자 | |
복소수형(complext) | 실수부와 허수부로 구성된 숫자 | |
불리형 | 불리언(bool) | 참(True) 또는 거짓(False)을 나타내는 데이터 타입 |
시퀀스형 | 문자열(str) | 문자나 단어의 시퀀스 |
리스트(list) | 순서가 있는 가변 시퀀스 타입 | |
튜플(tuple) | 순서가 있는 불변 시퀀스 타입 | |
범위(range) | 특정 범위 내의 숫자를 생성 | |
매핑형 | 딕셔너리(dict) | 키-값 쌍으로 구성된 매핑 타입 |
집합형 | 집합(set) | 중복을 허용하지 않는 순서가 없는 컬렉션 타입 |
프로즌셋(frozenset) | 집합과 유사하지만 불변 집합 | |
NoneType | 아무 것도 없음을 나타내는 특수한 데이터 타입 |
3.2. 데이터 타입 변환
(1) 암시적 형 변환
- 파이썬 인터프리터가 자동으로 데이터 타입을 변환하는 것
- 파이썬은 강력한 타입 검사를 수행하지만, 특정 상황에서는 암시적 형 변환을 허용해 연산을 수행할 수 있게 함
- 일반적으로 숫자 타입 간의 연산에서 암시적 형 변환이 발생
# 정수와 실수의 연산에서 암시적 형 변환
int_num = 10
float_num = 2.5
# int_num과 float_num을 더한 결과를 출력
# 정수와 실수가 혼합된 연산에서는 실수로 암시적 형 변환
result = int_num + float_num # 10.0 + 2.5
print(result) # 12.5
print(type(result)) # <class 'float'>
# 블리언과 정수의 연산에서 암시적 형 변환
bool_value = True
int_value = 10
# 블리언 값이 정수로 변환
result = bool_value + int_value # 1 + 10
print(result) # 11
bool_value = False
int_value = 10
# 블리언 값이 정수로 변환
result = bool_value + int_value # 0 + 10
print(result) # 10
(2) 명시적 형 변환
- 개발자가 int(), float(), str()과 같은 형 변환 함수를 사용해 직접 데이터 타입을 변환하는 것
# 정수형을 실수형으로 명시적 형변환
int_number = 10
float_number = float(int_number)
print(float_number) # 10.0
print(type(float_number)) # <class 'float'>
# 실수형을 정수형으로 명시적 형변환
float_number = 10.5
int_number = int(float_number)
print(int_number) # 10
print(type(int_number)) # <class 'int'>
# 문자열을 정수형으로 명시적 형변환
string_number = "10"
int_number = int(string_number)
print(string_number) # 10
print(type(string_number)) # <class 'str'>
print(int_number) # 10
print(type(int_number)) # <class 'int'>
# 정수형을 문자열로 명시적 형변환
int_number = 123
string_number = str(int_number)
print(int_number) # 123
print(type(int_number)) # <class 'int'>
print(string_number) # 123
print(type(string_number)) # <class 'str'>
4. 연산자
4.1. 산술 연산자
- + : 덧셈
- - : 뺄셈
- * : 곱셈
- / : 나눗셈 (결과로 실수형이 반환)
- // : 나눗셈 몫 (결과로 정수형이 반환)
- % : 나눗셈 나머지 (결과로 정수형이 반환)
- ** : 거듭제곱
- - : 단항음수 (피연산자의 부호를 반대로 변경)
a = 10
b = 20
c = a + b
print(c) # 30
print(type(c)) # <class 'int'>
d = b / a
print(d) # 2.0
print(type(d)) # <class 'float'>
e = b // a
print(e) # 2
print(type(e)) # <class 'int'>
f = b % a
print(f) # 0
print(type(f)) # <class 'int'>
a = 10.0
b = 20.0
c = a + b
print(c) # 30.0
print(type(c)) # <class 'float'>
d = b / a
print(d) # 2.0
print(type(d)) # <class 'float'>
e = b // a
print(e) # 2
print(type(e)) # <class 'int'>
f = b % a
print(f) # 0
print(type(f)) # <class 'int'>
4.2. 비교 연산자
- == : 같음
- != : 다름
- > : 큼
- < : 작음
- >= : 크거나 같음
- <= : 작거나 같음
- is : 객체 동일성
- is not : 객체 동일성 부정
a = 5
b = 5
c = a
d = [1, 2, 3]
e = [1, 2, 3]
f = d
print(id(a))
print(id(b))
print(id(c))
print(id(d))
print(id(e))
print(id(f))
print(a == b) # True
print(a is b) # True
print(a == c) # True
print(a is c) # True
print(d == e) # True
print(d is e) # False
print(d == f) # True
print(d is f) # True
4.3. 논리 연산자
- and : 논리곱
- or : 논리합
- not : 논리 부정
4.4. 할당 연산자
- = : 기본 할당
- += : 덧셈 후 할당
- -= : 뺄셈 후 할당
- *= : 곱셈 후 할당
- /= : 나눗셈 후 할당
4.5. 비트 연산자
- & : 비트 AND
- | : 비트 OR
- ^ : 비트 XOR
- ~ : 비트 NOT
- << : 비트 왼쪽 시프트
- >> : 비트 오른쪽 시프트
5. 문자열
5.1. 문서화 문자열
def example_function():
"""
이 함수는 예제를 위한 함수입니다.
여기에는 함수에 대한 설명이 들어갈 수 있습니다.
여러 줄로 설명을 추가할 수 있습니다.
"""
print("함수가 실행되었습니다.")
print(example_function.__doc__) # docstring 출력
help(example_function) # help() 함수로 docstring 출력
# 실행 결과
c:\python> python hello.py
이 함수는 예제를 위한 함수입니다. ⇐ print(example_function.__doc__) 결과
여기에는 함수에 대한 설명이 들어갈 수 있습니다.
여러 줄로 설명을 추가할 수 있습니다.
Help on function example_function in module __main__: ⇐ help(example_function) 결과
example_function()
이 함수는 예제를 위한 함수입니다.
여기에는 함수에 대한 설명이 들어갈 수 있습니다.
여러 줄로 설명을 추가할 수 있습니다.
5.2. 문자열 인덱싱과 슬라이싱
# 0 1
# 01234567890123
str = "Hello, Python!"
# 인덱스를 이용해서 문자를 추출
print(str[0]) # H
print(str[7]) # P
print(str[-1]) # !
print(str[-7]) # P
# 슬라이싱을 이용해서 문자열을 추출
# [start:end:step] 형식을 사용
print(str[0:5]) # Hello # 0 <= index < 5
print(str[7:]) # Python! # 7 <= index < 끝까지
print(str[:5]) # Hello # 0 <= index < 5
print(str[:]) # Hello, Python! # 0 <= index < 끝까지
print(str[::2]) # Hlo yhn # 0 <= index < 끝까지, 2씩 증가
print(str[::-1]) # !nohtyP ,olleH # 끝부터 처음까지, 1씩 감소 = 문자열을 역순으로 출력
print(str[1::2]) # el yhn # 1 <= index < 끝까지, 2씩 증가
5.3. 문자열 연결과 반복
hello = "HELLO"
world = "WORLD"
# 문자열에서 + 연산자를 사용하면 두 문자열을 연결
print(hello + world) # HELLOWORLD
# 여러 문자열을 특정 구분자와 함께 연겷하려면 join() 메서드 사용
# 형식: 구분자.join(문자열리스트)
words = ["Hello", "World", "with", "Python"]
resutl = " ".join(words)
print(reult) # Hello World with Python
resutl = "*".join(words)
print(reult) # Hello*World*with*Python
# 문자열에 * 연산자를 사용하면 문자열을 반복
hello = "Hello"
print(hello * 3) # HelloHelloHello
5.4. 문자열 메서드
str = "Hello World"
# len() 함수 : 문자열 길이를 반환
print(len(str)) # 11
# str.lower() : 문자열(str)을 소문자로 변환
print(str.lower()) # hello world
# str.upper() : 문자열(str)을 대문자로 변환
print(str.upper()) # HELLO WORLD
# str.strip() : 문자열(str)의 양쪽 공백을 제거
str = " Hello Python "
print(str.strip()) # Hello Python
# str.replace(old, new) : 문자열(str)에서 old를 new로 변경
str = "Hello Python!"
print(str.replace("Python", "World")) # Hello World!
# str.split(delimiter) : 문자열(str)을 delimiter로 분리
# delimeter가 생략되면 공백을 기준으로 분리
str = "Hello world with Python!"
print(str.split()) # ['Hello', 'world', 'with', 'Python!']
# str.count(substring) : 문자열(str)에서 substring의 개수를 반환
str = "Hello Python!"
print(str.count("o")) # 2
# str.find(substring) : 문자열(str)에서 substring의 위치를 반환
str = "Hello Python!"
print(str.find("Python")) # 6
print(str.find("Java")) # -1 (찾는 문자열이 없을 경우 -1 반환)
# str.index(substring) : 문자열(str)에서 substring의 위치를 반환
# find()와 동일하지만 찾는 문자열이 없을 경우 ValueError 발생
print(str.index("Python")) # 6
# print(str.index("Java")) # ValueError: substring not found
# in 연산자를 이용해서 문자열 포함 여부를 판단
str = "Hello Python!"
print("Python" in str) # True
print("Java" in str) # False
5.5. 문자열 포맷팅
문자열의 출력 형식을 지정하고, 지정된 형식에 맞춰서 출력
(1) % 포맷팅
문자열 내부에 % 기호를 이용해서 데이터의 형식을 지정하고, 출력 데이터를 튜플 형태로 전달하는 방법
name = "홍길동"
age = 24
weight = 65.5
# 위의 데이터(프로파일)를 아래와 같은 형식으로 출력
# 이름 [홍길동]
# 나이 [24]
# 체중 [65.5]
profile = "이름 [%s]\n나이 [%d]\n체중 [%.1f]" % (name, age, weight)
print(profile)
# 너비를 지정
# 이름 [ 홍길동]
# 나이 [ 24]
# 체중 [ 65.5]
profile = "이름 [%10s]\n나이 [%10d]\n체중 [%10.1f]" % (name, age, weight)
print(profile)
# 왼쪽 정렬
# 이름 [홍길동 ]
# 나이 [24 ]
# 체중 [65.5 ]
profile = "이름 [%-10s]\n나이 [%-10d]\n체중 [%-10.1f]" % (name, age, weight)
print(profile)
# 0으로 채우기
# 나이 [0000000024]
# 체중 [0000065.5]
profile = "나이 [%010d]\n체중 [%010.1f]" % (age, weight)
print(profile)
(2) str.format() 메서드
문자열(str) 내에 중괄호를 이용해서 출력될 데이터의 위치를 지정하고, 출력에 사용할 데이터는 format() 메서드의 인자로 전달
name = "Python"
age = 30
message = "Hello, {}! Your age is {}.".format(name, age)
print(message) # Hello, Python! Your age is 30.
# 자리 표시자 내에 인덱스를 사용할 수 있습니다.
message = "Hello, {1}! Your age is {0}.".format(age, name)
print(message) # Hello, Python! Your age is 30.
# 자리 표시자 내에 이름을 사용할 수 있습니다.
message = "Hello, {xname}! Your age is {xage}.".format(xname=name, xage=age)
print(message) # Hello, Python! Your age is 30.
# 원주율을 소수점 둘째 자리까지 출력합니다.
pi = 3.1415926535
format_string = "원주율은 {:.2f}입니다.".format(pi)
print(format_string) # 원주율은 3.14입니다.
# 전체 자리수를 10으로 맞추고 왼쪽에 0으로 패딩합니다.
format_string = "원주율은 {:010.2f}입니다.".format(pi)
print(format_string) # 원주율은 0000003.14입니다.
# 문자열을 특정 너비에 맞추고 정렬합니다.
name = "HONG"
age = 23
address = "Seoul"
align_left = "|{:<10}|{:<10}|{:<10}|".format(name, age, address)
align_right = "|{:>10}|{:>10}|{:>10}|".format(name, age, address)
align_center = "|{:^10}|{:^10}|{:^10}|".format(name, age, address)
print(align_left) # |HONG |23 |Seoul |
print(align_right) # | HONG| 23| Seoul|
print(align_center) # | HONG | 23 | Seoul |
(3) f-strings (포맷 문자열 리터럴)
- 파이썬 3.6에서 도입
- 문자열 앞에 f 또는 F를 붙이고 중괄호 안에 변수(또는 표현식)를 직접 삽입
name = "Python"
age = 30
print(f"Hello, {name}! You are {age} years old.") # Hello, Python! You are 30 years old.
# 변수 뿐 아니라 표현식도 가능
print(f"Next year, your will be {age + 1} years old.") # Next year, your will be 31 years old.
# 부동 소수점 수를 출력할 때 소수점 이하 자릿수를 제한할 수 있다.
pi = 3.141592653589793
print(f"원주율 = {pi:.2f}") # 원주율 = 3.14
# 정렬
print(f"{'hello':10}python") # hello python
print(f"{'hello':<10}python") # hello python
print(f"{'hello':>10}python") # hellopython
print(f"{'hello':^10}python") # hello python
# 공백 채우기
print(f"{'hello':*<10}python") # hello*****python
print(f"{'hello':*>10}python") # *****hellopython
print(f"{'hello':*^10}python") # **hello***python