today::エンジニアに憧れる非エンジニア

今のところは、エンジニアとは言えないところの職種です。しかしエンジニア的なものの考え方に興味津津。

Pythonあれこれ 2021-01-31 - 関数

概要

「Head First Python 第2版」を進めていった中で考えたことの記録です。

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

  • 作者:Paul Barry
  • 発売日: 2018/03/24
  • メディア: 単行本(ソフトカバー)

Pythonにおける関数

Pythonにおける関数の基本構成

def a_descriptive_name(optional_arguments):
    """ドキュメンテーション文字列"""
    # ここに関数のコードが入る。
    # ここに関数のコードが入る。
    # ここに関数のコードが入る。
    return optional_value
  • Pythonにおける関数は、コードを再利用する最も基本的な手段である
  • 関数の基本的な構成
    • defキーワードから始まる行を先頭に記述する
    • 処理の内容を、defキーワードのある行の次の行以降に字下げして記入する
    • """(ダブルクォーテーション3つ)で囲った文字列は「ドキュメンテーション文字列(docstring)」という
    • return文により、1つの値を返すことができる
      • return文がない場合、関数の戻り値はNoneとなる
  • def行の構成
    • 関数の名前
    • ()で囲った引数群
    • 最後にコロン:を忘れないように

Pythonにおける関数の呼び出し方

def search4vowels():
    # ...略

# 関数呼び出し
search4vowels()
  • 関数を呼び出すには、関数名と関数が取る引数の値を指定すればよい
    • 引数を持たない関数を呼び出す場合、引数の記載は()とする
  • IDLEにおいては、関数を含むモジュールを実行すると、以下の動作をする
    1. シェルを起動する(新たに起動、または既存のシェルを再起動)
    2. 起動されたシェルに、モジュールに含まれる関数をインポートする

引数とは

  • Pythonにおける関数は、0個以上の任意の数の引数を取ることができる
  • 関数が引数を取るように定義するには、def行の()内に引数の名前を入力すればよい
    • 当該引数(仮引数)は、関数ブロック内で変数として用いることができる
  • 関数呼び出し時には、関数定義の際に定義した引数(仮引数)と同じ数の引数(実引数)を渡さなければならない
    • 仮引数の数と実引数の数が一致しない場合、TypeErrorがスローされる
def search4vowels(word):
    # ...略...
    vowels = set('aeiou')
    found = vowels.intersection(set(word))
    # ...略...

↑引数wordを取る関数search4vowels()を定義し、関数ブロック内でwordを変数として用いている例。

# 仮引数の数は1つである
def search4vowels(word):
    """入力した単語内の母音を表示する。"""
    vowels = set('aeiou')
    found = vowels.intersection(set(word))
    for vowel in found:
        print(vowel)

# 仮引数の数と実引数の数が一致する関数呼び出し
search4vowels('hitch-hiker')
# => e
# => i

# 関数呼び出し時に実引数の数が足りない場合、TypeErrorとなる
search4vowels()
# TypeError: search4vowels() missing 1 required positional argument: 'word'

# 関数呼び出し時に実引数の数が多すぎる場合、TypeErrorとなる
search4vowels('hitch-hiker', 'Sky')
# TypeError: search4vowels() takes 1 positional argument but 2 were given

関数は結果を返すことができる

  • Pythonにおいて、関数に結果を返させるためにはreturn文を用いる
  • return文が実行されることにより、以下の事態が発生する
    • 関数の実行が終了される
    • return文に与えられた値が呼び出し側のコードに返される
  • 関数の戻り値は、常に一つのオブジェクトである
    • 複数のオブジェクトを返したい場合は、リストなどの構造化データを用いて1つのオブジェクトにまとめる
  • return文が実行されずに関数の実行が終了された場合、関数の戻り値はNoneとなる
# return文がないため、戻り値は常にNoneである
def search4vowels(word):
    """入力した単語内の母音を表示する。"""
    vowels = set('aeiou')
    found = vowels.intersection(set(word))
    for vowel in found:
        print(vowel)

print(search4vowels('hello'))
# => o      # search4vowels()内でprint関数が実行されたことによる副作用
# => e      # search4vowels()内でprint関数が実行されたことによる副作用
# => None   # search4vowels()の戻り値

↑値を返さない関数の実行例。

def search4vowels(word):
    """母音が見つかったかどうかによってブール値を返す。"""
    vowels = set('aeiou')
    found = vowels.intersection(set(word))
    return bool(found)

print(search4vowels('hitch-hiker'))
# => True
print(search4vowels('galaxy'))
# => True
print(search4vowels('Sky'))
# => False

↑ブール値を返す関数の実行例。

def search4vowels(word):
    """指定された単語内の母音を返す。"""
    vowels = set('aeiou')
    return vowels.intersection(set(word))

print(search4vowels('hitch-hiker'))
# => {'e', 'i'}
print(search4vowels('galaxy'))
# => {'a'}
print(search4vowels('Sky'))
# => set()

↑集合を返す関数の実行例。空の集合はset()と表示される。