鐵樂學Python_day10_函數2

来源:https://www.cnblogs.com/tielemao/archive/2018/03/30/8678447.html
-Advertisement-
Play Games

今天書接昨天的函數繼續去學習瞭解: 昨天說到函數的動態參數。 1、函數的【動態參數】 2、函數中【\ 和 的魔法運用】 在函數的調用(執行)時, 加一個可迭代對象(列表,元祖,字元串,字典等)代表解包, (列表元祖打散成列表中的每個元素,字元串打散成每個字元,字典打散成每個鍵) 並將元素一 一添加進 ...


今天書接昨天的函數繼續去學習瞭解:
昨天說到函數的動態參數。

1、函數的【動態參數】

*args 動態參數,萬能參數
args接受的就是實參對應的所有剩餘的位置參數,並將其放在元組( )中。

def func(x, y, z, *args):
   print(x, y, z)
   print(args)

func(1, 2, 'a', 'b', 'c', 34)

1 2 a
('b', 'c', 34)
**kwargs 動態參數
將非位置對應的所有的關鍵字參數放到一個字典{  }中。
(排除形參中位置參數對應的實參中的關鍵字參數)
def func(x, y, z, *args, sex='男', **kwargs):
   print(x, y, z)
   print(args)
   print(sex)
   print(kwargs)

func(1, 2, 'a', 'b', 'c', 34, m='yue', n=12, sex='女', p='r')

1 2 a
('b', 'c', 34)
女
{'m': 'yue', 'p': 'r', 'n': 12}

從形參的角度來看,它們的順序應為:
位置參數在最前,*args次之,
預設參數因為形式上是關鍵字參數的式樣故要排在*args後,而要在**kwargs之前。
(位置參數,*args,預設參數,**kwargs)

2、函數中【*和**的魔法運用】

在函數的調用(執行)時,*加一個可迭代對象(列表,元祖,字元串,字典等)代表解包,
(列表元祖打散成列表中的每個元素,字元串打散成每個字元,字典打散成每個鍵)
並將元素一 一添加進args。

如下例:

def func(*args):
    return args
l1 = [1, 2, 30]
l2 = [1, 2, 33, 21, 45, 60]
# 要求將l1 和 l2 轉化成元祖,
# 並且裡面包含所有l1和l2的每一個元素,相同元素也得重覆。
# 解:
tu = func(*l1, *l2)
print(tu)

(1, 2, 30, 1, 2, 33, 21, 45, 60)

也可以簡單理解成*是求可迭代對象的每一個元素。

而在函數的定義時,*args代表的是聚合(打包成元祖)

**運用只限於字典(因它存在有鍵值對,可兩兩對應上),
同樣在函數的調用執行時,**dict(一個字典對象),代表將字典所有的鍵值對放到kwargs字典里。
(解包打散字典)

例:
def func(**kwargs):
    return kwargs
dic = {'name':'tiele', 'age':18, 'hobby':'下棋'}
dic2 = {'name2':'mao', 'age2':5, 'hobby2':'曬太陽'}
# 字典的鍵得是唯一,如果兩個字典同鍵雖然不同值,執行下麵函數的**運用也會報錯
dic3 = func(**dic, **dic2)
print(dic3)

{'name': 'tiele', 'age': 18, 'hobby2': '曬太陽', 'hobby': '下棋', 'age2': 5, 'name2': 'mao'}


在函數定義時,**kwargs代表的是聚合(成字典)

3、全局命名空間、局部命名空間、內置命名空間

名稱空間:放置變數與對應的值(有的還有記憶體地址對應)的關係;

全局命名空間,放置變數與對應的值(有的還有記憶體地址對應)的關係的名稱空間。

當執行函數的時候,記憶體開闢出一個臨時名稱空間(又叫局部命名空間),存放該函數內的變數與值的關係。
隨著函數的執行完畢,臨時名稱空間也隨之關閉。

內置名稱空間,(python的內置函數),所有的內置函數等存儲的空間。

4、順序與函數的嵌套

載入順序:
內置名稱空間--->全局名稱空間--->(函數執行時)--->局部名稱空間。

取值順序:
剛好與載入順序相反,優先順序為:
局部名稱空間--->全局名稱空間--->內置名稱空間。

函數的嵌套:
函數在被調用的時候才執行;函數裡面同樣代碼遵循從上至下依次執行;

5、作用域

作用域就是作用範圍,按照生效範圍可以分為全局作用域和局部作用域。
全局作用域:包含內置名稱空間、全局名稱空間,在整個文件的任意位置都能被引用、全局有效。
局部作用域:局部名稱空間,只能在局部範圍內生效。

由作用域引申出兩個函數方法globals()和locals()
例:

def func():
    a = 33
    b = 22
    print(locals())
    print(globals())

