【図解】Pythonプログラミングの始め方(ステートメント~変数まで)【基本編】

スポンサーリンク
Pythonの基礎文法(コードの書き方) Python

Pythonは現在もっとも人気のあるプログラミング言語のひとつです。理由はさまざまですが、大きく次の2つがあります。

Python人気の理由
「Python」が人気の理由
  • 文法が比較的簡単で、初学者でもとっかかりやすいく非プログラマにも向く
  • データ処理や機械学習(AI)に特化した様々な分野のライブラリがそろっている

特に、昨近の第3次AIブームにおいては、Pythonが選ばれる最も大きな要因ともいえるでしょう。

この連載では、大人気Pythonを扱う上で知っておきたい、基礎文法を図解を交えて分かりやすく解説していきます。Python学習の一助にしていただければ幸いです。

連載でとりあげる予定のコンテンツ一覧は次のとおりです。

<Pythonプログラミング始め方>

さあ、広大なPythonワールドを一緒にみていきましょう。


さて今回の記事では、Pythonプログラミングを始めるにあたって、まずは知おかなければならないことがらとして、ステートメント(ブロックを構成する最小単位(行・ステップ))の書き方についてと変数・その他について解説します。

Pythonには、特有のステートメントの書き方など他言語とは異なる作法がありますので、本記事でしっかり基礎を固めましょう。

この記事で学べること
  • ステートメント(ブロックを構成する最小単位)の書き方
  • Pythonのおけるインデントの重要性について
  • Pythonでつかう変数とデータ型(動的型式変数)

本記事は、Pythonの公式ドキュメントに基づき、わかりやすい図解で解説しています。より詳細に、原文にのとって学習される場合は以下のURLも適宜参照ください。

Python公式ドキュメント

https://docs.python.org/3/tutorial/index.html

それでは、次節より「ステートメント」から解説をしていきます。

スポンサーリンク

1. ステートメント

Python_基本文法_コードの書き方

Pythonの機能ごとのブロックを構成する最小単位を「ステートメント」と呼びます。本節では、Pythonプログラミングにおいてたいへん重要な意味を持つ「インデント(字下げ)」や区切り、改行さらにコメントについて解説していきます。

1.1 Pythonプログラムにおけるインデントの意味

Pythonでは、他のプログラミング言語とは異なり、インデント(字下げ)を使ってブロック(機能)の区切りをつけていくという大きな特徴があります。

他言語の例でいえば、C言語やJavaなどでは「{, };」 の間にステートメントを記述します。

また、Pythonと同じスクリプト言語でも、「doend, beginend」といった予約語の中にステートメントを記述していくスタイルのものもあります。

図1は、例としてRubyのコード例を紹介していますが、endというブロックの終端文字があるので、極端な例として図1の右側のようにまったくインデントを入れずに記述したとしても問題なく動作します。ところが、Pythonでこのような書き方をすると、シンタックスエラーが発生します

Rubyのインデントの挿入例
図1. Rubyのステートメントの書き方

まずはじめに、Pythonにおけるステートメント基本ルールをまとめると以下のようになります。<基本ルール.1>

【基本ルール. 1】

<ステートメントのインデント>

  1. 文頭は揃えて記述する
    • 先頭にスペース(インデント)を入れない、もしくは固定のインデント(半角スペース4個分)を常時挿入する
  1. ステートメントの末尾には (セミコロン) 付けない

基本ルール1を図示しながら補足します。

の「文頭を揃えて記述する」ではすべてのステートメントに対して文頭にインデントを「入れるのか」「入れないのか」、もし入れるとしたら幾つ分のスペースを挿入するのかといった、プログラム全体のコーディングルールを事前に決めておく必要があります。

は他言語で使われることが多い文の末尾を示す;(セミコロン) は、Pythonでは不要です。1行で完結するように記述します。

インデントの基本ルール➀
図2. インデントに関する基本ルール➀

それでは、実例で確認してみましょう。まず文頭をインデントなしで揃える場合ですが、以下のとおり問題なく実行することができています。

# 文頭を揃える(インデントなし)場合

a = 10
b = 20
c = 30

ans = a + b + c
print(ans)  # >>60 正常に動作

次に、文頭にインデント(ここでは4個分のスペース)を入れて、文頭を揃えた場合についてです。こちらも問題なく実行できます。

    # 文頭を揃える(インデントあり)場合

    a = 10
    b = 20
    c = 30

    ans = a + b + c
    print(ans)  # >>60 正常に動作

