(小甲鱼python)函数笔记合集四 函数(IV)总结 函数中参数的作用域 局部作用域 全局作用域 global语句 嵌套函数 nonlocal语句等详解

news2024/9/23 13:27:49

一、基础复习

  1. 函数的基本用法 创建和调用函数 函数的形参与实参等等
  2. 函数的几种参数 位置参数、关键字参数、默认参数等
  3. 函数的收集参数*args **args 解包参数详解

二、函数中参数的作用域

作用域:一个变量可以被访问的范围,一个变量的作用域总是由它在代码中被赋值的位置来决定的。

1.局部作用域
局部变量:如果一个变量定义的位置是在一个函数的里面,那么它的作用域就仅限于该函数中。

>>> def myfunc():
	x=520
	print(x)

	
>>> myfunc()    # x为局部变量
520
>>> 
>>> print(x)   # 在外部访问会报错
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    print(x)
NameError: name 'x' is not defined

2.全局作用域
全局变量:如果是在任何函数的外部定义一个变量,那么它的作用域就是全局的。

>>> x=880
>>> def myfunc():
	print(x)
	
>>> myfunc()    # x为全局变量
880

在一个函数中,局部变量和全局变量同名都为x时,局部变量就会覆盖掉全局变量。

>>> x=880
>>> def myfunc():
	x=520
	print(x)

>>> myfunc()     #打印局部变量x的值
520
>>> print(x)       #出了函数,打印全局变量
880
>>> 

通过id()函数查看全局变量和局部变量。
#例1:
函数内部如果没有同名的局部变量覆盖的话,它打印的这个id()就是上面全局变量的id

>>> x=880
>>> id(x)
2579527195760
>>> def myfunc():
	print(id(x))

>>> myfunc() #函数内部如果没有同名的局部变量覆盖的话,它打印的这个id()就是上面全局变量的id
2579527195760
>>> 

#例2:
局部变量的id值和全局变量的id值不同。

>>> x=880
>>> id(x)
2579527195760
>>> def myfunc():
	x=520
	print(id(x))

>>> myfunc()   # id值不同
2579527920528
>>> 

3.global语句
global语句在函数内部修改全局变量的值。
使用global语句,可以让函数内的局部变量全局可用,并且在别的文件里也可以引用到。

>>> x=880
>>> def myfunc():
	global x     # global语句可以让函数内的局部变量全局可用。
	x=520
	print(x)

>>> myfunc()   
520
>>> print(x)  # 全局变量x=880被global语句修改为520
520

4.嵌套函数
函数嵌套函数

#内部函数无法被调用
>>> def funA():
	x=520
	def funB():
		x=880
		print("In funB,x=",x)
	print("In funA,x=",x)

>>> funB()  #内部函数无法被调用
Traceback (most recent call last):
  File "<pyshell#47>", line 1, in <module>
    funB()
NameError: name 'funB' is not defined

要想调用funB()函数,在定义时就要调用。

>>> def funA():
	x=520
	def funB():
		x=880
		print("In funB,x=",x)
	funB()   # 调用funB()函数,在定义时就要调用。
	print("In funA,x=",x)

>>> funA()
In funB,x= 880
In funA,x= 520
>>> 

5.nonlocal语句
nonlocal语句:在内部函数修改外部函数的变量。
nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。

>>> def funA():
	x=520
	def funB():
		nonlocal x    # nonlocal语句修改了外部变量x=520的这个值。
		x=880
		print("In funB,x=",x)
	funB()
	print("In funA,x=",x)

>>> funA()
In funB,x= 880
In funA,x= 880
>>> 

6.LEGB规则

函数作用域之间的影响范围存在相互覆盖的情况,冲突出现时遵从LEGB规则。

L>E>G>B

  • L是local,局部作用域
  • E是Enclosed,是嵌套函数外层函数作用域
  • G是Global,是全局作用域。
  • B是Build-In,是内置作用域。

全局作用域局部作用域发生冲突时,python使用局部作用域的变量(除非使用global语句进行特殊说明)。
函数嵌套发生的时候,局部作用域又会覆盖外层函数这个作用域(除非使用nonlocal语句进行说明)
B是Build-In,只要起一个变量名和它相同,就足以把这个内置函数给毁了。

>>> str="小甲鱼把str给毁咯"
>>> str(520)   #前面已经把str作为变量名赋值,现在它相当于一个全局变量。+
Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    str(520)
TypeError: 'str' object is not callable
>>> str
'小甲鱼把str给毁咯'

课后题:
1.为什么小甲鱼在视频中说,Python 的阻止局部变量覆盖全局变量的做法,是一种出于对代码的 “保护” 的表现?
答:大家不妨设想一下,当一个程序很庞大的时候,自然就会有很多全局变量和函数,那么在函数中,很容易就会出现局部变量和全局变量同名的情况,如果没有这种“保护”,全局变量将面目全非,而且这种BUG非常不好调试!
2.学了这节课,你觉得除了通过参数给函数传递信息之外,还有什么途径可以传递信息到函数内部呢?
答:还可以通过全局变量传递信息。
3. 请问下面代码会打印什么呢?

