Atom's tech blog

Pythonを勉強しよう! ローカルとグローバルについて

f:id:iAtom:20201111094026j:plain

Python初心者の備忘録.....

今回はローカルとグローバルのスコープと変数についてです。

プログラミングする上で絶対意識する必要があります。例えば関数外で作成した変数は、同じ名称で作成できないが、関数内では、関数外と同じ変数でもよい。またアクセス可否など。

ローカルスコープ/変数

関数の入力パラメータ、関数内で使用する目的で設定した変数は、関数内のみで使用可能です。これを「 ローカルスコープ 」といいます。

スコープ(Scope)は「 範囲 」の意味ですので、関数内の範囲だけと考えるといいです。

ローカル変数 」は、そのローカルスコープで使用する変数のことをいいます。

グローバルスコープ/変数

「 ローカルスコープ 」は関数内に対して「 グローバルスコープ 」は、関数外の範囲を示します。関数外に設定された変数のことを「 グローバル変数 」といいます。

ルール

  • グローバルスコープからローカル変数にはアクセスできない
  • ローカルスコープからグローバル変数にアクセスできる
  • ローカルスコープとグローバルスコープに同じ変数名を設定できる
  • 異なる関数に同じローカル変数名を設定できる
  • モジュール内の異なる関数のローカル変数はアクセスできない

@ モジュールとは、Pythonファイルの「 .py 」のことをいいます。

このようなルールがあるのは、他変数への影響を考えてしまい、バグになる可能性を極力減らすことが目的と考えます。

グローバル変数値の変更

ローカルスコープからグローバル変数の変更は「 global 」文で可能です。

このglobal文で宣言でグローバル変数宣言を行い、ローカルスコープ内でグローバル変数へアクセスを行います。

global   "グローバル変数名"

・サンプルコード

def localfunc1():
    # 関数内でグローバル変数を宣言
    global chkValue 
    # 関数内でグローバル変数値の変更
    chkValue = "localfunc1Chg"

def localfunc2():
    # localfunc2内のローカル変数を設定
    chkValue = "localfunc2Chg"

def chkValuePrint():
    print(chkValue)

# localfunc1()で作成したグローバル変数に設定
chkValue = "chgGlobal"
# グローバル変数を変更
localfunc1()
# グローバル変数を出力
chkValuePrint()
# グローバルアクセスできないlocalfunc2を起動
localfunc2()
# グローバル変数を出力
chkValuePrint()

# 出力結果
# localfunc1Chg
# localfunc1Chg

出力結果よりlocalfunc1()の関数でグローバル変数へアクセス可能であること、21行目のlocalfunc2()を起動してもグローバル変数は変更されていないことがわかります。

個人的にはローカルスコープからグローバル変数の値を変更すべきではないと考えています。本来グローバルスコープでしかアクセスできない理由があり、そのようになっていると......。

やも得ず、どうしても関数内で変更が必要なこともあるので「 global 」文が用意されており、コードを見たときに「グローバル変数にアクセスしてますぅー」を明示することで可読性がよくなり、意図が伝わるようになっているのでは?と思います。

自分自身は、コードにコメント文を多く記述する方なので、そのときになったらコメント文にも「 グローバル変数へアクセス・・・・」みたいないこと記述するでしょう。たぶん。

Pythonを勉強しよう! 関数とメソッドの違い

f:id:iAtom:20201110161620j:plain

Python初心者の備忘録.....

今回は関数(function)とメソッド(method)の違いについてです。

プログラミングする上で絶対関数とメソッドを作成します。ここでは関数、メソッドの作成と説明と違いについて説明します。

関数

関数 」は簡単にいうと「 値を渡すとその値で計算結果を返すもの 」、「 値は渡さないが処理だけを行うもの 」、ものによっては「 値を渡すとその値で処理し、結果を返さないもの 」などのような感じしょうか。

「 関数 」は、基本的に機能毎に分けて作成します。作り次第ですが、例えば、ファイルに保存する、統計計算だけするなど、機能毎に階層化して作成することで役割分担を明確して作成します。

「 関数 」を作成するときは、「 def 」 というキーワードに続けて関数名を記述して、そのあとに「 () 」(カッコ)をつけます。

