akuruhinode's blog

pythonやC#を中心に興味を持った内容について調べています。

Python ブール型以外でTrueやFalseと判定される値

はじめに

Pythonでは、ブール型以外にもTrueやFalseと判定される値があります。ここではそれらの値と判定値を整理します。

TrueやFalseと判定される値

ブール型以外でTrueやFalseと判定される値は以下の通りです。

判定値
0 False
0.0 False
''(空文字列) False
上記以外 True

実行例

Falseとなる例

以下はFalseとなる例です。if文の評価結果がFalseとなっていることがわかると思います。

  • 例1
if 0:
    print('True')
else:
    print('False')
False
  • 例2
if 0.0:
    print('True')
else:
    print('False')
False
  • 例3
if '':
    print('True')
else:
    print('False')
False

Trueとなる例

以下はTrueとなる例です。ここでは1例のみ紹介しますが、Falseとなる例で説明した内容以外であれば、すべてTrueとなります。

if 1:
    print('True')
else:
    print('False')
True

TrueやFalse判定を利用したコードの簡易化

TrueやFalseと判定される値を利用するとコードを簡易化できます。

例えば、空文字が入力されている間whileループを繰り返す処理を考えます。
input()で入力した文字が空文字かどうか判定する場合、TrueやFalse判定を利用するとコードを簡易化できます。

  • TrueやFalse判定を利用しない場合の例
name = ''
while name == '': # not name != ''でも同様
    print('名前を入力してください')
    name = input()
print('こんにちは' + name + 'さん')
  • TrueやFalse判定を利用した場合の例
name = ''
while not name: # 空文字が入力された場合にFalse判定されることを利用して簡易化
    print('名前を入力してください')
    name = input()
print('こんにちは' + name + 'さん')

TrueやFalse判定で不具合を生まないために

間違えやすいのがマイナスの値です。0や0.0はFalseと判定されますが、マイナスの値はTrueと判定されます。
例えば年齢を入力してもらう処理を考えます。ここでTrue、False判定を誤解していると、不具合を埋め込んでしまう可能性があります。
年齢は0以上の値なので、条件式は age >= 0となります。しかし以下のTrue、False判定を誤解した間違った例ではage != 0という条件式になっています。

  • 間違った例
print('年齢を入力してください')
age = int(input())
if age: # この条件式は age != 0と同等
    print(str(age) + '歳ですね')
else:
    print('0以上の値を入力してください')
  • 正しい例
print('年齢を入力してください')
age = int(input())
if age >= 0:
    print(str(age) + '歳ですね')
else:
    print('0以上の値を入力してください')

Python 制御文の記述方法

はじめに

ここでは、条件文やループ文などのPythonの制御文を整理します。

基本的な記述方法

基本的な記述方法は以下の通りです。

  • キーワード + 条件式 + コロン(:)という構成の行で始まる
  • 必要に応じて次の行に「節」と呼ばれるコードのブロックが続く
  • コードのブロックは、コードの字下げ*1で指定する
  • コードのブロックの中にはほかのブロックを含めることができる
  • 字下げがなくなるか、上位ブロックの字下げに戻るとブロックは終了する

条件文

if文

if文の節は条件式がTrueの場合に実行されます。

if 条件式:
    処理 # 条件式がTrueの場合に実行

elif文

if文やelif文に続けて記述します。
「else if」を意味し、それ以前の条件式がFalseだった場合に限り条件式を判定します。

if 条件式:
    処理 # 条件式がTrueの場合に実行
elif 条件式:
    処理 # 前の条件式がFalseかつ条件式がTrueの場合に実行

else文

if文やelif文に続けて記述します。
if文またはelif文の条件がFalseの場合にelse節が実行されます。

if 条件式:
    処理 # 条件式がTrueの場合に実行
else:
    処理 # 条件式がFalseの場合に実行

使用例

if文、else文、elif文の使用例は以下の通りです。

print('名前を入力してください')
name = input()
if name == 'taro':
    print('こんにちはtaroさん')
elif name == 'hanako':
    print('こんにちはhanakoさん')
