파이썬 기본 개념 (1)

일. 변수 이름 규칙

파이썬은 다른 프로그래밍 언어와 마찬가지로 변수를 사용하며, 다음 규칙을 따릅니다:

  • 문자 제한: 변수명은 알파벳(a-z, A-Z), 숫자(0-9), 언더스코어(_)로만 구성 가능하며, 공백이나 하이픈 같은 특수문자는 사용할 수 없습니다;
  • 숫자로 시작 불가: 변수명은 알파벳 또는 언더스코어로 시작해야 합니다;
  • 대소문자 구분: 파이썬은 대소문자를 구분하는 언어로, myVar와 myvar는 서로 다른 변수로 인식됩니다;
  • 예약어 사용 금지: if, for, class, def, True, None 등과 같은 파이썬의 예약어는 변수명으로 사용할 수 없습니다;

추가로 일반적인 명명 스타일 규칙은 다음과 같습니다:

  • 명명 방식: 스네이크 케이스(stu_name)나 캐멜 케이스(stuName)를 사용합니다;
  • 상수 명명: 상수는 모든 문자를 대문자로 표기하고 단어 사이에 언더스코어를 사용합니다(MAX_LIMIT);
  • 보호 변수: 변수명 앞에 언더스코어(_internal_var)를 추가하면 모듈 내부 또는 클래스 내부의 보호된 멤버임을 나타냅니다;
  • 의미 있는 이름 사용: 변수명은 데이터의 의미를 직관적으로 알 수 있도록 해야 합니다;

이. 변수 선언

변수를 어떻게 선언하는지 알아보겠습니다:

x = 123
print(x)

=는 할당 연산자로, 오른쪽의 값을 왼쪽 변수에 할당합니다. 이 과정에서 파이썬은 다음 세 단계를 수행합니다:

  • 메모리에 정수 객체 123 생성;
  • 메모리에 변수 x 생성;
  • 변수 x가 123을 가리키도록 설정;

다른 언어(예: 자바)와 달리 파이썬은 변수 선언 시 데이터 타입을 명시하지 않습니다. 이는 다음과 같은 이유 때문입니다:

  • 런타임 타입 추론: 정적 타입 언어(예: C++ 또는 자바)는 컴파일 시 타입을 결정하지만, 파이썬은 실행 중에 타입을 자동으로 판단합니다;
  • 변수는 참조: 변수 자체는 데이터 객체를 저장하는 것이 아니라, 메모리 위치를 가리키는 참조입니다;

변수를 변수에 할당하여 동일한 객체를 가리킬 수 있습니다. 여기서는 문자열 'hello'를 사용합니다:

x = 'hello'
print(x)
y = x
print(y)

이제 x를 재할당해 y에 영향이 있는지 확인합니다:

x = 'hello'
print(x)
y = x
print(y)
x = 'nihao'
print(x)
print(y)

실행 결과:

PS D:\my-study\python\code> python day01.py
hello
hello
nihao
hello

x의 참조가 변경되더라도 y는 변하지 않음을 확인할 수 있습니다. 이는 불변 객체(예: int, str, tuple)가 메모리에 생성되면 값을 변경할 수 없기 때문입니다. 재할당은 새로운 객체를 생성하고 변수를 새 객체에 할당하기 때문입니다. 반면 가변 객체(예: list, dict, set)는 원본을 수정할 수 있어 참조 전달 효과가 발생합니다.

참고: 파이썬은 자동 메모리 관리와 가비지 컬렉션 메커니즘을 제공합니다. 변수를 재할당하면 이전에 참조했던 메모리는 다른 변수가 참조하지 않으면 자동으로 회수됩니다.

다른 주제인 컴파일 타임 최적화와 소수 정수 풀도 살펴보겠습니다. 다음 코드를 콘솔 환경과 .py 스크립트에서 실행했을 때의 차이를 확인합니다:

num1 = 5
num2 = 5
print(num2 is num1)   
val1 = 256
val2 = 256
print(val1 is val2)   
val3 = 257
val4 = 257
print(val3 is val4) 

콘솔 환경 실행 결과:

.py 스크립트 실행 결과:

결과가 다르게 나타나는 이유는 다음과 같습니다:

  • 소수 정수 풀: 파이썬은 -5에서 256 사이의 정수를 재사용합니다. 콘솔 환경에서는 첫 두 그룹은 True이며, 세 번째 그룹은 False입니다;
  • 컴파일 타임 최적화: 콘솔 환경에서는 각 줄이 독립적인 문장이므로 "상수 접기" 최적화가 적용되지 않지만, 스크립트 파일에서는 "상수 접기"가 적용되어 모든 그룹이 True가 됩니다;

삼. 데이터 타입

