ホーム‎ > ‎

Python入門

1.Pythonとは:誰が作った、などの背景知識は過去のマニュアルへ!
2.PerlとPythonの違い:先にPerlを読んでいるものとしてまとめてみました。ご参考まで。

  • 全体的な処理の流れは,PerlとPython共に同じです。
  • PerlとPythonのキーワードは似ていますが,その構文は異なります。
  • 注釈は,PerlとPython共に同じ書き方です。
  • Perlでは変数のデータ型(スカラー,アレイ)を変数名の接頭辞($,@)で表わしますが,Pythonではそうした型の標識はなく,データ型は代入時に動的に決められます。
  • Perlでは文の終端にセミコロンが必要ですが,Pythonでは改行が文を区切ります (明らかに終わっていない文の一部は、改行しても区切られません)。
  • Perlでは制御構造のブロック (文の集まり) は括弧でまとめていますが,Pythonではブロックはコロンのついたキーワードに続く字下げされた複数の行がまとめられます。
  • Perlでは二重引用符による文字列の中で変数展開できますが,Pythonではできません。
    • 文字列フォーマット演算子 % を用い "%d days and %d hours" % (days, hours) などとします。


3.さっそくプログラムを作ってみましょう!    

コマンドラインに入力して実行することもできますが、結果が消えてしまうので、今回はファイルに保存して実行する方法をとります。

Pythonの現時点での最新バージョンは3.x 系です。2.x 系はまだ使えますが、新しくPythonを習得する上であえて古いバージョンを覚える必要はないでしょう。
2.x 系と3.x 系では互換性がありません。python2コマンドを使うと2.x系が、python3コマンドを使うと3.xが使えます。
インストールされているバージョンは、ターミナル上で

$ python2 -V
または
$ python3 -V
を実行すれば確認できます。

コードを書くコツはこちら:良いコードを書くために



                            図:プログラムを構成する要素


 プログラムファイルの作成と実行 
    

1)メモ帳などのエディタを立ち上げ、プログラムを書き、ファイルに名前を付けて保存します。

    ファイル名は『ファイル名.py』とします。(.pyはPythonのファイルの拡張子です。)
    まずは練習として下のようなプログラムを書き、ファイル名をhello.pyとしてみましょう。保存場所を覚えておきます。
    (今回はホームディレクトリのpython_lessonsというフォルダに保存してみましょう。

    コメントアウトしている箇所(#のあと)であっても日本語を入力する場合は、

        # coding: UTF-8
        と記述するのがお約束です。
        また、Pythonは、文の終わりを改行で表します。(その他の言語はセミコロン;を使うことが多い。)
        Python は文法に従うことでコードが視覚的にも整理され、とても理解しやすい言語であることが特徴のひとつです。

        print ("コマンドライン上に表したい文字列")

        で、コマンドライン上に任意の文字列を表示させることができます。(詳細後述。)

2)プログラムをターミナル上で実行します。
    まずプログラムファイルを保存するディレクトリに移動します。
    ターミナルをたちあげて、
        cd ディレクトリへのパス
    を入力します。
    今回はホームディレクトリpython_lessonsというフォルダに保存しているので

        cd ~/python_lessons

    と入力します。 その後、

         python3 プログラム名.py

    とコマンドを入力し、プログラムを実行します。今回は
         python3 hello.py
    ですね。


 プログラムの構成要素 


    1)変数の種類

        Pythonで使われる変数には次の3種類があります。

        a) スカラー
        b) 配列
            i) タプル:値の変更が不可能な配列
            ii) リスト:値の変更が可能な配列
            iii) Set :要素の重複を含まない集合。各要素に順序はない。
        c辞書:Perlでいうハッシュに該当する。キーと値の組のあつまり。

        

        変数のスコープはPerlとは異なります。参考:http://d.hatena.ne.jp/saitodevel01/20101205/1291582273
        また、Perlでは変数を宣言する際に変数名の始めにデータ型を記述します(ex. $number)が、
        Pythonではそのような記述は行いません。

 
        では、具体的に3種類の変数をみていきましょう。

        
        1) スカラー:ひとつの数、文字、文字列。※線形代数で使われるスカラーとは違います。
            
            プログラム中では
                a = 1
                string = "text"

            などとして宣言します。
            また、変数名の付け方にも色々なコツがありますので調べてみてくださいね!
            スカラーを利用してhello.pyを改良したプログラムを書いてみます。hello2.pyとして保存します。

