見出し

Python入門

   2023年02月11日     21分で読めます

Pythonというプログラミング言語を使用してプログラミング未経験の方がまず学習する点に関して集約して解説していこうと思う。本格的に学習を開始する場合、以下を学習の後、参考書を読むことで理解速度が早まるとと思うので参考になれば幸いです。

ここでは個々の標準メゾット(関数)については説明しないため標準のメゾット(関数)について不明な場合は、別途検索し学習することを進めます。

python のインストール方法は以下のリンクを引用 Python インストール Windows10(64bit)編

目次

初めに

python は、オランダ人のグルド・ヴァンロッサム氏が開発し 1991 年に登場した 言語でソースコードの書き方はオブジェクト指向命令型手続き型関数型などの形式に対応しているので、状況により使い分けることができます。 ソースコードの特徴として、インデントをする決まりがあるのでコード構造が わかりやすく、しやすいという点があります。

一般的に開発を行う場合、エディター用いますが、執者はVisual Studio codeを用いて開発を行っている。

各エディターには Python の記述規則違反を自動で検知、または校正するLinter(リンター)という機能や、余分な改行や空白を除去、インデントの位置を修正するFormater(フォーマッター)また、適切な順序で並べ替えてくれるSortなどの機能が 開発ツールには付随していたり、拡張することができるので、まずは学習を開始する前に、導入してから学習することで、正しい記述規則が身につくのでお勧めです。

執者は、Visual Studio codeflake8というLinter(リンター)を 導入しているので設定のリンクを引用

Visual Studio Code へ flake8 を導入する

変数と型

プログラミングでよく使われる、変数

変数には一時的にデータを格納することができるが、データの形式によって 変数の型は異なるので、まず初めに理解しておくことが必要。

Pythonの主なデータ型は以下

データ型 説明記述例
str文字列文字、文字
“ “ ダブルクォーテーション、もしくは’ ‘ シングルクォーテーションで囲って定義する。
str = ‘abc’
int整数小数点を含まない数値num = 6
float浮動小数点小数点を含む数値num = 3.14
boolブールTrue、False で定義する。check_flg = True
check_flg = False
datetime日付日付date1 = datetime.datetime(2020, 1, 31, 12, 36, 45)
list配列1.複数の要素(文字列、整数、論理など)を含むもの。
2.[ ] を使って定義し、各要素の間はカンマ’,’で区切る。
3.格納した各要素の変更が可能。
list = [‘abc’, 6, True]
print list[0] (abcが出力される。)
tupleタプル1.複数の要素(文字列、整数、論理など)を含むもの。
2.( ) を使って定義し、各要素の間はカンマ’,’で区切る。
3.格納した各要素の変更は不可能。
tuple = (‘abc’, 6, True)
print tuple[1] (6が出力される。)
dictionary辞書1.複数の要素(文字列、整数、論理など)を含むもの。 2.{ }を使って定義し、各要素は、キーと組合せて間にコロン’:’を挟み記述する。
3.キー値と合わせて値を設定することにより、キー値を元に値を参照できる。
4.格納した各要素の変更は可能。
dict = {‘Key1’ : ‘Val1’, ‘Key2’ : ‘Val2’}
print dict(Key2) (Val2が出力される。)

演算子

プログラミングでは演算子を用いていろいろな判定を行う。 演算子について、基本的な要素なのでまず初めに理解しておくことが必要。 まず、演算子には算術演算子 代入演算子 比較演算子 理論演算子 文字列演算子などがある。 他にも演算子は存在するが、初期の学習に言いてまずは上記を優先的に押さえておくと良いので以下にまとめておきます。

Python で使用できる算術演算子は以下の 9 種類。

演算子内容
+a正数
-a負数
a + b加算
a - b減算
a * b乗算
a / b除算
a % ba を b で割った余り
a ** ba の b 乗
a // b切り捨て除算

Python で使用できる代入演算子は以下の 13 種類。

演算子内容  
a = ba に b を代入する  
a += ba = a + b に同じ  
a -= ba = a - b に同じ  
a *= ba = a * b に同じ  
a /= ba = a / b に同じ  
a %= ba = a % b に同じ  
a **= ba = a ** b に同じ  
a //= ba = a // b に同じ  
a &= ba = a & b に同じ  
a= ba = ab に同じ
a ^= ba = a ^ b に同じ  
a «= ba = a « b に同じ  
a »= ba = a » b に同じ  

Python で使用できる比較演算子は以下の 10 種類。

演算子内容
a == ba が b と等しい
a != ba が b と異なる
a < ba が b よりも小さい
a > ba が b よりも大きい
a <= ba が b 以下である
a >= ba が b 以上である
a is ba が b と等しい
a is not ba が b と異なる
a in ba が b に含まれる (a, b は共に文字列、または、b はリストやタプル)
a not in ba が b に含まれない (a, b は共に文字列、または、b はリストやタプル)

Python で使用できる論理演算子は以下の 3 種類。

演算子内容
a and ba も b も真であれば真
a or ba または b が真であれば真
not aa が偽であれば真

