python入門講座 | pythonを使ってみよう3-4(pythonのルール・フォーマットの基礎知識: PEP-8)[第9回]

アラサーOLのためのpython入門講座
基本ルールと構造化を意識することでわかりやすいコードが書けます。より速く正確にプログラミングができます。

Ciao!みなさんこんにちは!このブログでは主に
(1)pythonデータ解析,
(2)DTM音楽作成,
(3)お料理,
(4)博士転職
の4つのトピックについて発信しています。

今回は「アラサーOLのためのpython入門講座」です!
この講座では、プログラミング初心者アラサーOLのMi坊さんに、pythonを学習する上でのアドバイスを行います!
パソコンもプログラミングも初心者だけど、プログラミングができるようになりたい!」という方のためにstep-by-stepで解説していきます。

今日もpythonのスクリプト(ソースコード)を書く方法をご紹介します!
複雑な処理を行いたい場合、同じ処理を繰り返したい場合などに使う方法です。
前回は簡単なソースコードを書いて実行してみましたが、今回からは関数を定義して使ってみるなど複雑な処理をやってみましょう!

まずはpythonで本格的にスクリプトを書く際に意識すると良いことを知識としてご紹介します!
次回以降で実際に手を動かしていきますので、今回は「そんなもんかな」という軽い気持ちで読んでいただいて構いません!

Kaiko
Kaiko

この記事はこんな人におすすめ

  • 初心者だけどpythonを始めた!
  • とりあえずpythonを使ってみたい!
  • 本格的なpythonの動かし方を知りたい!

Abstract | 基本ルールと構造化を意識して速く正確にコードを書こう

Pythonに限ったことではありませんが、プログラミングでは基本的なルールと構造化を意識することで、より速く正確にコードを書くことができます。
PythonではPEP-8という公式の基本ルールがあります。
このルールに従わなくてもプログラミングはできますし、コードも動きます。
しかし、基本ルールに従ったほうが、他人が読んでも自分が読んでも理解しやすいコードを書くことができます。
理解しやすいコードを書いたほうが、ミスが減り、チェックの時間も短縮できます。

また、Pythonでスクリプトを書いて本格的なプログラミングを行う際には、何度も登場する数値や文字列を「変数」として定義したり、何度も行う処理や類似した処理を「関数」としてまとめることで構造化することができます。
Pythonには、構造化しやすい様式があります。
その様式に従ってスクリプトを書くことで、スクリプトの中身が整理され、ミスを減らしたりコードを書くのにかかる時間を減らすことができます。
あとから修正やアップデートが必要になっても変更箇所が少なくて済む利点もあります。

今回は、Pythonの基本ルールPEP-8から特に重要な部分を抜粋して紹介し、構造化されたスクリプトを書くための様式についてお話します!
目を通してみてください!



Background | プログラミングにおける様式の重要性

Pythonのコーディング、特にpythonのスクリプトの書き方には一定のルールとフォーマット(様式)があります。
私自身、完璧に守れているわけではないですが、ある程度意識してコードを書くことで

  • コードが速く書ける
  • ミスを減らせる
  • 後で直したり変更するのが楽
  • 他人に見せたときにすぐに理解してもらえる
  • あとで自分で見返しても理解しやすい

などの利点があります。

複雑な処理や長いコーディングが必要な処理を行うときには、特に今回紹介するPythonスクリプトのフォーマット(様式)に沿ってコードを書くと余計な手間を減らすことができます。
プロのプログラマーでなくともプログラミングをある程度やっていると、他人に読んでもらう機会もありますし、他人に直してもらったり、他人に引き継いでアップデートしてもらう場合もあります。
そのような場合に、基本的なフォーマットに沿って書けていると理解してもらいやすくなります。

プログラミングを学ぶ上でもしっかり型を身につけておくと上達が早くなります。
基本的なフォーマットは先人たちの知恵によって効率的にコーディングできるように編み出されたものです。
フォーマットに沿うことは見かけを良くするためでなく、実用性を高めるためです。
「動けばいい」、「計算さえできればいい」と考えるのではなく、フォーマットも意識してコーディングしてレベルアップしましょう!



Contents | Pythonスクリプトのルールとフォーマット(様式)

