[Python]Pythonフロー制御、異常、関数

25321 ワード

Pythonの中の分岐文、循環語句、異常などは他の言語より簡単で簡潔で実用的です。本稿では、分岐文、循環文、異常、関数の使用をまとめます。
1.分岐文
pythonの中の分岐文の書式は以下の通りです。
if bool_xxx :
    ....
elif bool_xxx :
    ...
else:
    ...
ここでelifは、javaのelse ifと似ています。上記の語句を単一の表現として抽出することもできます。
expression1 if bool_xxx else expression2.
たとえば:
x = “many” if sum > 0 else "little"
2.循環文
Pythonではwhileサイクルとfor ... inサイクルが提供され、フォーマットは以下の通りである。
whileがしつこい
while bool_xxx:
    ...
else:
    ...
ここでelse分岐は選択可能であり、whileループが正常に終了すると、次にelse分岐が実行され、while分岐が異常が発生したために終了またはbreak文を使用して終了すると、else分岐は実行されない。else語を使用してlistタイプのstr.find()に類似する方法を実現することができる。
>>> def list_find(lst,target):
    index = 0
    while(index < len(lst)):
        if(lst[index] == target):
            break
        index += 1
    else:
        index = -1
    return index
フォームが悪い
for循環フォーマットは以下の通りです。
for expression in iterable:
    ...
else:
    ...
whileループと同様に、forループが正常に実行されたらelse文が実行されます。異常とbreak文が終了したら、else文は実行されません。
3.異常
3.1.異常捕獲
異常な捕獲処理はtry..exceptコードブロックを使用して実現され、フォーマットは以下の通りである。
try:
   ......
except exceptionName [as variable]:
   ......
except exceptionNameGroup [as variable]:
   ......
else:
   ......
finally:
   ......
else文とfinallyはオプションとして、as variableはオプションとして、この異常をvariable変数に割り当てることを表しています。一般的な方法はtry...except...finally...です。try文のコードが正常に実行されたら、else文が実行されます。異常が発生し、break文が終了したら実行されません。finallyコードブロックは最後に実行されます。もし複数のexceptがあるなら、子類異常――父類異常の順にするべきです。try...except文を使用してlistを実施するための同様のstr.find()方法もあり得る。
>>> def list_find(lst,target):
    try:
        index = lst.index(target)
    except ValueError:
        index = -1
    return index
3.2.異常投げ
プログラムの実行時の異常を捕捉する以外に、私達は自分で一つの異常を投げて、プログラムの運行の流れを変えます。
raise exception(args)
raise exception(args) from SuperException
例えば:
>>> def myexcept():
    i = 10
    while(i > 0):
        if(i == 5):
            raise ValueError("i can't equal 5!!")
        i -= 1
        print(i)
>>> myexcept()
9
8
7
6
5
Traceback (most recent call last):
  File "", line 1, in 
    myexcept()
  File "", line 5, in myexcept
    raise ValueError("i can't equal 5!!")
ValueError: i can't equal 5!!
>>> 
第二の形式はカスタム異常を投げ出すために使われます。もちろんカスタム異常も第一の形式で投げ出すことができます。
#       
>>> class MyExcept(ValueError):pass
>>> def myexcept():
    i = 10
    while(i > 0):
        if(i == 5):
            raise MyExcept("i cant equal 5 !!!") from ValueError
        i -= 1
        print(i)
>>> myexcept()
9
8
7
6
5
ValueError
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "", line 1, in 
    myexcept()
  File "", line 5, in myexcept
    raise MyExcept("i cant equal 5 !!!") from ValueError
MyExcept: i cant equal 5 !!!
>>> 
3.3.カスタム異常
カスタム異常フォーマットは以下の通りです。
class MyExcept(Exception):pass
カスタム異常の親は、ExceptionまたはExceptionのサブクラスです。
4.関数
4.1.グローバル関数
関数定義の書式は以下の通りです。
def fun(args):
    ...
return v
パラメータはオプションで、戻り値もオプションです。Python関数はまた、C++に類似したデフォルトパラメータの形式を提供する。
def fun(args1,args2,args=...):
    ...
