python--函数详解二

一、作用域:

一个标识符的可见范围,这就是标识符的作用域,一般说的是变量的作用域

1.1、全局作用域

运行结果

在整个程序运行环境中可见。可以被多个函数重复多次使用

1.2、局部作用域

运行结果

这里调用a,显示未定义,原因在于函数是一个封装,他会开辟一个作用域,a被限制在这个作用域中了,所以a在函数外部不可见。

那如果一个函数内部出现一个跟全局变量一个相同的标识符名字呢?

如:

三、嵌套函数

在一个函数中定义宁外一个函数

先看一段代码:

运行结果:

调用inner函数呢?

运行结果:

也就是说,内部函数inner不能再外部直接使用,会显示未定义的标识符,因为它在函数外部不可见。其实inner就是标识符而已,就是一个函数outer内部定义的变量而已

3.1、函数嵌套的作用域

请看一段代码并思考运行的结果是什么?

运行结果:

从执行结果可以得知,外部变量在内部作用域可见

在看一段代码:

思考运行的结果:

从上面结果中可以得出结论,如果定义了o=97,相当于在inner函数作用域中重新定义了一个新的变量o,但是这个变量o并不能覆盖外部作用域outer2中的变量o,对于innner来说,相当于自己作用域中定义的变量o

四、一个赋值语句的问题

先来看几段代码:

代码1

运行结果

代码2:

运行结果

这个很简单,下面呢对这段代码进行修改:

代码3

运行结果

前面没有问题,只是加了x+=1,就出错了?在来改下代码:

代码4

运行结果

这样就好了?为什么

再来看一个例子:

代码5

运行结果

代码5和代码3出现的错误一模一样,x=500,赋值及定义,在当前作用域中,如果你出现了谁等与谁,你在本地作用域当中定义了x,x就是当前作用域变量。也就是说,只要在函数中出现类似于x=变量的赋值语句,且此变量不加任何语句的修饰,那么此变量一定是当前函数中的局部变量,在此函数中所有x都是使用该x,所以y=x+1中的x也是局部变量,本地变量x还未赋值,不就引用了当然会报错。如何解决这个常见问题呢?使用global

四、global

声明标识符为全局变量

使用原则

外部作用域变量会在内部作用域可见,

例一:

例二:

结果是什么?

错误的,x先引用后赋值而python动态语言赋值才算定义,才能被引用。

如何改正呢?

下面来讲python函数中一个比较重要的东西:闭包

五、闭包

自由变量:未在本地作用域中定义的变量。例如定义在内层函数外的外层函数作用域中的变量

闭包:就是一个概念,出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量,就形成了闭包。

下面举一个例子,思考一下这里面有没有变量,有没有闭包?

在内层函数inc中,用到了外层函数局部变量c,不出错具体分析如下:

运行结果:

再来看一个列子

运行结果:

这里面有闭包吗?如果在一个函数中使用了c= c就是inc的局部变量,跟外面counter函数中的c有关系吗?所以报错。如何解决?使用nonlobal如:

运行结果:

这是形成闭包的简单方式。

再来看一个列子

运行结果:

六、默认值作用域

下面先看一段代码:

例1:

运行结果:

x=出现了,x就是foo函数的局部变量,形参出现了,x都是局部变量,两次调用foo函数,x都一样。

再来看一段代码:

例2:

为什么第二次调用foo1()打印的是[1,1]?

y是局部变量,不可以在函数外访问,这个默认值不可能保存在局部变量作用域内

因为函数也是对象,每个函数定义被执行后,就生成了一个函数对象,和函数名。

函数是对象,有属性,pyhton把函数对象的默认值放在了函数对象的属性中,这个属于函数对象的整个生命周期。

查看foo1.__defaults__属性,他是个元组

如果没有缺省值?

例3:

函数调用放缺省值

运行结果:

好,了解了这个以后再来看一段代码:

例4:

运行结果:

函数地址没有变,就是说foo2函数这个对象没有变,调用它,它的属性__defaults__存默认值

z是引用类型,引用类型元素变动,并不是元组的变化

x,y是非引用类型,它们保存在缺省值属性元组中,将不能再改变了

下面再来看一段代码:

例5:keyword—only参数的缺省值

运行结果:

下面再来看一段代码:

例6:

运行结果:

x+=[1]是就地修改

改一下:

例7:

为什么三次都是[1]?

x=x+[1]是生成一个新对象覆盖x

可能你看不懂例6跟例7那我们看一个简单的你就懂了:

这里画图解释:

这是可变类型,x+=1  就地修改      x=x+1生成一个新对象覆盖x

不可变类型:

七、函数销毁:

del +函数标识符,引用计数减1

同名标识符覆盖原有定义,本质上也是使引用计数减1

python程序结束时,所有对象销毁

八、匿名函数lambda(没有名字的函数)

返回常量的函数

加匿名函数带有缺省值

keyword-only参数

可变参数

应用

defaultdict

sorted

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Etsy又被封号了!这次我终于搞懂了原因...

你是否真的了解在Etsy开店有哪些红线不能踩?你是否真的知道Etsy被封号后如何解决?本文我将探讨Etsy账号被封的常见原因,以及卖家可以采取的应对策略,以期减轻对跨境业务的伤害程度,感兴趣的商家速速码住,不…

大舍传媒:海外发稿的卓越选择——老挝新闻网报道及海外媒体发布服务