以下では、Pythonコーディングの基本的なルールとフォーマットを紹介します。
ここで紹介する内容が全てではなく、違う書き方もあります。
それでもPEP-8は世界共通のルールですし、変数や関数を始めに定義しておいてmain関数で呼び出して使うというフォーマットもよく使われるものです。
覚えておいて損はありません。

今回は実際にコーディングするところまでは立ち入らずに知識だけをご紹介します。
まずは知識として知っておき、次回以降で実際にコーディングをやっていきましょう!

Pythonコーディングのルール: PEP-8

Pythonスクリプトの書き方のルールはPython公式サイト(python.org)の「PEP 8 — Style Guide for Python Code」に細かく規定されています。
PEP-8には「他人が読んだときにわかりやすく書きなさい」ということが書かれています。
正直、私自身もここに書かれているルールを完璧に守れているわけではなく、しばしば逸脱しています。
ただ、「3日後の自分は他人」ということもあるので、あとで自分で見た時にもわかりやすいよう、なるべくPEP-8に従って書くのが良いでしょう。
とはいえ、この記事はPython入門講座なので、そこまで細かいことは言わずに基本的で重要なことだけざっくりとご紹介します!

PEP-8に規定されている中で特に知っておくべきものは以下の3です。
この他にもいろいろ面白い(?)規定があるので興味がある方はPEP-8を御覧ください!

以下で詳しく見ていきます!

インデント | 正しいインデントでエラーを防ごう

インデント(段下げ)にまつわるルールはいくつかありますが、ここでは

  1. Pythonではインデントが意味を持つ
  2. インデントはスペース4つで行う

の2点だけ覚えておきましょう!

Pythonではインデントが意味を持つ

Pythonではインデントが意味を持ちます。
例えば、if文やfor文などでまとまりを作る際に、インデントを揃えます。

a = 1
if(a == 1):
    print('a is unity')
else:
    print('a is not unity')

このようにifやelseでまとめられた中身はインデントを下げる必要があります。
また、悪い例

# bad example
a = 1
if(a == 1):
    print('a is unity')
  print(a)

のようにifの中身のインデントが揃っていないとエラーになります。
ただしくは

# good example
a = 1
if(a == 1):
    print('a is unity')
    print(a)

です。

インデントはスペース4つで行う

PEP-8によると、インデントはスペース(もちろん半角)4つで行うことになっています。
Atomなどのプログラミング用エディタやJupyter Notebookであれば、「Tab」キーを押すと自動的にスペース4つが入るようになっています。

プログラミング言語によってはTabでインデントを行うこともあります。
その影響でPythonでもTabでインデントしてしまうことがあります(私も昔そうでした)。
AtomにはTabをスペースに変換する機能もあるので、もし他人からもらったスクリプトがTabでインデントしていたらスペース4に変換して使いましょう。
Python3系ではTabインデントとスペースインデントの混在は禁止されています。エラーになる可能性があるので注意しましょう。

1行の文字数 | 79文字まで

PEP-8では1行の文字数が79文字(もちろん半角英数)以下にするよう規定されています。
「横に長いコードを書いてはいけない」ということです。
Atomなどのプログラミング用エディタでは、80文字のところに縦線が引かれています(図)。

図. Atomエディタの80文字線

1行を79文字以下にするのは、コード(スクリプト)の読みやすさを保つためです。
PEP-8によれば、コーディングを行うときや他人のコードをレビューする際に、左右2画面で見るということがあります(実際、私もやります)。
そのときに、1行が長いと横にスクロールしなければならないため面倒ですし、可読性が落ちます。

Pythonに限らず、プログラミングでは横に長く書かずに縦に長く書くことが推奨されます。
改行とインデントを組み合わせて、処理のまとまりが見やすくなるように書きます。
長いコマンドをどのように書けばよいかなど、具体的な方法は今後ご紹介する例を見て習得しましょう!

ちなみに80文字というのはおそらく、その昔プログラムをパンチングカードに残していた時代、1行に書ける文字数が80だったことの名残です。
USBメモリはおろかフロッピーディスク(知らない人いるのでは?)も存在しない時代に、紙のテープに穴を開けてデータを残していたそうです(私も触ったことはないです)。

名前の付け方 | 変数や関数には意味がわかりやすい名前をつけよう

変数や関数にはわかりやすい名前を付けましょう。
Pythonの変数や関数の名前では、小文字、大文字、アンダースコアを使うことができます。
PEP-8のfunction-and-variable-namesによれば、通常は小文字とアンダースコアで定義すべきとされています。例えば