파이썬은 다양한 데이터 타입을 제공합니다. 주요 분류는 다음과 같습니다:

  • 숫자 타입:
  • 정수(int): 소수점이 없는 숫자로, 양수, 음수, 0이 가능;
  • 부동소수점(float): 소수점을 가진 실수로, 과학적 기수법 지원;
  • 복소수(complex): 실수부와 허수부로 구성되며, 허수부는 j 또는 J로 표기;
  • 불리언 타입:
  • 불리언(bool): True(1)과 False(0) 두 가지 값만 존재;
  • 시퀀스 타입: 순서가 있는 요소 집합을 저장하며, 인덱싱 및 슬라이싱 지원
  • 문자열(str): 유니코드 문자로 구성된 불변 시퀀스;
  • 리스트(list): 가변 시퀀스로, 다양한 타입의 데이터를 포함;
  • 튜플(tuple): 불변 시퀀스;
  • 범위(range): 불변 숫자 시퀀스;
  • 매핑 타입:
  • 딕셔너리(dict): 키-값 쌍을 저장하는 무순서 집합;
  • 집합 타입: 중복되지 않은 요소를 저장
  • 세트(set): 가변 무순서 집합;
  • 불변 세트(frozenset): 생성 후 요소 추가/삭제 불가;
  • 이진 타입: 원시 이진 데이터 처리
  • 바이트(bytes): 불변 바이트 시퀀스;
  • 바이트 배열(bytearray): 가변 바이트 시퀀스;
  • 특수 타입:
  • None: None 하나의 값만 존재;

다음은 간단한 데이터 타입 예시입니다:

1.1 정수

정수 타입 예시:

>>> print(123)
123
>>> print(-99)
-99
>>> print(0)
0

16진수 표현은 0x 접두사를 사용합니다:

>>> print(0xff18)
65304

큰 수는 _로 구분하여 표현할 수 있습니다:

>>> print(100_0000_0000)
10000000000

1.2 부동소수점

소수점이 이동 가능한 수:

>>> print(1.23)
1.23
>>> print(-0.26)
-0.26

1.68e5는 1.68×10^5를 나타냅니다:

>>> print(1.68e5)
168000.0
>>> print(254e-5)
0.00254

1.3 문자열

따옴표로 감싸진 텍스트:

>>> print('hello world')
hello world
>>> print("hello world")
hello world

따옴표를 포함하고 싶을 경우 백슬래시 \를 사용합니다:

>>> print('\"hello world\"')
"hello world"

줄바꿈은 \n을 사용합니다:

>>> print('hello\nworld')
hello
world

\를 출력하려면 이중 백슬래시를 사용합니다:

>>> print('hello\\nworld')
hello\nworld

전체 문자열에 많은 이스케이프 문자가 있는 경우 r''를 사용합니다:

>>> print(r'hello\nworld,hello\tkitty,hello\nbrother')
hello\nworld,hello\tkitty,hello\nbrother

여러 줄의 텍스트는 삼중 따옴표 ''''''로 표현합니다:

>>> print('''hello world
... hello world
... hello world''')
hello world
hello world
hello world

1.4 불리언

True 또는 False 두 가지 값만 존재:

>>> print(True)
True
>>> print(False)
False

논리 연산으로도 생성 가능:

>>> print(3>1)
True
>>> print(1>5)
False
# and 연산: 모두 True일 때만 True
>>> print(1>3 and 1<5)
False
>>> print(1<3 and 1<5)
True
# or 연산: 하나라도 True이면 True
>>> print(1>3 or 1<5)
True
>>> print(1>3 or 1>5)
False
# not 연산: 결과를 반전
>>> not 1>3
True
>>> not 1<3
False

1.5 None

의미 있는 값이 없는 특수 타입:

>>> print(None)
None

사. 연산자

파이썬에서 연산자는 변수와 값에 대해 수학적, 로직적, 데이터 조작을 수행합니다. 주요 연산자 분류와 예제는 다음과 같습니다:

1. 산술 연산자

기본 수학 연산을 수행합니다.

