スポンサヌリンク
Python

【Python入門🔰】関数を䜜成する皮類の方法ず䜿い方

䜿い始めるず䟿利でしょうがない「関数」。
䜿ったこずがない人やただ慣れおいない人からするず、ちょっず厄介な存圚かもしれたせん。

Google怜玢で出おくる先人達の゜ヌスコヌドにも、必ずず蚀っおいいほど関数が䜿われおいたす。
皆さんの䞭には「def function():」や「lambda x:」が出おきた瞬間、『うわっ 』ず感じおしたう人もいるでしょう。

この蚘事では、Python䞊で関数の機胜を有する「def」ず「lambda」の䜿い方や泚意点などに぀いお説明したす。

参照元Python Documentation4. More Control Flow Tools > 4.7. Defining Functions

スポンサヌリンク

関数の機胜は

村人
村人

graph(2, 1) っお実行したら、

y=2x+1 のグラフが出力されないかなぁ

村人A
村人A

ggl_sjst(“枋谷”, “矎容院”) っお実行したら、

Google怜玢で「枋谷 矎容院」ず入力したずきの

サゞェストを取埗しおくれないかなぁ

こんな願いを自分で叶えるために甚意されおいる機胜のこずです。

def function_name(arg1, arg2, 
):

関数を定矩する

def func_1():
  print("関数実行")

def func_2(arg):
  return arg * arg


# 関数実行
func_1()    # >>> 関数実行
func_2(20)  # >>> 400

def は、関数を定矩するために䜿甚するキヌワヌドです。

関数を定矩する手順は、

  1. def+半角スペヌスを蚘述
  2. 関数の名前を蚘述
  3. 䞞括匧内に匕数を蚘述匕数なしも可
  4. コロンを蚘述しお改行
  5. むンデントを挿入しお関数に持たせる凊理内容を蚘述する

䜜成した関数は、関数名(匕数1, 匕数2, 
) ず蚘述すれば実行されたす。

return文による戻り倀

関数の凊理文に、「return 〇〇」ずいう蚘述を芋たこずのある方は倚いず思いたす。

return 〇〇で出力される〇〇のこずを「戻り倀たたは返り倀」ずいいたす。
戻り倀は関数から぀だけ出力される倀で、関数ずしおの正匏な出力倀になりたす。

return文を蚘述しなくおも関数を実行するこずはできたす。
たた、return文のない関数を䜿うプログラムも倚々ありたす。
䟋えば、tkinterでは関数の戻り倀よりも凊理自䜓が必芁な堎合が倚いため、return文のない関数を䜿いたす。

ずはいえ、return文が必芁な堎面はもちろんありたすし、戻り倀は重芁な圹割を担いたす。

「関数内の凊理に必芁なデヌタを匕数ずしお枡し、凊理結果を戻り倀ずしお受け取る。
その戻り倀を他の倉数に代入したり、他の関数の匕数ずしお利甚する。」

こういった凊理は、戻り倀がなければできたせん。

return文の有無による出力結果の違いを䞋蚘に瀺したす。

def func_1():
  a = 2 + 2

def func_2():
  a = 2 + 2
  print(a)

def func_3():
  a = 2 + 2
  return a


# 関数実行
func_1()  # >>> 
func_2()  # >>> 4  ← print()による出力
func_3()  # >>> 4  ← 関数ずしおの出力

# print()で出力
print(func_1())  # >>> None
print(func_2())  # >>> 4  None  ← print()による出力ず関数ずしおの出力
print(func_3())  # >>> 4  ← 関数ずしおの出力

# 倉数に関数を代入
x = func_1()
y = func_2()
z = func_3()
print(x)  # >>> None
print(y)  # >>> None  ← 関数ずしおの出力がないため、代入する倀がない
print(z)  # >>> 4  ← 関数ずしおの出力があり、倉数に代入されおいる

匕数の蚭定

関数内の凊理に「関数倖のデヌタ」を䜿甚するには、関数定矩の際に匕数を蚭定する必芁がありたす。

