[Python学习日记-32] Python 中的函数的返回值与作用域
[Python学习日记-32] Python 中的函数的返回值与作用域
简介
返回值
作用域
简介
在函数的介绍中我们提到了函数的返回值,当时只是做了简单的介绍,下面我们将会进行详细的介绍和演示,同时也会讲一下 Python 中的作用域,作用域分为全局和局部,这也会在下面进行详细讲解和演示。
返回值
函数外部的代码要想获取函数的执行结果,就可以在函数里用 return 语句把结果返回,代码如下
def stu_register(name, age, course='PY', country='CN'):print("------注册学生信息------")print("姓名:", name)print("age:", age)print("国籍:", country)print("课程:", course)if age > 22:return Falseelse:return Trueregistriation_status = stu_register('王老五',22,course='Python日记',country='JP')if registriation_status:print("注册成功")
else:print("年龄过大")
代码输出如下:

当函数具有多个结果是则需要 return 多个值,代码如下
def stu_register(name, age, course='PY', country='CN'):print("------注册学生信息------")print("姓名:", name)print("age:", age)print("国籍:", country)print("课程:", course)if age > 22:return False,"年龄过大"else:return True,"注册成功"registriation_status,str = stu_register('王老五',22,course='Python日记',country='JP')if registriation_status:print(str)
else:print(str)
代码输出如下:

注意:
- 函数在执行过程中只要遇到 return 语句,就会停止执行并返回结果,所以也可以理解为 return 语句代表着函数的结束
- 如果未在函数中指定 return,那这个函数的返回值为 None
作用域
一、全局与局部变量
函数中的作用域指的是变量的可访问范围。在函数内部定义的变量是局部变量,只能在函数内部被访问。在函数外部定义的变量是全局变量,可以在函数内部和外部被访问。代码如下
name = "Jove"def change_name():name = "浩南哥" # 局部变量,在这里相当于赋值了新的变量,只在函数里面有效print("after change:",name," id:",id(name)) # 这里 print(name) 会先去找局部内存里的 name,如果没有才会去找全局内存里的 namechange_name()print("在外面看看 name 改了没有:",name," id:",id(name))
代码输出如下:

在函数内部修改了 name 的值后,在外面 print() 的时候却没有修改,这是因为这两个 name 根本不是一回事,在上面的输出就可以看出函数内的内存地址和函数外面的内存地址是不一样的,局部变量和全局变量的注意事项如下
- 在函数中定义的变量称之为局部变量,在程序的一开始定义的变量称为全局变量;上面的代码中函数内的 name 称之为局部变量,外面的 name 称之为全局变量;
- 全局变量作用域(即有效范围)是整个程序,局部变量作用域是定义该变量的函数;
- 变量的查找顺序是局部变量 > 全局变量;
- 当全局变量与局部变量同名时,在定义局部变量的函数内,局部变量起作用;在其它地方全局变量起作用;
- 在函数里是不能直接修改全局变量的。

若是想在函数内修改全局变量那应该怎么修改呢?代码如下
name = "Jove"def change_name():global name # 在函数内部声明(创建)一个全局变量,如果全局变量在外面已经有了,更像是指向到外面的全局变量的内存地址name = "浩南哥" # 这里调用的就是前面声明了的全局变量 name 了print("after change:",name," id:",id(name))change_name()print("在外面看看 name 改了没有:",name," id:",id(name))
代码输出如下:

global name 的作用就是要在函数里声明(创建)全局变量 name,意味着最上面的 name="Jove" 即使不写,程序最后面的 print() 也可以打印 name。
值得注意的是,如果函数内声明了全局变量 name(global name)那 name = "浩南哥" 一定不能先于 global name,因为在你运行这段 Python 代码时,Python 解析器会先把这段代码读一遍,选出那些是局部变量,那些是全局变量,如果 name = "浩南哥" 先于 global name 那解析器会认为 name 既是局部变量也是全局变量,那就会出现如下报错信息
SyntaxError: name 'name' is assigned to before global declaration