Python で使用できる文字列演算子は以下の 7 種類。

演算子内容
a + b文字列 a と 文字列 b を連結します
a * n文字列 a を n 回繰り返します
a[n]文字列 a の中の n 番目の文字を取り出します
a[n:m]文字列 a の中の n 番目から m 番目までの文字列を取り出します
a[n:]文字列 a の中の n 番目から最後までの文字列を取り出します
a[:m]文字列 a の中の 0 番目から m 番目までの文字列を取り出します
a[n:m:s]文字列 a の中の n 番目から m 番目までの文字列を s 個とばしで取り出します

Module を作成してみる

まずは任意のディレクトリーにpy拡張子のファイルを作成してhello_worldと表示されるModuleを作成してみる。 printメゾットはコンソールに値を出力することができるメゾット

print ('hello_world')

Sample_Code

作成した Module を実行するには画像右上の再生マークから実行できる。


実行するとhello_worldと実行される。

簡単な処理を書いて実行してみる

では簡単な処理を書いてみましょう。 今回は、直径 25cm の円の面積を求めましょう。

以下ではmathという Python 標準のライブラリーから 円周率math.piを取得しπr²を計算してプリントしています。 ライブラリーの使い方はここから

ポイント:プリントするときに単位を一緒に出力するために計算した値を文字列に変換しています。  計算した結果はfloat型で単位は’str’型なので型を合わせないと文字を結合できないため。

import math

R: int = 25

range: str = 'cm'

print(str((math.pi*R)**2) + range)

Sample_Code

関数を作成する。

次に簡単な関数を作成してみましょう。 関数とはインプットされた値をもとに、決められた処理を実行してくれるプログラムの部品です。 今回は前回の練習にそって円の面積をお求める関数を作ります。

defステートメントとはpythonで関数を定義する際、関数名の前方に記述する(def 文)宣言です。

以下の例ではcircle_Areaという関数を定義して、半径と、単位を引数として関数に渡すだけで 円の面積を求められる関数を作った。

関数を使用することで、複雑な処理をまとめることができ、何度も似たような処理を記述しなくて済む。 また、単体テストなども容易になり、開発速度も早くなる。

ポイント 1:def 文で定義す箇所はインデントを入れて記述します。

ポイント 2:関数はソースコードの初めに定義しましょう。最後に定義するとprintメゾット内で呼び出している関数が動かない。

import math

r: int
ren: str


def circle_Area(R: int, range: str):

    return str((math.pi*R)**2) + range


r = 25
ren = 'cm'
print(circle_Area(r, ren))

r = 10
ren = 'mm'
print(circle_Area(r, ren))

Sample_Code

条件によって処理を分岐する

プログラミングにおいてとても重要な要素条件分岐について プラクティスをしようと思う。 条件分岐はifステートメントで行うことができる。

ifステートメントでは比較演算子理論演算子 条件にマッチしているか判定し、その判定に基づき処理を変えるというものです。

以下の例では前回関数を作成するで作成したソースコードに条件分岐を追加し関数の引数に渡された値によって出力される値が変わるようになっている。

ポイント 1:ifステートメントの処理はインデントを入れて記述する。

ポイント 2:ステートメントの終わりでインデントを戻すことを忘れないように。

import math

r: int
ren: str


def circle_Area(R: int, range: str):
    result: str

    if R > 10:
        print('計算失敗')
        result = '入力された値が小さすぎて計算できません。' \
            + '\n入力された値:' \
            + str(R) + '\n10より大きい数を入力してください。'

    else:
        print('計算成功')
        result = str((math.pi*R)**2) + range

    return result


r = 25
ren = 'cm'
print(circle_Area(r, ren))

r = 10
ren = 'mm'
print(circle_Area(r, ren))

Sample_Code

繰り返し処理をする

繰り返し処理はプログラミングを行う上で重要で繰り返し処理を適切に使用(実装) できることで、プログラミングの工数の削減および、ソースコードの冗長の低減につながります。

python ではforステートメントとWhileステートメントがあるが今回はforステートメントで解説していく。
以下の Sample では配列関数の要素数分繰り返し処理を行う記述で、繰り返すごとに配列関数の要素をひとつづ取り出し print で出力する処理である。

ポイント 1:forステートメントの処理はインデントを入れて記述する。

ポイント 2:ステートメントの終わりでインデントを戻すことを忘れないように。

i: int = 1
myarry: list = ['おはよう', 'こんにちわ', 'さようなら', 'おやすみなさい', '以上']

for myelement in myarry:  # for 変数 in イテラブルオブジェクト:
    print(f'{i}回目:{myelement}')
    i += 1  # インクリメント
 

Sample_Code Sample_Code

外部ライブラリーを使用して機能を拡張する

外部ライブラリーを使用する場合には importステートメントを使用して外部ライブラリーの参照を宣言することで 外部ライブラリーをSauce内で使用できるようになる。
以下のSampleはmathライブラリーをimportしてmath.piをよびだして使用している。

import math

r: int
ren: str


