본문 바로가기
SK 쉴더스 루키즈/인프라 활용을 위한 파이썬

[인프라 활용을 위한 파이썬] 가상 환경, 데이터 타입, 연산자

by seoyamin 2024. 10. 24.

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