python-return_グローバルローカル変数_関数名の使い方_関数のネスト
48061 ワード
関数#カンスウ#
1.return戻り値
機能:
カスタム関数の戻り値、returnは関数の呼び出しに値を返すことができます
return+6つの標準データ型、クラスとオブジェクト、関数
returnを定義しない場合、デフォルトはNoneを返します.
returnを実行した後、すぐに関数を終了し、後のコードは実行しません. returnの戻りタイプ returnを実行した後、すぐに関数を終了し、後のコードは を実行しない.簡単な計算機+-*/ をシミュレート
2.グローバル変数とローカル変数
≪ローカル変数|Local Variable|oem_src≫:関数の内部で定義された変数(ローカルネーミングスペース)
グローバル変数:関数の外部で定義された変数またはglobalを使用して関数の内部で定義された変数(グローバルネーミングスペース)
スコープ:スコープ
ローカル変数の役割ドメイン:関数の内部
グローバル変数の役割ドメイン:ファイル全体にわたって
ライフサイクル:
組み込み変数>グローバル変数>ローカル変数ローカル変数 グローバル変数 globalを使用して関数内部にグローバル変数 を作成する. globalを使用して関数内部でグローバル変数 を修正する.まとめglobalキーワードを使用して関数の内部にグローバル変数を定義してもよいし、globalキーワードを使用して関数の内部にグローバル変数 を変更してもよい.
3.関数名の使用関数名は特殊な変数であり、変数として を割り当てることができる.関数名は、コンテナタイプデータの要素 とすることができる.関数名は、関数のパラメータ とすることができる.関数名は、関数の戻り値 とすることができる. docまたはhelp文書 を参照
4.関数のネスト
関数間は互いにネストできます
外層を外関数と呼ぶ
内層を内包数と呼ぶ
inner()
外層はouterで、内層はinnerで、一番奥の層はsmallerで、smallerの中のすべてのコードを呼び出します
LEGB原則(至近探索変数原則)
変数の呼び出し順序を探すにはLEGBの原則(すなわち近接の原則)を採用する.
B —— Builtin(Python);Python内蔵モジュールのネーミングスペース(内蔵ドメイン)
G —— Global(module); 関数の外部にあるネーミングスペース(グローバル役割ドメイン)
E —— Enclosing function locals;外部ネスト関数の役割ドメイン(ネストされた役割ドメイン)
L —— Local(function);現在の関数内のスコープ(ローカルスコープ)
近接の原則に基づいて,下から上へ中から外へ順に探す
5.nonlocalローカル変数の変更
nonlocalはLEGB近接変数の原則に従う現在の空間上のレイヤのローカル変数を探して変更 見つからない場合は、 を探し続けます.最後に何もなくて、直接 を間違えました.
6.localsとglobals locals現在の役割ドメインのすべての変数を取得localsグローバルでlocalsが呼び出された後、印刷前のすべての変数を取得し、辞書を返し、グローバル空間役割ドメインlocalsがローカルでlocalsが呼び出された後、呼び出された前のすべての変数を取得し、辞書を返し、ローカル空間役割ドメイン globalsグローバル空間内のすべての変数globalsグローバルでglobalsが呼び出された後、印刷前のすべての変数が取得され、辞書が返され、グローバル空間役割ドメインglobalsがローカルでglobalsが呼び出された後、取得されたのは呼び出し前のすべての変数であり、辞書が返され、グローバル空間役割ドメイン globalsダイナミックバッチグローバル変数の作成 グローバル変数 を文字列で定義する.一括定義グローバル変数
練習する
練習1
登録:は2回のパスワードが同じであれば、登録成功 を確認する.は2回のパスワードが異なる場合、2回のパスワードが一致しないことを示す を検出する.ユーザー名は を繰り返すことはできません.
練習2
ログイン:アカウントパスワードは、ファイルに予め記録する .アカウントのパスワードを入力:もしすべて正しいならば、登録は成功しました ユーザー登録時に3回のチェックを行った場合、いずれも間違っていて、ブラックリストファイルの を記録する.ブラックリストのユーザーであれば、次回の への再登録は禁止されています.
1.return戻り値
機能:
カスタム関数の戻り値、returnは関数の呼び出しに値を返すことができます
return+6つの標準データ型、クラスとオブジェクト、関数
returnを定義しない場合、デフォルトはNoneを返します.
returnを実行した後、すぐに関数を終了し、後のコードは実行しません.
def func():
return 1
return 3.14
return "abc"
return []
return ()
return {
"a":1}
pass
res = func()
# return, None
print(res) # None
def func():
print(1)
print(2)
return 3
print(4)
print(5)
res = func()
print(res)
def func():
for i in range(3):
if i == 2:
return 1
print(i)
res = func()
print(res)
def func(sign,num1,num2):
if sign == "+":
res = num1 + num2
elif sign == "-":
res = num1 - num2
elif sign == "*":
res = num1 * num2
elif sign == "/":
if num2 == 0:
return " 0, !"
res = num1 / num2
else:
return " "
return res
res = func("+",3,6)
res = func("-",6,2)
res = func("*",5,2)
res = func("/",8,4)
res = func("/",8,0)
res = func("&",4,0)
print(res)
2.グローバル変数とローカル変数
≪ローカル変数|Local Variable|oem_src≫:関数の内部で定義された変数(ローカルネーミングスペース)
グローバル変数:関数の外部で定義された変数またはglobalを使用して関数の内部で定義された変数(グローバルネーミングスペース)
スコープ:スコープ
ローカル変数の役割ドメイン:関数の内部
グローバル変数の役割ドメイン:ファイル全体にわたって
ライフサイクル:
組み込み変数>グローバル変数>ローカル変数
def func():
#
a = 5
#
print(a)
#
a = 10
print(a)
func()
# print(a) error
#
b = 10
#
print(b)
#
b = 20
def func():
#
print(b)
func()
def func():
global c
c = 100
func()
print(c)
d = 200
def func():
global d
d = 300
func()
print(d)
3.関数名の使用
def func():
print(" func ")
return 1111
a = " "
print(a)
a = func
a()
#
del a
a()
def func1():
print(" func1 ")
def func2():
print(" func3 ")
def func3():
print(" func3 ")
lst = [func1,func2,func3]
for i in lst:
print(i)
i() # func1() func2() func3()
def func():
print(" func ")
def func4(f):
f()
func4(func)
def func1():
print(" func1 ")
def func(f):
return f
res = func(func1) # f <=> func1 => res = func1()
res()
def eat_bigchang(something):
"""
:
:
:
"""
print(" {} ".format(something))
print(" ")
print(" !!")
return " , , "
res = eat_bigchang(" ")
print(res)
help(eat_bigchang)
res = eat_bigchang.__doc__
print(res)
4.関数のネスト
関数間は互いにネストできます
外層を外関数と呼ぶ
内層を内包数と呼ぶ
def outer():
def inner():
print(" inner ")
inner()
outer()
inner()
1.
2. ,
3.
4. , ,
外層はouterで、内層はinnerで、一番奥の層はsmallerで、smallerの中のすべてのコードを呼び出します
def outer():
def inner():
def smaller():
print(" smaller ",id)
smaller()
inner()
outer()
LEGB原則(至近探索変数原則)
変数の呼び出し順序を探すにはLEGBの原則(すなわち近接の原則)を採用する.
B —— Builtin(Python);Python内蔵モジュールのネーミングスペース(内蔵ドメイン)
G —— Global(module); 関数の外部にあるネーミングスペース(グローバル役割ドメイン)
E —— Enclosing function locals;外部ネスト関数の役割ドメイン(ネストされた役割ドメイン)
L —— Local(function);現在の関数内のスコープ(ローカルスコープ)
近接の原則に基づいて,下から上へ中から外へ順に探す
5.nonlocalローカル変数の変更
nonlocalはLEGB近接変数の原則に従う
""" """
def outer():
a = 100
def inner():
nonlocal a
a = 200
print(a)
inner()
print(a)
outer()
""" """
def outer():
a = 100
def inner():
def smaller():
nonlocal a
a = 400
print(a)
smaller()
print(a)
inner()
print(a)
outer()
""" : nonlocal ( , ) """
a = 100
def outer():
def inner():
def smaller():
nonlocal a
a = 400
print(a)
smaller()
print(a)
inner()
print(a)
outer()
""" nonlocal """
def func():
lst = [1,2,3,4]
def inner():
lst[-1] = 10
inner()
print(lst)
func()
6.localsとglobals
#
def func():
ff = 123
a = 1
b = 2
res = locals()
c = 3
print(res)
d = 4
#
a1 = 10
def func():
a = 1
b = 2
res = locals()
c = 3
print(res)
d = 4
a2 = 20
func()
a3 = 30
#
def func():
ff = 123
a = 1
b = 2
res = globals()
c = 3
print(res)
d = 4
#
a1 = 10
def func():
a = 1
b = 2
res = globals()
c = 3
print(res)
d = 4
a2 = 20
func() # globals
a3 = 30
dic = globals()
print(dic) #
"""
, ,
,
"""
dic["name"] = " "
print(name)
def func():
dic = globals()
# , ,
for i in range(1,6):
# "a%d" % (1) => "a1" "a%d" % (2) => "a2"
dic["a%d" % (i)] = i # 1~5
func()
"""
"a%d" % (1) => a1
"a%d" % (2) => a2
"a%d" % (3) => a3
"a%d" % (4) => a4
"a%d" % (5) => a5
"""
練習する
練習1
登録:
# accountlst
accountlst = []
sign = True
with open("user.txt",mode="a+",encoding="utf-8") as fp:
while sign:
#
username = input(" :")
if username == "" or " " in username:
print(" , ")
else:
#
fp.seek(0)
lst = fp.readlines()
for i in lst:
account = i.strip().split(":")[0]
accountlst.append(account)
print(accountlst)
#
if username in accountlst:
print(" , ")
else:
#
pwd = input(" :")
while True:
pwd2 = input(" , q ~")
#
if pwd == pwd2:
#
strvar = username + ":" + pwd + "
"
#
fp.write(strvar)
#
sign = False
#
print(" ~")
break
elif pwd2.upper() == "Q":
break
else:
print(" . ~")
練習2
ログイン:
#
accountlst = []
#
pwdlst = []
#
blacklst = []
sign = True
while sign:
username = input(" :")
#
with open("user.txt",mode="a+",encoding="utf-8") as fp:
fp.seek(0)
lst = fp.readlines()
for i in lst:
user,pwd = i.strip().split(":")
# print(user,pwd)
accountlst.append(user)
pwdlst.append(pwd)
# print(accountlst)
# print(pwdlst)
#
if username in accountlst:
#
with open("black.txt",mode="a+",encoding="utf-8") as fp:
fp.seek(0)
lst = fp.readlines()
for i in lst:
blacklst.append(i.strip())
# print(blacklst)
if username in blacklst:
print(" , ")
else:
#
num = accountlst.index(username)
pwd = pwdlst[num]
# print(num,pwd)
#
times = 1
while times <= 3:
pwd2 = input(" :")
# , ,
if pwd == pwd2:
print(" ~")
sign = False
break
else:
# = -
print(" %s " % (3-times))
# , ,
if times == 3:
with open("black.txt",mode="a+",encoding="utf-8") as fp:
strvar = username + "
"
fp.write(strvar)
print(" , ~")
times+=1
else:
print(" ~")