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

[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的主要特点、使用场景以及它们之间的差异&#xff0c…...

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 源,以便于提高包安装的速度和效率,特别是在中国大陆地区&#xf…...

解压短视频素材资源网站推荐

如果你正在寻找解压短视频素材,那么这篇文章正是为你而写!以下是一些热门的网站,帮助你轻松找到所需的素材,快来看看吧! 蛙学网 蛙学网是国内领先的视频素材网站,提供丰富的解压视频素材。无论是放松心情的…...

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&#xff…...

每日一题学习笔记

给你两个字符串: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>...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...