python--函数详解二

news2024/11/24 0:36:02

一、作用域:

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

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

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

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

相关文章

LeetCode 3165. 不包含相邻元素的子序列的最大和

. - 力扣(LeetCode) 题目 给你一个整数数组 nums 和一个二维数组 queries(维),其中 queries[i] []。 对于每个查询 i,首先将 nums[] 设置为 ,然后计算查询 i 的答案,该答案为 nu…

基于无框力矩电机抱闸实现人形机器人在展会中不依赖悬吊

目录: 1 人形机器人在展会中的悬吊状态 2 人形机器人不能长时间站立的原因 3 基于电机抱闸使人形机器长时间站立 4 人形机器人在实用场景中必须长时间站立、快速进行 “静-动” 互换 5 人形机器人在实用场景中实现 “静-动” 快速互换的抱闸控制思路 6 无框力…

Rust 力扣 - 2090. 半径为 k 的子数组平均值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 半径为 k 的子数组平均值 等价于 子数组长度为2 * k 1的总和 除于 2 * k 1 我们遍历长度为2 * k 1的窗口,我们只需要记录窗口内的平均值即可 题解代码 impl Solution {pub fn get_averages(num…

哪些远程控制软件能高清畅玩黑神话?

远程控制软件近年来越来越普及,这类软件使用场景广泛,包括远程办公、技术支持、教育等。但其实除了协助远程办公之外,对于游戏玩家来说,远程操控软件还是一款能够让他们即使身处异地也能享受到流畅的游戏体验的好工具。利用远程控…

qt QComboBox详解

QComboBox是一个下拉选择框控件,用于从多个选项中选择一个。通过掌握QComboBox 的用法,你将能够在 Qt 项目中轻松添加和管理组合框组件,实现复杂的数据选择和交互功能。 重要方法 addItem(const QString &text):将一个项目添…

架构师备考-数据库基础

基本概念 数据(Data):是描述事物的符号记录,它具有多种表现形式,可以是文字、图形、图像、声音和语言等。信息(information):是现实世界事物的存在方式或状态的反映。信息具有可感知…

【牛客刷题实战】二叉树遍历

大家好,我是小卡皮巴拉 文章目录 目录 牛客题目: 二叉树遍历 题目描述 输入描述: 输出描述: 示例1 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码(C语言) 兄弟们共勉 !&…

ESP-HaloPanel:用 ESP32-C2 打造超低成本智能家居面板

项目简介 在生活品质日益提升的今天,智能家居系统已经走进了千家万户,并逐渐成为现代生活的一部份。与此同时,一款设计精致、体积轻盈、操作简便的全屋智能家居控制面板,已经成为众多家庭的新宠。这种高效、直观的智能化的解决方…

西北工业大学Journal of Applied Ecology最新研究进展:野生食草动物破坏了干旱自然保护区的土壤种子库及植被恢复潜力

本文首发于“生态学者”微信公众号! 自然保护区(protected areas)是全球生物保护的重要支柱。其中,植物是生物多样性和生态系统的核心组成部分,是实现生物保护目标的前提和基础。土壤种子库(soil seed ban…

Kotlin协程-async分析

概述 本章讲解协程中async,await的原理。前提条件是知道父子协程是如何关联的,可以看这篇协程之间父子关系1-Job如何关联的了解。 这里简单讲一下原理:使用await方法,这是一个挂载方法,协程执行到这里就会挂载&#…

推荐一款功能强大的AI实时变声器:FliFlik Voice Changer

FliFlik VoiCE Changer是一款专注于声音变换与音频处理的创新软件,旨在满足从日常娱乐、游戏直播到播客制作、专业音频编辑的多种应用场景需求。无论是想在游戏中变换声音逗乐队友,还是在播客中塑造个性化的音效,这款软件都能提供灵活而强大的…

LeetCode总结-链表

一、遍历链表 1290.二进制链表转整数 2058.找出临界点之间的最小和最大距离 2181.合并零之间的节点 二、删除节点 问:为什么没有修改 dummy,但 dummy.next 却是新链表的头节点?如果删除了 head,那么最后返回的是不是原链表的头…

Apache Dubbo (RPC框架)

本文参考官方文档:Apache Dubbo 1. Dubbo 简介与核心功能 Apache Dubbo 是一个高性能、轻量级的开源Java RPC框架,用于快速开发高性能的服务。它提供了服务的注册、发现、调用、监控等核心功能,以及负载均衡、流量控制、服务降级等高级功能。…

【Flask】二、Flask 路由机制

目录 什么是路由? Flask中的路由 基本路由 动态路由 路由中的HTTP方法 路由函数返回 在Web开发中,路由是将URL映射到相应的处理函数的过程。Flask是一个轻量级的Web应用框架,提供了简单而强大的路由机制,使得开发者能够轻松…

强势改进!TCN-Transformer时间序列预测

强势改进!TCN-Transformer时间序列预测 目录 强势改进!TCN-Transformer时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现TCN-Transformer时间序列预测; 2.运行环境为Matlab2023b; 3.单个变量时间序…

六西格玛项目助力,手术机器人零部件国产化稳中求胜——张驰咨询

项目背景 XR-1000型腔镜手术机器人是某头部手术机器人企业推出的高端手术设备,专注于微创手术领域,具有高度的精确性和稳定性。而XR-1000型机器人使用的部分核心零部件长期依赖进口,特别是高精度电机、关节执行机构和视觉系统等,…

C++ 优先算法——复写零(双指针)

目录 题目:复写零 1. 题目解析 2. 算法原理 一. 先找到最后一个“复写”数 处理边界情况 二. 复写操作 3. 代码实现 题目:复写零 1. 题目解析 题目截图: 该题目要求的与移动零相似,都要在一个数组上进行操作,…

掌握DFMEA,让潜在设计缺陷无处遁形!

一个微小的设计缺陷,就可能让一款产品从市场宠儿变成过客。那么,如何在设计初期就精准识别并扼杀这些潜在威胁呢?答案就是——巧妙运用DFMEA(设计失效模式与效应分析)。本文,天行健企业管理咨询公司将详细阐…

时间序列预测(十)——长短期记忆网络(LSTM)

目录 一、LSTM结构 二、LSTM 核心思想 三、LSTM分步演练 (一)初始化 1、权重和偏置初始化 2、初始细胞状态和隐藏状态初始化 (二)前向传播 1、遗忘门计算(决定从上一时刻隐状态中丢弃多少信息) 2、…

FlaskFastAPIgunicornunicorn并发调用

Flask VS. FastAPI Flask和FastAPI是Python中两种流行的Web框架,它们各自具有不同的特点和适用场景。以下是它们之间的一些主要区别: 1. 框架类型 Flask:Flask是一个轻量级的微框架,适合构建小型到中型的Web应用。它灵活且易于扩展…