return v
  • 1.標準値パラメータは関数の最後のパラメータでなければなりません。標準パラメータの後には、def myfun(x,y=2,b)などのパラメータがありません。
  • .デフォルト値はdefを実行するときに作成されるもので、defを定義するときに作成されるものではないので、可変タイプのパラメータについては、呼び出しごとに作成されます。
    >>> def add_list(x,lst=[]):
        if(x % 2 == 0):
            lst.append(x)
        return lst
    >>> for i in range(10):
        my_list(i)   # for     10 ,    1 
    [0]
    [0]
    [0, 2]
    [0, 2]
    [0, 2, 4]
    [0, 2, 4]
    [0, 2, 4, 6]
    [0, 2, 4, 6]
    [0, 2, 4, 6, 8]
    [0, 2, 4, 6, 8]
    可変タイプのパラメータをデフォルトとするには、次のような形で使用できます。呼び出しごとに新しいオブジェクトが作成されることを保証できます。
    >>> def add_list(x,lst=None):
        lst = []
        if(x % 2 == 0):
            lst.append(x)
        return lst
    関数のコメント
    javaでは、定義された方法に注釈を施すことができ、Pythonでは、3つの"""を使用して表してもよい。
    def my_fun(x,y):
        """ This is a docstring
    
            detail description
    
            >>> my_fun(x,y)
            ...
        """
        print(x,y)
    一般的な使用方法は、第1の行動の簡単な説明情報であり、空白の行、さらに詳細な説明情報、最後にいくつかの例であり、これらの例は、ユニットテストを行うために使用されてもよい。注意例は>>>の後にスペースの先頭を付けなければなりません。テストを実行する時は、次の行を追加するだけで実行できます。
    if __name__ == "__main__":
        import doctest
        doctest.testmod()
    どのモジュール(すなわち.pyファイル)も導入されると、Pythonは特殊な変数__name__を作成し、モジュール名を変数に格納します。pyファイルが実行されると、Pythonはプログラムのために__mane__の特殊変数を作成し、__main__に設定します。help(my_fun)を使用して関数の説明を調べることができます。
    関数のパラメータ
    Pythonのパラメータ伝達には値伝達、引用伝達、キーワード伝達があります。いくつかの基本的なデータタイプint、floatのような値の伝達、オブジェクトのような参照の伝達。キーワード転送とは、関数が呼び出された時に直接に定形参の値を指します。
    >>>def sum(a,b,c)
    >>>sum(b=2,a=1,c=3)
    1.可変パラメータ
    関数パラメータのリストで、シリアル分割操作子*を使って可変パラメータを作成できます。フォーマットは以下の通りです。
    def fun(*args):
    *argsは関数の内部で、パラメータargsは一つの母集団であり、与えられた位置パラメータの個数の変化に伴って項数が変化します。例えば、可変パラメータによって所与の値の和を求める場合:
    >>> def sum(*item):
        result = 1
        for i in item:
            result += i
        print(result)
    >>> sum(12,3,4,56)
    76
    このような方法の利点は、より簡単な呼び出しを行うことであり、また、関数を呼び出したときに可変パラメータを1つのパラメータとして使用することができ、シーケンスタイプt 1があれば、sum(t 1[0],t 1[1],t 1[2])は、sum(*t 1)を使用して呼び出すことができる。
    #       
    >>> def sum(a,b,c):
        result = 0
        result =a + b + c
        print(result)
    >>> sum(1,2,3)
    6
    >>> 
    >>> l = [1,2,3]
    #          
    >>> sum(*l)
    6
    >>> 
    2.標準パラメータ
    Python関数では、デフォルトのパラメータが使用できます。
    #     
    >>> def sum(flag = 3,*item):
        result = 1
        for i in item:
            result += i
        result *= flag
        print(result)
    しかし、上記の例は良い例ではなく、デフォルトのパラメータを位置パラメータの後ろに置くべきです。呼び出し時にデフォルトのパラメータに入らなくてもいいし、入ってきてもいいです。デフォルトのパラメータを最初のパラメータとして使うと、最初のパラメータはデフォルトのパラメータに割り当てられます。正しい例は以下の通りです。
    
    >>> def sum(*item,flag = 0):
        result = 0
        for i in item:
            result += i
        print(result)
    >>> sum(1,2,3,flag = 4)
    6
    3.キーワードパラメータ
    関数が呼び出された時に、キーのペアの形でイメージ値を指定することをキーワードパラメータといいます。
    #      
    >>> def show(id,name):
        print("id:{}".format(id))
        print("name:{}".format(name))
    #            
    >>> show(id=2,name="zhangsan")
    id:2
    name:zhangsan
    >>> 
    4.*をパラメータとして*を直接関数パラメータとして使用することができ、*の後に位置パラメータが現れないことを示しているが、キーワードパラメータが発生してもよい。
    >>> def sum(*args,*)   #             
    SyntaxError: invalid syntax
    >>> 
    >>> def sum(a,b,c,*,flag = 2):
        return (a+b+c)*flag
    >>> sum(1,2,3)
    12
    >>> def sum(a,b,c,*,d,flag = 2):
        return (a+b+c)*flag
    >>> sum(1,2,3,4)
    #  `*`      d  ,       TypeError  。
    Traceback (most recent call last):
      File "", line 1, in 
        sum(1,2,3,4)
    TypeError: sum() takes 3 positional arguments but 4 were given
    >>> 
    したがって、*が最初のパラメータとして使用される場合、任意の位置パラメータ(キーワードパラメータを使用することができる)を使用することは許されない。
    5.*小包のキーワード
    シーケンスタイプの値は、シーケンス分割*によってパラメータとして使用され、シーケンスタイプ名を用いて呼び出すことができ、同様に、マッピング分割オペレータ**によって、1つの辞書タイプの値をパラメータとして呼び出すことができる。例えば:
    #       
    >>> def show(**kwargs):
        for key in kwargs:
            print(key,kwargs.get(key))
    この関数を呼び出した場合:
    >>> d = dict(id = 1,name="zhangan",age = 12)
    >>> show(**d)
    id 1
    age 12
    name zhangan
    または関数を次のように定義します。
    >>> def show(id = 1,name = "z",age = 3):
        print("id :{0}".format(id))
        print("name:{0}".format(name))
        print("age:{0}".format(age))
    呼び出し時:
    >>> show()
    id :1
    name:z
    age:3
    >>> show(**d)
    id :1
    name:zhangan
    age:12
    >>> 
    もちろん前提はdのkeyと関数のイメージマッチングです。そうでないとTypeErr異常が発生します。**は、関数パラメータとして使用される場合、分割オペレータをマッピングし、べき乗演算子としてもよい。a*bはaのb乗を表します。
    4.2.Lamda関数
    Lamban関数のフォーマットは以下の通りです。
    lambda [parameter] : expression
  • parameterは任意であり、通常はカンマで分割される変数名であり、位置パラメータとして理解される。
  • expression文にはブランチ、ループ、return、yieldが含まれてはいけません。
  • expressionがタプルであれば、()を使ってくくらなければなりません。
  • は、式の計算結果を返します。
  • >>> s = lambda x:"yes" if x>=0 else "no"
    >>> s(12)
    'yes' 
    >>> s(-1)
    'no'
    Lamban使い方
  • 1.Lamber関数は、sorted()関数とlist.sort()関数の中でキーパッド値ペアとして使用でき、その順序を指定します。
    >>> elsments  = [(1,11,"S"),(2,10,"T"),(3,9,"L")]
    >>> sorted(elsments)
    [(1, 11, 'S'), (2, 10, 'T'), (3, 9, 'L')]
    >>> 
    >>> sorted(elsments,key=lambda e:(e[1],e[2]))
    [(3, 9, 'L'), (2, 10, 'T'), (1, 11, 'S')]
  • .Lamban関数は、デフォルト辞書を作成するときに使用できます。
  • >>> import collections
    >>> d1 = collections.defaultdict(lambda:1) # Lambda       ,           , 1
    >>> d1["xxx"]
    1
    アサルトは断言する
    エラーメッセージを提示するためのテストです。その文法形式は以下の通りです。
    assert boolean_expression,information
    bookならexpressionはFalseであるとAspsertionError異常が発生し、informationを異常な情報として使用していると断言した例です。
    def divide(i, j):
        assert (j != 0), "can't divide zero"
        return i // j
    
    if __name__ == "__main__":
        s = divide(2, 0)
        print(s)
    運転結果は以下の通りです。
    D:\ProgramFiles\Python\Pyton3\python.exe E:/PythonWorkSpace/opt.py
    Traceback (most recent call last):
      File "E:/PythonWorkSpace/opt.py", line 6, in <module>
        s = divide(2, 0)
      File "E:/PythonWorkSpace/opt.py", line 2, in divide
        assert (j != 0), "can't divide zero"
    AssertionError: can't divide zero
    エンドユーザー向けではなく、開発者のために設計されていると断言します。したがって、プログラムのリリース後には、断言を注釈したり、断言文を実行しないという方法があります。
  • 1.python 3-O program.py
  • .環境変数PYTHONITIMIZEをO
  • に設定します。