最後に「 : 」(コロン)をつけ、改行して「 インデント 」を入れて処理コードを書きいれると、関数として扱われます。

関数の基本形

入力パラメータが無い場合
def  " 関数名 " () :
     "関数内を実行する処理"

・サンプルコード

def  funcNotPara() :
     print(" Not Parameter")

funcNotPara()

# 出力結果
# Not Parameter
入力パラメータが有る場合
def  " 関数名 " ( "パラメータ ") :
     "関数内を実行する処理"

・サンプルコード

def  funcPara(para1) :
     print(para1)

funcPara("paraData")

# 出力結果
# paraData
結果を返す場合
def  " 関数名 " ( "パラメータ ") :
     "関数内を実行する処理"
  return "処理結果"

・サンプルコード

def  funcPara(para1) :
     retValue = para1 + " / returnValue"
     return(retValue)

ret = funcPara( "paraData")
print(ret)

# 出力結果
# paraData / returnValue

メソッド

関数と同じ構造で記述のルールも同等です。ここで疑問になってくるのが、記述ルールが同じなのに言い方が変わるのか....。それは次章で説明を。

関数とメソッドの違い

簡単にいうと「 モジュール内にdefで作成したものが関数 」、「 クラス内にdefで作成したものがメソッド 」になります。

正確にはクラスがインスタンス化されてから「 メソッド 」になるようです。

# これが関数(モジュール内に作成されたもの)
def  func1(para1) :
     print(para1)

class funcClass():
     # これがメソッド(クラス内に作成されたもの)
     def func2(para2):
        print(para2)

# 関数を起動
func1("func1Exec")
# メソッドを起動
funcClass.func2("func2Exec")

# 出力結果
# func1Exec
# func2Exec

Pythonを勉強しよう! 関数パラメータに初期値を設定する

f:id:iAtom:20201109203052j:plain

Python初心者の備忘録.....

今回は起動先の関数側で、予め初期値を設定しておく方法です。

Pythonには関数パラメータに初期値を持たせておくことができます。これを「デフォルト引数」と呼び、 関数起動時にパラメータの指定を省略しても、そのパラメーターにはあらかじめ与えられる引数をいいます。

パラメータ値の幅がある場合、普通に使うときはX X値。カスタマイズして使用したいときは、Y Y値に変えて動作させたい。

そのようなケースにおいてとても便利な仕組みです。

ただし、インタフェースを確認、理解した上で設計・コーディングしないと、あとでインタフェースミスに繋がる可能性があるため要注意です。

デフォルト引数ができる記述

パラメータが一つの場合
def   "関数名"" パラメータ名 "  =  "  デフォルト値  ") :
        "関数で実行する処理"

・サンプルコード

def defaultParaTest( para1 = "defalutPara"):
    print( para1 )

# defaultパラメータ設定を使用した場合
defaultParaTest()
# defaultパラメータ値を変更した場合
defaultParaTest("changePara")

# 出力結果
# defalutPara
# changePara

5行目でパラメータ指定なしで関数起動すると、デフォルト引数の値となります。7行目でパラメータ値を指定して関数起動すると、引数で渡した値となります。

パラメータ全てに初期値を設定する場合(下記はパラメータ2つ) 
def   "関数名"" パラメータ名 " = " デフォルト値 "  ,  "  パラメータ名  " = " デフォルト値 " ) :
        "関数で実行する処理"

・サンプルコード

def defaultParaTest( para1 = "defalutPara1" , para2 = "defalutPara2"):
    print( para1 + ' , '  +para2)

# defaultパラメータ設定を使用した場合
defaultParaTest()
# defaultパラメータ値を変更した場合
defaultParaTest("changePara1" , "changPara2")
# 一つだけdefaultパラメータを変更した場合
defaultParaTest("changePara1")

# 出力結果
# defalutPara1 , defalutPara2
# changePara1 , changPara2
# changePara1 , defalutPara2

5行目でパラメータ指定なしで関数起動すると、デフォルト引数の値となります。

7行目で両方のパラメータ値を指定して関数起動すると、引数で渡した値となります。

