日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

[Python3] 020 借函数,谈一谈变量的作用域

發布時間:2024/10/12 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Python3] 020 借函数,谈一谈变量的作用域 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 1. 概述
  • 2. 分類
  • 3. 變量的作用范圍
    • 少廢話,上例子
  • 4. 將局部變量提升為全局變量
    • 少廢話,上例子
  • 5. 內建函數 globals() 與 locals()
    • 少廢話,上例子
  • 6. 邪惡的 eval() 與 執行者 exec()
    • (1) eval()
    • (2) exec()
  • 7. 遞歸函數
    • (1) 概述
    • (2) 少廢話,上例子

1. 概述

  • 從“變量作用域”這個詞不難看出:變量有作用范圍限制

2. 分類

  • 按照作用域分類
  • 全局(global):在函數外部定義
  • 局部(local):在函數內部定義

  • 3. 變量的作用范圍

    • 全局變量:在整個全局范圍都有效
      • 全局變量在局部可以使用(即,在函數內部可以使用在函數外部定義的變量)
    • 局部變量:僅在特定的局部范圍內有效
      • 局部變量在出了自己的范圍后就無法使用
    • LEGB 原則
      • L(Local)局部作用域
      • E(Enclosing function locale)外部嵌套函數作用域
      • G(Global module)函數定義所在模塊作用域
      • B(Builtin):python 內置模塊的作用域
      • LEGB 規定了查找一個名稱的順序為:local-->enclosing function locals-->global-->builtin

    少廢話,上例子

    # 例1num1 = 100 # 全局變量def func():print("num1 =", num1)num2 = 99 # 局部變量print("num2 =", num2)return Noneprint("num1 =", num1) func() print("num2 =", num2)
    • 運行結果

    num1 = 100
    num1 = 100
    num2 = 99

    ---------------------------------------------------------------------------
    NameError……name 'num2' is not defined


    4. 將局部變量提升為全局變量

    • 使用 global

    少廢話,上例子

    # 例2def func():global num1num1 = 100print("num1 =", num1)num2 = 99print("num2 =", num2)return Nonefunc() print("num1 =", num1)
    • 運行結果

    num1 = 100
    num2 = 99
    num1 = 100


    5. 內建函數 globals() 與 locals()

    • 通過 globals() 和 locals() 可以顯示出全局變量和局部變量

    少廢話,上例子

    # 例3num1 = 1 num2 = 2def func(n1, n2):n3 = 666print("Local s= {0}".format(locals()))print("Globals = {0}".format(globals()))return Nonefunc(11, 22)
    • 運行結果

    Locals = {'n1': 11, 'n2': 22, 'n3': 666}
    Globals = {'name': 'main', 'doc': None, 'package': None, 'loader': <_frozen_importlib_external.SourceFileLoader object at 0x000001C21D86E940>, 'spec': None, 'annotations': {}, 'builtins': <module 'builtins' (built-in)>, 'file': '.\globals & locals.py', 'cached': None, 'num1': 1, 'num2': 2, 'func': <function func at 0x000001C21D82C2F0>}


    6. 邪惡的 eval() 與 執行者 exec()

    (1) eval()

    • 把一個字符串當成一個表達式來執行, 返回表達式執行后的結果
    • 示例
    # 例4 eval(string_code, globals=None, locals=None)num1 = 100 num2 = 200num3 = num1 + num2 num4 = eval("num1+num2")print(num3) print(num4)
    • 運行結果

    300
    300


    (2) exec()

    • 跟 eval() 功能類似, 但 exec() 不返回結果
    • 示例
    # 例5 exec(string_code, globals=None, locals=None)num1 = 100 num2 = 200num3 = num1 + num2 num4 = exec("print('num1 + num2 =', num1+num2)")print(num3) print(num4)
    • 運行結果

    num1 + num2 = 300
    300
    None


    7. 遞歸函數

    (1) 概述

    • 簡單地說,就是“我調用我自己”
    • 優點:簡潔,容易理解
    • 缺點:對遞歸深度有限制,消耗資源大
      • python 對遞歸深度有限制,超過限制報錯
      • 也可以手動更改遞歸深度
    • 寫遞歸程序時,要注意結束條件

    (2) 少廢話,上例子

    # 例6 錯誤示范num = 0def func(): # 會暴走的global numnum += 1print(num)func() # 調用自己return Nonefunc()
    • 運行結果

    先是像 excel 一樣,縱向數字累加,然后拋出異常。

    RecursionError……maximum recursion depth exceeded while calling a Python object

    遞歸錯誤:調用 python 對象時超過了最大遞歸深度。


    # 例7 斐波那契額數列 # 數學公式為: f(1) = 1, f(2) = 1, ... f(n) = f(n-1) + f(n-2)def fib(n): # n 表示斐波那契數列的第 n 個數if n == 1 or n ==2: # or 表示或者return 1return fib(n-1) + fib(n-2)print(fib(10))
    • 運行結果

    55

    轉載于:https://www.cnblogs.com/yorkyu/p/10297787.html

    總結

    以上是生活随笔為你收集整理的[Python3] 020 借函数,谈一谈变量的作用域的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。