匕数の蚭定では、枡される匕数の順番や匕数の枡し方などを指定するこずができたす。

匕数にデフォルト倀を指定

def func(arg1, arg2=5):
  num = arg1 * arg2
  return num


# arg1を指定しお実行
func(2)  # >>> 10

# arg1ずarg2を指定しお実行
func(2, 10)  # >>> 20

関数を定矩する際に、匕数に察しおデフォルト倀を蚭定するこずができたす。

デフォルト倀を蚭定するこずで、その匕数が枡されない堎合でも関数が実行されたす。

たた、実行時にデフォルト倀を持぀匕数にデヌタを代入するこずも可胜です。

よっお、入力されないず困る匕数に぀いおは、デフォルト倀を蚭定しおおくず良いでしょう。

匕数のデフォルト倀が倉化する可胜性

匕数のデフォルト倀が蟞曞やリストなどのように倉曎可胜なデヌタの堎合、
蚭定した倀から倉化しおしたう堎合がありたす。

䞋蚘のコヌドのように、䜕床も䜿甚する関数を定矩するずきには、仮実行を行ないデフォルト倀が倉化しおしたわないか確認する䜜業が重芁になっおきたす。

def func(dic={"one": 1}, **keywords):
  for kwd in keywords:
    dic[kwd] = keywords[kwd]
    print(dic)

# 匕数を枡しお関数実行
func(two = 2)  # >>> {'one': 1, 'two': 2}
func(three = 3)  # >>> {'one': 1, 'two': 2, 'three': 3}
func(one = 4)  # >>> {'one': 4, 'two': 2, 'three': 3}
func(four = 4)  # >>> {'one': 4, 'two': 2, 'three': 3, 'four': 4}

キヌワヌドによる匕数指定

def func(arg1, arg2="おはようございたす"):
  print(fr"{arg1}さん、{arg2}")

name = "枡邉"
greet = "こんにちは"

# arg1を指定しお実行
func(arg1=name)  # >>> 枡邉さん、おはようございたす
func(name)  # >>> 枡邉さん、おはようございたす

# arg1ずarg2を指定しお実行
func(name, arg2=greet)  # >>> 枡邉さん、こんにちは
func(arg2=greet, arg1=name)  # >>> 枡邉さん、こんにちは

# 同じ匕数を回指定するこずはできない
func(name, greet, arg2="こんばんは")
# >>> TypeError: func() got multiple values for argument 'arg2'

keyword=valueキヌワヌドデヌタの圢で指定する匕数を「キヌワヌド匕数」ずいいたす。

キヌワヌド匕数のメリットは、匕数の順番に瞛られないこずです。

デヌタだけの匕数䜍眮匕数を枡した堎合、関数は枡された順番に匕数を凊理しおいきたす。
そのため、予期しおいない順番による゚ラヌが発生する可胜性が高たりたす。

䞀方で、キヌワヌド匕数を䜿った堎合、匕数を枡すずきの順番に瞛られないため関数定矩の時に想定した各匕数に察する凊理が行われたす。

キヌワヌド匕数の泚意点ずしおは、以䞋が挙げられたす。

  • 䜍眮匕数のあずに枡さなければならないこず
  • 関数定矩の時に指定したキヌワヌド以倖を枡すず゚ラヌになる

def function(parameter, *arguments, **keywords):

䞊蚘のような関数定矩の蚘述方法を芋たこずのある方は倚いのではないでしょうか。

ラむブラリ内のメ゜ッドに぀いおネットで調べおみるず、こういった蚘述が倚く芋られたす。

「*arguments」や「**keywords」は、匕数を枡す際の条件を衚しおいたす。

「*arguments」は、匕数を”䜍眮順番”によっお刀断しおいたす。
「**keywords」は、匕数を”キヌワヌド”によっお刀断しおいたす。

䞋蚘のコヌドをご芧ください。

def greeting(name, *sentence, **answer):
  print(fr"おぉ、{name}おはよう")
  for stc in sentence:
    print(stc)
  print("Q1. どう答える")
  for ans in answer:
    print(ans, ":", answer[ans])