9行目でパラメータ値を一つ指定すると、第一パラメータとなることがわかります。

パラメータ二番目だけに初期値を設定する場合(下記はパラメータ2つ)
def   "関数名"" パラメータ名 "  ,  " パラメータ名 " =  " デフォルト値 ") :
        "関数で実行する処理"

・サンプルコード

def defaultParaTest( para1 , para2 = "defalutPara2"):
    print( para1 + ' , '  +para2)

# 第一パラメータ設定、第二パラメータはデフォルト引数
defaultParaTest("changePara1")
# 第一、第二パラメータ設定
defaultParaTest("changePara1","changePara2")

# 出力結果
# changePara1 , defalutPara2
# changePara1 , changePara2

5行目で第一パラメータ指定で関数起動すると、第一パラメータが設定され、第二パラメータがデフォルト引数になります。

7行目で両方のパラメータ値を指定して関数起動すると、引数で渡した値となります。

当然ながらこの場合は、第一パラメータの指定は必須です。設定しないとエラーとなります。

デフォルト引数ができない記述

複数のパラメータのうち一番目だけ初期値を設定する場合

下記ケースでは正常に実行されず、エラーとなります。

def   "関数名"" パラメータ名 " = " デフォルト値 " , " パラメータ名 " ) :
        "関数で実行する処理"

・サンプルコード

def defaultParaTest( para1 = "defaultPara1" , para2):
    print( para1 + ' , '  +para2)

# 出力結果
# SyntaxError: non-default argument follows default argument
複数のパラメータのうち一部だけ初期値を設定する場合

下記ケースは正常に実行されず、エラーとなります。

def   "関数名"" パラメータ名 " = " デフォルト値 " , " パラメータ名 " , " パラメータ名 " ) :
        "関数で実行する処理"

・サンプルコード

def defaultParaTest( para1 = "defaultPara1" , para2 ,  para3):
    print( para1 + ' , '  +para2 + ' , ' para3)

# 出力結果
# SyntaxError: non-default argument follows default argument
複数のパラメータのうち一部だけ初期値を設定する場合

下記ケースは正常に実行されず、エラーとなります。

def   "関数名"" パラメータ名 " = " デフォルト値 " , " パラメータ名 " , " パラメータ名 "= " デフォルト値 " ) :
        "関数で実行する処理"

・サンプルコード

def defaultParaTest( para1 = "defaultPara1" , para2 ,  para3 = "defaultPara3"):
    print( para1 + ' , '  +para2 + ' , ' para3)

# 出力結果
# SyntaxError: non-default argument follows default argument

Pythonを勉強しよう! パラメータ名を指定して引数を渡す

f:id:iAtom:20201109170807j:plain

Python初心者の備忘録.....

今回は、関数でパラメータ値を渡すときに、パラメータ名を指定して渡す方法です。

基本的には、起動先の関数のパラメータの順番は同じにする必要があります。これはC言語と同等。パラメータ名を指定して引数を渡す。

しかしPythonにはパラメータを指定することで順番を意識しない方法もあります。これはパラメータ数が多いときにとても有効です。

キーワード引数

パラメータ名を指定して引数の値を設定することを、「 キーワード引数 」といいます。

キーワード引数でパラメータを渡すときは、「 パラメータ名 = 引数にする値 」を関数パラメータに記述します。

サンプルソースの方がわかりやすいです。

サンプルソース

def paramTest(para1 , para2):
    addValue = para1 + para2      
    return addValue

returnValue = paramTest(para2="blog" , para1="Atom's ")
print(returnValue)

# 出力結果
Atom's blog

5行目でパラメータ順番が違いますが、キーワード引数を行うことで paramTest()関数で期待値を取得することができます。

Pythonを勉強しよう! 同じ処理を繰り返すfor文

f:id:iAtom:20201109142943j:plain

Python初心者の備忘録.....

今回は、「 for 」文についてです。

for文は一定の回数を繰り返し処理を行うために使用します。

基本的な組み合わせで使用するものが「 break 」、「 continue 」、「 else 」。

その他に一緒に使うことで便利な関数もあります。

for文の記述