text_to_print = "Hello, world"

といった具合に、意味がわかるように端的な単語をアンダースコアでつなげて定義します。

また、意味のない変数、たとえばfor文でi番目を定義するための変数

for i in range(10):
    print(i)

のような場合には一文字の変数を使うことがあります。
このときの注意点として、

  • l (小文字のエル)
  • O (大文字のオー)
  • I (大文字のアイ)

は避けましょう。フォントによっては他の英数字と見分けが付きません。



Pythonスクリプトのフォーマット | 構造化して速く正確にコーディング

Pythonスクリプトは変数や関数を使い、まとめることのできる処理をまとめる = 構造化することで、わかりやすくすることができます。
他人に見せるときはもちろん、自分で見返すときにもわかりやすいので、ミスを減らしながらコードを書く時間を短縮することができます。

Pythonのスクリプトはしばしば

  1. メタ情報部分
  2. import部分
  3. parameter定義部分
  4. function(関数)定義部分
  5. main関数部分

という構成で書かれます。
このような構成はルールとして規定されているわけではなく、慣行としてよく見るといった程度のものです。
ただ、このような構成でコーディングすることでうまく構造化することができます。
「これが正解」というわけではありませんし、私の我流も入っているので参考までにお話しします。
長くなるので、今回は説明だけにとどめ、次回以降、実際にコーディングをしていきます!
まずはどんなものか、知識を入れましょう!

メタ情報を記載する

Pythonスクリプトの最初には、そのファイルがどのようなものなのか示すためのメタ情報を記載します。

コメントとdocstrings

