ãããããããåŠçæ代ã«ãç§ã¯ãã€ãœã³ã«åãŸããŸããããæœäŒæéãé
ããç§ã¯çç ã®ããã°ã©ããŒã«ãªã£ãããšãå€æããŸããã
ããããããæç¹ã§çç ã¯äœ¿ãæããããç§ã¯Pythonãåãäžããããšã«æ±ºããŸãããæåã«äœããããŠããã®ã¿ã¹ã¯ã«å¿
èŠãªãã®ãèŠã€ããŸããããã®åŸãäœããã®äœç³»çãªç¥èãå¿
èŠã§ãããããã€ãã®æ¬ãèªãã ããšã«æ°ä»ããŸããïŒ
- ãã«ã»ãªã¥ããããããã·ã³ãã«ãªPythonã ããã°ã©ãã³ã°ã®çŸä»£ã¹ã¿ã€ã«â
- ãã³ãããŒããã¥ã¢ãã€ãœã³ã ããã®ããã®ããã°ã©ãã³ã°ã®åŸ®åŠã»
- Brett SlatkinãPythonã®ç§å¯ïŒå¹æçãªã³ãŒããæžãããã®59ã®ãã³ãã
èšèªã®åºæ¬çãªåŸ®åŠããç解ããã®ã«éåžžã«é©ããŠããããã«èŠããŸãããã ã¹ãããã«èšåããããšã¯èŠããŠããŸãããããããæ¬åœã«å¿
èŠãªæ©èœã§ããããšã¯ããããŸããããã¯ãã¹ãŠç¶æ³ã«äŸåããŸãã
ãã®çµæãç§ã¯pythonã®æ©èœã«é¢ããããã€ãã®ã¡ã¢ãèç©ããŸãããããã¯ãä»ã®èšèªããpythonã«ç§»è¡ããã人ã«åœ¹ç«ã€ãšæãããŸãã
Pythonã®ã€ã³ã¿ãã¥ãŒã§ã¯ãèŸæžã®ããŒãšãªããã®ïŒãŸãã¯x = yield y
æå³ïŒãªã©ãå®éã®éçºã«é¢é£ããªããã®ã«ã€ããŠååãªè³ªåãé »ç¹ã«è¡ãããããšã«æ°ä»ããŸãããæ°åãŸãã¯æååã®ã¿ãããã§ãªããŠããŒã¯ãªã±ãŒã¹ã§ã¯ãããã¥ã¡ã³ããèªãã§ããããå°ããçç±ãç解ã§ããŸããïŒ ã€ã³ã¿ãã¥ãŒå¯Ÿè±¡è
ãç¥ããªãããšãèŠã€ããã«ã¯ïŒ ãã®ãããæçµçã«ã¯èª°ãããã®ç¹å®ã®è³ªåã«å¯ŸããçããèŠããŠããŸããæ©èœããªããªããŸãã
3.5以éã®ããŒãžã§ã³ã®ããŒãžã§ã³ãéèŠã§ãããšèããŸãïŒ2çªç®ã®Pythonãé·ãéå¿ãããšããæ¥ãŸããïŒ ããã¯å®å®çDebianã®ããŒãžã§ã³ã§ããã€ãŸããä»ã®ãã¹ãŠã®å Žæã«ã¯ææ°ããŒãžã§ã³ããããŸãïŒ
ç§ã¯ãŸã£ããPythonã®é人ã§ã¯ãªãã®ã§ãããçš®ã®æãããçªç¶åçµããå Žåãã³ã¡ã³ãã§èšæ£ããŠãããããšãé¡ã£ãŠããŸãã
ã¿ã€ãã³ã°
Pythonã¯åçã«åä»ããããèšèªã§ãã å®è¡æã«åã®äžèŽããã§ãã¯ããŸãã次ã«äŸã瀺ããŸãã
cat type.py a=5 b='5' print(a+b)
å®è¡ããïŒ
python3 type.py ... TypeError: unsupported operand type(s) for +: 'int' and 'str'
ãã ãããããžã§ã¯ããéçåä»ãã®å¿
èŠæ§ã«æçããŠããå Žåãpythonã¯mypy
éçã¢ãã©ã€ã¶ãŒã䜿çšããŠãã®ãããªæ©äŒãæäŸããŸãã
mypy type.py type.py:3: error: Unsupported operand types for + ("int" and "str")
確ãã«ããã¹ãŠã®ãšã©ãŒããã®æ¹æ³ã§ãã£ãããããããã§ã¯ãããŸããã
cat type2.py def greeting(name): return 'Hello ' + name greeting(5)
mypyã¯ããã§ã¯èªããŸããããå®è¡äžã«ãšã©ãŒãçºçãããããçŸåšã®ããŒãžã§ã³ã®pythonã¯é¢æ°åŒæ°ã®ã¿ã€ããæå®ããããã®ç¹å¥ãªæ§æããµããŒãããŠããŸãã
cat type3.py def greeting(name: str) -> str: return 'Hello ' + name greeting(5)
ãããŠä»ïŒ
mypy type3.py type3.py:4: error: Argument 1 to "greeting" has incompatible type "int"; expected "str"
å€æ°ãšããŒã¿
Pythonã®å€æ°ã¯ããŒã¿ãä¿åãããããããåç
§ããã ãã§ãããŒã¿ã¯å¯å€ïŒå¯å€ïŒããã³äžå€ïŒäžå€ïŒã§ãã
ããã«ãããã»ãŒåãç¶æ³ã§ããŒã¿ã®ã¿ã€ãã«å¿ããŠç°ãªãåäœãçºçããŸããããšãã°ã次ã®ã³ãŒãã§ãã
x = 1 y = x x = 2 print(y)
å€æ°x
ãšy
ãç°ãªãããŒã¿ãåç
§ãããšããäºå®ã«ã€ãªãããŸãã
x = [1, 2, 3] y = x x[0] = 7 print(y)
ãããã x
ãšy
ã¯åããªã¹ããžã®ãªã³ã¯ã®ãŸãŸã§ãïŒãã ãã ã³ã¡ã³ãã«èšèŒãããŠããããã«ãäŸã¯ããŸãæåããŠããŸããããç§ã¯ãŸã ããŸããã£ãŠããŸããïŒãPythonã®æ¹æ³ã§is
æŒç®åã§ç¢ºèªã§ããŸãïŒJavaã®äœæè
ã¯æ°žé ã«è¯ãç¡ç ã倱ã£ããšç¢ºä¿¡ããŠããŸãïŒç§ã¯Pythonã§ãã®æŒç®åãèŠã€ãããšãã«æ¥ããïŒã
è¡ã¯ãªã¹ãã®ããã«èŠããŸããããããã¯äžå€ã®ããŒã¿åã§ããã€ãŸããæååèªäœã¯å€æŽã§ãããæ°ãããã®ã®ã¿ãäœæã§ããŸãããå
ã®ããŒã¿ã¯å€æŽãããŸããããå€æ°ã«ç°ãªãå€ãå²ãåœãŠãããšãã§ããŸãïŒ
>>> mystr = 'sss' >>> newstr = mystr # >>> mystr[0] = 'a' ... TypeError: 'str' object does not support item assignment >>> mystr = 'ssa' # >>> newstr # 'sss'
æååãšããã°ããã®èæ§ã®ããã«ãã«ãŒãã«è¿œå ãŸãã¯è¿œå ããããšã§æååã®éåžžã«å€§ããªãªã¹ããé£çµããããšã¯ããŸãå¹æçã§ã¯ãªãå ŽåããããŸãïŒç¹å®ã®ã³ã³ãã€ã©/ããŒãžã§ã³ã®å®è£
ã«ãã£ãŠç°ãªããŸãïŒãéåžžããã®ãããªå Žåã«ã¯ãå°ãäºæ³å€ïŒ
>>> str_list = ['ss', 'dd', 'gg'] >>> 'XXX'.join(str_list) 'ssXXXddXXXgg' >>> str = 'hello' >>> 'XXX'.join(str) 'hXXXeXXXlXXXlXXXo'
ãŸããã¡ãœãããåŒã³åºãããè¡ã¯ã»ãã¬ãŒã¿ãŒã«ãªããèãããããããªæ°ããè¡ã®å§ãŸãã§ã¯ãªãã次ã«ããªã¹ãïŒå埩å¯èœãªãªããžã§ã¯ãïŒãæž¡ãå¿
èŠããããŸããããã¯å埩å¯èœãªãªããžã§ã¯ãã§ããããã·ã³ãã«åãããããã§ãã ã
å€æ°ã¯ãªã³ã¯ã§ãããããå
ã®ãªããžã§ã¯ããå£ããªãããã«ãªããžã§ã¯ãã®ã³ããŒãäœæããã®ã¯éåžžã«æ®éã§ãããèœãšãç©ŽããããŸã- ã³ããŒæ©èœã¯1ã¬ãã«ã®ã¿ãã³ããŒããŸããããã¯æããã«ãã®ååã®é¢æ°ããæåŸ
ããããã®ã§ã¯ãªãããã deepcopy
䜿çšãdeepcopy
ã
ããã§èª¬æããããã«ãã³ã¬ã¯ã·ã§ã³ã«ã¹ã«ã©ãŒãä¹ç®ããããšãã³ããŒã«é¢ããåæ§ã®åé¡ãçºçããå¯èœæ§ããããŸã ã
ç¯å²
ã¹ã³ãŒãã®ãããã¯ã¯ããããå¥ã®èšäºã«å€ããŸãããSOã«ã¯è¯ãçãããããŸãã
èŠããã«ãã¹ã³ãŒãã¯ã¬ãã·ã«ã«ã§ãããå¯èŠæ§ã®6ã€ã®é åããããŸã-é¢æ°æ¬äœãã¯ããŒãžã£ãŒãã¢ãžã¥ãŒã«ãã¯ã©ã¹æ¬äœãçµã¿èŸŒã¿Pythoné¢æ°ãšãªã¹ãå
ã®å€æ°ãããã³ãã®ä»ã®ã€ã³ã¯ã«ãŒãå
ã®å€æ°ã
埮åŠãªç¹ããããŸã-ããã©ã«ãå€æ°ã¯åå¥çã«ãã¹ããããåå空éã§èªã¿åãå¯èœã§ãããå€æŽã«ã¯ãããã1ã¬ãã«é«ããŸãã¯ã°ããŒãã«ãªå¯èŠæ§ã®å€æ°ãå€æŽããããã«ç¹å¥ãªnonlocal
ããã³global
ããŒã¯ãŒãã®äœ¿çšãå¿
èŠã§ãã
ããšãã°ã次ã®ãããªã³ãŒãïŒ
x = 7 print(id(x)) def func(): print(id(x)) return x print(func())
1ã€ã®ã°ããŒãã«å€æ°ã§åäœããããã¯æ¬¡ã®ãšããã§ãã
x = 7 print(id(x)) def func(): x = 1 print(id(x)) return x print(func()) print(x)
æ¢ã«ããŒã«ã«ã®ãã®ãçæããŸãã
ç§ã®èŠ³ç¹ãããããšãããã¯ããŸãè¯ããããŸãããååãšããŠãé¢æ°å
ã§ã®éããŒã«ã«å€æ°ã®äœ¿çšã¯ãé¢æ°ã®ãããªãã¯ã€ã³ã¿ãŒãã§ã€ã¹ããã®ã·ã°ããã£ã®äžéšã§ããã€ãŸããæ瀺çã«å®£èšããé¢æ°ã®æåã«è¡šç€ºããå¿
èŠããããŸãã ãŸããããŒã¯ãŒãã¯ããŸãæçã§ã¯ãããŸãã-ã°ããŒãã«é¢æ°ã®å®çŸ©ã®ãããªglobal
é³ã§ãããå®éã«ã¯use global
ãuse global
ããããšãæå³ãuse global
ã
Pythonã§ã¯ãå€ãã®èšèªã§è¡ãããŠããããã«ãããã°ã©ã ãéå§ããå¿
é ã®ãšã³ããªãã€ã³ãã¯ãããŸããããã¢ãžã¥ãŒã«ã¬ãã«ã§æžããããã¹ãŠã®ãã®ãé çªã«å®è¡ãããŸãããã¢ãžã¥ãŒã«ã¬ãã«ã®å€æ°ã¯ã°ããŒãã«å€æ°ã§ãããããç§ã®èŠ³ç¹ããã¯è¯ãç¿æ
£ã§ãmain()
é¢æ°ã«ã¡ã€ã³ã³ãŒããè©°ã蟌ã¿ããã®åŸã«ãã¡ã€ã«ã®æåŸã§åŒã³åºããŸãã
if __name__ == '__main__': main()
ãã®æ¡ä»¶ã¯ããã¡ã€ã«ãã¹ã¯ãªãããšããŠåŒã³åºãããã¢ãžã¥ãŒã«ãšããŠã€ã³ããŒããããªãå Žåã«æ©èœããŸãã
é¢æ°ã®åŒæ°
Pythonã¯ãé¢æ°ã®åŒæ°ïŒäœçœ®åŒæ°ãååä»ãåŒæ°ãããã³ãããã®çµã¿åããïŒãå®çŸ©ããããã®çŽ æŽãããæ©äŒãæäŸããŸãã
ããããåŒæ°ãã©ã®ããã«æž¡ãããããç解ããå¿
èŠããããŸã-ãªããªã Pythonã§ã¯ããã¹ãŠã®å€æ°ã¯ããŒã¿ãžã®ãªã³ã¯ã§ããã転éã¯åç
§ã«ãããã®ãšæšæž¬ã§ããŸãããç¹æ®æ§ããããŸã-ãªã³ã¯èªäœã¯å€ã«ãã£ãŠæž¡ãããŸã åç
§ã«ããå¯å€å€ãå€æŽã§ããŸãã
def add_element(mylist): mylist.append(3) mylist = [1,2] add_element(mylist) print(mylist)
å®è¡ããïŒ
python3 arg_modify.py [1, 2, 3]
ãã ããé¢æ°å
ã®å
ã®ãªã³ã¯ãäžæžãããããšã¯ã§ããŸããã
def try_del(mylist): mylist = [] return mylist mylist = [1,2] try_del(mylist) print(mylist)
ãœãŒã¹ãªã³ã¯ã¯çããŠããŠæ©èœããŠããŸãïŒ
python3 arg_kill.py [1, 2]
åŒæ°ã®ããã©ã«ãå€ãèšå®ããããšãã§ããŸãããèŠããŠããã¹ãéèªæãªããšã1ã€ãããŸããããã©ã«ãå€ã¯é¢æ°ãå®çŸ©ãããšãã«äžåºŠèšç®ããããããæªå€æŽã®ããŒã¿ãããã©ã«ãå€ãšããŠæž¡ãå Žåããå€æ°ããŒã¿ãŸãã¯åçãªå€ãçµæã¯å°ãäºæ³å€ã§ãïŒ
å¯å€ããŒã¿ïŒ
cat arg_list.py def func(arg = []): arg.append('x') return arg print(func()) print(func()) print(func())
çµæïŒ
python3 arg_list.py ['x'] ['x', 'x'] ['x', 'x', 'x']
åçãªå€ïŒ
cat arg_now.py from datetime import datetime def func(arg = datetime.now()): return arg print(func()) print(func()) print(func())
ç§éã¯åŸãïŒ
python3 arg_now.py 2018-09-28 10:28:40.771879 2018-09-28 10:28:40.771879 2018-09-28 10:28:40.771879
OOP
Pythonã®OOPã¯éåžžã«èå³æ·±ããã®ã§ãïŒäžéšã®ããããã£ã«ã¯äŸ¡å€ããããŸãïŒããããã¯å€§ããªãããã¯ã§ãããOOPã«ç²ŸéããŠãããµããšã³ã¹ã¯åœŒãæããã¹ãŠã®ãã®ïŒãŸãã¯ããã§èŠã€ããïŒãã°ãŒã°ã«ã§æ€çŽ¢ãããããããªãã®ã§ãç¹°ãè¿ãã¯æå³ããããŸããããPythonã¯å°ãïŒ -ç°ãªãå²åŠããã·ã³è³¢ãããã°ã©ããããã³ã¯è
åšã§ã¯ãªããšããããšã§ãïŒUPD ãã Pythonã®ããã©ã«ãã¯ä»ã®èšèªã®ã¢ã¯ã»ã¹ä¿®é£Ÿåã«ã¯æ®éã§ã¯ãããŸããã®ã§ãïŒïŒã¡ãœããåã®ã©ã³ã¿ã€ã ãå€æŽãã2ã€ã®äžç·ãïŒè¿œå ããããšã«ãã£ãŠå®è£
ãã©ã€ããŒãã¡ãœããã¯OAPCã§ã¯ãããŸãã ã¹ã¬ããïŒããã䜿çšããæ©äŒããããŠäœãããªãä¿è·ããã1ã¢ã³ããŒã¹ã³ã¢ïŒããã¯ïŒã¡ããã©åœåèŠåã§ãã
éåžžã®æ©èœãæ¬ ããŠãã人ã¯ããã®ãããªæ©äŒãpythonã«ããããè©Šã¿ãæ¢ãããšãã§ããŸããããã€ãã®ãªãã·ã§ã³ïŒ lang ã python-access ïŒã¯ç§ã«ãã£ãŠã°ãŒã°ã«ã§æ€çŽ¢ãããŸããããç§ã¯ãããããã¹ããç 究ãããŸããã§ããã
æšæºã¯ã©ã¹ã®å¯äžã®ãã€ãã¹ç¹ã¯ã Danderã¡ãœããã®ãã³ãã¬ãŒãã³ãŒãã§ããç§ã¯å人çã«attrsã©ã€ãã©ãªã奜ãã§ãã
Pythonã§ã¯ãé¢æ°ãã¯ã©ã¹ãå«ããã¹ãŠã®ãªããžã§ã¯ããã åé¢æ°ã«ãã£ãŠïŒ eval
ã䜿çšããã«ïŒåçã«äœæã§ãããããèšåãã䟡å€ããããŸãã
ãŸãã ã¡ã¿ã¯ã©ã¹ ïŒ Habr ïŒããã³èšè¿°å ïŒ Habr ïŒã«ã€ããŠèªãããšãã§ããŸãã
èŠããŠãã䟡å€ã®ããç¹æ§ã¯ãã¯ã©ã¹ãšãªããžã§ã¯ãã®å±æ§ãåããã®ã§ã¯ãªãããšã§ããäžå€ã®å±æ§ã®å Žåãå±æ§ã¯ãã·ã£ããŠã€ã³ã°ããªã®ã§åé¡ã¯çºçããŸãããåãååã®ãªããžã§ã¯ãã®å±æ§ã¯èªåçã«äœæãããŸãããå€æŽå¯èœãªå±æ§ã®å Žåã¯ã§ããŸãäºæ³ããããã®ãšã¯ãŸã£ããç°ãªããŸãã
cat class_attr.py class MyClass: storage = [7,] def __init__(self, number): self.number = number obj = MyClass(1) obj2 = MyClass(2) obj.number = 5 obj.storage.append(8) print(obj2.storage, obj2.number)
ç§éã¯åŸãïŒ
python3 class_attr.py [7, 8] 2
ã芧ã®obj2
å€æŽããã obj2
storage
å€æŽãããŸããã ãã®å±æ§ã¯ïŒ number
ãšã¯ç°ãªãïŒã€ã³ã¹ã¿ã³ã¹ã«å±ããŠããŸããããã¯ã©ã¹ã«å±ããŸãã
å®æ°
ã¢ã¯ã»ã¹ä¿®é£Ÿåã®å Žåã®ããã«ãPythonã¯éçºè
ãå¶éããããšããªããããæšæºçãªæ¹æ³ã§å€æŽããä¿è·ãããã¹ã«ã©ãŒå€æ°ãå®çŸ©ããããšã¯ã§ããŸããã倧æåã®ååãæã€å€æ°ã¯å®æ°ãšèŠãªãå¿
èŠããããšããåçŽãªåæããããŸãã
äžæ¹ãPythonã«ã¯ã¿ãã«ãªã©ã®äžå€ã®ããŒã¿æ§é ããããããconfigãªã©ã®ã°ããŒãã«æ§é ãäžå€ã«ããäŸåé¢ä¿ãè¿œå ããããªãå Žåã¯ã namedtupleãéžæããã®ãé©åã§ãããåãèšè¿°ããã®ã«å°ãæéãããããŸããç§ã¯ããããè¡šèšã®äžå€æ§é ã®ä»£æ¿å®è£
-BoxïŒfrozen_boxãã©ã¡ãŒã¿ãŒãåç
§ïŒã奜ãã§ãã
ã¹ã«ã©ãŒå®æ°ãå¿
èŠãªå Žåã¯ããã³ã³ãã€ã«ãã®æ®µéã§ã¢ã¯ã»ã¹å¶åŸ¡ãå®è£
ã§ããŸããã€ãŸãã mypyã example ã detailsããã§ãã¯ããŸãã
.sortïŒïŒvsãœãŒãæžã¿ïŒïŒ
Pythonã§ãªã¹ãããœãŒãããã«ã¯ã2ã€ã®æ¹æ³ããããŸãã 1ã€ç®ã¯ãå
ã®ãªã¹ããå€æŽããŠäœãïŒãªãïŒãè¿ã.sort()
ã¡ãœããã§ãã ããã¯ã§ããŸããïŒ
my_list = my_list.sort()
2çªç®ã¯ã sorted()
é¢æ°ã§ãããã®é¢æ°ã¯ãæ°ãããªã¹ããçæãããã¹ãŠã®å埩å¯èœãªãªããžã§ã¯ããåŠçã§ããŸãã SOã§å§ãŸãæ
å ±ãå¿
èŠãªäººã
æšæºã©ã€ãã©ãª
éåžžãæšæºã®Pythonã©ã€ãã©ãªã«ã¯äžè¬çãªåé¡ã«å¯Ÿããåªãã解決çãå«ãŸããŠããŸãããå¥åŠãªç¹ãååã«ãããããéèŠãªããšã¯äŸ¡å€ããããŸãã 確ãã«ãäžèŠå¥åŠã«èŠãããã®ãæè¯ã®è§£æ±ºçã§ããããšãå€æããããšããããŸãããã¹ãŠã®æ¡ä»¶ãç¥ãå¿
èŠããããŸãïŒç¯å²ã«ã€ããŠã¯ä»¥äžãåç
§ïŒãããŸã å¥åŠãªç¹ããããŸãã
ããšãã°ããããã«ä»å±ããunittestãŠãããã¢ãžã¥ãŒã«ã¯ãPythonãJavaã®ã¹ããã¯ãšã¯é¢ä¿ãããŸããããã®ããã Pythonã®äœæè
㯠ãEveybodyã¯py.testã䜿çšããŠããŸã...ããšè¿°ã¹ãŠããŸãã éåžžã«èå³æ·±ããã®ã§ãããå¿
ãããé©åã§ã¯ãªãå Žåã§ãã doctestã¢ãžã¥ãŒã«ãæšæºãšããŠä»å±ããŠããŸãã
æäŸãããŠããurllibã¢ãžã¥ãŒã«ã«ã¯ ããµãŒãããŒãã£ã®ãªã¯ãšã¹ãã¢ãžã¥ãŒã«ã®ãããªçŸããã€ã³ã¿ãŒãã§ãŒã¹ã¯ãããŸããã
ã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ã解æããããã®ã¢ãžã¥ãŒã«ãšåã話-ãããã«ãã³ãã«ãããŠããargparseã¯è³ã®OOPã®ãã¢ã§ããã docoptã¢ãžã¥ãŒã«ã¯åãªãã¹ããŒããœãªã¥ãŒã·ã§ã³ã§ããããã§ã-究極ã®èªå·±ææžåïŒ ããããåã«ãããšãdocoptãšã¯ãªãã¯ã«ããããããããããããããŸãã
ãããã¬ãŒã§ã-ç§ãç解ããŠããããã«ããã³ãã«ãããpdbã䜿çšãã人ã¯å°ãªããå€ãã®éžæè¢ããããŸãããéçºè
ã®å€§åã¯ipdbã䜿çšããŠããããã§ã ãããã¯ãç§ã®èŠ³ç¹ããã ãããã°ã©ãããŒã¢ãžã¥ãŒã«ãä»ããŠäœ¿çšããã®ãæã䟿å©ã§ãã
import ipdb;ipdb.set_trace()
代ããã«import ipdb;ipdb.set_trace()
import debug
import ipdb;ipdb.set_trace()
åçŽã«èšè¿°ã§ããŸãããŸãããªããžã§ã¯ãã®äŸ¿å©ãªæ€æ»ã®ããã«seeã¢ãžã¥ãŒã«ãè¿œå ããŸãã
æšæºã®ã·ãªã¢ã«åã¢ãžã¥ãŒã«ã眮ãæããããã«ã pickleã¯dillã§ã ããšããã§ããããã®ã¢ãžã¥ãŒã«ã¯å€éšã·ã¹ãã ã§ã®ããŒã¿äº€æã«ã¯é©ããŠããŸããã å¶åŸ¡ãããŠããªããœãŒã¹ããåãåã£ãä»»æã®ãªããžã§ã¯ãã埩å
ããããšã¯å®å
šã§ã¯ãããŸããããã®ãããªå ŽåãjsonïŒRESTã®å ŽåïŒãšgRPC ïŒRPCã®å ŽåïŒããããŸãã
æšæºã®æ£èŠè¡šçŸåŠçã¢ãžã¥ãŒã«ã眮ãæããã«ã¯ã reã¯ãæåã¯ã©ã¹ala \p{Cyrillic}
ãªã©ãããããçš®é¡ã®è¿œå æ©èœãåããregexã¢ãžã¥ãŒã«ãäœæããŸãã
ã¡ãªã¿ã«ãpythonã«ã¯ã ããŒã«ãªãªã ã®ã«äŒŒãæ£èŠè¡šçŸçšã®æ¥œãããããã¬ãŒã¯ãããŸããã§ããã
ããã«å¥ã®äŸããããŸã-ãã¡ã€ã«ç·šéã®ã€ã³ãã¬ãŒã¹éšåã§ãæšæºãã¡ã€ã«å
¥åã¢ãžã¥ãŒã«ã®APIã®æ²çãšäžå®å
šæ§ãä¿®æ£ããããã«ãã€ã³ãã¬ãŒã¹ã¢ãžã¥ãŒã«ãäœæããŸããã
ãŸããç§ã¯ãã®ãããªã±ãŒã¹ãããããèããŸããç§ã¯è€æ°ã«åºãããããšããããã®ã§ã泚æããŠãããããçš®é¡ã®çŽ æŽãããæçšãªãªã¹ããèŠãããšãå¿ããªãã§ãã ãããè¯ãæ é€å£«ã¯åœŒã®æ±ºå®ã®æé«ã®éŠããæã£ãŠãããšæããŸããããã¯ãšããã§ãå¥ã®è°è«ã®ãããã¯ã§ã-ç§ã®æ°æã¡ã«ãããšïŒãã¡ããããã®ããŒãã«é¢ããçµ±èšã¯ãªããæããã«ããã§ã¯ãããŸããïŒãPythonã®äžçã§ã¯å°é家ã®ã¬ãã«ã¯å¹³åãäžåã£ãŠããŸããå€ãã®å Žåãè¯ããœãããŠã§ã¢ã¯Pythonã§æžãããŠããã®ã§ãããªããããã«ã€ããŠã©ãæããã³ã¡ã³ãã«æžããŠãã ãã
䞊è¡æ§ãšç«¶äº
Pythonã¯ã䞊åããã°ã©ãã³ã°ãšç«¶åããã°ã©ãã³ã°ã®äž¡æ¹ã«ååãªæ©äŒãæäŸããŸãããæ©èœããªãããã§ã¯ãããŸããã
䞊ååŠçãå¿
èŠã§ãã¿ã¹ã¯ã§èšç®ãå¿
èŠãªãšãã«ãããçºçããå Žåã¯ã ãã«ãããã»ãã·ã³ã°ã¢ãžã¥ãŒã«ã«æ³šæããå¿
èŠããããŸãã
ãŸããã¿ã¹ã¯ã«å€ãã®IOã®æåŸ
ãããå Žåãpythonã«ã¯ãã¹ã¬ããããã³geventããasyncioã«è³ããŸã§éžæããããã®å€ãã®ãªãã·ã§ã³ãçšæãããŠããŸãã
ãããã®ãªãã·ã§ã³ã¯ãã¹ãŠäœ¿çšã«é©ããŠããŸãïŒã¹ã¬ããã¯ããå€ãã®ãªãœãŒã¹ãå¿
èŠãšããŸãïŒããuvloopãªã©ã®ããããçš®é¡ã®æ©èœã®ãããã§ãasyncioãæ®ããåŸã
ã«çµãåºããŠããããã«æããŸãã
誰ããæ°ã¥ããŠããªãå Žå-pythonã§ã¯ãã¹ã¬ããã¯äžŠååŠçã«ã€ããŠã§ã¯ãããŸãããç§ã¯GILã«ã€ããŠååã«è©±ãèœåããããŸãããããã®ãããã¯ã«ã¯ååãªè³æããããŸãã®ã§ããã®ãããªå¿
èŠã¯ãããŸãããèŠããŠããã¹ãäž»ãªããšã¯pythonã®ã¹ã¬ããã§ãCPythonã§ã¯ïŒä»ã®ããã°ã©ãã³ã°èšèªãšã¯ç°ãªãåäœãããŸã-ãããã¯1ã€ã®ã³ã¢ã§ã®ã¿åäœããŸããã€ãŸããå®éã®äžŠååŠçãå¿
èŠãªå Žåã«ã¯é©ããŠããŸããããI / OãåŸ
ã£ãŠãããšã¹ã¬ããã®å®è¡ãäžæåæ¢ããããã䜿çšã§ããŸã 競äºåã®ããã«ã
ãã®ä»ã®å¥åŠãªç¹
Pythonã§ã¯ã a = a + b
å¿
ãããa += b
ãšåçã§a = a + b
ãŸããã
a = [1] a = a + (2,3) TypeError: can only concatenate list (not "tuple") to list a += (2,3) a [1, 2, 3]
ãªããããããã§ããããç解ããæéãèŠã€ãããŸã§ãç§ã¯ãããSOã«éããŸãã圌ãããããããçç±ã®æå³ã§ãããã¯åã³å¯å€æ§ã«ã€ããŠã§ãã
å¥åŠã§ã¯ãªãå¥åŠãª
äžèŠãããšãç¯å²ã®çš®é¡ã«æ£ããå¢çç·ãå«ãŸããŠããªãã®ã¯å¥åŠã«æããŸãããã芪åãªäººãç§ãåŠã¶å¿
èŠãããå Žæãç¡èŠããããã«èšã£ãã®ã§ããã¹ãŠãéåžžã«è«ççã§ããããšãããããŸããã
å¥ã®å€§ããªãããã¯ã¯äžžãã§ãïŒãã®åé¡ã¯ã»ãšãã©ãã¹ãŠã®ããã°ã©ãã³ã°èšèªã«å
±éã§ããïŒãããªãã奜ããªããã«äžžãã䜿çšããããšã«å ããŠãæ°åŠã®åŠæ ¡ã®ã³ãŒã¹ã§å匷ããå
šå¡ãæµ®åå°æ°ç¹æ°ãè¡šãåé¡ããŸã ããã«éç³ãããŠããããã詳现ãªèšäº ã
倧ãŸãã«èšãã°ãåŠæ ¡ã®æ°åŠã®ããã®éåžžã®ããŒãã¢ããã¢ã«ãŽãªãºã ã®ä»£ããã«ã ããŒã ã€ãŒãã³ã¢ã«ãŽãªãºã ã䜿çšãããŸããããã¯ãçµ±èšåæã®æªã¿ã®å¯èœæ§ãäœæžãããããIEEE 754æšæºã§æšå¥šãããŠããŸãã
ãŸãããªã-22//10=-3
ãªã®ãç解ã§ããŸããã§ããããå¥ã®èŠªåãªäººã¯ ãããã¯å¿
ç¶çã«æ°åŠçãªå®çŸ©èªäœã«ç¶ãããšãææããŸãããè² ã®æ°ã
ã¢ã¯ãã³ïŒ ããŠãããã¯åã³å¥åŠãªããšã§ãããç§ã¯äœãç解ããŠããŸããããã®ã¹ã¬ãããåç
§ããŠãã ããã
æ£èŠè¡šçŸã®ãããã°
ãããŠããã§ãPythonã®äžçã«ã¯ãåªããçç ã¢ãžã¥ãŒã«Regexp :: Debugger ïŒ ãããªãã¬ãŒã³ããŒã·ã§ã³ ïŒã«äŒŒãæ£èŠè¡šçŸãã€ã³ã¿ã©ã¯ãã£ãã«ãããã°ããããã®ããŒã«ã¯ãããŸããããã¡ããããããã®ãªã³ã©ã€ã³ããŒã«ããããWindowsç¬èªã®ãœãªã¥ãŒã·ã§ã³ããããŸãããç§ã«ãšã£ãŠã¯ããã§ã¯ãããŸããããããpythonããŒã䜿çšãã䟡å€ããããŸããPythonã®rexeã¯pearl barãšããã»ã©å€ãããªãã®ã§ãpearl barãææããŠããªã人ã®ããã«èª¬æãæžããŸãã
sudo apt install cpanminus cpanm Regexp::Debugger perl -I ~/perl5/lib/perl5/ -E "use Regexp::Debugger; 'ababc' =~ /(a|b) b+ c/x"
çç ã«äžæ
£ããªäººã§ããè¡ãå
¥åããå¿
èŠãããå Žæãšãæ£èŠè¡šçŸãã©ãã«ããããç解ã§ãããšæããŸãx
ã¯python re.VERBOSEã«äŒŒããã©ã°ã§ãã
s
ãæŒããŠã ããã¥ã¡ã³ãå
ã®äœ¿çšå¯èœãªã³ãã³ãã®è©³çŽ°ãªèª¬æã§ããæ£èŠè¡šçŸãã¹ãããå®è¡ããŸã ã
ããã¥ã¡ã³ã
pythonã«ã¯ãããŒããããé¢æ°ïŒdocstringããååŸïŒã®ãã«ããååŸã§ãããã«ãé¢æ°ããããé¢æ°ã®ååããã©ã¡ãŒã¿ãŒãšããŠæž¡ãããŸãã
$ python3 >>> help(help)
ããããããã¯å¿
ããã䟿å©ãªæ¹æ³ã§ã¯ãªããå€ãã®å ŽåãpydocãŠãŒãã£ãªãã£ã䜿çšããæ¹ã䟿å©ã§ãã
pydoc3 urllib.parse.urlparse
ãã®ãŠãŒãã£ãªãã£ã䜿çšãããšãããŒã¯ãŒãã§æ€çŽ¢ããããHTMLããã¥ã¡ã³ãã§ããŒã«ã«ãµãŒããŒãå®è¡ããããšãã§ããŸãããåŸè
ã¯ãã¹ããããŠããŸããã