当前位置: 首页 > news >正文

Python学习-----函数2.0(函数对象,名称空间,作用域-->全局变量与局部变量)

 

目录

前言:

1.函数对象

(1)函数对象的引用

(2)函数可以放到序列里面

(3)函数可以作为参数 , 传递给另一个函数

2.名称空间

 3.作用域

(1)作用域的理解

(2)作用域的转换


前言:

        前面已经介绍了Python中函数的参数类型,见下文。Python学习-----函数1.0(函数的定义和函数的参数)_守约斯维奇的博客-CSDN博客

        这一节,我会进一步去讲解Python中的函数,从对象、名称空间、作用域去讲解,看正文。

1.函数对象

        前面我们学习了关于Python中的变量类型,例如int、str、bool、list等等……,其实函数我们可以去理解为一种更加高级的变量类型,也就是函数对象,其实是一个更加高级的变量容器,我们可以去把函数对象当做一个变量去使用。

(1)函数对象的引用

        一个函数对象的形成是先定义一个函数,然后写入函数体,最后把这个函数赋值给一个变量,也就是函数的对象,然后我们可以去通过这个函数变量来实现函数相应的功能。(先赋值,再调用)

 示例1:

#定义一个函数对象fun
def fun():print('hello word',end=' ')print('wwww')
fun()  #直接调用这个函数对象

这种写法是最直接的,没有返回值。

示例2:

def fun():print('ww')return 123
kun = fun()
print(kun,type(kun))
#输出结果:ww
#         123 <class 'int'>

这个写法是定义了一个kun在变量,作为fun函数的对象,我们可以去通过这个对象去处理这个函数的返回值。

示例3:

def fun():return 123
kun = fun
print(kun,type(kun))
#输出结果:<function fun at 0x00000154828AD280> <class 'function'>

这里我没有加上()所以输出结果是fun这个变量的地址,

示例4: 

def fun():return 123
kun = fun
print(kun(),type(kun))
#输出结果:123 <class 'function'>

 这里先定义一个kun变量为fun的函数对象,下面如果要去调用这个函数的话就必须加上括号,如果没有括号那这个对象只是函数的地址。

(2)函数可以放到序列里面

 函数的返回值是一种变量类型,同时序列可以储存变量,所以函数是可以放到序列里面去    

这里就以列表为例子: 

def fun():return '牛马'
kun = fun
li=[1,5,kun]
print(li)
print(li[2]())
#输出结果:[1, 5, <function fun at 0x000001BFB1ABD280>]
#         牛马

(3)函数可以作为参数 , 传递给另一个函数

示例: 

def fun():return '牛马'
def ff(st):print(f'我是{st}')
ff(fun())
#输出结果:我是牛马

(4)函数可以作为另一个函数的返回值

def ff():print('我爱你')return 520
def fun():return ff()
a=fun()
print(a,type(a))
#输出结果:我爱你
#          520 <class 'int'>

这里是fun函数返回值为ff函数,实际上是经历过了fun函数的功能,然后再次经历ff函数的功能,最后返回的是ff函数的520,故a的结果是520

2.名称空间

数据的名称是储存到栈区,而数据的内容是储存到堆区,当我们要去使用数据的内容时,我们可以通过数据的名称来直接去表示数据的内容,也就是通过栈区去找到堆区的东西,然后在堆区拿出来去使用。栈区和堆区是有对应关系的。http://t.csdn.cn/9plp1

1.内建名称空间
    生命周期:会随着Python启动而生成,程序关闭会摧毁
    保存的数据:内置函数(input,print....)
    生成顺序:程序里最先生成的
2.全局名称空间
    生命周期:会随着Python启动而生成,程序关闭会摧毁
    保存的数据:函数名,变量名
    生成顺序:在内建名称空间的后面
3.局部名称空间
    生命周期:随着函数的调用而生成,函数调用接受后就关闭
    保存的数据:函数内定义的名字
    生成顺序:随着函数的调用而生成

所以,我们定义的函数是属于局部名称空间,当函数被调用完成了之后就会被销毁,里面变量储存到的栈堆区都会被销毁 

 3.作用域

(1)作用域的理解

        作用域实际上就是变量的作用范围,之前我们学了C语言都知道,有全局变量和局部变量,比如在for循环里面,里面的变量是一种局部变量,我们如果在主函数外面去定义一个变量,那就是全局变量。Python也是一样的道理,变量也是有相应的作用域。而变量的作用域是由定义的位置决定的

全局变量与局部变量的名字相同的时候,实质上是两个不同的变量, 其栈堆区是完全不一样的!所以我们不可以通过局部来改变全局变量,否则就报错

示例1: 

#定义一个全局变量a
a=15
def fun():a=999print('hhh')
fun()
print(a)
#输出结果:15

因为函数是放到栈堆区,当函数调用完成了之后返回一个值,这个函数已经被销毁了,那么里面的变量也会与之销毁,所以不会影响到全局变量,故a的值还是15

示例2:

