Python入門

Perl,RubyときたのでPythonです。
コマンドラインを使うときの言語にこだわりはなく、パイプが上手くつながればいいんじゃないかぐらいの感覚でPythonも使います。使うといっても他の言語と同じく入門的なことしか覚えてませんが。
Python2.7と3の違いも良く分かってないので、なるべく3の方を使っていこうかと思います。

スポンサーリンク

Pythonの好きなところ

私がPythonで一番好きなところは、{}ではなく:を使うところです。

Perl

if($a > 10){
	処理1
	処理2

	処理3
	:
}

Python

if a > 10:
	処理1
	処理2

	処理3
	:

なぜだかうっとりします。Lispの()を美しいと思ってしまうのと同様、どこから湧き出すのかわからない感覚です。

ではPython使っていきましょう。私のdebian9の環境ではデフォルトでインストール済でした。まずはバージョンから。

takk@deb9:~$ python --version
Python 2.7.13
takk@deb9:~$

おっと。バージョン2.7になってます。3.xを使おうと思ったんですがどこにあるんでしょうか。whichしてみます。

takk@deb9:~$ which python
/usr/bin/python
takk@deb9:~$ 

/usr/bin/の下にありました。実体を確認するため、ls -lします。

takk@deb9:~$ ls -l /usr/bin/python
lrwxrwxrwx 1 root root 9  1月 24  2017 /usr/bin/python -> python2.7
takk@deb9:~$

同じ/usr/bin配下にあるpython2.7へのシンボリックリンクでした。
そちらの実体も見てみましょう。

takk@deb9:~$ ls -l /usr/bin/python2.7
-rwxr-xr-x 1 root root 3783608  1月 19  2017 /usr/bin/python2.7
takk@deb9:~$

こちらはバイナリ本体のようです。
ってことは、3.xがあるならここにありますよね。

takk@deb9:~$ ls -l /usr/bin/python*
lrwxrwxrwx 1 root root       9  1月 24  2017 /usr/bin/python -> python2.7
lrwxrwxrwx 1 root root       9  1月 24  2017 /usr/bin/python2 -> python2.7
-rwxr-xr-x 1 root root 3783608  1月 19  2017 /usr/bin/python2.7
lrwxrwxrwx 1 root root       9  1月 20  2017 /usr/bin/python3 -> python3.5
-rwxr-xr-x 2 root root 4747120  1月 19  2017 /usr/bin/python3.5
-rwxr-xr-x 2 root root 4747120  1月 19  2017 /usr/bin/python3.5m
lrwxrwxrwx 1 root root      10  1月 20  2017 /usr/bin/python3m -> python3.5m
takk@deb9:~$

python3.xは、3.5でpython3にシンボリックリンクされていました。

ではHello Worldから。こんな感じで動くでしょうか。

takk@deb9:~/py$ cat hello.py
print "Hello World!"
takk@deb9:~/py$ 

python2.7と3.5両方実行してみます。

takk@deb9:~/py$ python hello.py
Hello World!
takk@deb9:~/py$ python3 hello.py
  File "hello.py", line 1
    print "Hello World!"
                       ^
SyntaxError: Missing parentheses in call to 'print'
takk@deb9:~/py$

2.7は動きましたが、3.5はエラーになりました。

3.xでは、printは()が必要なんですね。

takk@deb9:~/py$ cat hello.py
print("Hello World!")
takk@deb9:~/py$ python hello.py
Hello World!
takk@deb9:~/py$ python3 hello.py
Hello World!
takk@deb9:~/py$

()をつけたら、2.7でも3.xでも両方動くようになりました。
3.xの書き方を覚えていくのが無難なようです。

Python 変数

Pythonもインタラクティブモードがあるので、こちらを使って学習していきます。
インタラクティブって言葉、意味分からず使ってましたが辞書で調べると、相互作用するとか、その場のとか、の意味ですね。まあインタラクティブモードってのは、対話モードってことでしょうね。
使い方はpythonを入力して実行するだけ。

takk@deb9:~$ python
Python 2.7.13 (default, Jan 19 2017, 14:48:08)
[GCC 6.3.0 20170118] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
takk@deb9:~$
takk@deb9:~$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
takk@deb9:~$