二、传递列表、字典、集合产生的现象
d = {"name":"Jove","age":26,"hobbie":"大保健"} # 输出1841217292608
l = ["Rebeeca","Katrina","Rachel"] # 输出1841215033728def change_data(staff_table,girls): # 这里 staff_table 和 girls 只是传递了字典和列表的内存地址进来,并没有像字符串那样在局部内存当中声明(创建)了新的变量# 如果在函数当中创建了 dict,list 到函数结束时还是会销毁的# 如果当函数当中出现了与全局变量同名的局部变量,那样会优先选择局部变量# 在函数当中需要修改这个同名的变量,那样就要先声明这个临时变量,再操作,不然就会报错print("传入函数中 d 的内存地址:",id(staff_table)) # 输出1841217292608print("传入函数中 l 的内存地址:", id(girls)) # 输出1841215033728staff_table["hobbie"] = "学习"girls.append("XiaoYun")change_data(d,l)
print("d:",d," ——> ",id(d),"\nl:",l," ——> ",id(l)) # 整个过程 d 和 l 的内存地址都没有发生过改变
代码输出如下:

可以看到代码输出当中 d 和 l 都已经发生了改变,这个怎么和前面我们得到的结果有这么大偏差呢?不是说不能在函数里改全局变量么,这里怎么改了呀?看了下面这张图你就明白了

