python-return_グローバルローカル変数_関数名の使い方_関数のネスト

48061 ワード

関数#カンスウ#
1.return戻り値
機能:
カスタム関数の戻り値、returnは関数の呼び出しに値を返すことができます
return+6つの標準データ型、クラスとオブジェクト、関数
returnを定義しない場合、デフォルトはNoneを返します.
returnを実行した後、すぐに関数を終了し、後のコードは実行しません.
  • returnの戻りタイプ
    def func():
    	return 1
    	return 3.14
    	return "abc"
    	return []
    	return ()
    	return {
           "a":1}
    	pass
    res = func()
    #      return,      None
    print(res) # None
    
  • returnを実行した後、すぐに関数を終了し、後のコードは
    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()    
    
  • globalを使用して関数内部にグローバル変数
    def func():
        global c
        c = 100
    func()
    print(c)
    
  • を作成する.
  • globalを使用して関数内部でグローバル変数
    d = 200
    def func():
        global d
        d = 300
    func()
    print(d)
    
  • を修正する.
  • まとめglobalキーワードを使用して関数の内部にグローバル変数を定義してもよいし、globalキーワードを使用して関数の内部にグローバル変数
  • を変更してもよい.
    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()
    
  • とすることができる.
  • docまたはhelp文書
    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
  • locals現在の役割ドメインのすべての変数を取得localsグローバルでlocalsが呼び出された後、印刷前のすべての変数を取得し、辞書を返し、グローバル空間役割ドメインlocalsがローカルでlocalsが呼び出された後、呼び出された前のすべての変数を取得し、辞書を返し、ローカル空間役割ドメイン
    #    
    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
    
  • globalsグローバル空間内のすべての変数globalsグローバルでglobalsが呼び出された後、印刷前のすべての変数が取得され、辞書が返され、グローバル空間役割ドメインglobalsがローカルでglobalsが呼び出された後、取得されたのは呼び出し前のすべての変数であり、辞書が返され、グローバル空間役割ドメイン
    #    
    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
    
  • globalsダイナミックバッチグローバル変数の作成
  • グローバル変数
    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
    登録:
  • は2回のパスワードが同じであれば、登録成功
  • を確認する.
  • は2回のパスワードが異なる場合、2回のパスワードが一致しないことを示す
  • を検出する.
  • ユーザー名は
  • を繰り返すことはできません.
    # 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
    ログイン:
  • アカウントパスワードは、ファイルに予め記録する
  • .
  • アカウントのパスワードを入力:もしすべて正しいならば、登録は成功しました
  • ユーザー登録時に3回のチェックを行った場合、いずれも間違っていて、ブラックリストファイルの
  • を記録する.
  • ブラックリストのユーザーであれば、次回の
  • への再登録は禁止されています.
    #    
    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(" ~")