#定义一个全局变量a
a=15
def fun():a=999return aprint(fun())
print(a)
#输出结果:999
#         15

这个函数调用完成了之后就返回一个值,这个值函数内部的功能的值,但是并没有对这个函数以外的值进行修改,所以a的结果还是15,而函数的返回值是999

示例3:

b=15
def fun():b=b+99
fun()
print(b)
#输出结果:系统报错

因为b是一个全局变量,而函数里面的b是一个重新定义的局部变量,所以我们不可以去直接修改这个局部变量b,因为这个b是没有初始数值的,而且类型也未定,所以无法进行运算处理

对比

b=15
def fun():b=0b+=99print(b)
fun()
print(b)
#输出结果:99 15

对于这个而言,我给了函数里面b一个初始化值,所以可以进行运算处理,但这个b与外部全局变量的b是完全不相同,是两个不同的变量 

(2)作用域的转换

在C语言中我们可以去设置静态变量(static),从而使得这个变量可以在函数进行修改,同样Python中可以利用关键字去修改变量的作用域,把局部变量作用到全局变量,或者把全局变量作用降级为局部

1.global 关键字 (局部变全局)

在函数中,变量是这个函数的局部变量,只仅仅作用到函数内部,我们对这个变量进行修改是不会影响外面的变量的,如果把这个局部变量转换为全局变量的话,那么这变量就可以在函数里面进行修改,而且还可以影响到外部,当新定义global的变量名字与之前已有的变量名字出现重复的话,新的变量内容会把之前的给覆盖掉,而且新的全局变量也可以在函数内部进行修改,从而影响全局。

注意事项:这个关键字是作用到全局变量,这个全局变量的栈堆区不会被销毁 

b=15
def fun():b=123
fun()
print(b)
#函数里面的b与外面的b是不同性质的!!!
#输出结果:15

 对比

b=15
def fun():global bb=123
fun()
print(b)
#输出结果:123

 重新定义了一个global后,此时这个b已经是一个新的全局变量因为前面已经有了一个全局变量b,所以这个新的全局变量会因为名字相同会把之前的全局变量b给直接覆盖掉(类似于类型相同且名字相同的文件会被新的给覆盖),故输出结果是新的全局变量b的结果:123

2.nonlocal 关键字 (全局变局部)

功能:降权,全局变成局部

前面讲到过,已知一个全局变量,但是我不可以在函数里面对这个全局变量进行修改,而且函数里面的变量都是新的变量,既是跟外面的全局变量名字一模一样,但是其储存的栈堆区是完全不同的,那么当我想去通过一个局部函数来修改这个全局变量的话,这时候我就可以通过nonlocal关键字来进行 降维处理 。

注意事项 :这个关键字是作用于嵌套函数的外部变量(相较于内部函数,外部函数是“全局”),这个变量的栈堆区会被销毁

def fun():w=99def fun1():w=100fun1()return w
print(fun())
#输出结果:99

VS

def fun():w=99def fun1():nonlocal ww=100fun1()return w
print(fun())
#输出结果:100

这里,可以看出,w=99相对应fun1()是一个全局变量,而fun1()内部的w相对应fun()是一个局部变量,当我用nonlocal关键字去定义了fun()的变量w之后,这个w变量已经是属于fun1()函数内部的变量,这时候我们可以去修改这个w的值,从而去影响外部函数,最后w的返回值也就是被修改后的100

 

         好了,这一期就到这里的,thanks~

相关文章:

Python学习-----函数2.0(函数对象,名称空间,作用域-->全局变量与局部变量)

目录 前言&#xff1a; 1.函数对象 &#xff08;1&#xff09;函数对象的引用 &#xff08;2&#xff09;函数可以放到序列里面 &#xff08;3&#xff09;函数可以作为参数 &#xff0c; 传递给另一个函数 2.名称空间 3.作用域 &#xff08;1&#xff09;作用域的理解 …...

Java中Json字符串和Java对象的互转

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。诞生于 2002 年。易于人阅读和编写。同时也易于机器解析和生成。JSON 是目前主流的前后端数据传输方式。 JSON 采用完全独立于语言的文本格式&#xff0c;但是也使用了类似于 C 语言家族的…...

代码随想录NO42 | 动态规划_Leetcode70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

动态规划_Leetcode70. 爬楼梯 &#xff08;进阶&#xff09; 322. 零钱兑换 279.完全平方数70. 爬楼梯 &#xff08;进阶&#xff09; 在原题基础上&#xff0c;改为&#xff1a;一步一个台阶&#xff0c;两个台阶&#xff0c;三个台阶&#xff0c;…&#xff0c;直到 m个台阶…...

【C++从入门到放弃】初识C++(基础知识入门详解)

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《C从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; C基础…...

企业工程项目管理系统源码+spring cloud 系统管理+java 系统设置+二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…...

【GPLT 三阶题目集】L3-016 二叉搜索树的结构

二叉搜索树或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b;它的左、右子树也分…...

核心交换机安全多业务高性能万兆交换机