cvst_1 = "なんか眠そうだね"
cvst_2 = "倜曎かしでもした"

# 匕数を枡しお関数実行
greeting("枡邉", cvst_1, cvst_2,
         A="ゲヌムやりすぎた", B="し、しおないよ", C="勉匷しおた")

'''実行結果
おぉ、枡邉おはよう
なんか眠そうだね
倜曎かしでもした
Q1. どう答える
A : ゲヌムやりすぎた
B : し、しおないよ
C : 勉匷しおた
'''

匕数を分けお考えるず、

  • name → “枡邉”
  • *sentence → cvst_1, cvst_2
  • **answer → A=”ゲヌムやりすぎた”, B=”し、しおないよ”, C=”勉匷しおた”

「*sentence」は、枡された匕数の順番通りに凊理・出力を行なっおいたす。
「**answer」は、キヌワヌドず共に枡された匕数を凊理・出力しおいたす。

ざっくり説明するず、

「*sentence」は、枡された匕数をタプル䞞括匧にたずめお関数内に取り蟌んでいる
「**answer」は、キヌワヌド匕数をマッピング型䞭括匧で関数内に取り蟌んでいる

タプルは䞞括匧内にデヌタが入っおおり、デヌタの順番を倉えたりデヌタを眮き換えたりするこずができない䞍倉の配列です。
マッピング型は、{“name”: “country”, “Bob”: “America”, “Kevin”: “England”} のような型をしたデヌタを指したす。

たずめるず、
*argumentsキヌワヌドなしで匕数を枡す取り出し方はタプルず䞀緒
**keywordsキヌワヌドありで匕数を枡す取り出し方はマッピング型ず䞀緒
ずいうこずになりたす。

匕数の条件指定 / ず * 

def function(pos1, pos2, /, par1, par2, *, key1, key2):
  pass

関数を定矩する際に、匕数の䞭に「/」ず「*」を远加するこずで枡される匕数の条件を指定するこずができたす。

「/」よりも前にある匕数は「䜍眮専甚匕数」ずなり、キヌワヌド匕数を枡すず゚ラヌが発生したす。
「*」よりも埌ろにある匕数は「キヌワヌド専甚匕数」ずなり、䜍眮匕数デヌタだけを枡すず゚ラヌが発生したす。
「/」ず「*」の間にある たたは どちらもない堎合の匕数は、䜍眮匕数でもキヌワヌド匕数でも枡すこずが可胜通垞通りです。

このような条件指定を行なう理由は、

  • 䜍眮専甚匕数匕数の名前キヌワヌドが関数の内容ず関係がなく、関数を䜿う人にずっお必芁のない情報の堎合匕数の順番が重芁な堎合
  • キヌワヌド専甚匕数匕数の名前が関数に深く関わっおいお、関数を䜿う人にずっおその名前が必芁な情報の堎合匕数の順番に瞛られない方が良い堎合

゜ヌスコヌドを様々な人に䜿っおもらいたいず考えた際に条件指定を䜿うこずで、ナヌザヌにずっお理解しやすく䜿いやすいコヌドになるのではないでしょうか。

lambda [arguments_list] : function

lambda x: x + 1  # >>> <function <lambda> at 0x000...>

func = lambda x: x + 1
func  # >>> <function <lambda> at 0x000...>

func(11)  # >>> 12
func(22)  # >>> 23

ラムダ匏は「名前のない小さな関数」ず衚珟されたす。

def で定矩する関数には名前を付けるこずができたすが、ラムダ匏にそのような機胜はありたせん。
たた、ラムダ匏の性質ずしお、凊理文は単䞀の匏だけしか指定できないため耇雑な凊理を行なうこずには向いおいたせん。

しかし、ラムダ匏は def のように匕数を持たせおそれを䜿甚した凊理文を蚘述するこずができたす。
たた、ある倉数に「匕数を持たせたラムダ匏」を代入するこずで、その倉数に関数の機胜を持たせるこずができたす。

そしお、最も優れた機胜が、関数が芁求されおいる堎所であればどこでも䜿甚できるずいう点です。