次に文頭を揃えない場合の例も確認してみます。4行目のコード(b=2)の部分だけインデントを挿入して実行すると、「IndentationError」というエラーが表示され、実行できませんでした。

# 文頭を揃えていない場合はエラーが発生する事例➀
    
a = 10
    b = 20 # ここに先頭にインデント
c = 30

ans = a + b + c

print(ans)  # >>IndentationError: unexpected indent


#-------------------------------------------------------
# File "<ipython-input-367-9f275dac7afc>", line 4
#  b=20
#IndentationError: unexpected indent
#-------------------------------------------------------

今度は、4行目のコード(b=2)の部分だけスペース2個分(他は4個分)にした場合です。こちらも同様に「IndentationError」というエラーが表示されました。

    # 文頭を揃えていない場合はエラーが発生する事例②

    a = 10
  b = 20  # 先頭を揃えない(スペース2個分)
    c = 40

    ans = a + b + c

    print(ans)  # >>IndentationError: unexpected indent

#-------------------------------------------------------
# File "<ipython-input-367-9f275dac7afc>", line 4
#  b=20
#IndentationError: unexpected indent
#-------------------------------------------------------

このように、Pythonでは{}やendなどの予約語を使うことなくコードをシンプルに記述することができる反面、インデント(字下げ)の関係を常に意識してコーディングする必要があります。


さて、インデントに関してはもう一つ重要な基本ルールがあります。

それは、制御構文、関数・クラスの定義といった、各機能ブロックの識別にもインデントが使われるという点です。

詳しくは、それぞれの機能ごとの記事解説の中でふれますが、先に基本ルールをまとめると次のようなものがあります。<基本ルール. 2>

【基本ルール. 2】

<ステートメントのインデント>

次のような場所の :(コロン) 以降にインデントを挿入し字下げする。

➀. 制御構文

 if文句 条件式, while文句 条件式, for文句 条件式 :

➁. 関数の定義

def 関数名():

➂. クラスの定義

class クラス名():

分かりずらいと思います、図示すると次のようなイメージとなります。(図3)

条件分岐や繰り返しなどの制御構文、ユーザ定義関数やクラスを定義をする際には「各種定型構文+:(コロン)」の後に、具体的な処理手順を記述していきます。この処理手順のステートメントが、同一のインデントの範囲までなのだと、Pythonコンパイラにより識別されて実行されます。

逆にインデントを戻した時点で、その機能ブロックの定義が終了したことをコンパイラに告げることになります。

インデントの基本ルール➁
図3. インデントに関する基本ルール➁

ユーザー定義クラスや関数、条件分岐などは、それぞれ組み合わせてネスト構造にすることもできます。図4はクラス定義の例です、クラスの中にメソッド、メソッドの中に条件分岐(if文句)といったようにブロックごとにインデントを入れ区切りを明確にします。

インデントの基本ルール➂
図4. インデントの多重(ネスト)構造

図4と同じ構造のプログラムを<List5>に示します。

# インデントの多重構造による機能の分離の具体例

class Sample:               # ➀Sampleクラスの定義
    def foo(self, flag):    # ➁インスタンスメソッドの定義
        if flag:            # ➂ifブロック
            print("Call")   # ➃ifブロックの内容

inst = Sample()     # インスタンスの生成
inst.foo(True)      # インスタンスメソッドの実行

# >>Call

<List5>の概要は以下の通りです。

でクラスを定義しています、その次にでクラスのオブジェクトであるメソッドを定義しています。はクラスの中で個別に定義できるメソッドブロックですからインデントをを挿入後に書きはじめます。

さらにではメソッドの具体的な処理内容を記述していますが、if文句ですのでここでも基本ルール2を適用し、インデントを挿入して書きはじめます。(番号は、コードのコメントに紐づきます)

(※クラスや関数、if文の構文は後程、詳細に説明していきます。)

以上が、Pythonにおける「インデント」の役割についてでした。引き続きステートメントの「区切り改行」「コメント」について解説します。

1.2 ステートメントを区切る・改行する

Pythonでは、1ステートメントは1行で記述するスタイルが普通ですが、区切り文字や改行文字を入れることで、1行に複数行のステートメントを記述したり、その逆に、1ステートメントを複数行に改行することができます。

まずは、文の区切りについて解説します。1行の複数のステートメントを記述するために、その区切る予約語 ; (セミコロン) を付加します。図5を参照下さい。

区切り文字の説明
図5 区切り文字の説明図

