ガンガンコーディングする、その前に!


こんにちは、切口太郎です。

開発環境も整ったので、早速、VS Code を使って Python でガンガンとプログラミングをしていきましょう! 
と行きたいところですが、そのまえに Python ってどんなもの?について、7つの豆知識をご紹介します。

1 Python はインタープリター型言語
2 Python は、動的型付言語
3 前方参照型言語
4 パッケージ
5 ソースファイルの行数
6 インポート
7 オフサイドルール

1 Python はインタープリター言語


プログラム言語には、コンパイル型とインタープリター型言語の2種類があります。

種類特徴良いところ悪いところ
コンパイル型プログラムソースをコンパイル作業をしてから実行できます。
コンパイル作業でソースのチェックを行うため、動かす前に文法のミスやプログラムミスが見つかります。
コンパイル後の処理速度が速くなります。
コンパイル作業をおこなうので、「動かしながら作っていく」作り方ができません。
きっちりと作ってからでないとコンパイルができないため、経験が少ないとプログラミングが難しくなります。
インタープリター型プログラムソースを実行できる範囲で逐次読み、実行していきます。
「動かしながら作っていく」作り方ができます。経験が少なくても多く作り上げる事ができます。

実行する直前に文法チェックなどを行うので、処理速度が遅くなります
動かしている途中で文法エラーなどが発見されるので、コンパイラーに比べて単純ミスの発見が遅れます。

インタープリター型の言語は、動かしながら文法チェックなどを行うので、いいところまで動いてエラーが出て止まってしまうような事があり、プログラムのテストをしていると「イラッ」と来ることがありますが、IDEで文法チェックなどをする機能が強化されて、この部分は解消されています。

種類言語
コンパイル型
C言語系
Java系 
インタープリター型
Python
Ruby
Javascript

Python はインタープリタ系の言語です。

インタープリター系の言語は、「作りやすいけど、実行速度が遅い」ぐらいで覚えておいてください。

2 Python は動的型付け言語


プログラムで値を扱う場合には、「変数」を使います。
変数は値に仮の名前をつける事で、厳密には値が変更される場合に「変数」、変更されない場合は「定数」と言ったりしますが、Python ではどちらも変数です。

値に仮の名前をつける場合、値は数値か文字列かは、プログラム言語で管理しなければなりません。

"ABCD" + 23 は、演算できないからです。

そこで、変数に明示的に型宣言(この変数は文字列を扱うよ)が必要な言語を静的型付け言語、変数に暗黙の型宣言がある言語を動的型付けと呼んでいます。

わかりにく書いてしまいました。具体例を挙げてみます。

静的型付け (java) 動的型付け (python)
String name = "Jhon Smith";
int  num = 100;
name = 1024; ←エラーになる。
name = "Jhon Smith"
num = 100
name = 1024

太字の部分が変数名です。
静的型付け言語の java は、変数の前に型を記述しています。 (String = 文字列 , int = 整数値)

動的型付けの Python では、変数の前に型を指定していません。
これは、変数 name は、 "Jhon Smith" という文字列を設定しているので、文字型の変数と Python が暗黙で判断して内部で型付けを実行しているのです。

3つめの例  name = 1024 は、java では、エラーになります。
java の1つめの例で、 String mame と宣言しているので、 name は String型しか設定できません。

Python では、 name = 1024 でエラーにはなりません。
新しく name に 1024 を設定するので、name は動的に数値型として型付けされます。


3 前方参照型言語

インタープリター型の言語は、ソースの先頭から順にコードを読んで処理を実行します。
人間がソースコードを読む時に上から順に読んでいくのと同じ手順です。

print("プログラム開始!")
base = BaseCls(100)
print(base.getValue())

上のようなソースコードを読んでいくと、1行目はわかりますが、2行目で「????」となるのではないでしょうか。
Pythonも 「???」となり、エラーメッセージを表示します。

NameError: name 'BaseCls' is not defined
BasicCls が見つからない(わからない)とおっしゃっています。

Python では、利用するコードは、予めその前に記述しておく必要があります。

class BaseCls:
    # classmethod で参照する変数
    _val = 0
    def __init__(self, value):
       self._value = value
       _initValue = value

    def getValue(self):
        return self._value
    
print("プログラム開始!")
base = BaseCls(100)
print(base.getValue())



プログラムを実行する順序が①->②->③->④ であれば、
プログラムを記述する順序は、④、③、②、① になります。


4 パッケージ

