python学習-関数-関数の種類

5469 ワード

1.関数
Pythonには多くの有用な関数が内蔵されています.直接に呼び出すことができます.関数を呼び出すには、絶対値を求める関数absのような関数の名前とパラメータを知る必要があります.パラメータは一つしかありません.Pythonの公式サイトから直接文書を見ることができます.http://docs.python.org/3/library/functions.html#abs 関数を呼び出したとき、着信パラメータの数が間違っているとTypeErrのエラーが発生し、Pythonは明確にあなたに教えます.abs()には1つのパラメータしかありませんが、2つのパラメータが与えられました.
>>> abs(1, 2)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: abs() takes exactly one argument (2 given)
着信パラメータの数が正しい場合、パラメータタイプは関数によって受け入れられず、TypeErrのエラーも報告され、エラー情報が与えられます.strはエラーのパラメータタイプです.
>>> abs('a')
Traceback (most recent call last):
  File "", line 1, in 
TypeError: bad operand type for abs(): 'str'
max関数max()は、任意の複数のパラメータを受信し、最大のそれを返すことができる.
>>> max(1, 2)
2
>>> max(2, 3, 1, -5)
3
Pythonに内蔵された常用関数には、int()関数などのデータタイプの変換関数が含まれています.他のデータタイプを整数に変換できます.
>>> int('123')
123
>>> int(12.34)
12
>>> float('12.34')
12.34
>>> str(1.23)
'1.23'
>>> str(100)
'100'
>>> bool(1)
True
>>> bool('')
False
関数名とは、関数オブジェクトの参照を指しています.関数名を変数に割り当てることができます.この関数に「別名」を付けるのに相当します.
>>> a = abs #   a  abs  
>>> a(-1) #        a  abs  
1
1.1.定義関数
Pythonでは、関数をdef文で定義し、関数名、括弧、括弧のパラメータとコロンを順次書きます.その後、インデントブロックで関数体を作成し、関数の戻り値をreturn文で返します.
私たちは絶対値を求めるmy_をカスタマイズします.abs関数は例です
def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x
1.2空き関数
何もしない空の関数を定義したいなら、パス文を使ってもいいです.
def nop():
    pass
パス文は何もしないですが、何のために使いますか?実際にパスはプレースホルダとして使えます.例えば、関数のコードをどう書くかはまだ決めていません.まずパスを入れて、コードを実行させます.
パスは他の語句でも使えます.例えば:
if age >= 18:
    pass
   pass,           
1.3パラメータチェック
関数を呼び出した場合、パラメータの個数が間違っていると、Python解釈器は自動的にチェックし、TypeErrorを投げ出します.
>>> my_abs(1, 2)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: my_abs() takes 1 positional argument but 2 were given
ただし、パラメータの種類が間違っていると、Python解釈器は確認してくれません.試してみるmy_absと内蔵関数absの違い:
>>> my_abs('A')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 2, in my_abs
TypeError: unorderable types: str() >= int()
>>> abs('A')
Traceback (most recent call last):
  File "", line 1, in 
TypeError: bad operand type for abs(): 'str'
不適切なパラメータが入ったら、内蔵関数absはパラメータエラーを確認します.私達が定義したmy_absはパラメータチェックがないので、if文のエラーが発生します.エラー情報はabsと違います.したがって、この関数の定義は十分ではない.
my_を直しましょう.absの定義は、パラメータタイプをチェックし、整数と浮動小数タイプのパラメータのみを許可します.データタイプのチェックは、内蔵関数isinstance()で行うことができます.
def my_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    if x >= 0:
        return x
    else:
        return -x
パラメータチェックを追加したら、エラーのパラメータタイプが入ったら、関数はエラーを投げられます.
>>> my_abs('A')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 3, in my_abs
TypeError: bad operand type
1.4複数の値を返します
関数は複数の値を返しますか?答えは肯定的です.例えば、ゲームでは、ある点から別の点に移動する必要があります.座標、シフト、角度を与えると、新しい座標が計算されます.
import math
def move(x, y, step, angle=0):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny
import math文は、mathパケットを導入することを表し、後続コード参照mathパケット中のsincosなどの関数を許可する.
その後、私達は同時に戻り値を得ることができます.
>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print(x, y)
151.96152422706632 70.0 #    2  ,      
しかし、これは一種の仮相にすぎません.Python関数が返したのはまだ単一の値です.
>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)
元の戻り値はtupleです.しかし、文法的には、tupleを返すと括弧を省略することができますが、複数の変数は同時に一つのtupleを受信し、位置に応じて対応する値を与えられます.だから、Pythonの関数は複数の値を返します.
結び目
関数を定義するには、関数名とパラメータの個数を決定する必要があります.必要があれば、まずパラメータのデータタイプをチェックしてもいいです.関数の内部は、関数の結果をいつでも返します.関数の実行が完了しても、return文がない場合は、自動的にreturn Noneが実行されます.関数は複数の値を同時に返すことができますが、実際にはtupleです.
付録:ここに小さなコードを書いてax*2+bx+c=0を実現して、x値を求めます.
import math
def quadratic(a,b,c):
   # ax**2 + bx + c == 0
    #     
    if not isinstance(a,(int,float)):
        raise TypeError('bad operand type')
    if not isinstance(b,(int,float)):
        raise TypeError('bad operand type')
    if not isinstance(c,(int,float)):
        raise TypeError('bad operand type')
    if b*b - 4*a*c < 0:
        print('error!,you have a mistake')
    else:

        if a == 0 and b != 0:
            x = c/b
            return x
        if a != 0 and b == 0:
            x = math.sqrt(-c/a)
            return x
        print(" b 0,    2  ,    ")
        if a != 0 and b != 0:
            y = (b**2 - 4*a*c)/(4*a*a)
            x1 = -math.sqrt(y) -b/(2*a)
            x2 = math.sqrt(y) -b/(2*a)
            return x1,x2
        print('    2  ,a b     0')

print(quadratic(1, 0, -1))    #
2.