edubun
日本語

自分の関数を書く

returnなしで終わる関数はNoneを返します。そのため、print(print("hi"))はhiを出力し、次にNoneを出力します。

画面では同じに見える2つの関数

ほとんどの初心者は、値を表示することと、値を返すことは同じだと思っています。ここに、どちらも長方形の面積を「与える」ように見える2つの関数があります。defは関数定義を始めます。名前、括弧の中の入力、コロン、インデントされた本体です。プログラムを実行すると、出力の2行は似て見えます。

def show_area(w, h):
    print(w * h)

def area(w, h):
    return w * h

show_area(4, 3)
print(area(4, 3))
出力
12
12

では、結果を計算に使ってみましょう。違いがすぐに現れます。

def show_area(w, h):
    print(w * h)

def area(w, h):
    return w * h

a = show_area(4, 3)
b = area(4, 3)
print(a, b)
print(b * 2)
出力
12
None 12
24

show_areaは画面に12を出力して終わります。何も返さず、何も返さない関数は、特別な値Noneを返します。そのため、aはNoneです。areaは何も出力しません。呼び出した行に12を返し、その12は、保存したり、出力したり、2倍にしたりできます。出力は、画面を見る人のためです。返すことは、プログラムの残りのためです。あとで結果を使いたいなら、returnしましょう。

関数は引数を受け取り、それを使って本体を実行し、returnで1つの値を返します。area(4, 3)は、書かれた場所のどこでも12になります。

パラメータは名前、引数は値

def area(w, h):では、wとhはパラメータで、関数の中にだけ存在する名前です。area(4, 3)では、4と3は引数で、その1回の呼び出しで、それらの名前を満たす値です。位置で対応づけられるので、最初の引数は最初のパラメータに入ります。引数の数を間違えて関数を呼ぶと、Pythonは、足りないパラメータの名前を示すTypeErrorで止まります。

パラメータには、定義の中で=を使って書く既定値を持たせられます。呼び出す側はその引数を省略でき、既定値が使われます。Pythonチュートリアルは、関数の定義の節で既定値を示しています。既定値は組み込み関数のいたるところにあります。print自体にもあり、そのendパラメータの既定値は改行です。

def greet(name, greeting="Hello"):
    return f"{greeting}, {name}!"

print(greet("Mina"))
print(greet("Jun", "Hi"))
print("no new line", end=" ")
print("here")
出力
Hello, Mina!
Hi, Jun!
no new line here

returnは関数をすぐに終わらせる

関数は、下にまだ行があっても、最初に到達したreturnで止まります。そのため、早めのreturnは、特別な場合をきれいに扱う方法になります。下の関数は、ifの単元の入場料の規則を使い、プログラムのどこからでも料金を尋ねられるように関数にまとめたものです。

def ticket_price(age):
    if age < 7:
        return 0
    if age <= 18:
        return 3000
    return 5000

family = [40, 15, 5]
total = 0
for age in family:
    total += ticket_price(age)
print(total)
出力
8000

関数の中でつくられた変数はローカルです。関数が実行されている間だけ存在し、終わると消えます。ある関数の中のtotalという名前の変数は、外のtotalとは関係ありません。そのおかげで、プログラムのほかの部分がたまたまどの名前を使っているかを気にせずに、関数を再利用できます。

def関数定義を始める
パラメータ定義の中の名前:def area(w, h)のw
引数呼び出しで渡す値:area(4, 3)の4
return値を返して関数を終わらせる
Nonereturnのない関数が返すもの
ローカル変数関数の中にだけ存在する変数
  1. このコードは何を出力しますか。
    def double(x):
        return x * 2
    
    print(double(7))
  2. このコードは何を出力しますか。
    def hello():
        print("hi")
    
    result = hello()
    print(result)
    • hi
      hi
    • hi
      None
    • None
    • hi
  3. このコードは何を出力しますか。
    def add(a, b):
        return a + b
    
    print(add(2, 3) * add(1, 1))
  4. このコードは何を出力しますか。
    def f(x):
        return x + 1
        print("never")
    
    print(f(1))
  5. このコードは何を出力しますか。
    def greet(name, greeting="Hello"):
        return greeting + " " + name
    
    print(greet("Bo"))
  6. このコードは何を出力しますか。
    def sign(n):
        if n > 0:
            return "plus"
        if n < 0:
            return "minus"
        return "zero"
    
    print(sign(-4), sign(0))
  7. このコードは何を出力しますか。
    print("a", end="-")
    print("b")
  8. このコードは何を出力しますか。
    def total_of(nums):
        t = 0
        for n in nums:
            t += n
        return t
    
    print(total_of([4, 5, 6]))
  9. def area(w, h):で、wとhは何と呼ばれますか。
    • 引数
    • パラメータ
    • 戻り値
    • キーワード
  10. プログラムが25を出力するように、行を並べてください。
    出力
    25
よくある間違い
  • 「答えを出力する関数は、それを返している。」 出力は値を表示するだけです。関数はまだNoneを返すので、x = show_area(4, 3)はxにNoneを代入し、x * 2はTypeError: unsupported operand type(s) for *: 'NoneType' and 'int'で止まります。
  • 「定義の行より上の行で、関数を呼べる。」 Pythonは上から実行するので、その時点では名前がまだ存在しません。NameError: name 'area' is not definedです。defを最初の呼び出しの上に置きましょう。
  • 「引数を省くと、単に0になる。」 既定値がなければ、Pythonは止まります。area(4)はTypeError: area() missing 1 required positional argument: 'h'を発生させます。
先生からひとこと表示することと返すことの混同は、この段階で最もよくある誤解で、画面が同じに見えるので隠れます。学習者に、結果を変数に保存して、2つ目の計算で使わせましょう。Noneがすぐに現れます。言葉も助けになります。関数が値を「返す」と言い、「表示する」はprintのために取っておきましょう。韓国の中学校の情報科のカリキュラムは、関数を使うことと誤りを見つけて直すことを組にしているので、引数の不足と、defより前の呼び出しのエラーは、短いデバッグ演習のよい題材です。
ポイント
  • def name(params):関数を始める。本体はインデントする。
  • returnは値を返して関数を終わらせる。
  • printは値を表示するが、返さない。returnがなければNone。
  • 引数はパラメータを位置で満たす。既定値は足りないものを満たす。
  • 関数の中でつくった変数は、その関数のローカル。
このコースの出典 (6)
  • Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
  • Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
  • Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
  • General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
  • Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
  • Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)

確認日: 2026-10-19