メタ情報はコメントもしくはドキュメンテーションストリング(docstrings)として記載します。
コメントは行頭に「#」(半角シャープ)をつけることで記入できます。
「#」から始まる文はpythonを実行するときには無視されるので、コマンドとして実行されることはありません。
docstringsは”””と”””(どちらもダブルクオーテーション3つ)で囲まれた領域です。この領域もpythonを実行するときには無視されます。
複数行にまたがってdocstringsの領域を作ることができるので、長い説明を書く場合にはコメント(#)を使うよりもdocstrings(“””)を使ったほうがいいでしょう。

メタ情報の内容

Pythonスクリプトに記載するメタ情報には以下のようなものがあります。

  1. ファイル1行目の定型文
  2. テキストエンコーディング
  3. ファイル作成者の情報
  4. アップデート履歴
  5. スクリプトで行う処理の概要
  6. スクリプトの使い方

必ずしもこれが全てではなく、他にも書くこともあります。
ただ、この6項目ぐらいは大抵は書いてあるように思います。
5の「スクリプトで行う処理の概要」は書いておくと、後で見返したときにソースコードの中身を見なくてもやっていることがわかるので書いておくと良いでしょう。

大抵は下記のような感じで書きます。
先程の6項目のメタ情報が入っています。

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# ------------------------- #
# Created By Kaiko on 20210523
# Edit History
#    20210523: File created by Kaiko with MacOS 11.2.3, Python 3.9.2
# ------------------------- #

"""
Purpose of the script
    1. To learn how to run Python using a script
    2. To print "Hello, world"
    3. To test arithmetic calculation

How to use the script
    python HelloArithmetic.py
"""

importは最初にまとめて行う

Pythonの外部ライブラリ(NumPy, SciPy, Pandas, Matplotlibなど)をimportする部分です。
メタ情報の記載が終わって、コードを書き始める部分に記載します。
下記のように書きます。

import os
import sys
import datetime

このように最初にimport文で読み込んでおくと、外部ライブラリをそのスクリプトの中でいつでも使えるようになります。
ちなみに、「os」というライブラリはパソコンのOSを操作できるライブラリです。
パソコンに保存されているファイルの存在を確認したり、ディレクトリを作成するとき、ファイル名を変更するときなどに使います。
「sys」はスクリプトの管理に役立つライブラリで、実行中の関数のファイル名や行数を取得するのに使います。
「datetime」は現在時刻の取得など、時間関係の処理に使えるライブラリです。
他にも様々な外部ライブラリがあります。
基本的には最初に読み込んでおきます。

パラメータも最初に定義してアップデートしやすくする

ソースコードの中で参照される数値は最初に変数として定義しておきましょう。
ソースコードの中に数値をベタ打ちしてしまうと、後でその値を変更したくなったときにわざわざソースコードの中身を見に行って、該当箇所を見つけて書き換えなければいけません。
変数として定義しておけば、その定義部分だけ変更すれば全体に反映されます。
たとえば、

print(1 + 2)

のように数字を直接書くのではなく、

# スクリプトの冒頭部分
var1 = 1
var2 = 2

"""
ここに様々な処理が入るかもしれない
"""

# 足し算結果を表示する部分
print(var1 + var2)

のように書くべきです。

Pythonのスクリプトを書くときには、外部ライブラリのimportが終わったあとあたりに、変数をまとめて定義しておくと良いでしょう。
変数の名前はわかりやすいものにしておきましょう!

処理のまとまりをfunction(関数)として定義しよう

一連の処理をある程度の塊でまとめることができるなら、function(関数)としてまとめましょう。
Python(に限らず)のスクリプトを書く場合、細かい処理や複数回出てくる処理を関数にまとめるということが、わかりやすく、直しやすく、アップデートしやすいコードを書くコツです。

PythonをJupyterではなくあえてスクリプトで書いて実行する場合、複雑な処理を行いたいことが多いです。
Jupyterで書く場合には、行いたい処理を上から下に書いていって順次実行するのでも良いですが、複雑な処理を行う場合には、ある程度の処理のまとまりを関数として括っておくことが見易さや治しやすさ(デバッグ)の面で有効です。

関数は「def」という表現で定義します。
例えば、

def print_hello_something(string1):
    print("Hello, ", string1)

のように書きます。詳しいやり方は次回以降お話します。
このように関数を定義しておくと、この関数を呼び出すことでいつでも”Hello, hogehoge”を出力できます。

print_hello_something("world")
print_hello_something("python")
print_hello_something("pyol")

などと書けば、”Hello, “のあとに”world”や”python”がくっついたものが出力されます。

流石にこの例は実用的ではないですが、一連の処理を何度も行うような場合には関数でまとめておくと便利ですし、その関数にバグがあって直したいときや処理を変えたいとき、関数を定義した一箇所だけを編集すれば全体に反映されます。
参照する数値を最初に変数として定義しておいて後で変更しやすくするのと同じように、まとめられる処理も関数として定義しておくと後で変更しやすいのです。

main関数部分から関数を呼び出して全ての処理を行おう

最後にmain関数というものを定義します。
main関数部分では、先に定義しておいた関数を使って所望の処理をすべて行っていきます。
料理で言えば、functionを定義するまでの部分が鍋やフライパンを準備したり、調味料を準備したり、野菜やお肉を切ったりする下ごしらえの部分です。
main関数の中で料理をしていきます。

main関数は以下のように書きます。

#-------------------------#
# main func
if __name__ == '__main__':
    # print var1
    print_hello_something(var1)
    
    # print var2
    print_hello_something(var2)
    
    # print var3
    print_hello_something(var3)

なお、「var1」などはスクリプト冒頭で定義される変数、「print_hello_somothing」は前段で定義されている関数という想定です。
事前に定義された変数や関数を使って一連の処理を行っていく部分がmain関数部分です。

このように、まとめられる部分は変数や関数として予めまとめておき、それをmain関数内部で呼び出すことで所望の処理を行います。
一連の処理が構造化されるので、自分で見返しても他人が見てもわかりやすいため、ミスを減らしながらコードを書く時間を短縮することができます。
また、後から修正するときやアップデートするときに手間が少ないです。



Contents | まとめ

最後までご覧頂きありがとうございます!
Pythonでコーディング、特にスクリプトを書くときのルールと基本的な様式についてお話しました!

Pythonコーディングの基本ルールPEP-8に則り、また変数や関数を使って構造化することで他人にとっても自分にとっても理解しやすいプログラムを書くことができます。
ミスを減らしたり、チェックにかかる時間を短縮できるので、より速く正確にコードを書くことができます。
Pythonコーディングの基本ルールと構造化を意識しながらプログラミングをやってみてください!

次回は今回お話した内容をもとに、実際にPythonスクリプトを書いていきます!お楽しみに!
以上、「python入門講座 | pythonを使ってみよう3-4(pythonスクリプトのルールとフォーマットの基礎知識)」でした!
またお会いしましょう!Ciao!

コメント

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