C言語とは異なり、基本形は以下となります。

for "変数"  in "イテレート可能なオブジェクト" :
      "繰り返す処理"

イテレート 」とは「繰り返し処理」するという意味で、イテレート可能ということは、オブジェクトの中から順に値を取り出せることを意味します。

どのようなことを示しているか、サンプルをみてみましょう。

fruits = ['apple', 'orange', 'banana']
for name in fruits:
    print(name)

# 出力結果
# apple
# orange
# banana

特に回数を指定しなくてもリストデータに入っている数(上記サンプルでは3要素)分ループします。さらにそのデータをname変数へ取り出しができています。

回数と固定してループすることも可能です。後ほど説明を追加します。

for文を途中で終了: break

for文で一定回数をループしているときに、ある条件のときは最後までループさせたくないときがあります。そのときは「 break 」文を使いましょう。

それではサンプルをみてみましょう。

fruits = ['apple', 'orange', 'banana']
for name in fruits:
    if name == "orange":
        print("break")
        break

    print(name)

# 出力結果
# apple
# break

3行目の条件文でTrue結果のとき、5行目で「 break 」し、「 for 」文をと途中で終了します。

途中で終了することで 「 banana 」のループを実施しない結果となります。

処理をスキップ: continue

for文で一定回数をループしているときに、ある条件のときは処理したくないけど、ループは継続したいときがあります。

そのときは「 continue 」文を使用しましょう。

サンプルをみてみましょう。

fruits = ['apple', 'orange', 'banana']
for name in fruits:
    if name == "orange":
        print("skip")
        continue

    print(name)

# 出力結果
# apple
# skip
# banana

3行目の条件文でTrue結果のとき、5行目で「 continue 」し、「 for 」文に戻ります。

戻ることで「 banana 」のループも実施され「banana」を表示しています。

forループ正常終了後の処理: else

for文が一定回数正常終了した後に、何か処理をしたいときに「 else 」を使います。

breakで途中で終了したときは、「 else 」ルートに行かないとのこと。

breakで抜けるループ処理があるときに使えそうですね。

fruits = ['apple', 'orange', 'banana']
for name in fruits:
    if name == "grape":
        break

else:
    print("OK Finish")

# 出力結果
# OK Finish

「 else 」を用いることで途中でbreakせずに最後までループしたことが、これでわかりますね。

「 continue 」の場合は、「 break 」と異なり正常回数分ループするため、「 else 」ルートへ分岐します。

fruits = ['apple', 'orange', 'banana']
for name in fruits:
    if name == "orange":
        print("skip")
        break

else:
    print("OK Finish")

#  出力結果
#  skip

「 break 」文で途中で処理を終了すると「 else 」ルートにはいかないことがわかりますね。

インデックス(カウンタ): range()関数

指定回数分ループ 」させ、さらにその「 インデックスカウンタ値を取得する 」目的で使用します。

インデックスカウンタ取得しないケースでも使用したりしますね。

インデックスカウンタを0から開始するとき

range()関数には, (start値 , stop値) の2つの引数を指定できます。0カウンタ値から実施したい場合は、stopのみでもよいです。

下記のサンプルは「0開始〜4終了の5回ループ」です。

for cnt in range(5):
    print(cnt)

# 出力結果
# 0
# 1
# 2
# 3
# 4
インデックスカウンタを5から開始するとき
for cnt in range(5 , 10):
    print(cnt)

# 出力結果
# 5
# 6
# 7
# 8
# 9
カウントアップを任意の増分したいとき

1ずつではなく任意の増分を指定したい場合は、 range(start, stop, step) のように3つの引数を指定します。

下記サンプルは5開始で、2ずつカウントアップ。終了は10までの3回ループをイメージしています。

for cnt in range(5 , 10, 2):
    print(cnt)

# 出力結果
# 5
# 7
# 9
カウントダウンを任意の減分したいとき

カウントアップは「 + 」プラスだけではなく、「 - 」マイナス していくこともできます。

下記サンプルは10開始で、-2ずつカウントダウン。終了は5までの3回ループをイメージしています。

for cnt in range(10 , 6, -2):
    print(cnt)