Python では、プログラムはテキストファイルに記述します。
このプログラムが記述されているテキストファイルを、「ソースファイル」と呼びます。
ソースファイルは、同じグループ、同じ機能、同じ処理など同類のソースを、1つのディレクトリーにまとめて保存して管理するようにします。
このディレクトリーは、python では パッケージとして扱えるようになります。
また、ディレクトリーを階層化して管理することで、パッケージの階層化ができます。


上の図は、フォルダー /mypack を作成して、そこに Python のソースファイルを格納した場合です。
Python では、パッケージとして扱えるようにするためには、特別なファイル __init__.py を作成します。

これで、mypack は、python でパッケージとして扱えます。

インポートは、from mypack import src01 と記述します。

5 ソースファイルの行数

Python で1つのソースファイルに書くプログラムは何行ぐらいが良いかという目安です。
プログラムは10行でも、数万行でも記述できますし、制限もありませんが、1つのソースファイルは 「1,000行ぐらいに収まるように」と言われています。

実際に Python のパッケージで先程の scipy のintegrate ソースコード行数をカウントしてみました。


赤枠の部分は行数が 1,000行を超えているのもありますが、概ね 1,000行に収まっているようです。

「ソースコードは、1,000行程度に収まるように気にかけてあげよう」程度に覚えておいてください。

6 インポート (import)

外部のファイルを利用する場合に使います。
外部のファイルとは、別のソースファイルや、ライブラリーやフレームワークの Pythonプログラムです。

Python は前方参照型の言語というお話をしましたが、import 文も外部ファイルのプログラムを利用する前に記述する必要があります。
記述する場所は、「プログラムを利用する前」なので、直前でも、ファイルの先頭でも問題ありませんが、外部のライブラリーやフレームワークを利用する前は、ファイルの先頭部分ですべて宣言するほうが安全です。

import 文は次の2種類の構文があります。

同じパッケージ内のオブジェクトをインポートするimport モジュール名import mypack
異なるパッケージのオブジェクトをインポートするfrom パッケージ名 import モジュール名from mypack import src01


7 オブサイドルール


Python ソース上の一番の特徴は、構造のインデント(字下げ)が決まっている、文のデリミターがない、ブロックの指定がないの3点です。
これは、オフサイドルールと呼ばれる記述方法です。

この規定により、Python は誰が書いても同じフォーマットのソースコードになります。

今は、IDEの機能が強力で、ソースコードフォーマッターで統一する事が多いのですが、Pythonの場合は プログラマーが意識してコーディングする必要があります。
このルールは、すぐ慣れるでしょうし、慣れれば自然にコーディングできます。

以下は Python のサンプルコードです。

'''
    Python のオフサイドルール
'''

# 関数の書き始めは、必ず1カラム目から始める
def add(str):                       # 関数の最後には、ブロックの始まりとして必ずコロン(:) が必要
    base = 'this is '               # 関数のコードは、4カラム目から始める デリミターキャラクターはない。
    return base + str            # 関数のコードは、4カラム目から始める デリミターキャラクターはない。
    
def is_zero(value):
    if value == 0:                  # if 文もブロックなので、最後にコロンが必要
        print("zero")               # ブロックのコードは、+4カラム目から始める デリミターキャラクターはない。
    else:                           # else 文もブロックなので、最後に : が必要
        print("not zero")           # ブロックのコードは、+4カラム目から始める デリミターキャラクターはない。

# 関数ではない、プログラムコードは、必ず1カラム目から始める。
print(add("kirikutitarou"))
is_zero(0)
is_zero(1)

まとめ

Python のプログラムを覚える前に知っていたほうが良い事柄についてまとめました。

プログラミング言語の詳細な仕様を覚えるまえに、全体の仕様を覚えておけば、実際のプログラムを作成するときに役立ちます。

言語仕様を覚えたけど、プログラムの1行目が書けない! というのは、全体像のイメージができていない場合に起こります。
今は、なんとなくこんな感じかでも良いので Python の全体像を覚えておきましょう。
 
各則の前に総則です。

Python の学習本(Pythonに限らずですが)、いきなり Hello world を表示してみようから、細部の言語仕様が書かれているものが多いのです。
私が勉強したときに、全体像がつかめなかったので、「どこから書いていけばいいの?」 と悩みました。
もしかしたら、「プログラミング言語を学ぶ人は、そんなの当たり前に知っている事が前提」なのかもしれませんが、そんな前提持っている人ばかりが世の中にいるわけではないと思うのです。
誰か1人でも役に立ったというと言ってくれれば、とっても嬉しいです。

コメント

このブログの人気の投稿

Python のファイルアクセス

Lambda について

Visual Studio Code での Python 開発のポイント