>>> x = [1, 2, 3]
>>> def invert(x):
...     x = x[::-1]
...
>>> invert(x)
>>> print(x)
>>> # 请问这里会打印什么内容?

答:[1, 2, 3]
解析:见下题解析。
4.请问下面代码会打印什么呢?

>>> x = [1, 2, 3]
>>> def invert(x):
...     x[:] = x[::-1]
...
>>> invert(x)
>>> print(x)
>>> # 请问这里会打印什么内容?

答: [3, 2, 1]
解析:为什么上一题在函数内部执行 x = x[::-1] 语句,出了函数就还原;而这一题在函数内部执行 x[:] = x[::-1] 语句,则能够从根本上修改列表呢?
现在假设代码如下:

>>> x = [1, 2, 3]
>>> y = x
>>> x = x[::-1]

它在内存中的结构应该是下面这样:
在这里插入图片描述
如果假设代码如下:

>>> x = [1, 2, 3]
>>> y = x
>>> x[:] = x[::-1]

那么在内存中的结构则应该是下面这样:
在这里插入图片描述

5.请问下面代码会打印什么呢?

>>> x = 100
>>> def funA():
...     global x
...     x = 250
...     def funB():
...         nonlocal x
...         x = 520
...     funB()
...
>>> funA()
>>> print(x)
>>> # 请问这里会打印什么内容?

答:会报错!
解析:如果是在 IDLE 的交互模式下敲代码,没等你代码敲完就会报错了。
在 funA() 函数中,先将 x 变量定义为全局变量,接着在嵌套的 funB() 函数中,又试图通过 nonlocal 语句将内层的 x 变量定义为外层的同名变量……
但是,此时外层的 x 变量已经被提前一步定义为全局变量了(也就相当于外层不存在一个叫 x 的局部变量),于是找不到外层的同名的 x 变量,所以便会报错(SyntaxError: no binding for nonlocal ‘x’ found)。
如果在全局中并没有存在变量 x,然后我们在函数中通过 global x 声明,像这样:

>>> # 已知全局中不存在变量 x
>>> def myfun():
...     global x
...     x = 250

这个就不会报错,并且 myfun() 函数成功调用后,全局中会多出一个变量 x,并且被赋值为 250。

题目来自小甲鱼python函数IV

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171488.html

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

相关文章

jQuery学习-01jQuery下载安装

1 jQuery的介绍 jQuery就是js函数库&#xff0c;里面有大量的js函数库&#xff0c;使用这些函数操作dom对象&#xff0c;做事件&#xff0c;动画&#xff0c;ajax处理&#xff1b; 地址&#xff1a;https://jquery.com/ 2下载 地址&#xff1a;https://jquery.com/download/…

Apache Solr 9.1-(一)初体验单机模式运行

Apache Solr 9.1-&#xff08;一&#xff09;初体验单机模式运行 Solr是一个基于Apache Lucene的搜索服务器&#xff0c;Apache Lucene是开源的、基于Java的信息检索库&#xff0c;Solr能为用户提供无论在任何时候都可以根据用户的查询请求返回结果&#xff0c;它被设计为一个强…

day12-继承

1. 继承 1.1 继承的实现&#xff08;掌握&#xff09; 继承的概念 继承是面向对象三大特征之一&#xff0c;可以使得子类具有父类的属性和方法&#xff0c;还可以在子类中重新定义&#xff0c;以及追加属性和方法 实现继承的格式 继承通过extends实现格式&#xff1a;class 子…

【算法题】1318. 或运算的最小翻转次数

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你三个正整数 a、b 和 c。 你可…

Webpack:HTML Webpack Plugin插件

HTML Webpack Plugin插件&#xff0c;在Webpack构建的前端项目中&#xff0c;用于简化index.html文件的创建&#xff0c;以免除项目打包之后手动创建/拷贝index.html到打包目录下的繁琐步骤。以下&#xff0c;从一个已构建好的Vue项目中的一个现象谈起&#xff0c;逐步深入了解…

vs code中的platformIO插件,完成Arduino的程序编写,导入,安装开发板管理库

准备工作 vs code已经安装好&#xff0c;扩展插件plateformIO也安装好。&#xff08;下图是platformIO安装方式&#xff09; platformIO界面功能介绍和简单使用 新建Arduino项目 选择正确的开发板型号&#xff0c;和自己习惯的编译框架。打开后有一个.ini的配置文件&#x…

MySQL表的增删改查(初级)

MySQL数据库最核心的内容就是增删改查&#xff08;即CURD&#xff09;,看了这篇初级增删改查的博客之后可以解决以后工作中百分之80-90的内容&#xff0c;这部分的知识并不是很难&#xff0c;但是需要一定的熟练程度&#xff1b;C&#xff1a;create--新增U&#xff1a;update-…

设计模式_行为型模式 -《策略模式》

设计模式_行为型模式 -《策略模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、…