# 出力結果
# 10
# 8
# 6

リストの要素とインデックス: enumerate()関数

指定回数分ループ 」させ、さらにその「 インデックスカウンタ値 」と「 イテラブルオブジェクトの要素 」を取得する目的で使用します。

インデックスカウンタを0から開始
fruits = ['apple', 'orange', 'banana']
for cnt,name in enumerate(fruits):
    print(cnt, name)

# 出力結果
# 0 apple
# 1 orange
# 2 banana
インデックスカウンタを任意の値から開始

enumerate()関数の第二引数には開始値を指定でき、任意の整数値から開始できます。

fruits = ['apple', 'orange', 'banana']
for cnt,name in enumerate(fruits,10):
    print(cnt, name)

# 出力結果
# 10 apple
# 11 orange
# 12 banana

enumerate()関数に増分stepを指定する引数はありません。

逆順: reversed()関数

イテラブルオブジェクトの要素を取得

イテラブルオブジェクトの要素」を逆から取得をreversed()関数でできます。

fruits = ['apple', 'orange', 'banana']
for name in reversed(fruits):
    print(name)

# 出力結果
# banana
# orange
# apple
range()関数と組み合わせる

range()関数と合わせることでカウントダウンインデックス値を取得することもできます。

for cnt in reversed(range(5)):
    print(cnt)

# 出力結果
# 4
# 3
# 2
# 1
# 0

多重ループ: itertools.product()関数

「 for 」文の複数使用で多重ループをする方法を普通に思いつきますが、itertools.product()関数を使用することで、ネストを深くせずに記述し「 for 」文の複数使用と同等の結果が得られます。

使用するには組み込み関数ではなく、標準ライブラリの「 itertools 」を使用します。そのためimportする必要があるためサンプルのように記述します。

import itertools

list1= [0, 1, 2]
list2 = [10, 20, 30, 40]

for x, y in itertools.product(list1, list2):
    print(x, y)

# 出力結果
# 0 10
# 0 20
# 0 30
# 0 40
# 1 10
# 1 20
# 1 30
# 1 40
# 2 10
# 2 20
# 2 30
# 2 40

dictionary objectのforループ

dictionaryとは、keyとvalueのペアを登録できるデータ構造となっています。keyを使ってvalueを呼び出せるので、情報のヒモ付けされるイメージなので参照、アクセスしやすいです。

このdictionary objectのデータを「 for 」文で取得する方法です。

keyのみを取得
# dictionaryオブジェクト
fruits = {'apple':1, 'orange':2, 'banana':3}

for key in fruits:
    print(key)

# 出力結果
# apple
# orange
# banana
valueのみを取得

valueを取得するときは、dictionaryオブジェクトのvalues()メソッドを使用して取得します。

# dictionaryオブジェクト
fruits = {'apple':1, 'orange':2, 'banana':3}

for value in fruits.values():
    print(value)

# 出力結果
# 1
# 2
# 3
# key と valueの両方を取得

key とvalueを取得するときは、dictionaryオブジェクトのitems()メソッドを使用して取得します。

# dictionaryオブジェクト
fruits = {'apple':1, 'orange':2, 'banana':3}

for key, value in fruits.items():
    print(key , value)

# 出力結果
# apple 1
# orange 2
# banana 3

Pythonを勉強しよう! if文と比較演算子について

f:id:iAtom:20201109085645j:plain

Python初心者の備忘録.....

今回は、「 if 」文と「比較演算子」についてです。

if 」文はプログラムの流れを変えるために使用します。 「 比較演算子 」は「 if 」文の条件式に使うための演算子です。それでは個々にみていきましょう。

if文

「 if 」は、条件式がTrueのときはTrueルートのプログラムコードを実行、FalseのときはFalseルートのプログラムを実行するための条件式を記述します。

基本的なif文の形

基本的に「 if 」文、「 else 」文、「 elif 」文で記述します。「 elif 」は C言語の「 else if 」に相当します。

if のみの場合

if 条件式1:
    "条件式1がTrueのときに行う処理"

if , else 場合

if 条件式1:
    "条件式1がTrueのときに行う処理"