2.7.xも3.xもどちらもexit()で抜けられます。

では、3.x系で変数を使っていきます。

takk@deb9:~$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 10
>>> print a
  File "<stdin>", line 1
    print a
          ^
SyntaxError: Missing parentheses in call to 'print'
>>>

おっと、忘れてました。3.xのprintは()が必要なんでした。

>>> a = 10
>>> print(a)
10
>>>

Pythonの変数は、頭に$がつきません。

文字列は”(ダブルクォート)で囲うことも'(シングルクォート)で囲うこともできます。文字列は+で結合です。

>>> a = "aaa"
>>> b = 'bbb'
>>> c = a + b
>>> print(c)
aaabbb
>>>

同じ文字列を繰り返し定義するには、*が使えます。

>>> a = "<aaa>"
>>> a * 3
'<aaa><aaa><aaa>'
>>>

Python リスト

多要素を入れる入れ物を配列と呼んだりリストと呼んだり、各言語で言葉の意味が異なってるのがものすごくややこしいのですが、それぞれの思想なんでしょうね。

Perlでリストというと、

(1,2,3,4)

("aaa","bbb","ccc")

といった値を並べて()で囲ったものを指し、配列は、入れ物のことを指します。

@arr = (1,2,3);

左の@arrが配列、右の(1,2,3)がリストですね。

Rubyは、というと、[]で作成できるのはArrayオブジェクトというぐらいだから、配列と呼んでるようですが、リストという呼び方は見かけたことがありません。
各言語何がどう違うのかというのは、そのうち調べていくことにして、Pythonでは複数の要素を入れる入れ物はリストで、このように定義できます。

takk@deb9:~$ python
(省略)
>>> a = [1,2,3]
>>> a
[1, 2, 3]
>>>

定義方法は、Rubyの配列にそっくりです。

takk@deb9:~$ irb --simple-prompt
>> a = [1,2,3]
=> [1, 2, 3]
>> a
=> [1, 2, 3]
>>

範囲を指定して初期化するのはちょいと難しいです。

>>> a=[i for i in range(1,11)]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>

3.xですが、rangeだけだとrangeそのものが格納されてしまいます。

>>> a = range(1,11)
>>> a
range(1, 11)
>>>

2.7.xはこのように初期化できてしまいます。

takk@deb9:~$ python
Python 2.7.13 (default, Jan 19 2017, 14:48:08)
[GCC 6.3.0 20170118] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = range(1,11)
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>

2.7.xでも3.xでも使える書き方の方を覚えておきたいです。
a = [i for i in range(1,11)]

要素の参照は、Perl、Rubyと同じく[]を使います。

>>> a = [i for i in range(1,11)]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a[3]
4

範囲を参照するにはスライスを使います。[インデックス:インデックス+1]で指定します。

>>> a[3:3]
[]
>>> a[3:4]
[4]
>>> a[3:5]
[4, 5]
>>>

Python 辞書

PerlやRubyでいうところのハッシュです。連想配列です。
Pythonでは辞書と呼ばれているようです。

なんで辞書なんて呼び方をするのか、初めて聞いた時は戸惑いましたが、使ってみると辞書そのものでしたね。

>>> dict={}
>>> dict['apple']='りんご'
>>> dict['banana']='バナナ'
>>> dict['apple']
'りんご'
>>> dict['banana']
'バナナ'
>>>

もちろんPerlやRubyのハッシュでも辞書にように使えます。

takk@deb9:~$ irb --simple-prompt
>> dict={}
=> {}
>> dict['apple']='りんご'
=> "りんご"
>> dict['banana']='バナナ'
=> "バナナ"
>> dict['apple']
=> "りんご"
>>
takk@deb9:~$ cat dict.pl
%dict=();

$dict{'apple'} = 'りんご';
$dict{'banana'} = 'バナナ';

print "$dict{'apple'}\n";
takk@deb9:~$ perl dict.pl
りんご
takk@deb9:~$

こうしてみると、RubyとPythonってまったく同じですね。
どの言語も知らない場合は、Rubyを最初に覚えておけば、PythonもPerlもスムーズに覚えられるかもしれません。

Perlではキーのクォートを省略することができましたが(Rubyではシンボル)、Pythonではどうでしょうか、やってみます。

