課時20:內嵌函數和閉包

目錄:

  一、global關鍵字

  二、內嵌函數

  三、閉包

  四、課時20課后習題及答案

?

********************

一、global關鍵字

********************

全局變量的作用域是整個模塊(整個代碼段),也就是代碼段內所有的函數內部都可以訪問到全局變量。但是要注意一點,在函數內部僅僅去訪問全局變量就好,不要試圖去修改它。

因為那樣的話,Python會使用屏蔽的方式”保護“全局變量:一旦函數內部試圖修改全局變量,Python就會在函數內部自動創建一個名字一模一樣的局部變量,這樣修改的結果只會修改到局部變量,而不會影響到全局變量。看下面的例子:

>>> count=5
>>> def myFun():count = 10print(count)>>> myFun()
10
>>> count
5

如果覺得有必要在函數中去修改這個全局變量,那么你不妨可以使用global關鍵字來達到目的!修改程序如下:

>>> count=5
>>> def myFun():global countcount = 10print(count)>>> myFun()
10
>>> count
10

?

二、內嵌函數

****************

?Python函數定義是可以嵌套的,也就是允許在函數的內部創建另外一個函數,這種函數叫做內嵌函數或者內部函數。舉個例子:

>>> def fun1():print("fun1()正在被調用")def fun2():print("fun2()正在被調用")fun2()>>> fun1()
fun1()正在被調用
fun2()正在被調用

值得注意的是:就是內部函數整個作用域都在外部函數之內。

另外需要注意的地方:如果在fun1()外部試圖調用內部函數fun2(),就會報錯:

>>> fun2()
Traceback (most recent call last):File "<pyshell#45>", line 1, in <module>fun2()
NameError: name 'fun2' is not defined

?

***********

三、閉包

***********

?閉包是函數編程的一個重要的語法結構,函數式編程是一種編程范式,著名的函數式編程語言就是LISP語言。

Python中閉包從表現形式上定義為:如果在一個內部函數內(funY就是這個內部函數),對外部作用域(但不是在全局作用域)的變量進行引用(x就是被引用的變量,x在外部作用域funX里面,但不在全局作用域里),那么內部函數就被認為是閉包。

>>> def funX(x):def funY(y):return x*yreturn funY>>> i = funX(8)
>>> i
<function funX.<locals>.funY at 0x0000017296857488>
>>> type(i)
<class 'function'>
>>> type(funX)
<class 'function'>
>>> funX
<function funX at 0x0000017296857598>
>>> i(5)
40

也可以直接這樣寫:

>>> funX(8)(5)
40

使用閉包時,需要注意的是:因為閉包的概念就是由內部函數而來的,所以也不能在外部函數以外的地方對內部函數進行調用:

>>> funY(5)
Traceback (most recent call last):File "<pyshell#58>", line 1, in <module>funY(5)
NameError: name 'funY' is not defined

在閉包中,外部函數的局部變量對應內部函數的局部變量,實際上就相當于之前講的全局變量跟局部變量的關系,在內部函數中,你只能對外部函數的局部變量進行訪問,但不能進行修改。

>>> def funX():x = 5def funY():x *= xreturn xreturn funY>>> funX()()
Traceback (most recent call last):File "<pyshell#61>", line 1, in <module>funX()()File "<pyshell#60>", line 4, in funYx *= x
UnboundLocalError: local variable 'x' referenced before assignment

這個錯誤信息跟之前講解全局變量的時候基本一樣,Python認為在內部函數的x是局部變量的時候,外部函數的x就被屏蔽了起來,所以執行x *= x的時候,在右邊根本找不到局部變量x的值,因此報錯。

在Python3以前并沒有直接的方案進行解決,只能間接的通過容器類型來存放,因為容器類型不是放在棧里,所以不會被‘屏蔽’掉。

>>> def funX():x = [5]def funY():x[0] *= x[0]return x[0]return funY>>> funX()()
25

在Python3里有了改進。如果希望在內部函數里可以修改外部函數里的局部變量的值,用關鍵字nonlocal。

>>> def funX():x = 5def funY():nonlocal xx *= xreturn xreturn funY>>> funX()()
25