else:
    "すべての条件式がFalseのときに行う処理"

if , elif , else の場合

if 条件式1:
    "条件式1がTrueのときに行う処理"
elif 条件式2:
    "条件式1がFalseで条件式2がTrueのときに行う処理"
...
else:
    "すべての条件式がFalseのときに行う処理"

比較演算子

「 if 」文の条件式に必要となる演算子です。比較演算子の記号は下記です。

比較演算子 意味 記述例 比較結果の内容
== 等しい x == y xとyが等しいときTrue。xとyが異なるときFalse
!= 異なる x != y xとyが異なるときTrue。xとyが等しいときFalse
> 大きい x > y x値がy値より大きいときTrue。x値がy値より小さいときFalse
< 小さい x < y x値がy値より小さいときTrue。x値がy値より大きいときFalse
>= 以上 x >= y x値がy値以上のときTrue。x値がy値より小さいときFalse
<= 以下 x <= y x値がy値以下のときTrue。x値がy値より大きいときFalse
in 要素 x in y xがyの要素のときはTrue。xがyの要素でないときはFalse
not in 要素ではない x not in y xがyの要素でないときはTrue。xがyの要素のときはFalse

「 is 」、「 not is 」演算子もありますが、ここでは説明から外します。ご了承ください。

== の書き方例

「 == 」で比較できるものとして、文字列、数値、リスト、bool型(True/False)などがあります。 下記は文字列、数値、リスト比較です。

###################
###   数値比較    ###
###################
# value変数に100の数値を代入
value = 100
# value変数が100と等しいか比較
if 100 == value :
    # 等しい場合True
    print('True')
else:
    # 異なる場合
    print('False')

###################
###    文字列比較      ###
###################
# fruits変数にapple文字列を代入
fruits  = 'apple'
# fruirs変数がapple文字列と等しいか比較
if 'apple' == fruits :
    # 等しい場合True
    print('True')
else:
    # 異なる場合
    print('False')

###################
###  リスト比較     ###
###################
# listValue変数に100,200,300のリスト数値を代入
listValue1  = [100,200,300]
listValue2  = [100,200,300]
# listValue1と2を等しいか比較
if listValue1 == listValue2 :
    # 等しい場合True
    print('True')
else:
    # 異なる場合
    print('False')

# 出力結果
# True
# True
# True

!= の書き方例

「 != 」で比較できるものとして、文字列、数値、リストなどがあります。「 == 」演算子と同じです。 下記は文字列、数値、リスト比較です。

###################
###   数値比較    ###
###################
# value変数に100の数値を代入
value = 100
# value変数が100と異なるか比較
if 100 != value :
    # 等しい場合True
    print('True')
else:
    # 異なる場合
    print('False')

###################
###    文字列比較      ###
###################
# fruits変数にapple文字列を代入
fruits  = 'apple'
# fruirs変数がapple文字列と異なるか比較
if 'apple' != fruits :
    # 等しい場合True
    print('True')
else:
    # 異なる場合
    print('False')

###################
###  リスト比較     ###
###################
# listValue変数に100,200,300のリスト数値を代入
listValue1  = [100,200,300]
listValue2  = [100,200,300]
# listValue1と2を異なるか比較
if listValue1 != listValue2 :
    # 等しい場合True
    print('True')
else:
    # 異なる場合
    print('False')

# 出力結果
# False
# False
# False

> の書き方例

「 > 」で比較できるものとしては基本的には数値です。

# value変数に100の数値を代入
value = 100
# value変数が100より大きいか比較
if value > 100 :
    # 大きい場合True
    print('True')
else:
    # 小さい場合
    print('False')

# 出力結果
# False

比較した値は同じですが、条件式が100より大きいときだけTrueという条件のため、結果はFalse。

100を含めたいときは「 >= 」の比較演算子を使いましょう。

「 >= 」の書き方例

「 >= 」で比較できるものとしては基本的には数値です。

# value変数に100の数値を代入
value = 100
# value変数が100以上か比較
if value >= 100 :
    # 100以上の場合True
    print('True')
else:
    # 100より小さい場合
    print('False')

# 出力結果
# True