# print() 함수는 결과를 콘솔에 출력합니다
# 덧셈
print(10+20)    #30
# 뺄셈
print(30-10)    #20
# 곱셈
print(3*4)      #12
# 나눗셈
print(7/2)      #3.5, 소수 결과
# 정수 나눗셈
print(7//2)     #3, 정수 결과
# 나머지
print(7%2)      #1
# 거듭제곱
print(2**3)     #8

2. 비교 연산자

두 값의 크기나 동등성을 비교하며, 결과는 불리언(True 또는 False)입니다.

# 두 값이 같은지 확인
>>> 5 == 3
False
# 두 값이 다른지 확인
>>> 5 != 3
True
# 왼쪽 값이 오른쪽보다 큰지 확인
>>> 5 > 3
True
# 왼쪽 값이 오른쪽보다 작은지 확인
>>> 5 < 3
False
# 왼쪽 값이 오른쪽보다 크거나 같은지 확인
>>> 5 >= 3
True
# 왼쪽 값이 오른쪽보다 작거나 같은지 확인
>>> 5 <= 3
False

3. 할당 연산자

데이터 값을 변수에 할당하거나, 산술 연산과 결합하여 복합 할당을 수행합니다.

  • 기본 할당 (=): 오른쪽 값의 변수에 할당합니다.
>>> a = 5

  • 복합 할당 (+=, -= 등): 자주 사용되는 연산을 간단히 표현합니다
# a = a + 3과 동일
>>> a += 3
>>> print(a)
8
# a = a - 5와 동일
>>> a -= 5
>>> print(a)
3

4. 논리 연산자

여러 조건 문장을 조합하여 복잡한 로직 표현식을 생성합니다.

# 논리 AND, 모든 조건이 True일 때만 True
>>> 1>2 and 2>1
False
>>> 2>1 and 3>2
True
# 논리 OR, 모든 조건이 False일 때만 False
>>> 1>2 or 2>1
True
>>> 1>2 or 2>3
False
# 논리 NOT, 결과를 반전
>>> not 1>2
True
>>> not 3>2
False

5. 신분 연산자

두 객체가 메모리에 위치하는지 비교합니다.

# is: 두 변수가 동일한 객체를 참조하는지 확인
# is not: 두 변수가 다른 객체를 참조하는지 확인
>>> a = 3.5
>>> b = a
>>> a is b
True
>>> c = 3.5
>>> a is not c
True

6. 멤버십 연산자

값 또는 객체가 시퀀스(문자열, 리스트, 튜플 등)에 있는지 확인합니다.

# in: 존재 시 True 반환
# not in: 존재하지 않을 시 True 반환
>>> string = 'apple'
>>> 'a' in string
True
>>> 'b' in string
False
>>> 'b' not in string
True

7. 비트 연산자

이진수로 숫자를 조작하며, 컴퓨터 저수준 작업에 사용됩니다.

# 비트 AND &: 둘 다 1일 때 1
>>> 1 & 2
0
# 비트 OR |: 둘 다 0일 때 0
>>> 1 | 2
3
# 비트 XOR ^: 다르면 1
>>> 1 ^ 2
3
# 비트 NOT ~: 0001(보수) -> 1110(보수) -> 1101(반전) -> 1010(원본) -> -2
>>> ~1
-2
# 왼쪽 이동 <<: 2^n 곱하기
>>> 1 << 2
4
# 오른쪽 이동 >>: 2^n 나누기
>>> 8 >> 2
2

오. 함수, 모듈 및 패키지

1. 기본 개념

파이썬에서 함수(Function), 모듈(Module), 패키지(Package)는 코드 조직과 재사용의 세 가지 핵심 계층입니다. 이들은 러시아 인형처럼 작은 것부터 큰 것까지 중첩되어 있습니다.

  • 함수(Function): 특정 작업을 수행하는 도구(예: 나사 드라이버);
  • 모듈(Module): 다양한 도구(함수, 변수, 클래스)를 포함한 도구상자(예: 수학 계산용 도구상자);
  • 패키지(Package): 여러 drawer(폴더)로 분류된 대규모 창고(예: 도구상자 세트);

2. 함수 분류

파이썬에는 네 가지 유형의 함수가 있습니다:

  • 내장 함수: 파이썬이 자체적으로 제공하는 함수로, 임포트 없이 사용 가능(예: print(), type());
  • 표준 라이브러리 함수: 파이썬 표준이 지원하는 함수로, 해당 모듈을 임포트하면 사용 가능(예: math 모듈의 함수);
  • 제3자 라이브러리 함수: 먼저 라이브러리를 설치한 후 사용;
  • 사용자 정의 함수: def 키워드로 사용자가 정의한 함수;

3. 구체적 사용

내장 함수는 임포트 없이 사용할 수 있습니다.

>>> string = 'abc'
>>> print(string)
abc
>>> type(string)
<class 'str'>

다른 내장 함수를 확인하려면 다음 명령어를 사용합니다:

# 내장 예외 및 함수 목록 출력
>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BaseExceptionGroup', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EncodingWarning', 'EnvironmentError', 'Exception', 'ExceptionGroup', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'PythonFinalizationError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_', '_IncompleteInputError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'aiter', 'all', 'anext', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
# 특정 함수 구조 확인
>>> help(print)
Help on built-in function print in module builtins:

print(*args, sep=' ', end='\n', file=None, flush=False)
    Prints the values to a stream, or to sys.stdout by default.

    sep
      string inserted between values, default a space.
    end
      string appended after the last value, default a newline.
    file
      a file-like object (stream); defaults to the current sys.stdout.
    flush
      whether to forcibly flush the stream.

비내장 함수는 math 모듈의 함수처럼 먼저 모듈을 임포트해야 합니다:

>>> import math
>>> print(math.pi)
3.141592653589793

모듈 임포트 방법은 다음과 같습니다:

# 단일 모듈 임포트
import moduleName
# 모듈의 특정 기능(함수, 변수, 클래스) 임포트
from moduleName import <함수명/클래스명/변수명>
# 별칭 임포트, 모듈 이름이 길거나 변수명 충돌 시 별칭 사용
import moduleName as 별칭 / from moduleName import <함수명/클래스명/변수명> as 별칭

패키지의 하위 모듈을 임포트할 경우 다음과 같이 작성합니다:

# 패키지는 다중 계층 구조일 수 있음
import 패키지.하위패키지.하위모듈

태그: 파이썬 변수 데이터 타입 연산자 함수 모듈

9월 25일 13:34에 게시됨