根据上图我们能看出,程序只是把 d 这个 dict 的内存地址传给了 change_data 函数,把 dict 比作鱼缸,里面的 key 和 value 比作缸里装的鱼。现在只是把鱼缸丢给了函数,这个鱼缸本身你不能改,但是里面的鱼可以。相当于只是传了一个对这个 d 的引用关系给到函数的形参。这样是为了减少内存的浪费,因为如果这个 dict 比较大,传一次到函数里就要复制一份新的值的话,效率低不单止还极度浪费资源。
相关文章:
[Python学习日记-32] Python 中的函数的返回值与作用域
[Python学习日记-32] Python 中的函数的返回值与作用域 简介 返回值 作用域 简介 在函数的介绍中我们提到了函数的返回值,当时只是做了简单的介绍,下面我们将会进行详细的介绍和演示,同时也会讲一下 Python 中的作用域,作用域分…...
儿童发光耳勺值得买吗?儿童发光耳勺最建议买的五个牌子!
儿童耳部清洁需谨慎,发光耳勺能在光线不足时提供照明,便于看清耳道。但不同产品质量参差不齐,选择时需综合考虑安全性、实用性等因素,为孩子的耳部健康做出正确选择! 这里给大家总结了全新的儿童发光耳勺的避雷指南&am…...
TIPS 二进制程序暴露符号给动态链接库使用
背景 在支持插件/扩展的C/C系统中,通常会支持在程序运行时加载动态链接库。这时二进制程序会提供一些函数/接口让动态链接库调用,但是这些函数在二进制程序中又不会使用,导致在编译时编译器直接把这些符号删除了,加载链接库就会由…...
【分布式微服务云原生】8分钟掌握微服务通信的艺术:Dubbo与OpenFeign全面解析
摘要: 在构建微服务架构时,服务间的通信机制是核心要素之一。Dubbo和OpenFeign是两个非常流行的服务调用框架,它们各有千秋,适用于不同的场景。本文将深入探讨Dubbo和OpenFeign的主要特点、使用场景以及它们之间的差异,…...
sicp每日一题[2.33]
Exercise 2.33 Fill in the missing expressions to complete the following definitions of some basic list-manipulation operations as accumulations: ; p 表示一个函数,sequence 表示一个列表 ; 这个函数将对列表中每一个元素进行 p 操作 (define (map p sequ…...
【Mybatis】常见面试题汇总 共56题
文章目录 1. 介绍下MyBatis?2. MyBatis 框架的应用场景?3. MyBatis 有哪些优点?4. MyBatis 有哪些缺点?5. MyBatis 用到了哪些设计模式?6. MyBatis常用注解有哪些?7. MyBatis 有哪些核心组件?8. MyBatis编程步骤是什么样的?9. MyBatis 和…...
每天一道面试题(17):服务网格学习笔记
什么是服务网格? 服务网格(Service Mesh)是处理微服务间通信的一种基础设施层。它主要用于解耦服务间的通信与业务逻辑,使开发者可以专注于业务实现。服务网格在微服务架构的演进中扮演了重要角色,特别是在解决服务间…...
【nrm】npm 注册表管理器
nrm是什么 nrm(NPM Registry Manager)是一个用于管理 Node.js 包管理器(如 npm 和 Yarn)的注册表工具。它可以帮助用户快速切换不同的 npm 源,以便于提高包安装的速度和效率,特别是在中国大陆地区…...
解压短视频素材资源网站推荐
如果你正在寻找解压短视频素材,那么这篇文章正是为你而写!以下是一些热门的网站,帮助你轻松找到所需的素材,快来看看吧! 蛙学网 蛙学网是国内领先的视频素材网站,提供丰富的解压视频素材。无论是放松心情的…...
Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作并通过uboot进行挂载启动
文章目录 1、AB分区镜像制作2、uboot修改3、镜像启动 在上一篇 Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动中,我们通过buildroot制作了根文件系统,并通过 SD卡的形式将其挂载到设备并成功进行了启动,但上一章中,我们的…...
Spring Boot中使用ThreadPoolTaskScheduler实现轻量级多线程定时任务
引言 在Java开发中,Spring Boot提供了多种方式来执行定时任务,如Scheduled注解和TaskScheduler。当需要执行多线程定时任务时,ThreadPoolTaskScheduler是一个轻量级的解决方案。本文将通过一个具体的业务场景,介绍如何使用Thread…...
完全二叉树的节点个数 C++ 简单问题
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 示例 1ÿ…...
每日一题学习笔记
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1: 输入&#…...
从事人工智能学习Python还是学习C++?
人工智能(Artificial Intelligence,简称AI)是当今科技领域最热门的研究方向之一。AI 涉及多个学科和技术,特别是机器学习、神经网络、深度学习等技术的应用。在AI的开发过程中,编程语言的选择对于开发效率和项目实现至…...
博客摘录「 CNN中的感受野和有效感受野会对模型产生怎样的影响?」2024年9月29日
,中心像素受影响较大,离中心越远梯度信号越弱。梯度信号的衰减是指数级的,这意味着应用于感受野的大多数像素的梯度将是可忽略的(如果有的话)。 有效感受野的定义...
AURIX单片机示例:开发入门与点亮LED
文章目录 目的模板工程Blinky_LED示例链接总结 目的 这个例程比较简单,主要通过这个例程来介绍 AURIX™ Development Studio(ADS) 和 iLLD 库来开发 AURIX 系列单片机一些入门的内容。一些更为基础的资料等内容可以参考下面文章: 《英飞凌 AURIX TriCo…...
MySQL字符串函数与操作
在编程领域中,字符串操作是数据处理中至关重要的一部分。无论是文本分析、日志处理,还是格式化输出,字符串的操作技能都能极大提高工作效率。在 Python 中,字符串相关的函数和方法为开发者提供了强大的工具,帮助完成各种任务。了解如何灵活运用这些工具,能够有效提升编程…...
HTML+CSS 水滴登录页
文章目录 一、效果演示二、Code1.HTML2.CSS 三、实现思路拆分 一、效果演示 实现了一个水滴登录页的效果。页面包含一个水滴形状的登录框和两个按钮,登录框包括用户名、密码和登录按钮,按钮分别为忘记密码和注册。整个页面的设计非常有创意,采…...
基于Next.js和TailwindCss的TailwindCss
最近在研究 Next.js 和 TailwindCss ,这两天没事的时候就搞了一个 c。 目前工具部署在 Vercel ,欢迎各位体验(能提出意见更好嘿嘿) 体验地址: https://icon.999872.xyz/ 图片预览 👇...
若依开源系统多数据源整合clickhouse数据库详细步骤
1.添加依赖【pom.xml文件】 <!-- clickhouse数据源依赖--><dependency><groupId>ru.yandex.clickhouse</groupId>...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
