局部變量 全局變量 函數的嵌套

day10筆記:

局部變量:

  1. 定義在函數內部的變量稱爲局部變量(函數的形參也是局部變量)

  2. 局部變量只能在函數內部使用

  3. 局部變量在函數調用時才能夠被創建,在函數調用結束之後會自動銷燬

全局變量:

  1. 定義在函數外部,模塊內部的變量稱爲全局變量

  2. 所有的函數都可以直接訪問"全局"變量,但函數內部不能直接通過賦值語句來改變全局變量

 

示例見:

  variable.py

 

局部變量說明:

  1. 在函數內首次對變量賦值是創建局部變量,再次爲變量賦值是修改局部變量的綁定關係

  2. 在函數內部的賦值語句不會對全局變量造成影響

  3. 局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個模塊同訪問

  4.  形參也是局部變量

 

練習:

  創建一個全局變量:

  L = []

  寫一個函數:

  definput_number():

      讀入正整數 放到L列表內

 

  # ......   input_number()  # 輸入1 2 3

  print(L)  # [1, 2, 3]

  # .....input_number()  # 輸入4,5

  print(L)  # [1, 2, 3, 4, 5]

 

 

 

globals() 函數和locals 函數

  globals() 返回當前全局作用域內變量的字典

  locals()  返回當前局部作用域內的變量的字典

  示例見:

   globals_locals_function.py

 

 

函數變量

  函數名是變量,它在創建時綁定一個函數

 

  示例見:

   function_variable.py

 

一個函數可以作爲另一個函數實參傳遞

 

示例:

  def f1():

     print("f1被調用")

 

  def f2():

     print("f2被調用")

 

  def fx(fn):

     print("fn綁定的是: ", fn)

      fn()  # 調用fn綁定的函數,此處等同於調用誰呢?

 

  fx(f1)

  fx(f2)

 

 

案例:

  看懂如下代碼做什麼事?

 

  defmyinput(fn):

      L = []

      whileTrue:

          x =int(input("請輸入大於0的整數:") or '-1')

          if x< 0:

             break

         L.append(x)

      returnfn(L)  # <<< 注意此處

 

 print(myinput(max))

 print(myinput(min))

  print(myinput(sum))

 

函數作爲另一個函數的返回值

 

示例見:

  function_return_other_function.py

 

函數的嵌套定義

  函數嵌套定義是指一個函數裏用def 語句來創建其它函數的情況

 

  示例見:

   function_embed_def.py

python 的作用域

  作用域也叫命名空間,是訪問變量時查找變量名的範圍空間

 

python的四個作用域  LEGB

  作用域               英文解釋          英文簡寫

局部作用域(函數內)  Local(function)            L

外部嵌套函數作用域  Enclosingfunction locals  E

函數定義所在模塊(文件)的作用域 Globals(module)   G

python 內置模塊的作用域 Builtin(python)        B

 

示例見:

  namespace.py

 

變量名的查找規則:

  1. 在訪問變量時先查找本地變量,然後是包裹此函數外部的函數內部的變量,之後是全局變量,最後是內置(內建)變量

      L--->  E  ---> G ---> B

  2. 在默認情況下,變量名賦值會創建或者改變本地作用域變量

 

 

問題:

  v = 100

  defchange_v(a):

      v = a  #  請問能修改全局的v嗎?

 

  change_v(200)

 

global 語句

  作用:

    1. 告訴解釋器,global語句聲明的一個或多個變量,這些變量的作用域爲模塊級的作用域(也稱作全局變量)

    2. 全局聲明(global)將賦值的變量映射到模塊文件內部的作用域

  語法:

    global 變量1, 變量2, ...

  示例:

    global v, a,b, c

    global d

  示例見:

    global.py

 

  global說明

    1. 全局變量如果要在函數內部被賦值,則必須經過全局 聲明(否則會被認爲是局部變量)

    2. 全局變量在函數內部不經過聲明就可以直接訪問

    3.不能先創建局部變量,再用global聲明爲全局變量,此做法不附合規則

    4. global變量列表裏的變量名不能出現在此作用域內形參列表裏

 

 

 

練習:

  寫一個函數

    defhello(name):

        ...  此處自己實現

 

    count =0  # 此變量用來記錄hello函數被調用的次數

    hello("小張")

    hello("小李")

    print("函數hello已經被調用%d次" % count ) # 2

    hello("小趙")

    print("函數hello已經被調用%d次" % count ) # 3

 

nonlocal 語句

  作用:

    告訴解釋器,nonlocal聲明的變量不是局部變量,也不是全局變量,而是外部嵌套函數內的變量

 

  nonlocal的語法

    nonlocal 變量名1,變量名2, ...

  示例見:

    nonlocal.py

 

  說明:

    1. nonlocal 語句只能在被嵌套的函數內部進行使用

    2. 訪問nonlocal變量將對外部嵌套函數作用域內的變量進行操作

    3. 當有兩層或兩層以上函數嵌套時,訪問nonlocal變量只對最近一層的變量進行操作

    4. nonlocal語句的變量列表裏的變量名,不能出現在此函數參數列表中

 

 

問題:

  請問'def 語句' 幹什麼用的?

 

lambda 表達式(又稱匿名函數)

  作用:

    創建一個匿名函數對象

    同 def類似,但不提供函數名

  語法格式:

    lambda [形參1, 形參2, ...] : 表達式

  示例見:

    lambda.py

  說明:

    1. lambda 只是一個表達式,它用來創建一個函數對象

    2. 當lambda表達式調用時,先執行冒號(:)後的表達式,並返回表達式的結果的引用

    3. lambda 表達式創建的函數只能包含一條表達式

4. lambda比函數簡單且可以隨時創建和銷燬,有利於減少程序的偶合度

 

eval()/exec()函數

eval(source,globals=none,local=none)

把一個字符串srouce

 

 

 

 

 

 

 

 

 

 

 

 

 

發佈了33 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章