Hatena::Grouprubyist

Going My Ruby Way このページをアンテナに追加 RSSフィード

Ruby ロゴ (C) Ruby Association LLC

2011年08月10日(水)

Python との比較 (その1)

| 09:38 | Python との比較 (その1) - Going My Ruby Way を含むブックマーク はてなブックマーク - Python との比較 (その1) - Going My Ruby Way Python との比較 (その1) - Going My Ruby Way のブックマークコメント

Python との比較です。

。。。というか Pyhton をちょっと勉強したくて、Ruby をベースにして、自分に差分プログラミングです。

インタプリタと環境

インタプリタ起動
$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
$ ruby
               # 何も出ない...。寡黙だ。

ruby の場合、インタプリタとして irb が付属します。

$ irb
>>
インタプリタの 変数 _

インタプリタの 変数 _ には直前の評価値が保存されている。

>>> 10
10
>>> _
10

irb でも同じ。

>> 10
=> 10
>> _
=> 10
ワンライナーで hello, world

オプションは -e でなく '-c'。print の出力は改行される。

$ python -c 'print "hello, world"'
hello, world
$ ruby -e 'puts "hello, world"'  # ruby の print は文字列そのまま出力
hello, world
$ perl -e 'print "hello, world\n"'  # perl の場合
hello, world
スクリプトの体裁

hello.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-    # エンコーディング名は小文字で書く(らしい)
                           # コメントは '#' で始める
print "hello, world"

# vim:set ts=4 sw=4 et fenc=UTF-8:  # インデントは 4、タブは使わない(らしい)

hello.rb

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
                           # コメントは '#' で始める
print "hello, world"       # print は改行しない (改行させるなら puts)

# vim:set ts=2 sw=2 et fenc=UTF-8: # インデントは 2、タブは使わない(そうだ)

ちなみに、

$ python hello.rb  # python で Ruby スクリプトを実行

は、実行できるが

$ ruby hello.py    # ruby で Python スクリプトを実行
ruby: no Ruby script found in input (LoadError)

となり ruby ではエラーになります。shebang をチェックしているようです。


python のモジュール

python のモジュールの import

 import sys         # コマンドラインでは -m モジュール名

 print sys.argv[0]  # sys.argv は ruby の ARGV に相当

Ruby のライブラリの require

 require 'rexml/document'  # コマンドラインでは -r ライブラリ
環境変数 PYTHONSTARTUP

環境変数 PYTHONSTARTUP にインタプリタの起動時の実行コマンドを記述したファイルを指定できます。

ruby では ~/.irbrc が irb (Ruby Interactive Shell) の起動時スクリプトです。

言語の基本

数値
>>> 1      # python
1
>>> 1 + 2
3
>>> 2 - 1
1
>>> 1 - -2
3
>>> 1 + -2
-1
>>> 2 * 3
6
>>> 3 ** 2
9
>>> 3  % 2
1
>>> 5/2
2
>>> 5//2
2
>>> 5.0/2
2.5
>>> 5.0//2
2.0
>>> 1/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>> 1 << 8
256
>>> 5 ^ 5
0
>>> 4 & 1
0
>>> 4 & 3
0
>>> 1j       # 複素数
1j
>>> 1 + 1j
(1+1j)
>>> complex(0,1)
1j
>>> a = 1.5+0.5j
>>> a.real
1.5
>>> a.imag
0.5
>> 1       # ruby
=> 1
>> 1_000
=> 1000
>> 1 + 2
=> 3
>> 2 - 1
=> 1
>> 1 - -2
=> 3
>> 1 + -2
=> -1
>> 2 * 3
=> 6
>> 3 ** 2
=> 9
>> 3 % 2
=> 1
>> 5/2
=> 2
>> 5.0/2
=> 2.5
>> 1/0
ZeroDivisionError: divided by 0
	from (irb):5:in `/'
	from (irb):5
	from /usr/local/bin/irb:12:in `<main>'
>> 1 << 8
=> 256
>> 5 ^ 5
=> 0
>> 4 & 1
=> 0
>> 4 & 3
=> 0
>> require 'complex' # ruby で複素数を扱うには complex ライブラリを使う
=> true
>> 3.to_c
=> (3+0i)
>> Complex(0,1)
=> (0+1i)
>> a = '1.5+0.5j'.to_c
=> (1.5+0.5i)
>> a.real
=> 1.5
>> a.imag
=> 0.5
文字列

python では文字列はふつうシングルクォートのようである。

ヒアドキュメント(に相当するの?)はトリプルクォート!

>>> print '\n'   # バックスラッシュのエスケープを解釈する!


>>> print "\n"   # ダブルクォートも同様


>>> print 'a' 'b'
ab
>>> print "a" "b"
ab
>>> print 'a' * 3
aaa
>>> a = 'a'
>>> b = 'b'
>>> print a + b
ab
>>> print """
... hello
... world
... """

hello
world
>>> 'hello'[3]
'l'
>>> 'hello'[1]
'e'
>>> 'hello'[1:3]  # インデクス 1 から 3 の前まで? JavaScript 風?
'el'
>>> 'hello'[:3]
'hel'
>>> 'hello'[3:]
'lo'
>>> 'hello'[-1]
'o'
>>> 'hello'[2:-1]
'll'
>>> 'hello'[2] = 10   # python の文字列は mutable
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

ruby の場合。

>> print '\n'
\n=> nil
>> print "\n"

=> nil
>> print 'a' 'b'
ab=> nil
>> print "a" "b"
ab=> nil
>> print "a" * 3
aaa=> nil
>> a = "a"
=> "a"
>> b = "b"
=> "b"
>> print a + b
ab=> nil
>> print <<-EOS
hello
world
EOS
> "hello"[1]
=> "e"
>> "hello"[1,3]   # インデクス 1 から 3つ
=> "ell"
>> "hello"[1..3]  # インデクス 1 から インデクス 3 まで
=> "ell"
>> "hello"[2..-1] # インデクス 2 から 最後の要素まで
=> "llo"

python の文字列のインデックスがわかりにくい、と思いましたが、こう考えるみたいです。

     -5  -4  -3  -2  -1
      0   1   2   3   4  ..... ruby の要素インデックス (C言語の配列風) 
    +---+---+---+---+---+
    | h | e | l | l | o |
    +---+---+---+---+---+
    0   1   2   3   4   5  <--- python のインデックス (エディタのカーソル風)
   -5  -4  -3  -2  -1

じゃあ...

>>> 'hello'[-1:5]
'o'
>>> 'hello'[-1:0]
''

うーん...。(負数のインデックスは右にひとつずれていたほうが良かったのでは?)

----

とりあえず、ここまで。