Python3 – 変数のスコープ

ブロックスコープはない

したがって、if文やfor文などの制御構文はスコープを持たない。制御文の外で定義された変数は制御文内で参照でき、制御文内での変更は変数に影響を与える。

関数のスコープ

関数内では変数はローカルスコープを持つ。

  • グローバル変数は関数内から直接には参照できないため、無定義で参照しようとするとエラーとなる
  • 関数内でグローバル変数と同じ名前の変数を定義すると、ローカル変数として扱われる
  • ローカル変数の変更は、同名のグローバル変数に影響を与えない

クラスのスコープ

クラスはローカルのスコープを持つが、クラス変数とインスタンス変数でもスコープが異なる。

global宣言

グローバル変数をglobal宣言することで、関数の中で参照・変更が可能となる。

 

Python3 – クラス

クラスの定義

標準形

  • クラス定義は、class [クラス名]:で始める
  • コンストラクタ名は__init__で決まっている(前後にアンダースコア2つ)
  • クラス変数(プロパティ)はコンストラクタで定義して明示

関数定義と同じく、クラスからオブジェクトを生成するときは、クラスを定義した後でなければならない。

プロパティ

クラス変数(クラス・プロパティ)

クラス定義の直下で定義された変数はクラス変数となり、全てのインスタンスを通じて同じ値が参照される。一般的には[クラス名].[クラス変数名]で用いる。

インスタンス変数(インスタンス・プロパティ)

インスタンス変数は、コンストラクタで定義して明示する。

インスタンス生成後にプロパティを定義することもできるが、あるインスタンスで定義したプロパティはそのクラスの他のインスタンスにはいきわたらない。

なお上記のpass文は、空のクラスのための構文。クラスの構文上は何か内容が必要なため、プレースホルダとしてpass文を置いている。passはPythonの予約語で、何も行わない。

インスタンス変数はpublic

Pythonのインスタンス変数は全てpublicアクセス可能。これを隠蔽するのに、以下の方法がある。

  1. クラス変数の先頭にアンダースコアを1つ付ける(_)
    • この方法は「作法」であり、普通に変数名を指定してアクセスが可能
  2. クラス変数の先頭にアンダースコアを2つ付ける(__)
    • この方法はPythonでアクセスが拒否される

ただし(2)の方法でも実はアクセスが可能。アンダースコア2つを前置した変数は、_クラス名__変数名に変換されるため、この変数名を使ってアクセスできる。

メソッド

コンストラクタ

  • コンストラクタの名前は__init__で決まっている
  • 少なくとも先頭に1つの、自己参照用の引数が必要
    • この引数の変数名は任意だが、Pythonの慣習でselfを用いることになっている

インスタンスメソッド

コンストラクタと同じく、インスタンスメソッドは最低1つの引数を持ち、第1引数はインスタンス自身への参照が渡される。

この引数の変数名は任意だが、Pythonの慣習でselfを用いることになっている。

クラスの継承

継承

基本的なクラスの継承方法は以下の手順による。

  1. 子クラスのclass宣言で親クラスを指定
  2. 子クラスのコンストラクタで親クラスのコンストラクタを呼ぶ
  3. 必要に応じて追加のプロパティを定義

オーバーライド

子クラスで親クラスのメソッドをオーバーライドできる。

親クラスのメソッドの呼び出し

子クラスでオーバーライドしたメソッドでも、親クラスの名前を指定して、親のメソッドを呼び出せる。

※super()メソッドを用いるべきか。

 

Python3 – lambda式

概要

ラムダ式(lambda式)は、無名の小さな関数を定義する。

lambda式の用法

lambda式は式として扱われるため、以下のような用い方が可能。

リストの内包表記

 

Python3 – 関数

基本形

  • 関数の定義は”def”で始める
  • 関数名と引数の後にコロン”:”を置く
  • 関数の内容にはインデントを入れて書く

呼び出しと定義

関数の呼び出しは関数定義の後でなければならない。

ただし、関数定義においては、後で定義される関数をそれより前の関数定義で記述することはできる。

戻り値

戻り値がある場合はreturn文で返す。

複数の戻り値

複数の戻り値を返すことができる。

引数

通常の引数

通常の引数に対しては、呼び出し時にその個数分の値を指定する。個数が多すぎても少なすぎてもTypeErrorとなる。

デフォルト値付きの引数

引数を省略した場合のデフォルト値を指定できる(キーワード付き引数)。

可変長の引数(1)

*[引数名]は数を超えた引数をタプルで受け取る。

可変長の引数(2)

**[引数名]はキーワード付き引数を辞書型で受け取る。

可変長引数の引き渡し

可変長の引数を変数で引き渡す場合、引き渡し側の引数に*、**をつける。

 

Python3 – 同値性と同一性

同値性

同値性に関しては、数値、文字列、オブジェクトに関わらず、そのコンテンツのパターンが同じならTrueとなる。

同一性

数値の同一性

一般的な予想

数値に関しては、同値性と同一性が同じ結果になると予想される。

予想外

整数で一定の範囲外の場合は、同一ではない(is not)と評価される。

