RとPythonの早見表 (2) 条件分岐,ループ,関数などの扱い

シェアする


随分時間が経っちゃいましたが,RとPythonの対応表の第2弾です.前回の記事はこちら↓

今回は条件分岐とループ,関数です.対応表にしようとしたんですが,なんか見づらくなったので表の形にはしませんでした.交互にコードを紹介します.Pythonらしいプログラムかどうかはともかく,とりあえずこれらが分かればコードを書くことは出来ます.

今回サンプルで作成した関数は,非常に簡単な2次方程式の解を判別するプログラムです.先ずはRで書きます.どうってことのない条件分岐です.

> solve_quad_equ <- function(a, b, c) { 
+      D = b^2-4*a*c; 
+      if(D>0) {
+         cat("different two real root\n");
+      } else if(<0) { 
+         cat("different two imaginary root\n"); 
+      } else { 
+         cat("two multiple root\n"); 
+      } 
+      return(D); 
+ } 
> 
> D <- solve_quad_equ(1,2,2) 
different two imaginary root 
> D
[1] -4
>

これをPythonで記述し,同じように実行すると,

>>> def solve_quad_equ(a,b,c):
...    D = b**2-4*a*c
...    if D>0 :
...        print('different two real root')
...    elif D<0: 
...        print('different two imaginary root') 
...    else: 
...        print('two multiple root') 
...    return D 
... 
>>> D = solve_quad_equ(1,2,2)
different two imaginary root
>>> D
-4
>>> D = solve_quad_equ(1,10,2)
different two real root
>>> D
92
>>> 

うーむ,ifの範囲がR(や他の多くの言語)では,{ }で囲うんですが,Pythonではインデントで表すようです.これが慣れないうちは気持ち悪いかも(笑).

Pythonの関数は,defから始まって関数名を書いてカッコ書きで引数を列挙するという書き方.関数も最初と最後を表す{ }は書かないで,インデントで表します.

次はループ.S=1+2+…+10を計算するプログラム.ただし,rangeは1〜10までのリストを生成する関数(1〜11までではない).今までの癖でついミスしてしまいそうです.

>>> S = 0
>>> for n in range(1,11):
>>>     S += n
>>>
>>> S
55
>>>

pythonやRらしい書き方だと,

>>> sum(range(1,11))
55
>>>

となります.ちなみにRだと

> sum(1:10)
[1] 55
>

単純に5回処理を繰り返すというだけなら(イテレータを処理に使用しない場合),range(5)と書けばよいです.書式は,range(初期値,最終値+1,増分)で初期値と増分は省略可.省略した場合は初期値=0,増分=1に設定することになります.

>>> for n in range(5):
...     print('processing')
... 
processing
processing
processing
processing
processing
>>> 

これをRで同じことをすると,

> for(n in 1:5) {
+ cat("processing\n")
+ }
processing
processing
processing
processing
processing
> 

となります.だけど,これだけだとC言語の書き方をそのままRやPythonに対応させただけですね(苦笑).一応動きますが,for文をなるべく使わないのがPython流でありR流でもあります(MATLAB流でもあります).実際,for文を使う使わないで実行速度が雲泥の差です.

その辺はまた少しずつ勉強していきます・・・