[Python]Pythonフロー制御、異常、関数
25321 ワード
Pythonの中の分岐文、循環語句、異常などは他の言語より簡単で簡潔で実用的です。本稿では、分岐文、循環文、異常、関数の使用をまとめます。
1.分岐文
pythonの中の分岐文の書式は以下の通りです。
Pythonでは
whileがしつこい
for循環フォーマットは以下の通りです。
3.異常
3.1.異常捕獲
異常な捕獲処理は
プログラムの実行時の異常を捕捉する以外に、私達は自分で一つの異常を投げて、プログラムの運行の流れを変えます。
カスタム異常フォーマットは以下の通りです。
4.関数
4.1.グローバル関数
関数定義の書式は以下の通りです。 1.標準値パラメータは関数の最後のパラメータでなければなりません。標準パラメータの後には、 .デフォルト値はdefを実行するときに作成されるもので、defを定義するときに作成されるものではないので、可変タイプのパラメータについては、呼び出しごとに作成されます。
javaでは、定義された方法に注釈を施すことができ、Pythonでは、3つの
関数のパラメータ
Pythonのパラメータ伝達には値伝達、引用伝達、キーワード伝達があります。いくつかの基本的なデータタイプint、floatのような値の伝達、オブジェクトのような参照の伝達。キーワード転送とは、関数が呼び出された時に直接に定形参の値を指します。
関数パラメータのリストで、シリアル分割操作子*を使って可変パラメータを作成できます。フォーマットは以下の通りです。
Python関数では、デフォルトのパラメータが使用できます。
関数が呼び出された時に、キーのペアの形でイメージ値を指定することをキーワードパラメータといいます。
5.*小包のキーワード
シーケンスタイプの値は、シーケンス分割
4.2.Lamda関数
Lamban関数のフォーマットは以下の通りです。 parameterは任意であり、通常はカンマで分割される変数名であり、位置パラメータとして理解される。 expression文にはブランチ、ループ、return、yieldが含まれてはいけません。 expressionがタプルであれば、()を使ってくくらなければなりません。 は、式の計算結果を返します。 1.Lamber関数は、sorted()関数とlist.sort()関数の中でキーパッド値ペアとして使用でき、その順序を指定します。 .Lamban関数は、デフォルト辞書を作成するときに使用できます。
エラーメッセージを提示するためのテストです。その文法形式は以下の通りです。 1.python 3-O program.py .環境変数PYTHONITIMIZEをO に設定します。
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
def myfun(x,y=2,b)
などのパラメータがありません。>>> 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
>>> s = lambda x:"yes" if x>=0 else "no"
>>> s(12)
'yes'
>>> s(-1)
'no'
Lamban使い方>>> 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')]
>>> 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
エンドユーザー向けではなく、開発者のために設計されていると断言します。したがって、プログラムのリリース後には、断言を注釈したり、断言文を実行しないという方法があります。