函數基礎部分html
1.什麼是函數?python
函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。
函數能提升應用的模塊性,和代碼的重複利用率。
2.定義函數閉包
定義:def 關鍵詞開頭,空格以後接函數名稱和圓括號(),最後還有一個":"。 def 是固定的,不能變,他就是定義函數的關鍵字。 空格:爲了將def關鍵字和函數名分開,必須空(四聲),固然你能夠空2格、3格或者你想空多少都行,但正常人仍是空1格。 函數名:函數名只能包含字符串、下劃線和數字且不能以數字開頭。雖然函數名能夠隨便起,但咱們給函數起名字仍是要儘可能簡短,並能表達函數功能(變量的命名規範) 括號:是必須加的,先別問爲啥要有括號,總之加上括號就對了! 註釋:每個函數都應該對功能和參數進行相應的說明,應該寫在函數下面第一行。以加強代碼的可讀性。 調用:就是 函數名() 要記得加上括號。
3.函數調用和參數函數
函數要先定義,後執行。定義完了以後不調用,就不執行 def userinfo(name,age,sex="男"): #其中sex是默認參數,name,age是未知參數 info = "姓名是%s,年齡是%s,性別是%s"%(name,age,sex) return info user=userinfo('kobe',age=18,sex="女") #其中kobe是未位置參數,age,sex是關鍵字參數 print(user) 函數名():不論是在哪一個地方出現都是在調用函數----->函數真正執行的時候是函數的內存地址加上擴號() 函數的參數: 形參--->函數定義的時候 位置參數 a,b 傳參的時候一一對應從實參處接受 默認參數 a=1 在定義的時候就設定好值了 實參--->函數調用的時候 位置參數 1,2, 傳參的時候一一對應給形參 關鍵字參數 a=1 經過形參的名字指定傳值 混合: 形參 def func(a,b,d,f=1): 實參 func(1,2,3,f=2) 傳參--->將實參傳遞給形參的過程
#形式參數-->變量名後面()裏面的參數 #實際參數-->實際上要傳遞的參數 #傳參-->將實參傳遞給形參的過程叫作傳參, #位置參數-->形參和實參是有一個位置的關係,能一一對應,叫作位置參數 #默認參數-->定義默認參數的時候,有時候傳遞的實參和接受的形參數量並不必定相等 #關鍵字參數-->這樣就不須要記住每個參數的位置了,只須要在調用的函數的時候,給參數進行賦值就能夠 注意:位置參數優先級要高於關鍵字參數(若是位置參數傳遞不正確的話會報錯)
4.函數的返回值spa
1.沒有return就默認返回None 2.寫了return 沒有寫返回值 默認返回None 3.多個返回值的時候,返回的是一個元組 4.一個返回值的時候,返回的就是返回值自己 5.return 下面的代碼不執行,而且結束這個函數
返回值做用:
1,結束整個函數。return下面的代碼都不執行
2,給函數的執行者(調用者)返回值。
返回值返回給誰:
誰調用函數就把返回值返回給誰
5.初識函數其餘知識點code
1.函數先定義後執行,定義完了以後不調用,就不執行 2.print(函數名) --->函數的內存地址---><function userinfo at 0x0000000001D31E18> 3.函數執行過程:定義--->調用---->函數體代碼
4.誰調用了函數,函數的返回值就返回給誰。若是返回值是1個,就返回字符串,2個以上的話,就返回元組
5.函數名():無論在哪一個地方都是在調用函數
6.傳遞參數時:位置參數要高於關鍵字參數,必定要將位置參數--對應以後,只進行關鍵字賦值
7.三元運算符:c = a if a>b else b--->若是a>b就將a的值返回給c,不然就將b的值返回給c (一般在不肯定究竟是什麼數值的時候用到)
other htm
1.全局變量必需要定格去定義,不能定義在縮進裏面 2.()叫作調用操做符,[]叫作索引操做符
3.若是直接要是用一個便令,默認使用全局的
函數進階部分對象
1.動態參數blog
*agrs:接受的位置參數,返回元組 **kwargs:接受關鍵字參數,返回字典 動態參數: 動態參數的用途:在不明確接受參數的數量時,使用*args和**kwargs來接受參數,分別返回 注意:*args和**kwargs中的英文字母能夠是任意的符合變量定義規範的數據類型,可是一般不這麼作! 動態參數出現位置: 動態位置參數>動態關鍵字(默認)參數 形參:位置參數>動態位置參數>默認參數>動態關鍵字(默認)參數
實參:位置參數>關鍵字參數
動態參數中*的做用:
實參:
*args在實參處調用時,*將可迭代對象打散,字典是將鍵值取出
**kwargs在實參處調用時,將字典打散,造成關鍵字參數,{鍵:值}相互對應
形參:
*args在形參處出現時,*表明的是將接收到的位置參數聚合成元組
**kwargs在形參處出現時,**表明的是將接收到的關鍵字參數聚合成字典
2.函數註釋索引
def info(user,name): """ :param user: :param name: :return: """ print(1)
#在函數體內,連續輸入三個雙引號的由於字符,而後回車
查看註釋: func名.__doc__
查看文件名: func名.__name__
查看文件路徑:
import os
print(os.path.abspath(__file__))
3.命名空間:把同名的變量區分出不一樣的做用域
在python解釋器開始執行以後, 就會在內存中開闢一個空間, 每當遇到一個變量的時候, 就把變量名和值之間的關係記錄下來。
可是當遇到函數定義的時候, 解釋器只是把函數名讀入內存, 表示這個函數存在了, 至於函數內部的變量和邏輯, 解釋器是不關心的. 也就是說一開始的時候函數只是加載進來, 僅此而已!
只有當函數被調用和訪問的時候, 解釋器纔會根據函數內部聲明的變量來進行開闢變量的內部空間. 隨着函數執行完畢, 這些函數內部變量佔用的空間也會隨着函數執行完畢而被清空.
咱們給存放名字和值的關係的空間起一個名字叫: 命名空間. 咱們的變量在存儲的時候就 是存儲在這片空間中的.
命名空間的分類:
內置空間: 存放python解釋器爲咱們提供的名字, list, tuple, str, int這些都是內置命名空間
全局空間: 咱們直接在py文件中, 函數外聲明的變量都屬於全局命名空間
內置空間: 在函數中聲明的變量會放在局部命名空間
加載順序:內置命名空間(程序運行前加載)->全局命名空間(程序運行中:從上到下加載)->局部命名空間(程序運行中:調用時才加載)
取值順序:找不到就報錯
在局部調用:局部命名空間->全局命名空間->內置命名空間
在全局調用:全局命名空間->內置命名空間
做用域:做用域就是做用範圍,按照生效範圍能夠分爲全局做用域和局部做用域。
全局做用域:包含內置名稱空間、全局名稱空間,在整個文件的任意位置都能被引用、全局有效
局部做用域:局部名稱空間,只能在局部範圍內生效,函數內部生效
global:在局部修改所有變量,若是沒有就建立一個新的。
nonlocal:在局部空間內,修改離本身最近的變量,若是上一層沒有就繼續向上找,直到找到局部變量的頂層,局部空間內沒有能夠修改的變量,就報錯。
4.函數嵌套
1. 只要碰見了()就是函數的調用. 若是沒有()就不是函數的調用 2. 若是看見了print(函數名)是打印函數的內存地址
global:
global: 1,聲明一個全局變量。 2,在局部做用域想要對全局做用域的全局變量進行修改時,須要用到 global(限於字符串,數字)。 ps:對可變數據類型(list,dict,set)能夠直接引用不用經過global。
代碼示例: a = 100 def func(): global a # 加了個global表示不再局部建立這個變量了. 而是直接使用全局的a a = 28 print(a) func() print(a)
nonlocal
nonlocal: 1,不能修改全局變量。 2,在局部做用域中,對父級做用域(或者更外層做用域非全局做用域)的變量進行引用和修改,而且引用的哪層,從那層及如下此變量所有發生改變。 代碼示例: a = 10 def func1(): a = 20 def func2(): nonlocal a a = 30 print(a) func2() print(a) func1() 結果: 加了nonlocal 30 30 加nonlocal 30 20
函數的做用域鏈:小範圍做用域可使用大範圍的變量,可是反之不行,他是單向的。
other
函數名本質上就是函數的內存地址或對象。 1.能夠被引用 2.能夠被看成容器類型的元素 3.能夠看成函數的參數和返回值 4.若是記不住的話,那就記住一句話,就當普通變量用 閉包函數:內部函數包含對外部做用域而非全局做用域變量的引用,該內部函數稱爲閉包函數 閉包函數的經常使用實踐: 因爲有了做用域的關係,咱們就不能拿到函數內部的變量和函數了。若是咱們就是想拿怎麼辦呢?返回呀! 咱們都知道函數內的變量咱們要想在函數外部用,能夠直接返回這個變量,那麼若是咱們想在函數外部調用函數內部的函數呢? 是否是直接就把這個函數的名字返回就行了? 這纔是閉包函數最經常使用的用法 代碼實現:
def func(): name = 'eva' def inner(): print(name)
#print(inner.__closure__)有cell元素,就是閉包元素 return inner #返回的時inner的內存地址 f = func()
f()