python基礎之 初識函數&函數進階

函數基礎部分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()

 在函數列表中出現的*,表示強制其後的參數強制使用關鍵字方式傳參!

 

 

 

 

 

返回系列

相關文章
相關標籤/搜索