>>> dict={}
>>> dict[apple]='りんご'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'apple' is not defined
>>>

なるほど、厳格ですね。

初期化も、Rubyと同じです。

>>> dict={'apple':'りんご','banana':'バナナ'}
>>> dict['apple']
'りんごA'
>>>

Python ファイル読み込み

Pythonでもテキストファイル読み込みします。

これまでの学習で、なんとなくRubyの書き方でPythonもいけるんじゃないか、という気がするのでやってみます。

takk@deb9:~$ cat read.py
f=open("read.py")
print(f.gets())
f.close()
takk@deb9:~$

スクリプト自身を一行だけ読み込んで表示するスクリプトです。
これをRubyで実行すると、

takk@deb9:~$ ruby read.py
f=open("read.py")
takk@deb9:~$

当然表示されます。では、Pythonで実行してみましょう。

takk@deb9:~$ python3 read.py
Traceback (most recent call last):
  File "read.py", line 2, in <module>
    print(f.gets())
AttributeError: '_io.TextIOWrapper' object has no attribute 'gets'
takk@deb9:~$

エラーになりました。でも、共通の書き方があるような気もします。次はgetsをreadに変えて実行してみます。

takk@deb9:~$ cat read.py
f=open("read.py")
print(f.read())
f.close()
takk@deb9:~$

まずはRubyから。

takk@deb9:~$ ruby read.py
f=open("read.py")
print(f.read())
f.close()
takk@deb9:~$

全行読み込まれて表示されました。
次はPython。

takk@deb9:~$ python read.py
f=open("read.py")
print(f.read())
f.close()

takk@deb9:~$

なんと! 表示されました。直感で使えるなんて優れた言語だと思います。

Rubyの時も良く分からなかったのですが、ただの関数に見えるopenって何者なんでしょうか。分からないので表示してみましょう。たぶん、type。

>>> type(open("read.py"))
<class '_io.TextIOWrapper'>
>>>

出ました。つまり、TextIOWrapperクラスのオブジェクトなんだけど、省略してopenって書けるってことなんでしょうね。

Rubyのopenも調べてみます。といっても、勝手に表示されます。

takk@deb9:~/py$ irb --simple-prompt
>> f=open("read.py")
=> #<File:read.py>
>>

Fileクラスのようです。File.openなんですね。

Python ファイル書き込み

読み込みが出来たので書き込みも簡単かと思います。きっと何も調べなくても大丈夫でしょう。読み込みではreadメソッドだったので、おそらくwriteですね。
スクリプト作ってみます。

takk@deb9:~$ cat w.py
f=open("out.txt","w")
f.write("AAAA")
f.close()
takk@deb9:~$

Rubyの書き込みの時の失敗を教訓に”w”も指定してみました。

takk@deb9:~$ python3 w.py
takk@deb9:~$ ls
out.txt  w.py
takk@deb9:~$ 

一発で実行できました。
out.txtが生成されていました。中身を確認しましょう。

takk@deb9:~$ cat out.txt
AAAAtakk@deb9:~$

ちゃんと書かれてます。改行してないので、プロンプトと同じ行に表示されて、見難いですが。

“w”がないとRubyのように失敗するのでしょうか。やってみます。

takk@deb9:~$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> f=open("out2.txt")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'out2.txt'
>>>

やはり失敗。指定した名前のファイルを探してしまうのですね。

次は、writeメソッドに注目してみます。リファレンスマニュアルを見れば書いてあるのでしょうけど、マニュアルを見ずに感を養いたいです。

>>> f=open("out2.txt","w")
>>> type(f.write("AAA"))
<class 'int'>
>>> 

なんとintが戻り値になっています。printしてみます。

>>> print(f.write("AAA"))
3
>>>

3が表示されました。AAAという文字列を引数に渡しましたが、もしや文字数でしょうか。
文字列を変えてやってみましょう。

>>> print(f.write("ABCDEFG"))
7
>>>

やはり文字数と一致してます。
観念してPythonリファレンスを見ると、このように書かれていたので、書き込み成功した文字数が返るのでしょう。

write(s)

    Write the string s to the stream and return the number of characters written.

コメント

タイトルとURLをコピーしました