설치
- www
- 설치경로(예. C:\Program Files\Python36, /usr/local/bin/python3.7)를 path 환경변수에 추가
- Python Shell은 각 문장을 대화식 인터프리터가 해석하여 결과를 바로 출력해준다
- 모듈 실행
- 소스 코드 인코딩
↓shell
인자는 sys 모듈의 argv 변수에 저장된다. -m module이 사용되면 sys.argv[0]은 모듈의 절대경로
기본 UTF-8. 변경하려면 파일 첫 줄에 주석 추가
예. # -*- coding: cp1252 -*-
단, 유닉스 셔뱅 줄(#!/usr/bin/env python3)이 있는 경우엔 2번째 줄에 들어간다
자료형
- 파이썬 변수는 동적 자료형(실행중 변경 가능)으로, type() 함수를 통해 자료형을 확인할 수 있다
- 변수 선언이 따로 필요없으며, 식별자만 있으면 변수로써 이용할 수 있다
bool
- True, False
- bool 연산 : and, or, not
- False로 간주되는 값 : None, 0, 0.0, '', [], (), {}, set()
int
- 모든 정수는 int형이며, 크기 제한은 없다
- 정수는 0으로 시작할 수 없다
- 리터럴 : 2진수 0b, 8진수 0o, 16진수 0x
- / : 부동소수 몫, // : 정수 몫, divmod() : (정수 몫, 나머지)
- ** : 거듭제곱
- int() : 형변환, 소수점이나 지수가 표현된 문자열은 정수로 변환 불가
float
- 부동소수도 +, -, *, /, //, **, %, divmod() 모두 가능하다
- float 정밀도는 그대로 가진다
- float() : 형변환, 소수점이나 지수가 표현된 문자열은 정수로 변환 불가
complex
복소수 a + bj
str
- 파이썬 문자열은 상수(불변)다. 리터럴로 ''와 ""모두 사용 가능하다
- + : 문자열 결합 연산자
* : 문자열 복제 연산자
문자열 리터럴은 단순히 공백을 기준으로 나열만 해도 연결된다 - ''' 또는 """로 열고 닫음으로써 여러 줄의 문자열 리터럴을 작성할 수 있다. 이진 문자열도 가능하다
- r'' → Raw String 리터럴. 이스케이프하지 않는다
- str() : 사람이 읽기 편한 형태로 객체의 문자열 표현 반환
repr() : 개발자를 위한 형태로 객체의 문자열 표현 반환. repr() 그대로 객체를 복원할 수 있도록 하자 - str은 시퀀스이므로 슬라이싱 , len() 이용
- split() : 분리. 기본은 공백 문자
join() : 문자열 접합 - strip() : 앞뒤 문자열 제거. 기본은 공백 제거
- 정렬
- replace() : 부분 문자열 대체
Formatted string literal(aka. f-string)
- f_string ::= (literal_char | "{{" | "}}" |replacement_field )*
- replacement_field ::= "{"f_expression [!conversion] [:format_spec] "}"
- f_expression : 값을 산출하는 표현식
- conversion ::= "s" | "r" | "a"
- f_expression이 산출한 값이 conversion을 거쳐 __format__(format_spec)으로 포매팅된다
- format_spec ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type]
- fill ::= 임의_문자
- align ::= "<" | ">" | "=" | "^"
- sign ::= "+" | "-" | " "
- '#' 옵션이 있으면 2, 8, 16진수 앞에 '0b', '0o', '0x'를 각각 붙인다
- width ::= digit+
- grouping_option ::= "_" | ","
- precision ::= digit+
- type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
{{, }}는 각각 {, }를 표시하기 위한 리터럴
각각 해당하는 함수를 호출한다 : !s → str(), !r → repr(), !a → ascii()
list
가변 시퀀스
tuple
불변 시퀀스. 불변이므로 딕셔너리의 키로 사용 가능
collections.namedtuple
collections.namedtuple(typename, field_names, verbose=False, rename=False)
각 필드를 주어진 이름으로 접근할 수 있는 tuple의 서브클래스를 반환한다. DTO 작성에 유용
_fields, _make(iterable), _asdict()
set
dict
구문
- for
- 콤마로 구분된 값들을 자동으로 튜플로 구성하여 다중 할당, 다중 반환이 가능하다
- else
- for/else : break로 멈추지 않고, for 루프가 완전히 실행된 후에 else 블록이 실행된다
- while/else : break로 멈추지 않고, 조건식이 거짓이 되어 while 루프를 빠져나온 후에 else 블록이 실행
- try/else : try 블록에서 예외가 발생하지 않은 경우 else 블록 실행
- 순회 대상 생성
- 수열 생성 : range([start,] stop[, step])
- 여러 시퀀스 동시 순회 : zip()
- comprehension : 순회를 통해 리스트, 딕셔너리, 셋 등 생성
- Monkey patching
for문은 순회 객체에 대하여 iter()를 호출한다. iter()는 __next__() 메서드를 정의한 iterator 객체를 반환하며, __next__()가 전달하는 값을 하나씩 루프에 사용한다
더 이상 요소가 없을 때 __next__()는 StopIteration 예외를 발생시키고, for 루프는 종료된다. 클래스 자체에 __next__()가 정의되어 있다면, iter()는 self를 반환하는 것으로 충분하다
start 기본값 0. step 기본값 1. stop 자체는 미포함
같은 오프셋의 요소들로 튜플을 생성. 시퀀스가 하나라도 끝나면 순회 종료
길이가 긴 시퀀스를 기준으로 하는 itertools.zip_longest()도 존재
파이썬 3에서 comprehension은 함수처럼 고유한 지역 범위를 가진다
소스 코드를 건드리지 않고 런타임에 클래스나 모듈을 변경하는 행위
함수
- 파이썬의 함수는 일급 객체다
- 함수 정의 deffunc_name():
- return이 없으면 호출자는 None을 얻는다. None 검사 : is None
- docstring : 함수 body 첫 줄에 문자열로 함수 설명. help()로 출력된다
- 함수 외부 scope에 접근할 수 있다
- 디폴트 매개변수, 키워드 매개변수, 매개변수 타입 바운딩
- * : 인자를 튜플로. ** : 인자를 딕셔너리로
- 함수 내부에 함수 정의 가능
- 람다 함수 : lambda
- Generator
- Decorator
↓python
* 뒷부분은 키워드 인자로만 보낼 수 있다
자료를 순회할 때마다 다음 항목 반환. __iter__()와 __next__()를 자동으로 생성하고, StopIteration 예외도 자동으로 발생시킨다. cf. range() : 미리 모든 값을 생성한다
다중 반복을 지원하려면 동일 객체에 대해 iter()를 호출할 때마다 독립적인 반복자가 새로 만들어져야 한다. 이를 파이썬스럽게 구현하려면 새로운 Iterator 인스턴스 대신 제너레이터(특히 Generator Comprehension)를 반환하면 된다
매개변수를 받는 데커레이터가 필요한 경우, 인자를 받아 데커레이터를 반환하는 팩터리 함수를 만들어 호출하면 된다.
namespace
- 네임스페이스 : "속성 이름 - 객체 이름" 매핑
- 메인 프로그램은 전역 네임스페이스를 정의
- 함수는 지역 네임스페이스를 정의
- global 키워드로 전역 변수 접근
globals() : 전역 네임스페이스 정보를 담은 딕셔너리
locals() : 지역 네임스페이스 정보를 담은 딕셔너리
예외
모듈
- 모듈 : 파이썬 파일 하나
- 패키지 : __init__.py 파일을 포함하는 디렉터리
- import
- [from package] import module1, module2
- from module import variable, function
- import module as alias
- from module import *
- del module
- reload(module)
- 처음 실행되는 모듈의 __name__ 속성은 "__main__"이다
- 모듈 탐색 경로 추가 sys.path.append('/usr/me/some_directory')
- dir()을 이용해 모듈에 정의된 것들을 확인할 수 있다
pass
- 빈 루프를 표현할 때 이용
- 빈 클래스를 표현할 때 이용
- 빈 함수를 표현할 때 이용
클래스
- 객체 메서드를 표현하는 객체도 속성들을 갖는다
- Name mangling : 파이썬은 기본적으로 접근 한정자가 없다. 다른 언어의 private과 같은 사용과 함께 이름 충돌을 회피하기 위해 2개 이상의 '_'로 시작하는 식별자는 내부적으로 앞에 '_classname'이 덧붙여 구분된다
- 다중 상속
메서드 결정 순서(Method Resolution Order)는 __mro__ 속성을 따른다
가상 환경
- 서로 다른 프로젝트들이 서로 다른 버전의 패키지 의존성을 가질 수 있다. 이를 유연하게 지원하도록 가상 환경을 만들 수 있다
- 최신 파이썬 버전에는 venv 모듈이 포함되어 있다
- Windows에서 실행 : my-env1\Scripts\activate.bat
- Unix에서 실행 : source my-env1/bin/activate
↓shell
my-env1 디렉터리가 존재하지 않으면 생성한다. 이 디렉터리에 파이썬 인터프리터, 표준 라이브러리 등이 복사된다
pip
- pip : 파이썬 패키지 설치, 제거에 관한 프로그램
- 기본적으로pypi의 패키지들이 대상이다
↓shell
__debug__와 assert
- __debug__는 파이썬이 -O 옵션으로 시작되지 않았다면 참이 되는 상수다. 인터프리터 실행 시 설정된다
- -O 옵션으로 시작한 경우, __debug__에 대한 조건부 코드와 assert문이 제거된다
- assert_stmt ::=
- assert EXPRESSION ::=
- assert EXPRESSION1, EXPRESSION2 ::=
↓python
↓python
↓python
weakref
- 약한 참조 : 캐시와 같이 객체 카운트를 증가시키지 않고 객체를 참조
- WeakValueDictionary : 약한 참조를 값으로 가지는 가변 매핑. 객체가 GC 수집되면 키가 자동으로 제거된다. + WeakSet
- weakref.finalize(참조변수, 콜백) # 객체 소멸시 실행될 콜백 등록
Python 3.7
- CPython UTF-8 강제 설정
- CPython 개발 환경 실행
- 모듈에 대한 __getattr__(), __dir__() 정의 허용
- @dataclass
- 일반적인 dict는 삽입 순대로 정렬된다(공식 스펙)
-X utf8 옵션 또는 PYTHONUTF8 환경 변수 설정
-X dev 옵션 또는 PYTHONDEVMODE 환경 변수 설정
단순 DTO 클래스에 대해 __repr__(), __eq__(), __hash__()를 자동 생성한다
Python 3.8
- 새로운 할당 연산 :=
- 키워드 매개변수 비허용 /
- f-string : 디버깅을 위한 자기 서술적 문자열 표기법
- reserved() 빌트인 함수를 통해 dict, dictview 객체를 삽입 순서대로 순회할 수 있다
- python -m asyncio
↓python
처럼 할당 후 사용이 가능
↓python
a, b는 키워드 인자로 보낼 수 없다
↓python
로 실행하면 asyncio.run()을 호출할 필요없이 최상위 수준에서 await 구문을 이용할 수 있다
compile() 빌트인 함수에 ast.PyCF_ALLOW_TOP_LEVEL_AWAIT를 넘기면 최상위 레벨에서 await, async for, async with 사용이 허용된다