多重代入の場合は同一と評価されるが、変数に対して演算を施すと同一ではなくなる。

同一性の変化は、演算に対して可逆的。

文字列の同一性

 

Python3 – 変数・式・演算

変数

変数の定義

変数は定義した時点で作成される。型指定や宣言のためのキーワードはなく、変数確保のためには何らかの値で初期化する。

内容の書き換え

変数の内容は、異なる型のもので任意に置き換え可能。

演算子

代数演算子

加減算(+/-)、乗算は一般的だが。除算系は以下に注意。

除算系

整数同士の除算は浮動小数点数となる。Python2から扱いが変更。

//演算子は商が整数となる除算、%演算子は剰余を返す。

// 切り捨て除算
% 剰余

詳しくは整数除算を参照。

べき乗

ビット演算子

~a ビット反転
a & b AND:論理積
a | b OR:論理和
a ^ b XOR:排他的論理和
a << n nビット左シフト
a >> n nビット右シフト

代入演算子

+=、-=、*=など。

インクリメント(++)/デクリメント(–)演算子はない。

比較演算子

同値性

==、!=、<、>、<=、>=は標準的。

同一性・包含

a is b aとbが同一である
a is not b aとbが同一でない
a in b aがbに含まれる
a not in b aがbに含まれない

比較演算子については「同値性と同一性」についても参照。

ブール演算子

a and b aもbもTrueのときTrue、それ以外はFalse
a or b aかbがTrueのときTrue、aもbもFalseのときFalse
not a aの否定

条件演算(3項演算子)

以下の式は、conditionが真であればtを、偽であればfを返す。

文字列演算子

a + b 文字列aと文字列bを連結
a * n 文字列aをn回繰り返す
a[n] n番目の文字を取り出す(0文字目からカウント)
a[n:m] n~m-1番目までの文字列を取り出す
a[n:] n番目以降の文字列を取り出す
a[:m] 先頭からm-1番目までの文字列を取り出す
a[n:m:s] n~m-1番目の文字列をs個飛ばしで取り出す

Python3 – 辞書

リテラル

辞書(dictionary)の要素はキーと値のセットで保持される。辞書の要素はリストのような順序を持たない(さらに言えば、このコードを実行するごとに表示される順番が変わる)。

キーや値の型は混在しても構わない。

キーについて

キーに使える型は、数値、文字列、タプルなど内容を変更できない型。

数値や文字を格納した変数をキーに指定すると、変数の内容がキーになる。

既存のキーに新たな要素を定義しようとすると、[最後に指定したキー]:[値]のペアになる(1つのキーには1つの値しか格納されない)。

リストやリストを含む変数、タプルをキーに使うとTypeErrorとなる。

内容の取得

要素数

辞書が持っている要素の数はlen()関数で得られる。

全てのキー・値・要素

辞書内の全てのキー、値、要素は、それぞれkeys()values()items()で取得。結果はdict_keysdict_valuesdict_itemsオブジェクトで得られ、list()関数でリスト化が可能。

要素の操作

要素の参照、追加

値の参照はキーを指定して行う。存在しないキーを指定して参照するとKeyError。

要素の追加は、新たなキーを指定して値を代入。

既存のキーを指定して、その内容を更新。

要素の削除

del文/del()関数

del文/del()関数はキーを指定して要素を削除する。

pop()メソッド

pop()メソッドは、引数で指定した要素を削除し、そのオブジェクトを返す。第2引数を指定した場合、キーが存在しないときに第2引数を返す。

clear()メソッド

clear()メソッドは辞書をすべてクリアする。

存在確認

キーの存在確認

辞書が指定したキーを持つかどうかをチェックするにはin演算子を使う。直接辞書に適用してもkeys()に適用しても結果は同じ。Python3ではhas_key()メソッドはなくなった。

値の存在確認

辞書が指定した値を持つかどうかは、in演算子にvalues()を適用

辞書オブジェクトの操作

辞書同士の連結

update()メソッドで他の辞書を連結できる。この操作は、元の辞書の内容を更新する。

ただし元の辞書と追加する辞書で重複するキーがあった場合は、追加する方の辞書の要素で上書きされる。

複数の値を持つ辞書

通常は重複したキーに値を登録すると、最後に登録した値で上書きされて1つしか残らないが、値をリストにすることで、同じキーに複数の値をもたせることができる。

 

Python3 – 内包表記

基本形

リスト/タプルからの要素の取り出し

リスト/タプルの要素を順に取り出したリストを返す。

range()を使ったリストの生成

要素の演算

要素に対して順次同じ演算を施す。

floatの要素

小数部分を持った数値を要素とする方法。

ifの使用

抽出する要素の条件の指定

後置if文で要素が条件に合致した場合のみ値に送ることができる。ただしelseは使えない。

抽出した要素の条件による値の選択

値を三項演算子にすることで、取り出された要素の条件によって値を変えることができる。

複数のループ

複数リストの同時ループ

複数のリストを同時に回すときは、2つの変数に対応するリストにzip()を使う。

多重ループ

多重ループの以下の2つの違いを押さえておく。

まず2つのforを連続させた場合。