大舍传媒:海外发稿的卓越选择——老挝新闻网报道及海外媒体发布服务 在当今全球化的时代,信息的传播速度和范围至关重要。对于企业、组织和个人而言,能够在海外媒体上发布稿件,实现有效的宣传和推广,无疑是提升知名度…

如何找到网上爆款内容,快速复制扩大品牌声量

社媒内容爆款复制是现代营销中的一个重要策略,它对于提升品牌声量、曝光度和知名度具有显著效果。 首先什么是爆款? 爆款内容指的是在社交媒体或其他在线平台上迅速获得大量关注、分享和讨论的内容。 准确、及时找到这部分品牌相关的爆款内容&#xf…

在元神操作系统启动时自动执行任务脚本

1. 背景 本文主要介绍让元神操作系统启动时自动执行任务脚本的方法,适用于无人化任务执行目的。将任务脚本及相关的应用程序准备好之后,把装有元神操作系统的U盘插入目标电脑,然后打开电脑电源就会自动完成所设置的任务。 2. 方法 &#x…

Pandas JSON学习

1.JSON简介 JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。JSON 比 XML 更小、更快,更易解析,Pandas 可以很方便的处理 JSON 数据。 [{"…

扫描电镜的超低温冷冻制样及传输技术(Cryo-SEM)

扫描电镜的超低温冷冻制样及传输技术(Cryo-SEM) 扫描电镜(Scanning Electron Microscope,简称SEM)是一种利用聚焦电子束扫描样品表面,通过检测二次电子或反射电子等信号来获取样品表面形貌信息的显微观察技术;然而&…

微服务设计模式 - 特性标志(Feature Flags)

微服务设计模式 - 特性标志(Feature Flags) 定义 特性标志(Feature Flags),又称特性开关(Feature Toggles),是一种常见的云计算设计模式,允许开发人员通过配置动态地打开…

Mac “屏幕保护程序启动或显示器关闭后需要密码“无效

屏幕保护程序启动或显示器关闭后需要密码只能选择“立即”的解决方法: 在 iPhone mirror中设置,每次询问权限。 参考:https://support.apple.com/en-us/120421

强势文化与弱势文化的交响:赋能认知

强势文化如同历史长河中的巨浪,以磅礴之力推动着社会的进步与变迁,其影响力深远而广泛,不仅塑造了民族的精神风貌,也深刻影响着个体的认知框架与行为模式。而弱势文化,则如细流涓涓,虽不显眼却蕴含着独特的…

虚拟机 Ubuntu 扩容

文章目录 一、Vmware 重新分配 Ubuntu 空间二、Ubuntu 扩容分区 一、Vmware 重新分配 Ubuntu 空间 先打开 Vmware ,选择要重新分配空间的虚拟机 点击 编辑虚拟机设置 ,再点击 硬盘 ,再点击 扩展 选择预计扩展的空间,然后点击 扩展…

再探“构造函数”

文章目录 一. 初始化列表1.1 实现1.2 何时必须使用初始化列表2.3 尽量使用初始化列表 二. 类型转换2.1 内置类型 转换 类类型2.2 explicit:不转换2.3 构造函数多参数2.4 使用隐式转换 2.5 自定义---转换为--->自定义类型 三. 静态成员变量概念在main函数调用私有…

基于java+SpringBoot+Vue的“衣依”服装销售平台设计与实现

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

smuge error

0 Preface/Foreword 1 解决方法 第一步:跳过大文件下载,到时候统一使用快速批处理fast batch git lfs install --skip-smudge 故意敲错指令,会出现git lfs install 的usage: 第二步:clone仓库 下载结果:…

新160个crackme - 089-fornixcrackme1

运行分析 需要破解Name和Serial PE分析 ASM程序,32位,无壳 静态分析&动态调试 ida搜索找到关键字符串 动态分析关键函数,逻辑如上图,通过Name计算得到char_1,亦或后对比Serial,相等则返回成功信息 分析…

项目验收测试的工作流程是怎样的?

验收测试的工作流程可以分为以下几个主要步骤: 一、项目类型和范围确定 在项目启动初期,技术团队介入以了解项目的类型、检测内容和要求范围。 如有必要,针对特定项目(如政府采购项目),需提前准备测试方…

读书笔记--类加载器

虚拟机设计团队把类的加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为“类加载器”。 类加载器可以说是Java语言的一项创新&#xff…

软件测试学习笔记丨Selenium复用已打开浏览器

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22520 本文为霍格沃兹测试开发学社的学习经历分享,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 说明:本篇博客基于sel…

Dubbo的设计存在哪些问题?3000行代码的分布式RPC能做什么?

RPC是分布式系统设计中不可或缺的一个部分。国内开源的RPC框架很多,它们的设计大都受到了dubbo框架的影响,核心的抽象概念与dubbo类似。从今天的角度上看,dubbo的设计已经过于繁琐冗长,如果基于现在的技术环境,重新审视…

宠物排泄物图像分割系统:高效目标识别

宠物排泄物图像分割系统源码&数据集分享 [yolov8-seg-p6&yolov8-seg-LAWDS等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al lnnovat…

nginx配置https及url重写

nginx配置https及url重写 一、https简介1、安全访问2、数据的安全性3、数据的完整性3、身份的真实性 二、配置https网站1、环境规划2、部署私有CA3、部署https的虚拟主机 三、URL重写1、语法 四、location的写法1、语法2、location uri {}3、location ~ uri { }4、location ~*…