どのプログラミング言語でも重要な原則の一つに「重複を避けよ」があります。何度も発生する動作があれば,それを一度定義すればそのコードを動作を行う必要のあるところで呼び出すことができます。
すでにコードを重複していますので,そろそろ簡単な関数を使ってみましょう。関数はプログラマにとって仕事を減らすもので,関数を上手に使えばミスをしにくくなります。
前: リストトタプル | ホーム | 次: If文
関数は動作を集めて,名前をつけたものです。これまでPython言語に組み込まれている関数 string.title()
やlist.sort()
などを多数使ってきました。自分で関数を定義して,Pythonに新たなふるまいを"教える"ことができるようになります。
# Let's define a function.
def function_name(argument_1, argument_2):
# Do whatever we want this function to do,
# using argument_1 and argument_2
# Use function_name to call the function.
function_name(value_1, value_2)
このコードは動きませんが,どのように関数が使われるか一般的に示しています。
def
で始め,Pythonに関数のdefine(定義)を始めることを伝えます。current_name
やcurrent_age
のような変数でも,'eric'や5のような実際の値でも構いません。print("You are doing good work, Adriana!")
print("Thank you very much for your efforts on this project.")
print("\nYou are doing good work, Billy!")
print("Thank you very much for your efforts on this project.")
print("\nYou are doing good work, Caroline!")
print("Thank you very much for your efforts on this project.")
関数は繰り返されるコードを一つにまとめて,使いたいときに呼びたします。同じプログラムを関数を使って書くとこのようになります。
def thank_you(name):
# This function prints a two-line personalized thank you message.
print("\nYou are doing good work, %s!" % name)
print("Thank you very much for your efforts on this project.")
thank_you('Adriana')
thank_you('Billy')
thank_you('Caroline')
元のコードでは,print文の組は3回実行されましたが,唯一の差は感謝される人の名前でした。このような繰り返しを見たら,関数を定義してプログラムを簡潔にできます。
キーワードdef
はPythonに関数を定義することを伝えています。関数に名前をつけます。ここではthank\_you()
としました。変数の名前はどのような情報が格納されているか関数の名前は関数が何をするかを示すようにすべきです。次に丸括弧を置きます。その間に関数が仕事をするために必要とする変数に名前をつけて並べます。この例では関数は,感謝のメッセージに使う名前が必要です。変数name
にその値が格納され関数thank\_you()
に渡されます。
関数を使うには,関数の名前の後に関数が仕事をするために必要とする値を与えます。この例では関数を3回呼んで,それぞれ異なる名前を渡しています。
関数は,プログラム中で使う前に定義します。例えば,関数をプログラムの最後に置くとうまく動作しません。
thank_you('Adriana')
thank_you('Billy')
thank_you('Caroline')
def thank_you(name):
# This function prints a two-line personalized thank you message.
print("\nYou are doing good work, %s!" % name)
print("Thank you very much for your efforts on this project.")
最初の行でPythonにthank_you()を走らせるように求めていますが,Pythonはまだこの関数をどうしたら良いのか知りません。関数をプログラムの最初に定義すれば,必要なときに使うことができます。
students = ['bernice', 'aaron', 'cody']
# Put students in alphabetical order.
students.sort()
# Display the list in its current order.
print("Our students are currently in alphabetical order.")
for student in students:
print(student.title())
# Put students in reverse alphabetical order.
students.sort(reverse=True)
# Display the list in its current order.
print("\nOur students are now in reverse alphabetical order.")
for student in students:
print(student.title())
同じことをするコードは,リストを印字する関数を使うと次のようになります。
def show_students(students, message):
# Print out a message, and then the list of students
print(message)
for student in students:
print(student.title())
students = ['bernice', 'aaron', 'cody']
# Put students in alphabetical order.
students.sort()
show_students(students, "Our students are currently in alphabetical order.")
#Put students in reverse alphabetical order.
students.sort(reverse=True)
show_students(students, "\nOur students are now in reverse alphabetical order.")
関数を使うと,ずっときれいになりました。必要な動作は,リスト内の学生をメッセージとともに示すことです。この動作にshow_students()という名前をつけました。
この関数は二つの情報を受け取って仕事をします。学生りリストと表示するメッセージです。関数の中では,メッセージを印字しリストをたどるコードは,関数を使わないコードと全く同じです。
プログラムの残りの部分がきれいなったのは,リストを変えることに着目したコードで,リストを印字するコードを置き換えたからです。リストを定義し,それをソートして関数を読んでリストを印字します。リストをもう一度ソートし,異なるメッセージとともに印字する関数を再び呼びます。この方が読みやすいコードです。
以上の例から関数を使ういくつか利点が分かります。
ちょっとした例として,印字の見栄えをよくするために中黒をつけた一覧の形にすると決めたとします。関数を使わない場合,いちいちprint文を変更しなくてはなりません。関数を使えば,関数内のprint文を変更するだけで済みます。
def show_students(students, message):
# Print out a message, and then the list of students
print(message)
for student in students:
print("- " + student.title())
students = ['bernice', 'aaron', 'cody']
# Put students in alphabetical order.
students.sort()
show_students(students, "Our students are currently in alphabetical order.")
#Put students in reverse alphabetical order.
students.sort(reverse=True)
show_students(students, "\nOur students are now in reverse alphabetical order.")
関数はPythonに新しいふるまいを教える方法であると考えることができます。以上例では,Pythonに学生一覧をハイフンを使って作る方法を教えました。今後はいつでもPythonに学生の名前に対してこの動作を実行させることができます。
def get_number_word(number):
# Takes in a numerical value, and returns
# the word corresponding to that number.
if number == 1:
return 'one'
elif number == 2:
return 'two'
elif number == 3:
return 'three'
# ...
# Let's try out our function.
for current_number in range(0,4):
number_word = get_number_word(current_number)
print(current_number, number_word)
思ったように動作しないプログラムを見て,このようなプログラムがどのように改善されうるか理解するのもときにはためになります。上の例では,Pythonのエラーはなく全てのコードはPythonの文法として適切です。論理的なエラーか出力の最初の行にあります。
関数に送る範囲に0を含めないか,知らない値を受けたとき関数がNone
以外を返すようにする必要があります。関数に単語'zero'を教えることにします。それだけでなく,else
節を追加して一連のifにない数値に対してはより情報量の多いメッセージを返すようにします。
def get_number_word(number):
# Takes in a numerical value, and returns
# the word corresponding to that number.
if number == 0:
return 'zero'
elif number == 1:
return 'one'
elif number == 2:
return 'two'
elif number == 3:
return 'three'
else:
return "I'm sorry, I don't know that number."
# Let's try out our function.
for current_number in range(0,6):
number_word = get_number_word(current_number)
print(current_number, number_word)
関数でreturn文を使うときに注意すべきことは,return文に到達した時点で関数の実行が停止することです。例えば,関数が値を返した後に行を追加してもget_number_word()関数に実行されることはありません。
def get_number_word(number):
# Takes in a numerical value, and returns
# the word corresponding to that number.
if number == 0:
return 'zero'
elif number == 1:
return 'one'
elif number == 2:
return 'two'
elif number == 3:
return 'three'
else:
return "I'm sorry, I don't know that number."
# This line will never execute, because the function has already
# returned a value and stopped executing.
print("This message will never be printed.")
# Let's try out our function.
for current_number in range(0,6):
number_word = get_number_word(current_number)
print(current_number, number_word)
関数に関して学ぶことはもっとありますが,詳しくは後回しにします。ここでは,プログラム中に何度も同じコードを見つけたら,どんどん関数を使ってください。今後関数を取り上げるときに学ぶことを少し紹介します。
for
ループから関数を呼んではどうでしょうか。前: リストとタプル | ホーム | 次: If文