func()
c = 40
print(locals())

{'a': 33, 'b': 22}
{'__name__': '__main__', '__spec__': None, 'func': <function func at 0x0000000000755488>, '__builtins__': <module 'builtins' (built-in)>,
 '__cached__': None, '__file__': 'E:/Python/day10/筆記.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000066E048>, 
'__doc__': None, '__package__': None}

{'__file__': 'E:/Python/day10/筆記.py',
 '__name__': '__main__', '__spec__': None, 
'__builtins__': <module 'builtins' (built-in)>, 
'__doc__': None, 'c': 40, 
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000009AE048>, 
'__cached__': None, '__package__': None, 
'func': <function func at 0x0000000000D85488>}


由上例可以看到,函數中locals存儲的是{'a': 33, 'b': 22}

因為它的作用域是在局部命名空間中,所以它存儲的變數和值並不多,而在函數之外再列印的locals就不同了,它的作用域擴大了,但是不包括局部,所以裡面的值里可以找到'c':40而找不到a,b的值。

在函數中使用locals()方法可以很方便返回在這個臨時命名空間作用域中所有的變數的值,呈字典返回,所以還是有它常用到的地方的。

global關鍵字,nonlocal關鍵字:

global:
1、聲明一個全局變數。
2、在局部作用域想要對全局作用域的全局變數進行修改時,需要用到global(限於字元串,數字)。

例:

a = 2
def func():
    a = 5
func()
print(a)  #這時候a返回的是2

a = 2
def func():
    global a
    a = 5
func()
print(a)  #使用了global後返回的是5

註:對可變數據類型(list,dict,set)可以直接引用不用通過global。

li = [1,2,3]
dic = {'a':'b'}

def change():
    li.append('a')
    dic['q'] = 'g'
    print(dic)
    print(li)
change()
print(li)
print(dic)

{'a': 'b', 'q': 'g'}
[1, 2, 3, 'a']
[1, 2, 3, 'a']
{'a': 'b', 'q': 'g'}

nonlocal:
  1、不能修改全局變數。
  2、在局部作用域中,對父級作用域(或者更外層作用域非全局作用域)的變數進行引用和修改,並且引用的哪層,從那層及以下此變數全部發生改變。

def add_b():
    b = 42
    def do_global():
        b = 10
        print(b)
        def dd_nonlocal():
            nonlocal b
            b = b + 20
            print(b)
        dd_nonlocal()
        print(b)
    do_global()
    print(b)

add_b()

10
30
30
42

end


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Struts2框架 一、什麼是Struts2 Struts2是一個基於MVC設計模式的Web應用框架,它本質上相當於一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的數據交互。Struts 2是Struts的下一代產品,是在 struts 1和 ...
  • 破解intelij IDEA請見鏈接:https://blog.csdn.net/weixin_37937646/article/details/79119540 ...
  • 1.編譯 go build hello.go 2.go get gopl.io/ch1/helloworld 命令,就會從網上獲取代碼,並放到對應目錄中 下載的代碼會放在$GOPATH/src/gopl.io/ch1/helloworld目錄 3.Go語言不需要在語句或者聲明的末尾添加分號,除非一行 ...
  • 1、指定序列化順序 預設fastjson序列化一個java bean,是根據fieldName的字母序進行序列化的,你可以通過ordinal指定欄位的順序。這個特性需要1.1.42以上版本。 1 public static class VO { 2 @JSONField(ordinal = 3) 3 ...
  • Idea 作為一個每天有一半時間都在電腦旁的人,無時無刻不在敲擊著鍵盤,點擊著滑鼠。有一天,我突然很想知道在一天的時間內,在我輕盈的指法下麵,鍵盤被我狂敲了多少下,滑鼠又被我點擊了多少次。甚至更具體一些,鍵盤上哪些鍵挨的敲擊次數更多呢?想想也覺得挺有意思的。 <! more Learing 有了想法 ...
  • 1,大小寫翻轉 2,從一串字元串中,提取純數字組合 等價於: 3,統計字元的出現次數,以字元為鍵,大小寫視為相同字元 4,字元串去重,按原來的順序輸出 5,字元串反轉 6,去除字元串中的數字,然後排序,如果出現相同的字母,如aA,大寫字母排在小寫字母的前面 ...
  • Problem Description 在每年的校賽里,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎? Input 輸入包括多組數據。每組數據第一行是兩個 ...
  • 1,二進位方式 2,移位運算符( >> << ): 箭頭向左就是 向左移位 反正 箭頭向右 就是向右位移,移位針對的是二進位 如,十進位的1 > 對應的二進位是 0000 0001 1 << 1 : 向左移動1位 0000 0001 >0000 0010( 2 ) 1 << 2 : 向左移動2位 0 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...