RG-S5750-24SFP/12GT交换机是锐捷网络推出的融合了高性能、高安全、多业务的新一代三层交换机。RG-S5750-24SFP/12GT 交换机能够提供灵活的介质接口&#xff0c;满足网络建设中不同介质的连接需要。全千兆的端口形态&#xff0c;加上可扩展的高密度万兆端口&#xff0c;提供1&a…...

Android APK 签名打包原理分析(三)【静默安装的实现方案】

背景 小编目前从事的系统定制类工作,有客户提出了,需要后台“静默安装”他们的app,也就是悄无声息的安装,而且特别强调,不可以跳出任何安装引导页面,他们的app下载完成之后,后台调用公开的android install代码,系统就后台完成安装,安装完成之后,重新打开应用就可以。…...

mulesoft MCIA 破釜沉舟备考 2023.02.14.05

mulesoft MCIA 破釜沉舟备考 2023.02.14.05 1. Refer to the exhibit.2. A Kubernetes controller automatically adds another pod replica to the resource pool in response to increased application load.3. An XA transaction Is being configured that involves a JMS c…...

结构体的三种定义方法、结构体类型名(可选标志符)什么时候可以省略

结构体的三种定义方法 一、单独定义&#xff1a; 先定义结构体类型&#xff0c;再定义变量   定义结构体的格式如下&#xff1a;    struct 结构体名 {    若干数据项&#xff1b;    } &#xff1b;   其中&#xff0c;struct为关键字&#xff1b; 结构体名是用户定…...

cgo静态编译不能用glibc,用musl

Golang 的一个动态链接依赖问题 upx 是一个压缩二进制的工具&#xff0c;如上图&#xff0c;经过压缩之后&#xff0c;这些 binary 的体积都减少了 46%。 静态链接 CGO 的依赖 如果使用 glibc 的是&#xff0c;是不能静态链接的&#xff1a; rootf88271a666f9:/workspace# g…...

​力扣解法汇总1124. 表现良好的最长时间段

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你一份工作时间表 hours&#xff0c;上面记录着某一位员工每天的工作小时数。…...

12- 降维算法 (PCA降维/LDA分类/NMF) (数据处理)

数据降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征&#xff0c;去除噪声和不重要的特征&#xff0c;从而实现提升数据处理速度的目的。PCA算法有两种实现方法&#xff1a; 基于特征值分解协方差矩阵实现PCA算法基于SVD分解协方差矩阵实…...

QT+ OpenGL学习

文章目录QT OpenGLQOpenGLWidget:不需要GLFWQOpenGLFunction_X_X_Core:不需要GLAD你好&#xff0c;三角形顶点输入顶点着色器片段着色器链接着色器本节代码元素缓冲对象EBOQT交互GLSLGLSL支持的类型输入输出Uniform纹理纹理单元纹理环绕纹理过滤多级渐远纹理QT OpenGL 本篇完整…...

C语言(字符串输入)

目录 一.gets和puts组合 二.fgets()和fputs() 三.fgets()函数返回 四.fgets读取满问题 五.修改fgets函数,自动用\0替换\n 一.gets和puts组合 Gets()读取整行输入&#xff0c;知道遇到换行符&#xff0c;然后丢弃换行符&#xff0c;存储其余字符&#xff0c;并在这些字符的…...

背包问题求方案数(AcWing)(JAVA)

有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出 最优选法的方案数。注意答案可能很大&#xff0c;请输出答…...

一篇文章带你读懂HashMap

HashMap是面试中经常问到的一个知识点,也是判断一个候选人基础是否扎实的标准之一。可见HashMap的掌握是多重要。 一、HashMap源码分析 1、构造函数 让我们先从构造函数说起&#xff0c;HashMap有四个构造方法&#xff0c;别慌 1.1 HashMap() // 1.无参构造方法、// 构造一…...

Java如何进行优雅的判空——Optional类的灵活应用

0 引言 在Java Web项目开发中&#xff0c;经常令人头疼的NPE问题&#xff08;NullPointerException&#xff09;——空指针&#xff0c;例如我们在调用equal()方法时&#xff0c;就经常会出现NPE问题&#xff1a; String str null; str.equals("fsfs")&#xff1b;…...

Fluent Python 笔记 第 12 章 继承的优缺点

重点是说明对 Python 而言尤为重要的两个细节: 子类化内置类型的缺点多重继承和方法解析顺序 12.1 子类化内置类型很麻烦 内置类型(使用 C 语言编写)不会调用用户定义的类覆盖的特殊方法。 不要子类化内置类型&#xff0c;用户自己定义的类应 该继承 collections 模块(http…...

Go语言读取解析yml文件,快速转换yml到go struct

YAML (YAML Aint a Markup Language)是一种标记语言&#xff0c;通常以.yml为后缀的文件&#xff0c;是一种直观的能够被计算机程序识别的数据序列化格式&#xff0c;并且容易被人类阅读&#xff0c;容易和脚本语言交互的&#xff0c;可以被支持YAML库的不同的编程语言程序导入…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...