次は、区切り文字を使って1行に複数のステートメントを記述したコード例<List6>です。

この例では、5つのステートメントを1行に記述しています。その一方で、可読性は多少低くなりがちですので、定型処理に限るなど適用範囲をなるべく局所的にするのが肝要かと思います。

実際に「;」で複数行を連結する書き方は現場ではあまり見かけない書き方です。

# 複数のステートメントを一行に記述

a=10; b=20; c=30; ans=a+b+c; print(ans)

# >>60 実行可能

文頭に不適切な空白、インデントを挿入した場合は1.1項同様にエラーが発生します。

そのため、制御構文や関数などの処理記述を一行でかくことはできませんので注意が必要です。<List7>

# 複数のステートメントを一行に記述

    a=10; b=20; c=30; ans=a+b+c; print(ans)

# エラー内容
#   a=10; b=20; c=30; ans=a+b+c; print(ans)
#   ^
# IndentationError: unexpected indent

#----------------------------------------------------------------------
# 制御構文などは1行で記述することはできない

a = 10 ; if True : ; b = 10

# エラー内容
# a = 10 ; if(True) : ; b = 10
#          ^
# SyntaxError: invalid syntax

次に、文の改行について解説します。

改行したい箇所に改行文字 \ (円マーク) を付加することで行を改めます。改行後の先頭のスペースは、インデントの縛りはなく好みの間隔で調整できます。

改行に関しては、Pythonではリストやタプルなど1行が長くなるデータ構造もあるので場合によっては適切に改行を入れることでコードの可読性が高まることがありますので、積極的に取り入れることをおすすめします。

改行文字の説明
図6. 改行文字の説明図

以下は、改行文字をつかって1つのステートメントを複数行に分けて記述したコード例(List8)です。