比較した値は同じで条件式が100以上(100を含む)のTrueという条件のため、結果はTrue。

< の書き方例

「 < 」で比較できるものとしては基本的には数値です。

# value変数に100の数値を代入
value = 100
# value変数が100より小さいか比較
if value < 100 :
    # 小さい場合True
    print('True')
else:
    # 大きい場合
    print('False')

# 出力結果
# False

比較した値は同じですが、条件式が100より小さいときTrueという条件のため、結果はFalse。

100を含めたいときは「 <= 」の比較演算子を使いましょう。

<= の書き方例

「 <= 」で比較できるものとしては基本的には数値です。

# value変数に100の数値を代入
value = 100
# value変数が100以下か比較
if value <= 100 :
    # 100以下の場合True
    print('True')
else:
    # 100より大きい場合
    print('False')

# 出力結果
# True

比較した値は同じで条件式が100以下(100を含む)のTrueという条件のため、結果はTrue。

inとnot inの書き方例

「 in 」の左辺には比較するための要素、右辺には比較する集合体を記述します。

# apple, orange,banana文字列をfruits変数に代入
fruits  = [ 'apple', 'orange','banana']

###################
###     in の使い方      ###
###################

# fruitsの変数にorangeの文字列が入っているか比較する
if 'orange' in fruits :
    # orangeの文字列が入っている場合
    print('True')
else:
    # orangeの文字列が入っていない場合
    print('False')

###################
###  not   in の使い方 ###
###################

# fruitsの変数にorangeの文字列が入っていないか比較する
if 'orange' not in fruits :
    # orangeの文字列が入っていない場合
    print('True')
else:
    # orangeの文字列が入っている場合
    print('False')

# 出力結果
# True
# False

複数の比較演算子の結合

一つのif文に複数の比較演算子をつけることもできます。ただし複雑にになりバグを埋め込む可能性もあるため、「 and 」、「 or 」演算子を用いてシンプルにし可読性などをよくする方法を活用した方がいいです。

比較演算子を2つ結合したとき

下記は「 < 」、「 <= 」を結合したときの条件式です。

# value変数に50の数値を代入
value = 50
# value変数が10より大きく、100以下か比較
if 10 < value <= 100 :
    # True
    print('True')
else:
    # False
    print('False')

# 出力結果
#True

比較演算子が2つの場合は、あまり複雑にならないのでシンプルにできそうですね。

この時の条件式は、10より大きく、100以下で比較した値は50なのでTrue。

結合できる比較演算子は、上記例以外の演算子も可能ですし、3つ以上の結合も可能です。

2つの条件式をandで記述したとき

こちらは「比較演算子を2つ結合したとき」と同じ条件式です。 and演算子は、左辺と右辺どちらもTrueが条件になります。 and演算子、or演算子、not演算子の論理演算子は別の記事で書きたいと思います。

# value変数に50の数値を代入
value = 50
# value変数が10より大きく、100以下か比較
if  value > 10 and value <= 100 :
    # True
    print('True')
else:
    # False
    print('False')

# 出力結果
#True

この時の条件式は、10より大きく、100以下で比較した値は50なのでTrue。

if , elseを一行で記述する方法

if , elseの基本形式で記述したとき

# value変数に100の数値を代入
value = 100
# value変数が100以上か比較
if value >= 100 :
    # 100以上の場合True
    print('True')
else:
    # 100より小さい場合
    print('False')

# 出力結果
#True

これを一行形式で記述すると下記となります。

一行形式で記述したとき

# value変数に100の数値を代入
value = 100
# value変数が100以上か比較し、100以上お場合はTrue、100より小さい場合はFalseを出漁
print('True' if value >= 100 else 'False' )

# 出力結果
#True

上下のサンプルソース共に同じ式になります。

とてもコードライン数は少なくなりますが、可読性と規模換算、プログラム評価を考えた場合、個人的には基本形が好きです。

省略した記述をするとき

プログラムでは、よく省略された書き方が出てくることがあります。if文で右辺の条件が記述されていないケース。

Bool型の場合

省略しない記述 
result = True
# result結果がTrueのときの比較
if result == True:
    print('True')
