KNIMEST’s diary

KNIME使いがPythonも使いたくて勉強中

【Python学習帳】009_変数利用のお作法

初学者を対象としている京都大学の無料Python教材の学習中です。
「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf

hdl.handle.net

CC-BY-NC-NDライセンスに従って引用します。

 

本教材での到達目標:

Python によるプログラムの実行についての基本操作ができるようになる.
Python プログラムを構成する基本的要素の機能と書式について説明し,例題を用いて実行例を構成できるようになる.
Python を用いて簡単なプログラムを自ら設計,実装,テストできるようになる.

第3章、「変数と演算,代入」の勉強中です。

knimest.hatenablog.com

今回は

「3.10 読み易い式の表記」と「3.11 複数の変数への代入」

いうなれば変数利用時のコーディングのお作法を学びます。

 

読み易い式については本文をそのまま引用します。

            rnew = (r1 + r2)/2
では,代入演算子 =, 足し算 +, 割り算 /, 優先順位を変える () が使われています が,
● 式を読みやすくするため = と + の前後には空白を入れています.
● 他方で () の内側や / の前後には空白を入れていません.試しにすべての空白 を抜くと

            rnew=(r1+r2)/2

とかなり詰まった感じになり,読みにくくなります.
● 優先順位の高い演算である * や/ の前後はつめ,低い演算である + や -, = の 前後を開けるようにするとよいでしょう.

この空白の使い方のお作法、実はさらにいろいろあります。

前に下記の記事でも紹介したPEP8を見てみましょう。

【Python学習帳】005_変数の命名ルール - KNIMEST’s diary

 

「式や文中の空白文字」

pep8-ja.readthedocs.io

リンク先には実例付きで記載されていてわかりやすいのでご覧いただきたいですが、こんなに項目があると言うことを伝えたいので抜き書きします。

 

次の場合に、余計な空白文字を使うのはやめましょう:

  • 括弧やブラケット、波括弧 のはじめの直後と、終わりの直前:
  • 末尾のカンマと、その後に続く閉じカッコの間:
  • カンマやセミコロン、コロンの直前:
  • しかし、スライスではコロンは二項演算子のように振る舞います。よって、(コロンは優先度が最も低い演算子として扱われるので)両側に同じ数(訳注: 無しでも可だと思われる)のスペースを置くべきです。拡張スライスでは、両側に同じ数のスペースを置かなければなりません。例外: スライスのパラメータが省略された場合は、スペースも省略されます。:
  • 関数呼び出しの引数リストをはじめる開き括弧の直前:
  • インデックスやスライスの開き括弧の直前:
  • 代入(や他の)演算子を揃えるために、演算子の周囲に1つ以上のスペースを入れる:

他にも推奨事項がいろいろあるそうで一部抜粋します。

  • 行末に余計な空白文字を残さないようにしましょう。通常それは目に見えないため、混乱のもとになるかもしれません。たとえば、バックスラッシュの後にスペースをひとつ入れて改行してしまうと、行を継続すると見なされません。
  • 次の2項演算子は、両側に常にひとつだけスペースを入れましょう: 代入演算子 (=), 拡張代入演算子 (+=, -= など.), 比較演算子 (==, <, >, !=, <>, <=, >=, in, not in, is, is not), ブール演算子 (and, or, not).

まだまだあるのですが、「よっしゃ、きょうはこれぐらいにしといたるわ!」という気分なのでここまでとします。初学者を委縮させるには十分な情報量ですよね。教材でごく一部だけを紹介されたのも配慮あってのことかもしれません。「3.10 読み易い式の表記」のためのルール徹底は結構難しいと言う感想でした。

 

さて次の節は「3.11 複数の変数への代入」

Python では複数の変数への代入を右辺,左辺とも「,」で式や変数を並べること で一つの代入文で実行可能です

なるほど。ところがここで意外に躓きました。

a = 1
b = 2
c, d = a*2, b*c
print(c, d)
とすれば
2 4
という結果が得られます

と教材にあるのですが、私は再現できなかったです。

 

Traceback (most recent call last):

  File "(ファイル名).py", line 3, in <module>

    c, d = a*2, b*c

NameError: name 'c' is not defined

 

とのエラーが出てしまう。

エラーの原因としては同じ行内の左辺と右辺にここまで未定義だったcが出ているのが良くなかったと推測します。
すなわちb*cのcがこの行より上で未定義と認識されているようです。

 

ちなみに

a = 1

b = 2

c, d = a*2, b*2

print(c, d)

なら

2 4
という結果が得られます。

複数の変数への代入自体は体験できたのでよしとします。


余談なのですが、この機能は多重代入ともいうようです。他のいくつかの言語でもできることらしい。

hydrocul.github.io

リストやタプルを右辺に置けば、要素ごとに左辺の変数に代入できる。アンパック代入という。

式の優先順位をコントロールするための () と混同する可能性がなければ、タプルは () を省略し , だけでも表せる。

a, b = [3, 'abc']

a, b = (3, 'abc')

a, b = 3, 'abc'

# a => 3

# b => 'abc'

 

確かに教材の注釈に

タプル(tuple)というデータ形式を背後で用いています.

と書かれています。さらに括弧()も略してあると言うことですね。

 

右辺はリストやタプルにかぎらず、同じくシーケンスと呼ばれるカテゴリに属する文字列を置くこともできる。

として示された例も興味深かったです。

a, b, c = 'あいう'
# a => 'あ'
# b => 'い'

# c => 'う'

アンパック代入の一種でもあるらしく、検索すると他にも多数の例を見ることができるのですがこちらも私のような初学者には情報過多のように感じたので割愛します。

 

今回も余談が過ぎましたかね。今日はここまでとして次回は第4章へ進みます。今回少し出てきたリストやタプルを学習します。

knimest.hatenablog.com