else:
    print('名前が間違っています')

ループ文

while文

条件式がTrueの間、While節が繰り返し実行されます。

while 条件式:
    処理 # 条件式がTrueの間繰り返し実行

forループ文

一定の回数だけコードのブロックを繰り返し実行します。
forループではrange()関数を用いることで、連続した値をループごとに取得します。現在の値は変数に格納されます。

for 変数名 in 引数を指定してrange()を呼び出し:
    処理 # 一定回数繰り返し実行

range()関数の指定方法

range()関数に渡す引数の数に応じて、開始、終了、ステップ数が異なります。

引数を1つ指定した場合
内容
開始 0
終了 第1引数の値-1
ステップ数
for i in range(5):
    print(str(i))
0
1
2
3
4
引数を2つ指定した場合
内容
開始 第1引数
終了 第2引数の値-1
ステップ数
for i in range(12, 16):
    print(str(i))
12
13
14
15
引数を3つ指定した場合
内容
開始 第1引数
終了 第2引数の値-1
ステップ数 第3引数
for i in range(1, 7, 2):
    print(str(i))
1
3
5
7

break文

プログラム実行がbreak文に到達すると、即座にwhileループ節またはforループ節を抜け出します。

while 条件式:
    if 条件式:
        break:

continue文

プログラム実行がcontinue文に到達すると、即座にwhileループ節またはforループ節の先頭に戻ります。

while 条件式:
    if 条件式:
        continue:

使用例

while文、break文、continue文の使用例は以下の通りです。

while True:
    print('名前を入力してください')
    name = input()
    if name != 'taro':
        continue:
    print('こんにちはtaroさん、パスワードを入力してください')
    password = input()
    if password == "password":
        break:
print('認証しました')

*1:Python標準のコーディングスタイルでは4文字のスペースを入れる。Googleのスタイルは2文字

Python 演算子の種類と評価順序

はじめに

ここでは、Pythonで使える演算子について説明します。

数学演算子

演算子一覧

Pythonの式で使える数学演算子は以下の通りです。

優先順位 演算子 説明 評価結果
1.** 累乗2 ** 4 16
2.* 掛け算2 * 4 8
2./ 割り算23 / 8 2.875
2.// 整数の割り算。小数点以下切り捨て23 // 8 2
2.% 余剰(割り算の余り)23 % 8 7
6.+ 足し算2 + 4 6
6.- 引き算4 - 2 2

評価順序

