Python ã®å«ããªã¨ãã
ã¡ãã£ã¨å¤ããã©ã
ãããµãä¼å ´ã§ãéè«ãã¦ããã¨ãPythonã¯DISããªããã§ãããã¨æ´ç°ããããããªããèªèçãããªãï¼
ã¨ã¯è¨ããã®ã®ãPythonã¯åºæ¬çã«è¯ãè¨èªã§ã 䏿ºãªç¹ã¯ããªãå¾®å¦ã ãä¸è¬äººã«ã¯ã©ã¼ã§ããããããªç¹ã ã¨æãã
ä¸å¿ãªã¹ãããMatz日記:PythonをDisる。
- å¼ã¨æã®åºå¥ãæç¢ºã
- ã¤ã³ãã³ããã¼ã¹ã ã¨eRubyã®ãããªãã³ãã¬ã¼ããé£ãã
- ãããã¯ãå«ãå¼ãæã¦ãªããHaskellã¿ããã«ãã¬ã¼ã¹ã使ãã°å¼ã«ã§ããã¨ããã®ã«
- reduceããªããªã
- generatoré£ãããyieldãæ¸ãã¨æ»ãå¤ãå¤åããã£ã¦ã®ã¯ã©ãã
- list comprehensionãé£ãããè±èªäººã«ã¯äººæ°ã¿ããã ãã©
ãPython ã¯åºæ¬çã«ããè¨èªãã«ã¯åæãRubyist ã§ãã使ã£ã¦ããªãã®ã« Python ã DIS ã人ãããã®ã¯æ®å¿µãã¤ã³ãã³ããã¼ã¹ãå«ãã¨ãã人ããããã©ãããã£ã¦ã'{ }' ã使ãã 'end' ã使ããã Ruby å«ããã¨åãããããã«ããçºè¨ã ã! ã¤ã³ãã³ããã¼ã¹ã¯æ¬ ç¹ããããã©ãRuby ã®ããã« end ã®å¯¾å¿ãåãããªããªããã¨ããªããããªã¬ã¯å¥½ãã ã!
ãããã¾ã¤ãã¨ãããæãããªã¹ãã¯ããããã«æ¬ ç¹ã¨ããã«ã¯å¾®å¦ã ãããããæ¬ ç¹ã¨æãã®ã¯ãä¸ç´è ã ã¨æãã
ããã§ãèªåãæ¥é æã£ã¦ãããPython ã®å«ããªã¨ãããæãã¦ã¿ãã
ã»print æãããããªç©ºç½ã¨æ¹è¡ãåºåãã¦ãã¾ãã
Python ã§ãã¡ã°ãå«ããªã®ã¯ãprint æãä½è¨ãªããã£ããããããã¨ã ãæ¹è¡æåãåæã«è¿½å ãããª! 弿°ã®éã«åæã«åè§ç©ºç½ãã¤ãããª!
print æã®ãããã« sys.stdout.write() ã使ããã¨ããã¨ãä»åº¦ã¯å¼æ°ã 1 ã¤ããã¨ããªãã
Python3000 ã§ã¯ print(arg, sep='', end='') ã¨ããã°ä½è¨ãªæ¹è¡ã空ç½ãåºåãããªããããããããã©ã«ãã®è¨å®ã«ãªã£ã¦ããã¹ãã ãããªãã§ãã¡ãã¡ãªãã·ã§ã³æå®ããªããããã!
Ruby ã¯ãã®ã¸ããããã§ãã¦ã¦ãä½è¨ãªãã¨ãããªã printãããã«è¨ãã£ã¦ããã putsããããã°ã§å¤§æ´»èºã® pãã¨ç¨éã«å¿ãã¦è¤æ°ã® print ç³»ã¡ã½ãããç¨æãã¦ããã¦ãããPython ããprint 㨠println ãããã¯ãã£ã¦ããã¨æãã
ã»list ã dict ã str ã大æåã§å§ã¾ã£ã¦ããªãã
built-in type ã® list ã dict ã tuple ã str ã set ã file ã¯ãã¯ã©ã¹åã¨åãããã«æåã¯å¤§æåã«ãã¦ã»ããã£ãããªã¬ã¯ list ã dict ã tuple ã str ã set ã file ã¨ãã夿°åã使ããããã ã! list = List() ã¨ã dict = Dict() ã¨ããããµãã«ããããã ã! lst ã dct ã L ã D ã¨ãã夿°åã«ããã®ãã¤ã¤ãªãã ã!
ãããã㯠Samlltalk 風㫠aList ã aDict ã使ãããã
ã»built-in type ã®ãªãã¸ã§ã¯ãã«ããããã£ã追å ã§ããªãã
ãã¨ãã°ãããªã®ã
>>> L = [] >>> L.default = 0 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'list' object has no attribute 'default'
ãããçµæ§ä¸ä¾¿ã
ã»built-in type ã«ã¡ã½ããã追å ã§ããªãã
ãã¨ãã°ãããªã®ã
>>> def foo(self): ... print('foo') ... >>> list.foo = foo Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't set attributes of built-in/extension type 'list'
Ruby ã ã¨ãããªå¶éããªãããããã¨ãã° Object#to_yaml() ã Object#to_json() ããã¨ãã追å ã§ãããPython ã§ã¯ãããã§ããªããããto_yaml() ã to_json() ã¯ã¡ã½ããã§ã¯ãªã颿°ã«ãããããªãã
ã»str#join() ãæåå以å¤ã®è¦ç´ ãããã°ã¨ã©ã¼ã«ãªãã
ãã¨ãã°ãããªã®ã
>>> L = ['foo', 'bar', 123] >>> ''.join(L) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: sequence item 2: expected string, int found
str 以å¤ã®è¦ç´ ããã£ãå ´åãRuby ã§ã¯åæã«æååã«å¤æããããã©ãPython ã¯ã¨ã©ã¼ã«ãªããããããã£ããä¸ä¾¿ã
ã»super ã使ã£ã親ã¯ã©ã¹ã®ã¡ã½ããå¼ã³åºãããã«ãã
ã¨ãããã親ã¯ã©ã¹ã®ã¡ã½ãããå¼ã³åºãã¨ãã«ã¯ã©ã¹åãå¿
è¦ãªæç¹ã§ééã£ã¦ãã
class Parent(object): def hello(self, name='World'): print 'Hello, %s!' % name class Child(Parent): def hello(self, name='World'): print "***", ## 親ã¯ã©ã¹ã®ã¡ã½ãããå¼ã³åºã Parent.hello(self, name) # 親ã¯ã©ã¹åãå¿ è¦ ## ã¾ã㯠super ã使ã super(Child, self).hello(name) # åã¯ã©ã¹åãå¿ è¦
ã»dict ãã«ã¼ãããã®ã« .iteritem() ãã¤ããå¿
è¦ãããã
for key, val in dict1.iteritems(): ã§ã¯ãªã㦠for key, val in dict1: ã§æ¸ãããã«ãã¹ãã ããRuby ã¯ããã§ããããã«ãªã£ã¦ããã ãããPython ã dict.__iter__() 㯠dict.iteritems() ã«ãã¹ãã ã£ããã ã£ã¦ for val in dict1: ããã for key, val in dict1.iteritems(): ã®ã»ããå§åçã«å¤ããã®ã
ã»dict ã«ããã¦ãã¼ããªãã¨ãã«ä¾å¤ãçºçããã
ãã¨ãã° d = {'a'=>1} ã¨ãã£ãã¨ãã«ãPython ã§ã¯ d['b'] ã§ KeyError ãçºçãã (d.get('b') ã 㨠None ãè¿ããã)ãä»ã®è¨èª (Java, Ruby, PHP, Perl) ã§ã¯ã©ãã NULL ã nil ãè¿ã£ã¦ããã®ã§ãPython ã ãéåæããããdict[] 㨠dict.get() ã®ä»æ§ãéã«ãã¦ã»ããã£ãã
ã»é¢æ°ã®ããå¤å´ã®ã¹ã³ã¼ãã«ãã夿°ã«ä»£å
¥ã§ããªãã
Python ã§ã¯ãlocal 夿°ã¨ global 夿°ã«å¯¾ãã代å
¥ã¯ã§ããã
x = 0 # global 夿° y = 0 # global 夿° def f(): global y # global 夿°ã¨ãã¦å®£è¨ x = 1 # local 夿°ã¸ã®ä»£å ¥ y = 1 # global 夿°ã¸ã®ä»£å ¥ # f() print x #=> 0 print y #=> 1
ãããã颿°ã®å¤å´ã®ã¹ã³ã¼ãã表ããã¼ã¯ã¼ãããªãããã颿°ã®å¤å´ã®ã¹ã³ã¼ãã«ãã夿°ã«ä»£å ¥ã§ããªãã
def f(): x = 0 # f() ã® local 夿°ã¸ã®ä»£å ¥ def g(): x = 1 # g() ã® local 夿°ã¸ã®ä»£å ¥ # g() # g() ãå¼ã³åºãã¦ã f() ã® local 夿°ã¯å¤æ´ãããªã print x #=> 0 # f()
Ruby ã® closure ã«æ £ãã¦ãã¾ã£ã身ã¨ãã¦ã¯ãouter ã¨ããããããã¼ã¯ã¼ãã追å ãã¦ã§ãã颿°ã®å¤å´ã®å¤æ°ã«ä»£å ¥ã§ããããã«ãã¦ã»ãããããã㯠def ã®ãããã« closure ãå°å ¥ããã¨ãã
ã»å¤æ°ã®ã¹ã³ã¼ãã®ä»æ§ããããã«ããã
ãããã«ããã¨ãããããããããã説æãã¿ããã¨ããªãããã¨ãã°ãããªã®ã
def foo(self, x): print x deff bar(self, y): foo(self, y) # ãã㯠OK ãªã®ã« class Test(object): def foo(self, x): print x def bar(self, y): foo(self, y) # ãã㯠NG ã¨ããã®ããã¾ã説æã§ããªã
ããã¯ä»ã®ä»æ§ã«ä¸æºãããã¨ããããã§ã¯ãªãã¦ãPython ã«ããã夿°ã®ã¹ã³ã¼ãã®ä»æ§ãç°¡æ½ã«ãã¾ã説æã§ããªããã¨ã䏿ºã¨ãããã¨ã誰ããããããã解説ãæãã¦ãã ããã
ã»å¼æ°çç¥æã®ããã©ã«ãå¼ãå®ç¾©æã«ããè©ä¾¡ãããªã
def f(d={}) ã¨ããå®ç¾©ããã£ãå ´åãRuby ã§ã¯ã{}ãã颿°å¼ã³åºããã¨ã«è©ä¾¡ãããã®ã§ã颿°å¼ã³åºããã¨ã«æ°ãã Hash ãªãã¸ã§ã¯ããçæãããã
ããã«å¯¾ããPython ã§ã¯ã{}ããå®ç¾©æã«ããè©ä¾¡ãããªãã®ã§ãdict ãªãã¸ã§ã¯ãã¯å®ç¾©æã« 1 åã ãçæããããããæ¯å弿°ã¨ãã¦æ¸¡ããããRuby ã¨åãããã«ãããã¨ããã¨ãPython ã§ã¯æ¬¡ã®ããã«ããªããã°ãªããªãã
def f(d=None): if d is None: d = {}
ã©ã¡ããç´æçãã¨ããã¨ããã£ã±ã Ruby ã ããªã
ã»æååã«å¼ãåãè¾¼ããªãã
æååã®ä¸ã«å¼ã®å¤ãåãè¾¼ãå ´åãPython ã§ã¯ "name: %s, age: %s" % (name, age) ã¨ããããããæååãé·ããªã£ãããå¼ã®æ°ãå¤ããªã£ãå ´åãé常ã«è¦ã¥ããã³ã¼ãã«ãªãã
ä»ã®è¨èªã 㨠"name: #{name}, age: #{age}" (Ruby) ã "name: $name, age: $age" (PHP) ã®ããã«æååã®ä¸ã«å¼ãç´æ¥åãè¾¼ããã¨ãã§ãããç¹ã« Ruby ã§ã¯ #{} ã®ä¸ã«ä»»æã®å¼ãåãè¾¼ããã¨ãã§ãããç´ æ´ãããã
Python ã§ããä¾ãã° e"name: #{name}" ã®ããã«æ°ãã prefix ãç¨æããã°åãè¾¼ã¿å¼ããµãã¼ãã§ããã¨æããã ãã©ãã©ãã§ããã?
ã»3 é
æ¼ç®åãæ¸ãã«ããã¦èªã¿ã¥ããã
3 é
æ¼ç®åã¯ä»ã®è¨èªã 㨠condition ? truevalue : falsevalue ã¨æ¸ããã©ãPython ã§ã¯ truevalue if condition else falsevalue ã¨æ¸ããããã£ã¦æ¸ãã«ãããèªã¿ã¥ãããªã? (æ
£ãã®åé¡ãããããªãã)ã
Python ã§ã¯ãªãã¹ãè¨å·ã使ããªãããã«ãã¦ããã¿ããã ãã©ããã®ããã§èªã¿ã¥ãããªãã®ã¯ã¡ãã£ã¨ãªã¼ã
ã»æ£è¦è¡¨ç¾ã表ããªãã©ã«ããªãã
ã¾ã Python ã«ã¯ raw string ããããããJava ã¨ã¯éã£ã¦æ¸ãã®ã¯ããå°ããªããã ãã©ããã£ã±ããªãã©ã«ã¨ãã¦ãã£ãã»ãã使ãåæãããããã®ããã«ã¯ re ã¢ã¸ã¥ã¼ã«ãçµã¿è¾¼ã¿ã«ãªãå¿
è¦ããããã©ããã£ã¨ãã®äºå®ã¯ãªãã ããã
ã»repr() ãè²§å¼±ã
Ruby ã® Object#inspect() ã PHP ã® var_dump() ã¨æ¯ã¹ãã¨ãPython ã® repr() ã¯è²§å¼±ã§ãããç¹ã«ã¤ã³ã¹ã¿ã³ã¹å¤æ°ã®å¤ã表示ãã¦ãããªãã¨ããã®ã¯ã大å¤ä¸ä¾¿ã§ããã
ã¤ãã§ã«ããã¨ãRuby ã® pp ã«å½ããã©ã¤ãã©ãªãæ¨æºã§ç¨æãã¦ã»ããã
ã»èµ·åãé
ãã
Python ããã»ã¹ã®èµ·åã¯é
ããã¯ã£ãããã£ã¦ãCGI ã§ã¯ã¾ãæ§è½ã¯åºãªããåå ã¯ããç¥ããªãã®ã§ãç¥ã£ã¦ãã人ãããã°æãã¦ãã ããã
ãã ãmod_python ã®æ§è½ã¯ç´ æ´ããããããæ¸¬å®ãã¦ã¿ãéãã§ã¯ãPHP ãããæ§è½ãããã
ã»ãã¡ã¤ã«ãããã¯ããæ©è½ã Windows ã§ã¯ãµãã¼ãããã¦ãªãã
ãã¡ã¤ã«ãããã¯ããã®ã¯ãUNIX ç³»ã 㨠import fcntl ã㦠fcntl.flock(file.fileno(), fcntl.LOCK_EX) ã§ã¦ãããã ãã©ãWindows ã§ã¯ãããã§ããªããRuby ã 㨠Windows ã§ã使ããã ãã§ãªããFile ã¯ã©ã¹ã« flock() ã¡ã½ãããå®ç¾©ããã¦ãããã使ãã®ãç°¡åã
ã»æ¨æºã® CGI ã©ã¤ãã©ãªã« Session æ©è½ãã¤ãã¦ããªãã
ããã¯ã©ãã«ããã¦ã»ãããè¨èªä»æ§ã®æ¡å¼µã夿´ããããªãã®ã§ãããã«ã§ãã§ããã¨ããããã ãã©ãªã¼ãã¾ã Ruby ã® cgi.rb ãã©ããã¨æããã©ã
python ã®å¥½ããªã¨ããã¯å¾æ¥ã
ããããããself.ããå¤ãã®ãå«ã人ããããã©ãã¯ã£ãããã£ã¦ããã¯æ £ããPHP ã®ã$this->fooãã Perl ã®ã$this->{foo}ãã«æ¯ã¹ãã°ããã¶ãã¾ãã ããJavaScript ã ã£ã¦ãthis.ããå¿ é ã ãã©ã¿ããªæå¥ãè¨ãã使ã£ã¦ãããã? Python ã®ãself.ãã ãå«ãã®ã¯ãããããã
ã¾ãçµå±ã¯ Ruby ã®ã@fooããããã§ãã¦ãã¨ãããã¨ãªãã ãã©ãª!