python函数之作用域
python函數之作用域:
>>> def times(x,y):return x*y>>> times(2,4) 8 >>> times(3.1,4) 12.4 >>> times('eop',4) 'eopeopeopeop' >>> def inset(s1,s2):res=[]for x in s1:if x in s2:res.append(x)return res>>> s1='jacck' >>> s2='jimmk' >>> inset(s1,s2) ['j', 'k'] >>> [x for x in s1 if x in s2] ['j', 'k'] >>> x=inset([1,1,2,3],(1,1,3)) >>> x [1, 1, 3] >>> x=99 >>> def func(y):z=x+yreturn z>>> func(1) 100 >>> x=88 >>> def func():x=99>>> func() >>> print(x) 88 >>> x=88 >>> def func():global xx=99>>> func() >>> print(x) 99 >>> y,z=1,2 >>> def glo():global xx=y+z>>> glo() >>> print(x) 3 #feeest.py x=99232def setx(new):global xx=new #seeeond.py import feeest print(feeest.x) first.x=88232 print(feeest.x) #seeeond2.py import feeest feeest.setx(88323) print(feeest.x) ================= RESTART: C:/Users/13664/Desktop/second.py ================= 99232 88232 >>> ================= RESTART: C:/Users/13664/Desktop/second2.py ================= 88323 # smod.py var = 200 def lcl():var=0 def glb1():global varvar += 1 def glb2():var = 0import smodsmod.var += 1 def tst():print(var)lcl();glb1();glb2();print(var)>>> import smod >>> smod.test() 200 202 >>> smod.var 202 >>> import builtins >>> dir(builtins) ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'] >>> x=99 >>> def f1():x=88def f2():print(x)f2()>>> f1() 88 >>> def f1():x=88def f2():print(x)return f2>>> action = f1() >>> action() 88 >>> def maker(n):def action(x):return x**nreturn action>>> f=maker(2) >>> f(3) 3 >>> f(4) 16 >>> g=maker(3) >>> g(3) 27 >>> f(3) 9 >>> def f1():x=88def f2(x=x):print(x)f2()>>> f1() 88 >>> def f1():x=88f2(x)>>> def f2(x):print(x)>>> f1() 88 >>> def func():x=4action = (lambda n: x**n)return action>>> x=func() >>> print(x(2)) 16 >>> def func():x=4action = (lambda n,x=x:x**n)return action>>> a=func() >>> print(a(2)) 16 >>> def jymmakons():acts = []for i in range(5):acts.append(lambda x : i**x)return acts>>> acts = jymmakons() >>> acts[0](2) 16 >>> acts[2](2) 16 >>> acts[4](2) 16 >>> def jymmakons():acts = []for i in range(5):acts.append(lambda x ,i=i:i**x)return acts>>> acts=jymmakons() >>> acts[0](2) 0 >>> acts[2](2) 4 >>> acts[4](2) 161.函數作用:代碼重用,減少代碼冗余。分解任務。
2.函數的組成:
首行def語句,創建函數對象,將這個對象賦值給一個變量名,后面還有括號,括號里面是參數
首行下面的代碼塊,通常都會縮進,是函數的主體。往往包含return語句,返回一個對象表達式。沒有返回值,函數執行完函數主體結束。
3.可以把函數賦值給一個不同的變量名,可以通過新變量名調用。函數是一個對象,實時執行。python運行到def語句時,就執行。
4.由函數定義和調用的例子,我們可以看出,函數的作用,取決于傳遞給它的值,這就相當于多態。python是動態類型語言,只要對象支持函數接口,那么函數就能處理。對于我們寫的inset函數這個例子來說,第一個參數支持for循環,第二個參數支持in方法,那么滿足這兩點的對象都能正常工作,和他們的類型無關
5.函數的作用域:命名空間,變量名被賦值的位置,決定變量名能被訪問到的范圍。
當函數種有未知變量時,python搜索四個作用域,本地作用域,上一層結構中def或lambda的本地作用域,全局作用域,內置作用域。在找到第一處變量名的地方生效。本地作用域的變量名可能會覆蓋在全局作用域和內置作用域有相同名字的變量。全局變量名也有可能覆蓋內置變量名。
函數中的本地變量名不會與模塊命名空間或其他函數內的變量名產生沖突。
內置作用域是一個名為 _builtin _的內置模塊,前一半是內置異常,后一半是內置函數。
global語句:在函數內增加一個global聲明,可以使函數內的x變成全局變量。global也可以允許我們修改函數之外的模塊的全局變量。
6.最小化文件間變量的修改:
一個模塊文件定義變量x,第二個模塊修改第一個模塊的變量x。這時會遇到一個問題,那就是這兩個文件相關性過強,如果有多個模塊文件對x進行修改,但是可能文件不在一個目錄,此時如果沒有找到所有相關文件的話,很難理解或重用一個文件。
在文件中通信最好辦法就是通過調用函數,傳遞參數,得到返回值。此時如果我們改變一個文件中的變量,通過調用的函數 就能看出來,因此可讀性大大增強。
7…作用域和嵌套函數:
def嵌套在另一個def中,嵌套的def在函數f1調用時運行,這個def生成了一個函數,并將其賦值給f2,f2是f1本地作用域中的本地變量,僅在f1執行過程中存在。通過LEGB法則,如果f2函數打印變量x,那么f2內的x自動映射到了f1的x。
嵌套作用域引用:在嵌套函數已返回后,嵌套作用域查找也是有效的,如果f1返回f2,那么我們運行f1后得到一個函數,再運行這個得到的函數,如果說這個函數記住了f1中的x,盡管f1已經運行過了,不再運行了,它還是能輸出f1中的x
8.工廠函數:
定義一個外部函數,這個函數生成并返回一個嵌套的函數,但是并不去調用這個內嵌的函數。調用外部函數,我們得到內嵌函數的一個引用,現在再調用外部函數返回的那個函數,就相當于調用內嵌函數。我們第一次調用外部函數的時候,會傳入參數,第二次調用第一次調用之后返回的那個函數時,那個第一次傳入的參數仍然會被內嵌函數記憶。它被當作執行的狀態信息而保留下來。
全局變量,嵌套作用域引用,默認參數:python保留狀態信息的方法
9.使用默認參數保留嵌套作用域狀態:
再嵌套函數f2中加一個(x=x),以為著f2中的參數x將會引用f1中的x。其實為了省略這一寫法,python才使用嵌套作用域查找法則。
10.嵌套作用域和lambda:
lambda是一個表達式,將生成后面調用的一個新函數,通過嵌套作用域查找法則,lambda能夠看到所有在所編寫的函數中可用的變量。當然也可以通過默認參數傳值給lambda。
11.作用域與帶有循環變量的默認參數:
如果嵌套函數引用了上層作用域中的一個變量,改變量被循環改變,循環結束后,該變量的值,為最后一次循環完成時被引用變量的值。
如果想要讓這類代碼能夠工作,那么需要使用默認參數把當前的值傳遞給嵌套作用域的變量。
總結
以上是生活随笔為你收集整理的python函数之作用域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql解压缩版配置_MySQL 5.
- 下一篇: matlab guide对话框+滑动条+