Nginx应用场景

Nginx应用场景 Nginx配置文件说明 Nginx 的配置文件位置 1、文件位置 安装目录\conf\nginx.conf 安装目录\nginx.conf 2、两个文件是一样的 3、使用 /usr/local/nginx/sbin/nginx 启动 Nginx &#xff0c;默认用的是 安装目录 \nginx.conf 配置文件 4、作用&#xff1a;完…

三、命令行工具cmder的安装

1、cmder安装 1.1、cmder简介 cmder是一个增强型命令工具&#xff0c;不仅可以使用Windows下的所有命令&#xff0c;并且还可以使用Linux和shell命令。 1.2、cmder下载 (1)cmder的官方网站提供的下载地址实在是太慢了基本是下载不下来&#xff0c;建议到清华大学的镜像站去…

SELECT必知必会_引擎,PROCEDURE,事务处理

书接上文&#xff0c;之前说了Mysql的SELECT部分&#xff0c;本片文章会重点介绍关于MySql的其他一些知识&#xff0c;也会是MySql必知必会的最后一篇。 首先&#xff0c;是Mysql中的增删改操作&#xff0c;对于测试岗来说&#xff0c;这部分知识相对来说不是那么重要&#xf…

案例分享 | AI助力肯尼亚“Sheng”语研究

你听说过一种叫做“Sheng”的语言吗&#xff1f;这是一种斯瓦希里语-英语俚语&#xff0c;主要使用者为肯尼亚内罗毕等城市地区的青年。近年来&#xff0c;随着“Sheng”的使用量不断增加&#xff0c;一家非盈利组织正在帮助更新该地区的社区信息资源&#xff0c;随时根据词汇中…

【6s965-fall2022】深度学习的效率指标

两个核心指标是计算和内存(Computation and Memory)。需要考虑的三个维度是存储、延迟和能耗(Storage, Latency, and Energy)。 延迟 Latency Latency max(Toperation,Tmemory)max(T_{operation}, T_{memory})max(Toperation​,Tmemory​) 能耗 Energy 内存访问比计算更消耗…

Softmax Loss、AAM-Softmax(ArcFace)、Sub-center ArcFace的PyTorch实现与代码解读

概述 说话人识别中的损失函数分为基于多类别分类的损失函数&#xff0c;和端到端的损失函数&#xff08;也叫基于度量学习的损失函数&#xff09;&#xff0c;关于这些损失函数的理论部分&#xff0c;可参考说话人识别中的损失函数本文主要关注这些损失函数的实现&#xff0c;…

开源PPP软件PRIDE-PPPAR使用记录(二)解算网友发来的GNSS观测文件

最近有个网友发来了几个GNSS原始观测文件&#xff0c;想使用TerraPos处理一下看看结果。 TerraPos打开这几个文件&#xff0c;都报一个格式错误&#xff0c;见下图&#xff1a; 正在上传…重新上传取消​ 这个问题不难&#xff0c;解决之道就是按照上一篇文章的方法&#xf…

杭州到温州老家自驾路线优化与整理

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 背景及义意义 背景 考虑到后续经常回老家&#xff0c;需要提前熟悉回家的路线。杭州和温州有很多快速路和国道与高速是基本相伴而行的&#xff0c;可以利用这些道路取…

在项目管理中,甘特图是最常用的工具之一

在项目管理中&#xff0c;为了能对项目过程进行监控&#xff0c;可视化进度管理&#xff0c;需要使用辅助工具来帮助我们管理项目&#xff0c;而甘特图则是其中最经常使用的工具之一。 甘特图更够清晰的反映项目各个阶段的计划&#xff0c;任务由谁负责&#xff0c;计划与实际…

mysql性能优化二

1 mysql 基本功能 1.1、mysql连接器的工作流程: 1.2、查看连接状态: show processlist; Note:客户端太长时间没动静 就自动断开 这个时间是由wait_timeout参数控制的,默认8h 长连接短链接 长连接是链接成功后,如果客户端持续有请求,则使用同一个链接[尽量使用长连接,因为每次…

通用NetCore前后端分离项目Linux系统部署步骤

最近参与的大部分项目都是NetCore API加SAP页面的形式&#xff0c;都是部署在linux系统上&#xff0c;本文记录新领的服务器的部署步骤。采用NetCore3.1&#xff0c;MySql数据库。 本文记录的程序名&#xff1a;myapp.dll 部署文件保存目录&#xff1a; 后台程序&#xff1a;/u…

SOLIDWORKS 2023新功能揭秘!装配体升级 阵列实例、配合错误修复、零件替换同步更新

SOLIDWORKS 2023全新面世&#xff0c;今天众联亿诚为大家带来SOLIDWORKS 2023装配体的新功能揭秘&#xff0c;SOLIDWORKS 2023对装配体进行功能增强&#xff0c;并且继续加强性能&#xff0c;让我们深入研究这些令人振奋的新功能吧&#xff01;在装配体中阵列是一种常见的、节省…