else:
    print('False')

## 出力結果
#True

3行目の 「 == True 」を省略することが可能です。

省略した記述
result = True
# result結果がTrueのときの比較
if result :
    print('True')
else:
    print('False')

## 出力結果
#True

省略してもサンプルコードどちらも同じ結果となります。

数値比較の場合

if文の数値結果が0以外の場合はTrue、0の場合はFalseのプログラムコードへ分岐します。

if (数値を結果とする式):は、if (数値を結果とする式) != 0: と同じになります。

省略しない記述
x = 5
y = 6

# 余りを計算し、奇数、偶数を確認する
if (x+y)%2 != 0:
    # 奇数の場合
    print('Odd')
else:
    # 偶数の場合
    print('Even')

# 出力結果
# Odd
省略する記述
x = 5
y = 6

# 余りを計算し、奇数、偶数を確認する
if (x+y)%2 :
    print('Odd')
else:
    print('Even')

# 出力結果
# Odd

Pythonを勉強しよう! 関数の戻り値について

f:id:iAtom:20201108092834j:plain

Python初心者の備忘録.....

今回は、関数の戻り値についてです。

戻り値とは

戻り値は「関数」から返ってくる値をいいます。自分はリターン値ともいっています。

関数の作り方次第ですが、戻り値があるとき1つの場合(C言語は1つまで)や、複数の場合が考えられます。

戻り値には、数値や文字列、場合によってはデータアドレス情報など返すことが可能です。

return文

戻り値を返す「return」文を使用します。 この「return」文は、関数で処理終了するときに必要な文になります。下記の一覧のような使い方ができます。

  • 関数内で複数の「return」文があってもよい。
  • 戻り値を変数名、直接値(ex : 100 , 200 , "OK"など)、bool型でTrue、Falseでもよい。
  • 「return」文で計算してもよい。

下記のサンプルコードでいうと、関数は「modoriTest」です。

  • 関数は処理を1つにまとめたもの
  • 関数は「def 関数名」の形で記述する

それでは戻り値の記述方法をみていきましょう。

戻り値が1つのとき

def modoriTest():
    addValue = 100 + 200      
    return addValue

returnValue = modoriTest()
print(returnValue)

# 300

説明をすると、「def modoriTest() 」は関数。 

100+200の加算した値(addValueに結果が入っている)を、「return」文で返しています。

この「def modoriTest() 」は関数宣言しており、誰かが呼ばないと起動しない関数です。

ここでは5行目の「returnValue = modoriTest()」でmodoriTest()の結果返しを、左辺のretrunValueへ保存し、「print」文で標準出力しています。

戻り値が2つのとき

def modoriTest():
    addValue = 100 + 200 
    subValue = 200 - 100   
    return addValue,subValue

retValueAdd,retValueSub= modoriTest()
print(retValueAdd)
print(retValueSub)

# 300
# 100

説明すると4行目の「return」文で二つの変数を「 , 」(カンマ)で区切って返しています。

6行目でその結果を「retValueAdd」、「retValueSub」へ保存し、「print」文で標準出力しています。

使い方は難しくなく、返す順番で返却することで期待した戻り値を返却、取得することができます。

戻り値が2つのうち1つ使わないとき

関数からの戻り値のうち1つは使用しないときは、戻り値を取得する箇所に「 _ 」(アンダースコア)を記述します。

この用途は詳しくわかっていませんが、使って欲しくない変数を明示的に示すことで、誤った参照を防ぐことも一つの用途に挙げられます。

  • 「 _ 」はアンダースコアが正式名称。アンダーバーは和製英語らしい。
def modoriTest():
    addValue = 100 + 200 
    subValue = 200 - 100   
    return addValue,subValue

retValueAdd , _= modoriTest()
print(retValueAdd)

# 300

6行目で戻り値の2つ目をアンダースコアで変数に入れず、使用しないことを明示しています。

戻り値を計算して返すとき

def modoriTest():  
    return  100+200,200-100

retValueAdd,retValueSub= modoriTest()
print(retValueAdd)
print(retValueSub)

# 300
# 100

2行目の「return」文で計算後に戻り値を返すことをしています。