擴展閱讀-->游戲中的移動角色:閉包在實際開發中的作用:(地址是:https://fishc.com.cn/thread-42656-1-1.html)

?

*******************************

四、課時20課后習題及答案

*******************************

?

?

轉載于:https://www.cnblogs.com/DC0307/p/9473305.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388838.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388838.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388838.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零開始學產品第六篇:更強大的測試,自動化測試和性能測試

本篇為【從零開始學產品】系列課第1章第5節歡迎到公眾號菜單欄&#xff0c;獲取產品經理課程更多資料 “測試就是拿點鼠標在電腦上瞎點&#xff0c;或者是用手機隨便戳幾下么&#xff1f;” “不&#xff0c;是有計劃有意圖的測試&#xff0c;比如說&#xff0c;邊界測試&#…

Get 了濾鏡、動畫、AR 特效,速來炫出你的短視頻開發特技!

在濾鏡美顏、搞怪特效、炫酷場景等各種新奇玩法驅動下&#xff0c;短視頻開始讓人上癮。 12 月 3 日&#xff0c;七牛云聯合八大短視頻特效平臺共同推出了中國短視頻開發者創意大賽&#xff08;China Short Video Contest&#xff09;&#xff0c;面向全國邀請廣大開發者&#…

匿名函數、冒泡排序,二分法, 遞歸

匿名函數 lambda 匿名函數 格式 lambda 參數&#xff1a;返回值 函數名統一叫lambda&#xff0c;最多只能寫一行普通的正常的函數 def func(n):return n * n lambda匿名函數寫法 a lambda n : n**2 print(a(3)) 當有多個返回值時suiyi lambda x, y : (1, 2) # 筆試題 …

Redis源碼剖析

Redis源碼剖析和注釋&#xff08;一&#xff09;---鏈表結構 Redis源碼剖析和注釋&#xff08;二&#xff09;--- 簡單動態字符串 Redis源碼剖析和注釋&#xff08;三&#xff09;--- Redis 字典結構 Redis源碼剖析和注釋&#xff08;四&#xff09;--- 跳躍表(skiplist) Redis…

Android Activity生命周期

Android生命周期 Android的生命周期&#xff1a;onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy() 如下圖所示&#xff1a; 1.當activity啟動時系統會先調用onCreate(),然后調用onStart(),最后調用**onResume()**方法&#xff0…

date數據存入mysql_Date對象存入mysql數據庫

java.sql.Date,java.sql.Time和java.sql.Timestamp三個都是java.util.Date的子類(包裝類)。java.sql.Date是java.util.Date的子類&#xff0c;是一個包裝了毫秒值的瘦包裝器&#xff0c;允許 JDBC 將毫秒值標識為 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以…

盛嚴謹,嚴謹,再嚴謹。_評估員工調查的統計嚴謹性

盛嚴謹,嚴謹,再嚴謹。The human resources industry relies heavily on a wide range of assessments to support its functions. In fact, to ensure unbiased and fair hiring practices the US department of labor maintains a set of guidelines (Uniform Guidelines) to …

復權就是對股價和成交量進行權息修

* 所謂復權就是對股價和成交量進行權息修復,按照股票的實際漲跌繪制股價走勢圖, * 并把成交量調整為相同的股本口徑。股票除權、除息之后&#xff0c;股價隨之產生了變化&#xff0c; * 但實際成本并沒有變化。 * 如&#xff1a;原來20元的股票&#xff0c;十送十之…

前端校驗和后端校驗

問&#xff1a;到底是前端校驗好還是后端校驗好呢&#xff1f; 答&#xff1a;后端校驗比前端校驗更安全&#xff0c;更可靠&#xff0c;前端校驗可以增加用戶體驗&#xff0c;一般來說&#xff0c;在前端校驗的東西在后端也必須校驗&#xff08;比如登陸用戶名、密碼&#xff…

[MySQL] INFORMATION_SCHEMA 數據庫包含所有表的字段

sql注入后可以通過該數據庫獲取所有表的字段信息1. COLLATIONS表 提供有關每個字符集的排序規則的信息。 COLLATIONS表包含以下列&#xff1a;COLLATION_NAME 排序規則名稱。 CHARACTER_SET_NAME 與排序規則關聯的字符集的名稱。 ID 排序規則ID。 IS_DEFAULT 排序規則是否為其字…

開根號的筆算算法圖解_一個數的開根號怎么計算

一個數的開根號怎么計算2020-11-08 15:46:47文/鐘詩賀帶根號的式子可以直接進行開平方的運算。一些特殊的根號運算有;√2≈1.414、1/2-√3≈0.5-1.732≈-1.232、2√5≈22.236≈4.236、√7-√6≈2.646-2.449≈0.197。開平方的筆算方法1&#xff0e;將被開方數的整數部分從個位起…

arima 預測模型_預測未來:學習使用Arima模型進行預測

arima 預測模型XTS對象 (XTS Objects) If you’re not using XTS objects to perform your forecasting in R, then you are likely missing out! The major benefits that we’ll explore throughout are that these objects are a lot easier to work with when it comes to …

net程序員的iPhone開發-MonoTouch

net程序員的iPhone開發-MonoTouch iPhone軟件的Native開發除了使用Apple推薦的Objective-C Cocoa之外&#xff0c;也有其他的一些工具和SDK提供 基于WEB的形式的一些框架在下面這個文章介紹過 各種SmartPhone上的跨平臺開源框架的總結 http://www.cnblogs.com/2018/archive/20…

ASP防止SQL注入

防止SQL注入http://0.0.0.0/bzhs/login.asp?logTypeedit;WAITFOR DELAY 0:0:5 --logType Replace(Replace(Replace(Replace(logType,"-",""),"",""),"&",""),";","")fcdm Replace(Rep…

protobuf java 生成_protobuf代碼生成

windows :1,兩個文件&#xff1a;proto.exe, protobuf-java-2.4.1.jar2,建立一個工程TestPb&#xff0c;在下面建立一個proto文件件&#xff0c;用來存放【。proto】文件3&#xff0c;將proto,exe放在工程下&#xff0c;4&#xff0c;建立一個msg.proto文件&#xff1a;option …

bigquery_在BigQuery中鏈接多個SQL查詢

bigqueryBigquery is a fantastic tool! It lets you do really powerful analytics works all using SQL like syntax.Bigquery是一個很棒的工具&#xff01; 它使您能夠使用像語法一樣SQL來進行真正強大的分析工作。 But it lacks chaining the SQL queries. We cannot run …

允許指定IP訪問遠程桌面

允許指定IP訪問遠程桌面 電腦軟件 2010-01-23 02:33:40 閱讀595 評論0 字號&#xff1a;大 中 小 訂閱 一、新建IP安全策略 WINR打開運行對話框&#xff0c;輸入gpedit.msc進入組策略編輯器。 依次打開“本地計算機”策略--計算機配置--Windows設置--安全設置--IP安…

大理石在哪兒 (Where is the Marble?,UVa 10474)

題目描述&#xff1a;算法競賽入門經典例題5-1 1 #include <iostream>2 #include <algorithm>3 using namespace std;4 int maxn 10000 ;5 int main()6 {7 int n,q,a[maxn] ,k0;8 while(scanf("%d%d",&n,&q)2 && n &&q…

Volley 源碼解析之網絡請求

Volley源碼分析三部曲Volley 源碼解析之網絡請求Volley 源碼解析之圖片請求Volley 源碼解析之緩存機制 Volley 是 Google 推出的一款網絡通信框架&#xff0c;非常適合數據量小、通信頻繁的網絡請求&#xff0c;支持并發、緩存和容易擴展、調試等&#xff1b;不過不太適合下載大…

為什么修改了ie級別里的activex控件為啟用后,還是無法下載,顯示還是ie級別設置太高?

如果下載插件時下載不了&#xff0c;這樣設置&#xff0c;打開IE選工具/Internet 選項/安全/自定義級別/設置中的ActiveX控件自動提示“禁用”。 對標記為可安全執行腳本ActiveX控件執行腳本“啟用” 對沒有標記為安全的ActiveX初始化和腳本運行“啟用”&#xff08;下載插件后…