课时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.mzph.cn/news/388838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

盛严谨,严谨,再严谨。_评估员工调查的统计严谨性

盛严谨,严谨,再严谨。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 …

开根号的笔算算法图解_一个数的开根号怎么计算

一个数的开根号怎么计算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 …

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 …

大理石在哪儿 (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…

mysql 迁移到tidb_通过从MySQL迁移到TiDB来水平扩展Hive Metastore数据库

mysql 迁移到tidbIndustry: Knowledge Sharing行业&#xff1a;知识共享 Author: Mengyu Hu (Platform Engineer at Zhihu)作者&#xff1a;胡梦瑜(Zhhu的平台工程师) Zhihu which means “Do you know?” in classical Chinese, is the Quora of China: a question-and-ans…

XCode、Objective-C、Cocoa 说的是几样东西

大部分有一点其他平台开发基础的初学者看到XCode&#xff0c;第一感想是磨拳擦掌&#xff0c;看到 Interface Builder之后&#xff0c;第一感想是跃跃欲试&#xff0c;而看到Objective-C的语法&#xff0c;第一感想就变成就望而却步了。好吧&#xff0c;我是在说我自己。 如果…

递归函数基例和链条_链条和叉子

递归函数基例和链条因果推论 (Causal Inference) This is the fifth post on the series we work our way through “Causal Inference In Statistics” a nice Primer co-authored by Judea Pearl himself.这是本系列的第五篇文章&#xff0c;我们通过“因果统计推断”一书进行…

java lock 信号_java各种锁(ReentrantLock,Semaphore,CountDownLatch)的实现原理

先放结论&#xff1a;主要是实现AbstractQueuedSynchronizer中进入和退出函数&#xff0c;控制不同的进入和退出条件&#xff0c;实现适用于各种场景下的锁。JAVA中对于线程的同步提供了多种锁机制&#xff0c;比较著名的有可重入锁ReentrantLock&#xff0c;信号量机制Semapho…

Intent.ACTION_MAIN

1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开始。比较常用。 Input:nothing Output:nothing 例如&#xff1a; 1 <activity android:name".Main"android:label"string/app_name">2 <intent-filter…

足球预测_预测足球热

足球预测By Aditya Pethe通过阿蒂亚皮特(Aditya Pethe) From September to January every year, football takes over America. Games dominate TV Sunday and Monday nights, and my brother tears his hair out each week over his consistently underperforming fantasy te…

C#的特性Attribute

一、什么是特性 特性是用于在运行时传递程序中各种元素&#xff08;比如类、方法、结构、枚举、组件等&#xff09;的行为信息的声明性标签&#xff0c;这个标签可以有多个。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号&am…

python3中朴素贝叶斯_贝叶斯统计:Python中从零开始的都会都市

python3中朴素贝叶斯你在这里 (You are here) If you’re reading this, odds are: (1) you’re interested in bayesian statistics but (2) you have no idea how Markov Chain Monte Carlo (MCMC) sampling methods work, and (3) you realize that all but the simplest, t…

【转载】移动端布局概念总结

布局准备工作及布局思想及概念: 一个显示器&#xff08;pc端显示器 及 手机屏显示器&#xff09;&#xff0c;既有物理像素&#xff0c;又有独立像素&#xff08;独立像素也叫作css像素&#xff0c;用于前端人员使用&#xff09;&#xff1b; -->重要 首先确定设计稿的尺寸…

深入浅出:HTTP/2

上篇文章深入浅出&#xff1a;5G和HTTP里给自己挖了一根深坑&#xff0c;说是要写一篇关于HTTP/2的文章&#xff0c;今天来还账了。 本文分为以下几个部分&#xff1a; HTTP/2的背景HTTP/2的特点HTTP/2的协议分析HTTP/2的支持 HTTP/2简介 HTTP/2主要是为了解决现HTTP 1.1性能不…

画了个Android

画了个Android 今晚瞎折腾&#xff0c;闲着没事画了个机器人——android&#xff0c;浪费了一个晚上的时间。画这丫还真不容易&#xff0c;为那些坐标&#xff0c;差点砸了键盘&#xff0c;好在最后画出个有模有样的&#xff0c;心稍安。 下面来看看画这么个机器人需要些什么东…

数据治理 主数据 元数据_我们对数据治理的误解

数据治理 主数据 元数据Data governance is top of mind for many of my customers, particularly in light of GDPR, CCPA, COVID-19, and any number of other acronyms that speak to the increasing importance of data management when it comes to protecting user data.…

提高机器学习质量的想法_如何提高机器学习的数据质量?

提高机器学习质量的想法The ultimate goal of every data scientist or Machine Learning evangelist is to create a better model with higher predictive accuracy. However, in the pursuit of fine-tuning hyperparameters or improving modeling algorithms, data might …

mysql 集群实践_MySQL Cluster集群探索与实践

MySQL集群是一种在无共享架构(SNA&#xff0c;Share Nothing Architecture)系统里应用内存数据库集群的技术。这种无共享的架构可以使得系统使用低廉的硬件获取高的可扩展性。MySQL集群是一种分布式设计&#xff0c;目标是要达到没有任何单点故障点。因此&#xff0c;任何组成部…

matlab散点图折线图_什么是散点图以及何时使用

matlab散点图折线图When you were learning algebra back in high school, you might not have realized that one day you would need to create a scatter plot to demonstrate real-world results.当您在高中学习代数时&#xff0c;您可能没有意识到有一天需要创建一个散点图…