なお、改行後の右側のスペースにはコメント(# …)を挿入することはできませんので、そこだけは注意してください。(2)

#(1) ステートメントを複数行に改行する

ans = 'a ' + 'b ' + 'c ' \
        + 'd ' + 'f ' \
            + 'g'

print(ans) # >>a b c d f g  実行可能

#-------------------------------------------------------------
#(2) 改行途中でコメントを挿入

ans = 'a ' + 'b ' + 'c ' \  # コメントを挿入
        + 'd ' + 'f ' \
            + 'g'

print(ans)
#   ans = 'a ' + 'b ' + 'c ' \  # コメントを挿入
#                                         ^
# SyntaxError: unexpected character after line continuation character

以上が、ステートメントの「区切り・改行」「コメント」についてです。引き続き「コメント」の書き方について解説します。

1.3 コメントの書き方

コメントはプログラムの注釈・説明として利用するほか、動作チェックのための一時的な記述などを無効(コメントアウト)にする目的に用いられます。

コメントは、以下の書式のように文頭に (シャープ) を入れることで、対象のステートメント(1行分)がコメント化します。また、“”“~”“” のように “”“(ダブルクオーテーション3つ) で挟んだ行(複数行も可)がコメント化します。

コメントの書き方

<対象の1ステートメント>

 ・文頭に #(シャープ) を付加する


<複数行のステートメント>

 ・先頭と末尾に “”” (ダブルクオーテーション3つ)を付加する

コメントは、このように好きな場所に容易に挿入することができます。ですが、好き勝手に入れるのではなく、必要な情報を残すようにすることが重要です。

ポイントしては、以下のことを意識すると他者から見ても可読性の高い良いコードになります。(初心者の方は、あまり強く意識する必要はありません。。)

意味のあるコメントを書く

  1. コードの理解を助ける情報を残す
    • コードの意図(理由)の説明
    • (Why not ? なぜ? そうではないのか)の説明をする
  2. コードを読む人に知っておいてほしい情報を残す
    • アノテーション(TODO, FIXME)付きのコメントをする

なるべく少ないコメント量にする

  1. そのためには、コメントに頼らない、分かりやすいコードになるように心掛ける
    • 分かりずらい、奇怪なコードは書かない
    • 変数名に、データの属性を含めるなどの最適化を図る など・・・

それでは、サンプルコードで確認してみます。

このサンプルはあくまで分かりやすく解説するためのもので、上記の価値あるコメントの流儀は考慮されていませんのでご了承下さい。

例1.ステートメントの右側にコメントを設定します(A)。 また、実行させたくないコードをコメントアウトした実行例です(B)。;(セミコロン) で1行に複数ステートメント連結させた場合でも、1つの“#”文字でコメント(アウト)できます。

# <コメントの書き方の例1>

# (A) 通常のコメント ---------------------------------------------------
x = 10     # 変数Xに整数10を割り当てる
y = 20; print(x); print(y)     # 変数yに整数20を割り当てる、各変数の値を表示する


# (B) コメントアウト ---------------------------------------------------
#x = 10                         #ステートメントをコメントアウト
#y = 20; print(x); print(y)     #複数のステートメントを一度にコメントアウトする

例2.次の例は、一度に複数行のコメントを設定できる、“”“~”“”(ダブルクオーテーション3つ) で挟んだコメント化の例です。

# コメントの書き方の例2

x = 10
y = 20

"""
この範囲はコメントとして
実行時には無視されます。
"""

print(x + y)

1.3.1 docstring について

コメントについて、応用的な使い方をひとつ紹介します。(エンジニア向け)

関数、メソッド、クラスの定義冒頭部分で、“”“~”“”で括ったコメントを書くと、そのコメントはドキュメント用の文章になります。これを 「docstring」といいます。

(Java言語のjavadoc, Go言語のGoDocに相当します)

この所定の位置に書かれたコメントは、変数 __doc__ に格納され、クラス名.__doc__ などで参照できるようになります。(_doc_は特殊メソッドとも呼ばれます)

なお、「docstring」には大きく3つの書き方(流儀)が存在します。

reStructured Text」「Google style」「NumpyStyle」の3種類です。このうちPythonで多用される、docstringは、「Google style」となります。

「Google style」の書き方のポイントを以下にまとめます、その他詳細については公式サイトに解説を譲ります。その他の流儀についても各自調べてみて下さい。

docstring (Google Style)
<Gogle Style ドキュメントの書き方>
例えば関数のドキュメントを記述するには以下の内容と順番で対応します
  1. 関数の説明や概要を記述
  2. Args:引数の名前と説明を記述 (省略可能)
  3. Returns:戻り値の説明を記述 (省略可能)
  4. Raises: 例外を投げる場合は記述する (省略可能)

Pythonの「コメント」に関しては以上となります。引き続き次節では、「変数」について解説していきます。

スポンサーリンク

2. 変数と定数 <概要編>

Python_基本文法_コードの書き方

本節では、「変数」について概要を解説します。ひとえに「変数」といえど突き詰めれば奥の深い理解が必要です。

本節では、<概要編>として「動的変数と静的変数の違い」「変数の定義方法」に絞り、必須事項のみを解説します。<応用編>として、「最適な変数名の検討」「変数の有効範囲(スコープ)」は別記事で取り上げ詳細解説します。

2.1 Pythonにおける「変数」

一般的なプログラミング言語の変数は、「静的型式変数」と「動的型式変数」の2つのタイプが存在します。以下の図7は、両者の違いのイメージです。

前者の「静的型式変数」は、図7(左)で、変数を予めデータ型を指定して宣言しておいて、以降の処理で利用するものです。(C言語やJavaなど一般的なスタイルです) int X; double Y; といったように

一方、後者の「動的型式変数」は、図7(右)のイメージで、変数というラベルにデータを割り当てた瞬間に、メモリ領域に必要なバイト数の空間が確保されます。つまり、あらかじめ冒頭で宣言する必要はありませんが、データで初期化(割り当て)をして初めて変数として機能するようになります。

ですので、Pythonでは変数に格納されているデータが何型なのかといったことを、プログラマが常に意識している必要があります

動的型式変数のイメージ図
図7. 動的/静的型式変数

2.2 変数の定義方法

変数名には、基本的に名詞を使って分かりやすく、推測しやすい文字列を設定します。その際に、いくつか以下のような制約やルールがあるので確認しておきましょう。

変数名の定義ルール
  1. 1文字目は、半角英文字もしくは、アンダースコア(_)
  2. 2文字目項は、半角英数文字か、アンダースコア(_)
  3. キーワード(予約語)は使えない
  4. 英文字の大文字・小文字は区別される
  5. 記述スタイルはスネークケースが推奨される (推奨であり何でもOK)

定義ルールにおいて、補足します。(1)変数の1文字目は、数字は設定できませんので注意してください、2文字目以降は基本的に、半角英数文字を置きますが、平仮名や漢字などのマルチバイト文字でもエラーにはなりません。ですが、バグの温床になるので、半角英数だけで構成するべきです。

また、演算子/記号(+, -, /, (, {}, #,) も使えません、さらに、言語の予約語<リンク>や大文字・小文字が区別されるのは他言語と同様です。

(5)の記述スタイルは、「キャメルスネーク」や「スネークケース」といった有名な記法がありますが、Pythonでは後者を採用することが多いようです。

(※スネークケースとは、“名詞A_名詞B”のように名詞の前後に_(アンダースコア)で挟む記法のことです。)


それでは、サンプルコードで確認してみましょう。

例1. 定義ルールに通りに記述した場合の例です、エラーは発生していません。また、<2.1項>で述べた通り、Pythonは動的型式変数なので、はじめて出現する変数は、初期化した時点で初めて認識されます。値(数値や文字列)で初期化します。<List11>

# 使用可能な変数名の例

id = 10
name = "tanaka"

myName = 10     # キャメルスネーク
my_name = 10    # スネークケース(Pythonで頻繁に使われる形)

例2. 定義ルール違反をした場合の例です。いずれも、シンタックスエラーが発生します。先頭に数字がくるもの、演算子・記号、予約語が含まれる変数名は設定することはできません。<List12>

# 使用できない変数名の例

1pin = "a"  # SyntaxError: invalid syntax  1文字目に数字を使っている
s&t = "a"   # SyntaxError: can't assign to operator  "&"論理演算記号を使っている
abc{ = "a"  # SyntaxError: invalid syntax   不正な記号を使っている

例3. Pythonでは、変数名の大文字・小文字は明確に区別されます。それぞれ別物のオブジェクトを指すことになります。<List12>

# 変数名の大文字・小文字の区別

abc = "small word"
ABC = "big word"

print(abc)      # small word
print(ABC)      # big word

print(abc == ABC)   # False(等しくない)

2.3 Pythonにおける「定数」

Pythonには、定数の概念がありません。慣例的に定数は「大文字アルファベット」でラベリングすることが多いようです。

そのほか、データ構造の一つである「タプル」で上書きを禁止したり、_(アンダースコア)を先頭にする、関数やクラスを活用するといった、疑似的な定数を定義することもありますが、厳密は意味での定数ではありません。本記事では、基本ルールの紹介にとどめます。

定数の定義について
  1. Pythonには、定数の概念はありません
  2. 厳密な定数ではありませんが、代替手段として以下のようなものがあります
    • 大文字英数字で記述
    • _(アンダースコア)ではじまる英数字で記述
    • タプル(データ構造)を活用して、上書きを禁止する
    • 関数やクラスの活用など

例1. Pythonには定数はありません。慣例的に大文字アルファベットで記述された変数を定数として扱うことが大半です。

PI = 3.14       #大文字で定数を表す
NUM = 1.732

以上、Pythonにおける「変数」と「定数」に関してでした。最後に「予約語」を確認して本記事を締めくくりたいと思います。

スポンサーリンク

3. Pythonの予約語(キーワード)

Pythonが備える、予約語(キーワード)の一覧は以下の通りです。これらの予約語は、ステートメントとしてすぐさま使用することができます。当然ながら、同一名を変数として使うことはできません。

False class finally is return
Nonecontinueforlambdatry
Truedeffromnonlocalwhile
anddel globalnotwith
aselififoryield
assertelseimportpassbreak
exceptinraiseasyncawait
表1. Pythonの予約語

4. まとめ

いかがでしたでしょう?

今回は、Pythonコードの書き方としてまずは必ず知っておきたい「ステートメント」の扱い変数・定数、予約語の使い方について解説してきました。

最後に、本記事のポイントを整理しておきましょう。

Pythonコードを構成する最小単位は「ステートメント」であり以下のような規則がある。

<ステートメントの基本ルール>
  • 各機能ブロック(制御構文や関数・クラス)の境界は、インデント(字下げ)で認識される。
  • コードの可読性を高める方法に、「区切り」や「改行」、コメントを適切に設けることが大切。
  • Pythonは、動的型式変数を採用しており、値(数値や文字列)を指す(ラベリング)することで始めて、変数が定義される。(あらかじめ型宣言する必要はない)

今回の記事を是非、お役立てくださいますと幸いです。


さて、次回は「ステートメント」解説の第2弾として「変数」の扱いについてさらに深堀していきたいとおもいます。今回、割愛した「最適な変数名の検討」「変数の有効範囲(スコープ)」をとりあげます。

また、データ型についてもあらためて解説します。リンクは以下となりますので是非次回もおたのしみに。

最後までお読みいただきありがとうございました。

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