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(函数对象,名称空间,作用域-->全局变量与局部变量)
目录 前言: 1.函数对象 (1)函数对象的引用 (2)函数可以放到序列里面 (3)函数可以作为参数 , 传递给另一个函数 2.名称空间 3.作用域 (1)作用域的理解 …...
Java中Json字符串和Java对象的互转
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。诞生于 2002 年。易于人阅读和编写。同时也易于机器解析和生成。JSON 是目前主流的前后端数据传输方式。 JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的…...
代码随想录NO42 | 动态规划_Leetcode70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数
动态规划_Leetcode70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数70. 爬楼梯 (进阶) 在原题基础上,改为:一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶…...
【C++从入门到放弃】初识C++(基础知识入门详解)
🧑💻作者: 情话0.0 📝专栏:《C从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! C基础…...
企业工程项目管理系统源码+spring cloud 系统管理+java 系统设置+二次开发
工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...
【GPLT 三阶题目集】L3-016 二叉搜索树的结构
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分…...
核心交换机安全多业务高性能万兆交换机
RG-S5750-24SFP/12GT交换机是锐捷网络推出的融合了高性能、高安全、多业务的新一代三层交换机。RG-S5750-24SFP/12GT 交换机能够提供灵活的介质接口,满足网络建设中不同介质的连接需要。全千兆的端口形态,加上可扩展的高密度万兆端口,提供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…...
结构体的三种定义方法、结构体类型名(可选标志符)什么时候可以省略
结构体的三种定义方法 一、单独定义: 先定义结构体类型,再定义变量 定义结构体的格式如下: struct 结构体名 { 若干数据项; } ; 其中,struct为关键字; 结构体名是用户定…...
cgo静态编译不能用glibc,用musl
Golang 的一个动态链接依赖问题 upx 是一个压缩二进制的工具,如上图,经过压缩之后,这些 binary 的体积都减少了 46%。 静态链接 CGO 的依赖 如果使用 glibc 的是,是不能静态链接的: rootf88271a666f9:/workspace# g…...
力扣解法汇总1124. 表现良好的最长时间段
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。…...
12- 降维算法 (PCA降维/LDA分类/NMF) (数据处理)
数据降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。PCA算法有两种实现方法: 基于特征值分解协方差矩阵实现PCA算法基于SVD分解协方差矩阵实…...
QT+ OpenGL学习
文章目录QT OpenGLQOpenGLWidget:不需要GLFWQOpenGLFunction_X_X_Core:不需要GLAD你好,三角形顶点输入顶点着色器片段着色器链接着色器本节代码元素缓冲对象EBOQT交互GLSLGLSL支持的类型输入输出Uniform纹理纹理单元纹理环绕纹理过滤多级渐远纹理QT OpenGL 本篇完整…...
C语言(字符串输入)
目录 一.gets和puts组合 二.fgets()和fputs() 三.fgets()函数返回 四.fgets读取满问题 五.修改fgets函数,自动用\0替换\n 一.gets和puts组合 Gets()读取整行输入,知道遇到换行符,然后丢弃换行符,存储其余字符,并在这些字符的…...
背包问题求方案数(AcWing)(JAVA)
有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出 最优选法的方案数。注意答案可能很大,请输出答…...
一篇文章带你读懂HashMap
HashMap是面试中经常问到的一个知识点,也是判断一个候选人基础是否扎实的标准之一。可见HashMap的掌握是多重要。 一、HashMap源码分析 1、构造函数 让我们先从构造函数说起,HashMap有四个构造方法,别慌 1.1 HashMap() // 1.无参构造方法、// 构造一…...
Java如何进行优雅的判空——Optional类的灵活应用
0 引言 在Java Web项目开发中,经常令人头疼的NPE问题(NullPointerException)——空指针,例如我们在调用equal()方法时,就经常会出现NPE问题: String str null; str.equals("fsfs");…...
Fluent Python 笔记 第 12 章 继承的优缺点
重点是说明对 Python 而言尤为重要的两个细节: 子类化内置类型的缺点多重继承和方法解析顺序 12.1 子类化内置类型很麻烦 内置类型(使用 C 语言编写)不会调用用户定义的类覆盖的特殊方法。 不要子类化内置类型,用户自己定义的类应 该继承 collections 模块(http…...
Go语言读取解析yml文件,快速转换yml到go struct
YAML (YAML Aint a Markup Language)是一种标记语言,通常以.yml为后缀的文件,是一种直观的能够被计算机程序识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入…...
第二十六章 java并发常见知识内容(ThreadLocal 详解)
JAVA重要知识点带着疑问看ThreadLocalGC 之后 key 是否为 null?ThreadLocalMap Hash 算法ThreadLocalMap Hash 冲突ThreadLocalMap.set()方法ThreadLocalMap过期 key 的探测式清理流程ThreadLocalMap扩容机制ThreadLocalMap.get()详解ThreadLocalMap过期 key 的启发…...
人类的第一语言是什么
其实机器智能始终存在一个争议 没有人类的肢体和感受器无法理解和感同身受 这不用想是自然,但是可以通过虚拟数据进行模拟,深度学习便是 深度学习是模拟简单输入输出的最好选择,但不是开放性的学习 没有智能交互的智能永远不是智能 就像狼孩一…...
jsp(全部知识点)
👌 棒棒有言:也许我一直照着别人的方向飞,可是这次,我想要用我的方式飞翔一次!人生,既要淡,又要有味。凡事不必太在意,一切随缘,缘深多聚聚,缘浅随它去。凡事…...
测试开发面试基础题
1.对测试开发的理解 测试开发首先离不开测试,而软件测试是指,在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 而且,现在不仅仅是通过手工测试来发…...
C++——多态|虚函数|重写|虚表
文章目录1. 多态的概念1.1 概念2. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3虚函数的重写虚函数重写的三个例外:2.4 普通调用和多态调用:2.5 C11 override 和 final2.6 重载、虚函数的覆盖(重写)、隐藏(重定义)的对比3. 抽象类(有关纯虚函数)3.1 …...
IPV4地址详解
文章目录IPV4地址分类编址划分子网无分类编制CIDR路由聚合应用规划(子网划分的细节)定长的子网掩码FLSM变长的子网掩码VLSMIPV4地址 IPV4地址就是给因特网(Internet)上的每一台主机(或路由器)的每一个接口…...
(一)初识Streamlit(附安装)
本入门指南介绍Streamlit的工作原理、如何在您首选的操作系统上安装Streamlit,以及如何创建第一个Streamlit应用程序! 1 安装 1.1 先决条件 Python 3.7 – Python 3.11 **注:我这里使用的是anaconda的虚拟环境,用pycharm编写代…...
【新】华为OD机试 - 斗地主 2(Python)| 刷完获取OD招聘渠道
斗地主 2 题目描述 在斗地主扑克牌游戏中,扑克牌由小到大的顺序为3 4 5 6 7 8 9 10 J Q K A 2 玩家可以出的扑克牌阵型有,单张,对子,顺子,飞机,炸弹等 其中顺子的出牌规则为,由至少 5 张由小到大连续递增的扑克牌组成 且不能包含2 例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,1…...
秒杀项目之消息推送
目录一、创建消费者二、创建订单链路配置2.1 定义RabbitMQ配置类2.2 创建RabbitmqOrderConfig配置类三、如何实现RabbitMQ重复投递机制3.1 开启发送者消息确认模式3.2 消费发送确认3.2.1 创建ConfirmCallBack确认模式3.2.2 创建ReturnCallBack退回模式3.3 创建生产者3.4 创建消…...
【重磅】IEEE33配电网两阶段鲁棒优化调度CCG
目录 1 前言 2基本内容 2.1 配网两阶段鲁棒模型 2.2 求解步骤 3部分程序 4程序结果 5程序链接 1 前言 鲁棒优化是电力系统研究的热点,而两阶段鲁棒和分布鲁棒研究就成为各类期刊(sci/ei/核心)的宠儿,最简单的思路是通过改…...
阿里云的云服务器做网站用哪种/百度推广总部客服投诉电话
如果懂位的运算,看到下面这2个程序执行的结果,会很容易理解,如果像我这样的菜鸟,刚接触开始肯定也觉得晕晕的,| 这是什么运算符? |就是位的或运算符,下面还是用上面的程序来讲解一下,…...
临沂建站公司/网站排名靠前的方法
你好!首先,你说的Java窗口是指JFrame或者Frame其次,你说的窗口背景颜色是指直接调用JFrame或者Frame的setBackground(Color color)方法设置后显示出来的颜色。其实,你的想法是正确的,但是我想提醒你的是,你…...
网站建设 管理/推广网页怎么做的
php如何获取文件修改时间_后端开发在php中可以使用filemtime函数获取文件修改时间,filemtime函数的作用就是返回文件内容的上次修改时间,语法是“filemtime(filename)”,其中参数filename表示要检查的文件。php找不到dll的解决办法࿱…...
专门做定制的网站/网络营销策划书论文
Python爬虫入门教程目录 写在前面编码部分,looter走起shell 步骤生成一个爬虫写在后面梦想橡皮擦,继续给自己加油打气 爬虫百例教程导航链接 : https://blog.csdn.net/hihell/article/details/86106916 写在前面 爬虫教程,爬虫框架其实已经非常多了,国内国外很多人都在不…...
南昌网站seo外包/网店培训
🎠🔮导语: 好玩又考验智力的小游戏来了~每天上班上学之后太累就做个小游戏犒劳一下自己吧!这期就是用python做迷宫小游戏分享给大家让我们愉快地开始吧~🎠想领取更多完整源码或Python学习资料可点击这行蓝色字体 &…...
建设行业网站平台的瓶颈/网站收录软件
题目 本题是谭浩强《C程序设计课后习题》题8.11。 题目: 在主函数中输入10个等长的字符串。用另一函数对它们排序。然后在主函数输 出这10个已排好序的字符串。 以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。—…...