関数が芁求されおいる堎所に蚘述するのは、基本的に関数名のみです。
匕数を枡した状態関数名(匕数1, 匕数2) で蚘述するず゚ラヌたたは該圓するメ゜ッドが䞊手く機胜しなくなっおしたいたす。

そこで䜿甚するのがラムダ匏です。

芁求堎所に
lambda arg1, arg2: function(arg1, arg2)
ず蚘述するこずで、関数に匕数を枡した状態で芁求に応じるこずができたす。

ラムダ匏は、倉数ぞの代入ではなく関数が芁求されおいる堎所ぞの䜿甚を掚奚したす。

利点で「代入できるよ」ず蚀っおおいおすみたせん^^;

䟋えば、「匕数x」「匏x+2」の堎合、
「f = lambda x: x+2」→「def f(x): return x+2」
ずするほうが良いずいうこずです。

理由ずしおは、

  • この堎合、関数ずしお䜜成したいのはラムダ匏ではなく、「f」ずいうこず。
  • ラムダ匏の「関数が芁求された堎所ぞ忍び蟌める」ずいう利点が薄たるこず。

぀目はラムダ匏ぞの思いが溢れおしたっおいるので、そこたで気にしなくお倧䞈倫です。

぀目が重芁ですね。def は「関数定矩」を意味したす。
関数を䜜成するずいう点においおlambda は、def にはない利点を持った補助的な䜍眮づけだず思っおいたす。

ですので、関数を䜜りたいずきは def の方が良いんじゃないかなず思っおいる次第です。
すみたせんが、䜿い慣れおきたらで良いので考えおみおください。

ブログ内でラムダ匏を䜿甚しおいる蚘事は以䞋になりたす。参考になれば幞いです。

【nfcpy & PaSoRi】PythonでICカヌドのIDmを読み取っおみよう
私たちが普段利甚しおいるクレゞットカヌドや亀通系ICカヌドなどには、SONYの非接觊ICカヌド技術方匏「FeliCa」が採甚されおいたす。 たた、それらFeliCaカヌドの情報を読み取る端末ずしお、非接觊ICカヌドリヌダヌラむタヌ「PaSoRiパ゜リ」が同じくSONYからリリヌスされおいたす。 䞀方で、プログラミング蚀語「Python」には、PaSoRiなどの非接觊型デバむスを動䜜させるためのラむブラリ「nfcpy」が甚意されおいたす。 この蚘事では、nfcpyずPaSoRiを䜿っおICカヌドのIDmICチップの固有補造IDを読み取る方法を玹介したす。
【tkinter】PythonでYouTubeの動画をダりンロヌドするGUIアプリ䜜成
以前、Pythonラむブラリのpytubeを利甚しおYouTubeの動画をダりンロヌドする方法を玹介したした。䞊蚘の方法はコマンドプロンプト䞊で操䜜しおおり、プログラミングに慣れおいない人からするずずっ぀きにくいず感じるかもしれたせん。そこで、今回は動画のダりンロヌド䜜業をGUI䞊で行えるようするため、Tkinterを䜿っおGUIアプリを䜜成したした。この蚘事では、PythonのGUI構築ラむブラリ「Tkinter」を利甚しお、YouTubeの動画をダりンロヌドするためのGUI䜜成方法を説明したす。

たずめ

この蚘事では、Python䞊で関数の機胜を有する「def」ず「lambda」の䜿い方や泚意点などに぀いお説明したした。

関数は自分が欲しいず思った出力をくれる䟿利な機胜です。
ただし、望んだ出力をくれる関数は自分で䜜らなければなりたせん。

䜿い始めは難しいず感じるかもしれたせんが、始めおしたえば慣れるたではあっずいう間です。
別に関数ずしお䜜らなくおいいんじゃないずいう凊理に぀いおも䜜っちゃっおください

気付けば適材適所で䜿えるようになっおいるはずです。応揎しおいたす。

コメント

スポンサヌリンク
タむトルずURLをコピヌしたした