# coding: UTF-8
# コメント

Greeting = "hello\tworld!"
Word = 'HELLO\t'
Word2 = 'WORLD'

print(Greeting)
print(Greeting * 5)
print(Word + Word2)
print(Word + "\t" + Word2)

RawGreeting = r"hello\nworld!"
print(RawGreeting)

MultiLine = """
    何行にも及ぶ文章は
    3つの \"\"\"
    で囲みます。
    """
print(MultiLine)

実行例:

$ python3 hello2.py
hello    world!
hello    world!hello    world!hello    world!hello    world!hello    world!
HELLO    WORLD
HELLO        WORLD
hello\nworld!

    何行にも及ぶ文章は
    3つの """
    で囲みます。
   

        b) 配列
            i) タプル:値の変更が不可能な配列

                タプルの名前 = (a, b, c, ...)             ←まるいかっこです。
                   要素が1つだけのときは、(a, )と言う風に、必ず , を付ける。要素が1個より多いときは、最後にカンマをつけてもつけなくてもよい。

            ii) リスト:値の変更が可能な配列

               リストの名前 = [a, b, c, ...]                 ←四角いかっこです。
                   要素の数にかかわらず [a] のように最後の要素の後にカンマを打たないスタイルも、[a,] のように最後の要素の後にカンマを打つスタイルも許容される。

               文字列は個々の文字を書き換えられませんが、"Hello world"[0] によって文字 "H"取得できる点でリストに似ています。Python 特有の仕様として、文字文字列との区別がありません。したがって "Hello world"[0][0]"Hello world"[0] と同じです。

            iii) Set :順序づけされていない、要素の重複を含まない集合

                セットの名前 = {a, b, c, ...}               中かっこを使います。 set([a,b,c,...]) のように、リストを set に与える方法もあります。

コード例(collection.pyとして保存):

# coding: UTF-8

#リスト[ , ]は変更可能なオブジェクト
#タプル( , )は変更不可能なオブジェクト

Greeting1 = ["hello world!", "Who are you?",[1,2,3]] #リストの中にリストを入れることも
Greeting2 = ["hello world!", "Who are you?",(1,2,3)] #リストの中にタプルを入れることもできます。
Greeting3 = ("hello world!", [1,2,3])                #タプルの中にリストを入れることもできます。

print(Greeting1[1], Greeting2[2])        #要素へのアクセスはPerlなどとほぼ同じ。
print(Greeting1[-1], Greeting1[-2])      #[-1]で右はじ,[-2]で右はじから2番目の要素にアクセスできる。
print(Greeting1[1::1], Greeting1[0:3:2]) # その他、要素の場所をスライスという方法で指定することも出来る。
print("\n")
#スライスについては長くなるのでここでは割愛しますが、興味のある方は調べてみてください。

#セット
GreetingSet1 = set(["hello!", "hi!", "Bonjour!", "hi!"]) #リストから作る。
GreetingSet2 = {"Yo, man!","Check it out!","hi!"}        #波カッコでくくる書き方もできます。

print("セットをつくりました。重複する要素が消えています。")
print(GreetingSet1)
print("\n")
print("2つのセットの共通集合")
print(GreetingSet1 & GreetingSet2)
print("\n")
print("2つのセットの和集合")
print(GreetingSet1 | GreetingSet2)
print("\n")
print("2つのセットの差集合")
print(GreetingSet1 - GreetingSet2)
print("\n")
print("2つのセットの対称差")
print(GreetingSet1 ^ GreetingSet2)

#その他にもさまざまな関数がありますのでチェックしてみてください。
実行例:
$ python3 collection.py
Who are you? (1, 2, 3)
[1, 2, 3] Who are you?
['Who are you?', [1, 2, 3]] ['hello world!', [1, 2, 3]]


セットをつくりました。重複する要素が消えています。
{'hi!', 'hello!', 'Bonjour!'}


2つのセットの共通集合
{'hi!'}


2つのセットの和集合
{'Yo, man!', 'hello!', 'Check it out!', 'hi!', 'Bonjour!'}


2つのセットの差集合
{'hello!', 'Bonjour!'}


2つのセットの対称差
{'Bonjour!', 'Yo, man!', 'hello!', 'Check it out!'}

        c) 辞書:Perlでいうハッシュに該当する

                辞書の名前 = {キー1: 値1, キー2: 値2, ... }            中かっこで区切られた key-value pair の組。しばしばキーと値を , で区切ってしまいエラーになりますが、キーと値とは : で区切ります。dict([(key1, value1), (key2, value2), ]) のように、タプルのリストを dict へ与える方法もあります。

コード例(dict.pyとして保存):
# coding: UTF-8

Greeting1 = ["hello world!", "Who are you?",[1,2,3]]
Greeting2 = ["hello world!", "How old are you?",(1,2,3)]

DictionaryExample = {"Alice": Greeting1[1], "Kiki":Greeting2[1]}

print ("This is the example of a dictionary\n")
print (DictionaryExample)

print ("\n")
print (DictionaryExample["Alice"], "---I'm Alice!") #辞書の値を取り出したいときは
                                                    #名前[キーの名前]で指定します

print ("\n")
print (DictionaryExample["Kiki"], "---I'm 14!")

実行例:
$ python3 dict.py
This is the example of a dictionary

{'Kiki': 'How old are you?', 'Alice': 'Who are you?'}


Who are you? ---I'm Alice!


How old are you? ---I'm 14!


    2)アルゴリズムの構成要素
            単純な論理構造(制御構造)と演算、関数を組み合わせて、より複雑なアルゴリズムを作成します。

            A) 制御構造
                
a) 繰り返し

                    i) while 文:条件を満たす間、命令を実行し続ける。
                    ii) for 文:指定したリスト等の構造を先頭から順に走査する。

                b) 条件分岐
                    i) if 文:場合分けをして命令を実行する。else if は elif と記述される。


             B) 演算子(各言語によってそんなに違いはありません。)

                a) 四則演算、その他
                    +, -, *, /, %, ** : 足し算、引き算、かけ算、割り算、割り算した余り、べき乗
                    除算の商は負の無限大方向へ切り捨てられ、剰余は除数 (% の右側) と同符号にとられます。
                    他の言語では剰余を被除数と同符号にとる場合が多いので注意しましょう。

                    割り算の答えを整数として得るには、//演算子を使います。

                    冪乗を意図して誤って書きがちな ^ は bitwise xor になります。他のビット演算子 &, |, <<, >> も用意されています。


                b) 比較演算子
                    数字・文字の比較:   (Pythonでは比較演算子は数値と文字列ともに同じ記号を用います。)
                    >, <, >=, <=, ==, !=, <>, is:(前半省略)、等号、不等号、不等号(Pythonのみ)、オブジェクトそのものの同一性の比較

                c) 論理演算子

                    and, or, not :AND, OR, NOT     (Pythonはそのままですね!わかりやすい。)        

               さて、プログラムを書きながら詳しく見てみましょう。

コード例(control.pyとして保存):

# coding: UTF-8
#
##### while文 #####
# while文は
#   while 条件式:
#       命令文
#       命令文
#       (改行)
# と書きます。タブを使ってインデントすることで、whileループの中にあることを表します。
#
##### for文 #####
# 色々な書き方がありますが、ひとまずひとつ解説します。
#   for 媒介変数(iなど) in range(n):
#       命令文
#       命令文
#       (改行)
# と書きます。nは繰り返し回数です。こちらもタブを使ってインデントすることで、forループの中にあることを表します。
#
##### if文 #####
# if文は
#   if 条件式:
#       命令文
#   elif 条件式:
#       命令文
#   else:
#       命令文
#       (改行)
# などと書きます。そろそろプログラミングに慣れてきたころだと思うので、合わせ技でプログラムを書いてみます。

for i in range(2):
    if i == 0:
        j = 10
        while j >= 0:
            print("*" * (((j**2)//2)+1)) #割り算に//演算子を使うことで、小数点以下を切り捨てて整数値にします。
            j -= 1    #1回実行するごとにjの値が1減ります。PerlやCなどのようにj--という書き方は出来ません。

    else:
        j = 0
        while j <= 10:
            print("*" * (((j**2)//2)+1))
            j += 1    #1回実行するごとにjの値が1増えます。PerlやCなどのようにj++という書き方は出来ません。

実行例:

$ python3 control.py
***************************************************
*****************************************
*********************************
*************************
*******************
*************
*********
*****
***
*
*
*
*
***
*****
*********
*************
*******************
*************************
*********************************
*****************************************
***************************************************

            ここまでの知識だけでも結構色々なことが出来ますね!
            さてここで練習問題。上では x = y^2 を表してみましたが
 y = x^2 を画面上に表すにはどうしたらよいでしょうか?
            (解答は上の例より明らか。)

            

            C) 関数・メソッド:変数(引数)・オブジェクトに対してある変換を施すもの。
            集合を構成するための set は関数の1つで、与えられたデータの構造をリストなどから集合に変換するものです。
            数学でいう関数と違い、副作用や状態を持つこともできるのがプログラミングにおける '関数' の特徴です。

            メソッドはオブジェクト(の中の変数)に対して作用します。
                object名.method名(引数
)
            として記述されます。実質行っていることは関数と同じですが、
            行っていることや作用の対象が視覚的に理解しやすいという利点があります。
            Pythonに標準的に装備されている関数やmethodはたくさんありますので、
            まずは一覧をざっとながめてみましょう。https://docs.python.org/3/library/functions.html

   
            また、作成したアルゴリズムをまとめて自作の関数を(同じファイル内に)作ったり、
            違うファイルにまとめてモジュールを作ることができます。
            Pythonはモジュールが充実していて、
標準ライブラリに加えて、
            数千のコンポーネントが (独立したプログラムやモジュールからパッケージ、アプリケーション開発フレームワークまで)
            成長し続けるコレクションとして
Python Package Index から入手可能です。


            実際にプログラムを書きながら勉強しましょう。

            例題:置換σを巡回置換の積に分解するプログラムを書いてみましょう!以下の内容をcycle.pyという名前で保存します。

# coding: UTF-8

#
#置換σを巡回置換の積に分解する
#σ(x) = (1,2,3,0, 5,6,7,4)とする。
#σ =(0,1,2,3)(4,5,6,7)が答え。

SIGMA_X = {0:1, 1:2, 2:3, 3:0, 4:5, 5:6, 6:7, 7:4}

TmpKey = 0
TmpList = []

while len(SIGMA_X)>0:                   #lenは配列の長さを取得する関数
    if TmpKey in SIGMA_X:
        TmpList.append(TmpKey)          #appendはリストに要素を追加するメソッド
        TmpKey = SIGMA_X.pop(TmpKey)    #popは辞書のキーと値を取り出して削除するメソッド
    else:
        print(TmpList)
        TmpList = list(SIGMA_X.keys())  #辞書のキーの一覧をリストにして取り出す
        TmpKey = TmpList[0]
        TmpList = []

print(TmpList)


実行例:
$ python3 cycle.py
[0, 1, 2, 3]
[4, 5, 6, 7]

    練習問題:今回は辞書を使いましたが、色々な解き方があります!リストを使う方法を考えてみましょう!
    (Perlの方にヒントがあります!)


文責:根上春

Python 3用に改訂:荒田


Comments