次にforを[]で囲んだ場合。

 

入れ子のコレクションへのアクセス

入れ子になったリストなどの要素へのアクセスは、一時変数を使って多重ループ。

多重配列の作成

多重配列の作成は、内側の要素から考えていくとわかりやすい。

内包表記ではないが、以下の記法でも同じ結果を得る。

応用

要素数が増減する多重配列

要素数が順次増減する配列の例。内側のリストの終値=長さを変数として、その変数を外側のループで回している。

2つのリストの交互結合

2つのリストの要素を交互に結合する。たとえば[1, 3, 5]と[2, 4, 6]から[1, 2, 3, 4, 5, 6]を生成。

  1. 各リストから1つずつ要素を取り出し、それらを要素とするリストを作成
    • [[x, y] for x, y in zip([1, 3, 5], [2, 4, 6])]
      -> [[1, 2], [3, 4], [5, 6]]
  2. その結果から各要素リストをsublistとして取り出す
  3. 各サブリストから順次要素を取り出して、全体リストの要素とする

 

 

Python3 – リストとタプル

リスト

リストの初期化

リストとタプルの表現

[…]でリスト(list)を、(…)でタプル(tuple)を記述する。リストは要素の変更が可能だが、タプルは変更できない。

要素を改行して記述可能で、最後の要素のカンマ(,)は付けても付けなくてもよい。

型の異なる要素を混在させてよい。

要素が一つだけのタプルは、要素の後にカンマ(‘)を付ける必要がある。

入れ子

リスト、タプルは入れ子にできる。リストの要素にタプルがあってもよく、その逆も可能。

リストとタプルの違い

リストの要素は変更できるが、タプルの要素は変更できない。

ただしタプルの要素がオブジェクトの場合、オブジェクトへの参照が変わらなければ、オブジェクトの内容は変更可能。

相互変換

list()関数でタプルをリストに、tuple()関数でリストをタプルに変換可能。

リスト

リストの初期化

共通操作

要素の個数

要素数はlen()関数で得られる。

要素へのアクセス

インデックスを指定してアクセスできる。最初の要素のインデックスは0となる。

インデックスに負の数を指定すると、-1を最後尾としてそこから前方へカウントする。

forによる順次アクセス

forで個々の要素にアクセスできる。

結合

リスト同士、タプル同士を結合して、新たなリスト/タプルを生成できる。

部分列

  • [n:m]でn番目からm-1番目の要素を取り出した部分列を返す
  • [:m]は先頭からm-1番目まで、[n:]はn番目から最後までの部分列を返す
  • [n:m:s]でn番目~m-1番目の要素をs個おきで返す

n、mにマイナスの値を指定すると、後ろから数える。-1が最後の要素を差し、そこから前へ遡っていく。ただしmに-1を指定すると、その一つ手前の-2番目の要素までが対象となる。

要素の検索

in演算子
要素がリストに含まれているかどうかを判定。
index()メソッド
指定した要素のインデックスを返す。2番目の引数で検索を開始するインデックスを指定可能。要素が存在しない場合はValueError。

リストのみの操作

以下の操作は要素の変更を伴うので、リストのみ可能。

要素の変更

単独要素の置き換えのほか、部分リストを指定した一括置換が可能。置き換えられるリストと置き換えるリストの長さが違う場合、自動的にリストの長さが変更される。

要素の追加・削除

要素の追加

append()メソッド
引数をリストの要素として追加する。
insert()メソッド
インデックスで指定した要素の前に新たな要素を追加する。

要素の削除

詳細はこちら

del文
添字を指定してリストの要素を削除する。部分リストを指定して削除することも可能。
remove()メソッド
要素そのものを指定して削除する。同じ値の要素が複数存在する場合、最初の要素を削除する。
pop()メソッド
指定した位置の要素を取り出して削除する。先頭要素はゼロ番目、位置指定を省略した場合は最後尾。

リストの拡張

extend()メソッドにより、リストに他のリストの要素を展開して追加できる。

内包表記

内包表記を参照。

 

Python3 – リテラル

数値

整数

基数

10進のほか、8進、16進、2進表記が可能。


console.log()→print()としても結果は同じ。

長整数

Python2では長整数L/lがあったが、Python3ではintとlongは統合され、L/lの表記は廃止された。

Python3のprint関数では表現は変わらないが、一定値を超えるとObject扱いとなり、Brysonのconsole.logではオブジェクト形式で表示される。

print()ではint、longとも表示は変わらないが、console.log()で長整数の場合はObject表現となる。

浮動小数点数

虚数・複素数

Pythonでは複素数が扱え、虚数単位は数値に続く”j”で表す。

論理値

論理値はTrue/Falseの二値。頭文字を大文字にすること(小文字の場合は未定義変数扱いになる)

文字列

文字列リテラルは、ダブルクォート(“)かシングルクォート(‘)で囲む。

エスケープ

バックスラッシュ(\)によって制御文字を表したり、特殊文字を通常の文字として扱える。

\n 改行
\t タブ
\” ダブルクォート(“)
\’ シングルクォート(‘)
\\ バックスラッシュ(\)