先來說明下幾個定義:
python 路徑、1,函數
在python中,函數通過def關鍵字、函數名和可選的參數列表定義。通過return關鍵字返回值。我們舉例來說明如何定義和調用一個簡單的函數:
cookie和session區別。方法體(當然多行也是一樣的)是必須的,通過縮進來表示,在方法名的后面加上雙括號()就能夠調用函數
2,作用域
在Python中,函數會創建一個新的作用域. Python開發者可能會說函數有自己的命名空間.這就意味著在函數內部碰到一個變量的時候函數會優先在自己的命名空間里尋找.來簡單舉例說明本地作用域與全局作用域
內置的函數globals返回一個包含所有Python解釋器知道的變量名稱的字段(省略一部分)在#2調用了函數foo 把函數背部本地作用域里面的內容打印出來.可以看到,函數foo有自己的獨立的命名空間,即使暫時命名空間啥也沒有.
3,變量解析規則
當然并不是說在函數里就不能訪問外面的全局變量.在Python的作用域規則里,創建變量一定會在當前作用域里創建一個變量,但訪問或者修改變量是會現在當前作用域查找變量,沒有找到匹配變量會依次向上在閉合的作用域里進行查找.so 如修改函數foo的是實現打印全局的作用域的變量也是可以
在#1處,Python解釋器會嘗試查找變量a_string,當然在函數的本地作用域是找不到,so接著會在上層的作用域去查找
但在另外一方面,假如在函數的內部給全局變量賦值,結果會不一樣
全局變量能夠被訪問到(如果是可變數據類型(像list,dict這些),甚至能夠被更改),但賦值就不行了,在函數內部的#1,實際上新創建了一個局部變量,隱藏全局作用域中的同名變量,可以通過打印出全局命名空間中的內容得出這個結論.也可以在#2處打印出來的a_string沒有改變
4,變量生存周期
值得注意的是:變量不僅是生存在一個個的命名空間里,都有自己的生存周期,如下:
5,函數參數
Python允許想函數傳遞參數,參數會變成本地變量存在與函數內部
在Python中有很多的方式來定義和傳遞參數,簡要說明下:函數的參數是必須的位置參數或是可選的命名,默認參數
在#1處定義了函數foo,有一個位置參數x和一個命名參數y ?在#2通過常規的方式來調用函數,即使只有一個命名參數,但參數依然可以通過位置參數傳遞給函數.在調用函數的時候,對于命名參數y也可以完全不管就想#3所示一樣.如命名參數沒有接收到任何值的話,Python會自動使用聲明的默認值.但不能省略第一個位置參數x,否則會像#4發生錯誤
python支持函數調用時的命名參數。看看#5處的函數調用,傳遞的是兩個命名實參,這個時候因為有名稱標識,參數傳遞的順序也就不用在意了。
當然相反的情況也是正確的:函數的第二個形參是y,但通過位置的方式傳遞值給它。在#2處的函數調用foo(3,1),我們把3傳遞給了第一個參數,把1傳遞給了第二個參數,盡管第二個參數是一個命名參數。
6,嵌套函數
Python允許創建嵌套函數,就意味著可以在函數里定義函數而且現有的作用域和變量生存周期依舊適用
Python解釋器需找一個叫x的本地變量,查找失敗之后會繼續向上層的作用域里查,這個上層的作用域定義在另外一個函數里,對于函數outer來說,變量x是一個本地變量
函數inner可以訪問封閉的作用域.在#2處,可以調用函數inner,inner也僅僅是一個遵循Python變量解析規則的變量名,Python解釋器會優先在outer的作用域里面對變量名inner查找匹配的變量
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态