Magic Method
__
λ‘ μμν΄μ λλλ κΈ°λ³Έ ν΄λμ€ μ μ λ©μλ- μ΄κ² μ΄μΈμ μΈλ±μ€ κ΄λ ¨ν¨μ λͺ©λ‘
__getitem__(index)
def __getitem__(self, index):
pass
# indexλ [] μμ κ°μ΄
- κ°μ²΄μ
[]
μ°μ°μλ₯Ό μ¬μ©νμ¬ μ‘°ν ν λ μλνλ λ©μλ - numpyμ
[3,4]
μ΄λ° μ¬λΌμ΄μ± λ°©μμ΄ μ΄κ±Έλ‘ ꡬνλμ΄μλ€ list[10] == list.__getitem__(10)
__setitem__(index, key)
def __setitem__(self, index, key):
pass
# indexλ [] μμ κ°, keyλ λμ
κ°
- κ°μ²΄μ
[]
μ°μ°μλ₯Ό μ¬μ©ν΄μ λ³μλ₯Ό μ§μ ν λ list[10] = 1 == list.__setitem__(10, 1)
__str__()
- κ°μ²΄μ μ§μ print λ₯Ό μ€μ λμ€λ μΆλ ₯ ꡬ문 컀μ€ν
__call__()
- κ°μ²΄λ₯Ό ν¨μμ²λΌ νΈμΆν μ μκ² ν΄μ£Όλ λ©μλ
obj = Object()
obj()
# __call__() ν¨μκ° νΈμΆλλ€
enumerate
for index, item in enumerate(arr):
- 리μ€νΈ νλͺ©λ€λ‘ for λ릴μ μΈλ±μ€λ κ°μ΄ μ»λ κ°μ²΄
typing
Literal
a: Literal["μ΄κ±°", "μ κ±°"] = "μ΄κ±°"
- νμ μ βμ΄κ±°β βμ κ±°βλ‘ λ§ λͺ μ νλ
- νΉμ Literal λ°λΌ νμ μ΄ λμ μΌλ‘ λ³ν΄μΌ νλκ²½μ°λ λͺ μ λΆκ°
λμ λ리 μμ λμ λ리 typing
λμ
λ리 = {
"ν€1": dict[Literal["νλͺ©1", "νλͺ©2"], int](
{
"νλͺ©1": 1,
"νλͺ©2": 2,
}
),
}
- μ΄λλ
dict
μ μμ±μλ₯Ό μ¬μ©ν΄ typing κ°λ₯νλ€ - κ·Έλ¬λ©΄
λμ λ리["ν€1"]["νλͺ©1"]
κΉμ§ typing λλ€
Sequence
- μ΄κ±΄
list
μtuple
κ°μ μ΄κ±°ν μλ£νμ μλ―Έ
a: Sequence[int] = [1, 2]
GIL (Global Interpreter Lock) λ¬Έμ
Pythonμ μ μΌ ν° λ¬Έμ λ 1μ½μ΄ 1μ°λ λλ‘ λ°μ λμνμ§ λͺ»νλ€
- λ§μ½ threading APIλ‘ μ¬λ¬ μ°λ λλ‘ μμ
νλ€κ³ ν΄λ
GIL λμ μ¬μ€μ λμμ μ€νλλ€λ μ μ λ μλλ€ - λ€λ§ μμ νκ² μλ―Έλ μλκ² μλκ² I/O μμ
κ°μ΄ Windows API κ°μ
OS API μ μμ‘΄νκ±°λ, λΌμ΄λΈλ¬λ¦¬ μμ²΄κ° C, C++λ‘ κ΅¬νλμλ κ²½μ°
GILμ΄ κ΄μ¬νμ§ μμΌλ―λ‘ λ©ν°μ°λ λ© μ¬μ©μ΄ κ°λ₯νλ€ - νμ§λ§ μμ Python μ½λλ‘ λμ΄μλ CPU μ°μ°μμ
μλ λ³λ‘ ν° μλ―Έκ° μμ΄μ§λ€
- μ΄λλ μ¬μ€μ λΉλκΈ°μ ν° μ°¨μ΄κ° μμ΄μ§λ κ²μ΄λ€.
λ¨μ§ ꡬ쑰μ μΈ μ°¨μ΄μ, λΉλκΈ° κ΄λ¦¬λ₯Ό μΈμ΄ μμ€μμ νλ, OS μμ€μμ νλ μ λ
- μ΄λλ μ¬μ€μ λΉλκΈ°μ ν° μ°¨μ΄κ° μμ΄μ§λ κ²μ΄λ€.
- Python 3.13 μ΄νμλ μ΄κ² μ νμΌλ‘ λ°λλ€λλ° μμ§κΉμ§ μ λλ‘λ μ 보λ₯Ό μ λͺ¨λ₯΄κ² λ€
multiprocessing
νμ΄μ¬μμ λ©ν°νλ‘μΈμ±μ μννλ κ°μ²΄
from multiprocessing import Pool
def f(x):
return x * x
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, [1, 2, 3, 4, 5]))
- Python μμλ μ΄λ° GIL λ¬Έμ λ₯Ό μ°ννκ³ μ λ©ν°νλ‘μΈμ±μ λ§μ΄ μ°λκ±° κ°λ€
- λ€λ§
Frozen Start
λ¬Έμ λλ¬Έμ λ³λ‘ μ€λ μ걸리λ μμ μλ λ©ν°μ°λ λ©μ΄ λͺλ°°λλ λΉ λ₯΄λ€
μ€λͺ
f()
ν¨μλ₯Ό κ°κ° 1, 2, 3, 4, 5μ μΈμλ₯Ό μ λ¬λ°μ μ°μ°νλ€λ κ°λ - λ§μ½ Pool μ 3μΌλ‘ λ³κ²½νλ©΄ 3κ°μ νλ‘μΈμ€λ₯Ό 1, 2, 3μ ν λΉνμ¬ μ°μ° μν€κ³ , κ°μ₯ 빨리 λλ μμΌλ‘ λλ¨Έμ§ 4, 5λ₯Ό μ°μ°
λ©ν°νλ‘μΈμ±μ νΉμ§
- νμ¬ νλ‘κ·Έλ¨μ μ€ννλ νλ‘μΈμ€μ μμ ν λ€λ₯Έ νλ‘μΈμ€λ₯Ό μμ±νλκ²
- λ 립λ Memory-Map κ³Ό, μμμ ν λΉλ°μ
- κ°μ Memory-Mapμ μ°μ§ μμΌλ―λ‘ κ°κ°μ νλ‘μΈμ€ κ° ν΅μ μ IPCλ‘ μ΄λ£¨μ΄μ§
리μ€νΈ μ»΄ν리μ (list comprehension)
x2 = [ n*2 for n in x ]
x2
# μ°μ° for λ³μ in μ°Έμ‘°κ°
Asterisk
Python μμμ
*
Unpacking (*)
μΌλ° μ½λμμμ μ¬μ©
list_data = [1,2,3,4,5]
print(*list_data)
-> 1 2 3 4 5
- λ§μΉ JS μ
...
μ°μ°μ μ²λΌ 리μ€νΈλ, ννμ νμ΄μ£Όλ μν μνλ€
def fuc(a: int, b: int, c: int):
pass
list_data = [1,2,3]
# λλ (1,2,3)
fuc(*list_data)
- μ΄λ κ² μ¬λ¬κ°μ μΈμλ₯Ό μ λ¬ν΄μΌ νλκ²½μ° listλ tupleμ λ§λ€μ΄μ μ λ¬λ κ°λ₯ν΄μ§λ€
dict_data = {1: "name", 2: "age", 3: "height", 4: "weight"}
print(*dict_data)
-> 1 2 3 4
- λμ
λ리μ κ²½μ° ν€κ°μ΄
Unpacking
λλ€
positional argument (*)
ν¨μμμ μ¬μ©
def test(*args):
Β Β print(args)
test(1 ,2, "νμ΄")
-> (1, 2, "νμ΄")
- ν¨μ μΈμλ₯Ό νν ννλ‘ λ°λλ€
- μλ
keyword arguements
μ λ€λ₯΄κ² ν€κ°μ΄ νμνμ§ μμ κ·Έλ₯ 무μμ κ°μ λ§μλ°λ‘ λ£μ μ μλ€ - λͺ¨νΈμ± λ¬Έμ λ‘ positional argumentμ λλ² μ°λ건 νμ©νμ§ μλλ€
keyword arguements (**)
ν¨μμμ μ¬μ©
def test(tes, **kwargs):
Β Β print(kwargs["key"])
test(1 ,key=10)
-> {'key': 10}
- ν¨μ μΈμλ₯Ό λμ λμ λλ¦¬λ‘ λ°λλ€
- ν¨μ νΈμΆ μ
kwargs
μλ λ°λμkey-value
ννλ‘ μ λ¬ν΄μΌ ν¨ - λͺ¨νΈμ± λ¬Έμ λ‘ keyword arguementsμ λλ² μ°λ건 νμ©νμ§ μλλ€
subprocess
subprocess.run
- λͺ λ Ήμ΄λ₯Ό λκΈ°μ μΌλ‘ μ€ν
try:
# check=Trueλ‘ μ€μ νμ¬ μ€ν¨ν νλ‘μΈμ€λ₯Ό κ°μ§
result = subprocess.run(
["bash" "-c", "echo", "ν
μ€νΈ" ],
check=True,
capture_output=True,
text=True
)
except subprocess.CalledProcessError as e:
# μ€ν¨ μ μμΈ μ²λ¦¬
print("μμΈλ°μ")
subprocess.Popen
- λͺ λ Ήμ΄λ₯Ό λΉλκΈ°λ‘ μ€ν
# λͺ
λ Ήμ λΉλκΈ°λ‘ μ€ν
subprocess.Popen(
["bash" "-c", "echo", "ν
μ€νΈ" ],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
)
# λΉλκΈ° μ€ν λκΈ°
stderr, stdout = pr.communicate()
# μμΈμ²λ¦¬
if pr.returncode != 0:
print("μ€ν¨")
argparse
νμ΄μ¬ μ€ν μΈμ μ£ΌκΈ°
parser.add_argument('--args', required=True, help='μ€λͺ
')
# cliμμ λ¨μ μ΅μ
νμ±ν μ
parser.add_argument('--enable', required=True, action="store_true")
args = parser.parse_args()
# μμ λ³μλͺ
μ΄ - λ model μ΄κ² λλ€
print(args.model)
# ν΄λΉ μΈμκ° μμΌλ©΄(μ€μ λμμΌλ©΄) True, μμΌλ©΄ False
print(args.enable)
CLI μ¬μ©
python train/cardDict_train.py --args κ°μ
λ ₯
ν¨ν€μ§ ꡬ쑰
- Python μμλ κ° ν¨ν€μ§ κ° importκ° μ€νμν¨ ν κΈ°μ€μ΄λ€
μ€λͺ
main.py
λ₯Ό μ€ν νμΌμ΄λΌκ³ κ°μ
lib:
lib.py
src:
sub.py
sub2.py
main.py
test.py
-
sub.pyκ° lib.py λ₯Ό import νκ³ μΆλ€λ©΄ μ΄λ κ² ν΄μΌνλ€
import src.sub.py
-
μ΄λ° μλ¦¬λ‘ κ°μ ν¨ν€μ§λλΌλ λ¨μ import κ° μλλ€
#sub.py import sub2 #μ΄κ±° μλ¨ ===μ¬λ°λ₯Έ μμ === import src.sub2
-
λμ
sub.py
κ° test.py λ₯Ό import ν λλ κ°λ₯νλ€# sub.py import test
import μμΉλ₯Ό ν΄κ²°νλ λ°©λ²
-
sytem pathλ₯Ό μΆκ°νμ
import sys sys.path.append("./λ°κΏκ²½λ‘")
μμΈμ²λ¦¬
μμΈ λ°μμν€κΈ°
raise Exception("μμΈ λ°μγ
γ
")
bool νμ λ³ν λ¬Έμ
-
python μμ string bool λ¬Έμμ΄(
false
,true
)μ μ€μ bool νμ μΌλ‘ λ³ν νλ €λ©΄ μλ μ½λλ₯Ό μΈ μ μλ€bool("true")
-
κ·Όλ°λ¬Έμ λ
false
λ¬Έμμ΄λ Trueλ‘ λ°ννλ€ -
μ΄κ² λΉ λ¬Έμμ΄ μ΄κ±°λ,
0
μ΄κ±°λ ν λfalse
λ§ falseλ‘ λ°νλλ€ -
κ·Έλμ bool λ¬Έμμ΄μ
a=="true"
b=="false"
μ΄λ°μμΌλ‘ μ²λ¦¬νμ