def circle_Area(R: int, range: str):
    result: str

    if R > 10:
        print('計算失敗')
        result = '入力された値が小さすぎて計算できません。' \
            + '\n入力された値:' \
            + str(R) + '\n10より大きい数を入力してください。'

    else:
        print('計算成功')
        result = str((math.pi*R)**2) + range

    return result


r = 25
ren = 'cm'
print(circle_Area(r, ren))

r = 10
ren = 'mm'
print(circle_Area(r, ren))

Sample_Code

if __name__ == ‘__main__’ の使い方

Pythonではクラスや関数などをまとめたモジュールを作成できる モジュールをインポートすると、モジュールの機能を利用できます。 また、モジュールもPythonプログラムなので、モジュールを直接実行することできるため。 モジュールをテストする時など、「モジュールを直接実行した時」と「モジュールをインポートした時」で動作を変えたい場合があります。 このような時に if name == ‘main’ の構文を使います。 モジュールを直接実行した場合に、 name 変数の中身が、’main’ になることを利用した手法です。

Moduleを作るとき if __name__ == ‘__main__’ でテストコードを記述しておくことで Module内の関数の単体テストが容易に実施できたりと工数削減、品質向上にもつながります。 以下のSampleでは関数をmainで実行するようにし直接Moduleを実行すると定数で引数を私 関数を実行します。

import math

r: int
ren: str


def circle_Area(R: int, range: str):
    result: str

    if R > 10:
        print('計算失敗')
        result = '入力された値が小さすぎて計算できません。' \
            + '\n入力された値:' \
            + str(R) + '\n10より大きい数を入力してください。'

    else:
        print('計算成功')
        result = str((math.pi*R)**2) + range

    return result


def test():

    r = 25
    ren = 'cm'
    print(circle_Area(r, ren))

    r = 10
    ren = 'mm'
    print(circle_Area(r, ren))

if __name__ == '__main__':
    test()

Sample_Code

Class を作成する。

クラス定義を作成する

クラス定義をすることで開発を効率的且つ建設的に行うことができます。 適切なクラス定義を行うことができれば、改修が発生した時のコストも抑えることができる。

以下のSampleは パーソン(人)のクラス定義である。 以下のように定義することで別のModuleでInstanceを生成して記述したクラスを使用することができるようになる。

import datetime


class Person_Class:
    '''
    パーソンクラス
    人の情報を操作することができる。

    member_variable
    ---------
    p_name: str
        氏名
    p_age: int
        年齢
    p_birth: str
        生年月日
    p_address: str
        住所
    '''

    def __init__(self, p_name, p_birth, p_address):  # コンストラクタ
        '''
        パーソンクラスのコンストラクタ
          member_variable
          ---------
          p_name: str
              氏名
          p_age: int
              年齢
          p_birth: str
              生年月日
          p_address: str
              住所
        '''

        self.p_name = p_name
        self.p_birth = p_birth
        self.p_address = p_address
        self.p_age = self.set_age()

    def set_age(self):
        '''
        誕生日から年齢を算出する関数

        parameter
        -------
        self
            コンストラクタのパラーメータ
        return
        set_age: int
            誕生日から換算した年齢を返す。
        -------

        '''
        # フォーマット
        birth_fmt = datetime.datetime.strptime('','%Y-%m-%d')
        now_date = datetime.datetime.strptime(str(datetime.date.today()),'%Y-%m-%d')

        # 年齢のベースを作成
        age_base = now_date.year-birth_fmt.year
        if now_date > datetime.datetime(now_date.year, birth_fmt.month, birth_fmt.day, birth_fmt.hour, birth_fmt.minute, birth_fmt.second):
            age = age_base
        else:
            age = age_base + 1

        return age

Sampleの関数を使うときは以下のようにする


from easy_class import Person_Class


p = Person_Class('morimoto_tsubaki',
                 '2022-01-02',
                 '千葉県千葉市千葉1-1-1'
                 )

print(f'{p.p_name}{p.p_age}歳です。')

Sample_Code

Class 継承

Class継承することで 既存のクラスの特性を引き継いで新たなクラスを作成することができる。 継承を利用することでコードの再利用性が高まり汎用的、抽象的な機能等を 親クラスに定義することで、類似コードを繰り返し記述することがなくなり。 開発、改修コスト低減も望める。 可読性も上がる利点がある。

以下では前述で作成したPerson_Classを継承Member_Classを定義している。

class Member_Class (Person_Class):

    def __init__( self ) :
            print( "Person_Class __init__()")


リファレンスなどの見方(中級者以上の学習方法)

ここまでで、基本的なPythonのプログラミングについて触れてきました。 ここから先の学習については必要に応じて、ドキュメントを読むことをお勧めします。 書籍を一つ買うことをお勧めしますが、それ以外にネットで閲覧できるお勧めのサイトをご紹介します。

  1. Python公式リファレンス ベースの知識はここから得るのが間違いない
  2. note.nkmk.me pythonの実使用にそって目次もあるので実用的
  3. Qiita pythonに限らず様々な技術DOCUMENTが検索できる