式は通常の数学と同じ順序で評価されます。

  1. 優先順位に従い、累乗演算子(**)が評価されます。
  2. 掛け算演算子(*)、割り算演算子(/)、整数の割り算演算子(//)、余剰演算子(%)が、左から右に評価されます。
  3. 足し算(+)、引き算(-)演算子が左から右に評価されます。

丸カッコ()を使って順序を変えることもできます。

実行例

実行例は以下の通りです。優先順位通りに評価されていることがわかると思います。

  • 例1
 2 + 3 * 6
20
  • 例2
 (2 + 3) * 6
30
  • 例3
(5-1) * ((7 + 1) / (3 -1)) 
16.0

比較演算子

演算子一覧

Pythonの式で使える比較演算子は以下の通りです。

演算子 説明
== 等しい
!= 等しくない
< より小さい
> より大きい
<= 以下
>= 以上

実行例

実行例は以下の通りです。

  • 例1
42 == 42
True
  • 例2
2 != 3
True
  • 例3
'hello' == 'Hello'
False

ブール演算子

演算子一覧

Pythonの式で使えるブール演算子は以下の通りです。

演算子 説明
and 2つのブール値の両方がTrueの時にTrueとなる
or 2つのブール値の片方、または両方がTrueの時にTrueとなる
not ひとつのブール値を反転させる

評価順序

ブール演算子は、算術演算子と同様に優先順位を持ちます。評価順序は以下の通りです。

  1. 算術演算子と比較演算子を評価
  2. not 演算子を評価
  3. and演算子、or 演算子を評価

実行例

実行例は以下の通りです。

  • 例1
True and True
True
  • 例2
True or False
True
  • 例3
not True
False

Python 先頭行のシバン行(#!)とは

はじめに

ここでは、Pythonスクリプトの先頭行に記述されるシバン行というものについて説明します。

シバン行とは

シバン(shebang)行とはPythonスクリプトの先頭行のことで、このスクリプトを実行するのがPythonであることをコンピュータに伝える働きをします。
シバン行は#!から始まります。

  • シバン行の例
#! python3

print( 'Hello world' )

書き方

各OSの書き方

シバン行の書き方はOSに依存します。

#! python3
#! /usr/bin/env python3
#! /usr/bin/python3

バージョンの指定方法

バージョンの指定方法は共通です。以下はWindowsの例です。

  • インストール済のPython3の中で最新のバージョンを指定
#! python3
  • バージョン3.6を指定
#! python3.6


Python2の場合も同様に指定可能です。


Pythonはマイナーバージョン単位でインストールされるため、指定できるのはマイナーバージョンまでです。例えば下記のような記述はエラーとなります。

#! python3.6.8    これはエラー

また、インストールされていないバージョンを指定した場合もエラーとなります。

用途

OSによる違い

シバン行はPython独自の機能ではなく、UNIX系においてスクリプトを実行するインタプリタを指定するための機能です。

そのため、どちらかといえばMacLinux向けの機能であり、WindowsMacLinuxでは用途が異なります。

MacLinuxでの用途

基本的に必須

MacLinuxでは以下のようにスクリプトを実行しますが、スクリプトを実行するインタプリタを指定するためにシバン行を記述する必要があります。

./pythonScript.py
不要な場合もある

PythonのPATHを通していれば、コマンドラインから下記のように記述することでシバン行がなくても実行可能です。

python pythonScript.py

ただし、複数のバージョンのPythonをインストールした場合にこの方法では対応できないのと、スクリプトの再利用性の観点からMacLinuxではシバン行を記述した方が良いと思います。

Windowsでの用途

基本的に不要

Windowsでの用途はごく一部に限られているため、シバン行を記述しなくても問題ありません。
シバン行は#から始まるため、Pythonスクリプト上はコメントと同じ扱いとなります。

シバン行を利用する目的

Windowsでシバン行を利用する目的は以下の通りです。

- 実行するPythonのバージョンをスクリプトから指定したい

複数バージョンのPythonがインストールされている環境では、py.exe*1を利用することでスクリプトを適切なバージョンのインタプリタpython.exe)で実行できます。
py.exeはシバン行の読み込みに対応しており、シバン行をもとに実行するインタプリタを選択します。

py pythonScript.py


なお、py.exeではシバン行がない場合はインストールされている最新のインタプリタが選択されますので、シバン行を記述しなくても問題ありません。
また、コマンドラインからバージョンを指定することもできます。コマンドラインとシバン行をどちらも記述した場合は、コマンドラインが優先されます。

  • インストール済のPython3の中で最新のバージョンを指定
py -3 pythonScript.py
  • バージョン3.6を指定
py -3.6 pythonScript.py


少し試すレベルであればコマンドライン指定で問題ないかと思いますが、バージョンが明確に決まっている場合はスクリプト上に記述したほうが分かりやすいですし、実行時の手間も減ると思います。


- 開発時のPythonのバージョン情報を残しておきたい
Windowsユーザで1つのバージョンのPythonしかインストールしていない場合など、シバン行が直接必要ない場合もあるかもしれません。

一方で、情報共有という観点では、シバン行は有益な情報源となります。スクリプトを再利用したり第三者に配布する可能性がある場合、シバン行を記述しておくと後々役に立つかもしれません。
Pythonはバージョンによって動作が異なる場合がありますので、スクリプト上から開発時のバージョンがわかればデバッグ時に参考になります。
最低限、Python2かPython3かどうかは分かるようにしておくと良いと思います。

*1:Pythonの実行ランチャ。Python3.3以降のバージョンでインストールされる。Anacondaなどのディストリビューションでには含まれない