【Python】函数的定义和调用、形参和实参、函数的返回值、多元赋值、全局和局部变量

news2024/9/28 8:42:05

文章目录

  • 函数的定义
  • 函数的调用
  • 形参和实参
  • 函数的返回值
    • 一个 return
    • 多个 return
      • 多元赋值
  • 变量作用域
      • 函数内的变量
      • 全局变量和局部变量
      • 修改全局变量

函数的定义

函数的定义:分配任务

def 函数名(形参列表):
	函数体
	return 返回值
  • defdefine,定义
  • 形参列表中,可以有多个形参,它们之间使用逗号分隔
  • 函数体要带一级缩进,带有缩进的代码,才能算是函数的内部语句
  • 函数执行到 return 就代表执行完了,后面跟的值就是函数的返回值。return 语句不是必须得,可有可无

函数的调用

函数的调用:开始完成任务

函数名(实参列表)
  • 实参列表,简称实参,此处写的实参的个数要和形参的个数匹配
def test():  
    print('hello')  
    print('hello')  
    print('hello')  
# 调用函数
test()

"""
运行结果
hello
hello
hello
"""
  • 函数调用才会真正执行函数体里面的代码
  • 函数经过一次定义之后,可以被调用多次
  • Python 中要求,函数定义写在前面,调用在后面,“先定义,再使用

形参和实参

举一个例子:

我有一个朋友

高中的时候,是一个学霸
通过是一个非常漂亮的女生
他们的关系非常好,
但是因为一些原因,最终没能在一起


这个朋友,其实 就是我

  • 在这里面,“我有一个朋友“ 就是形参,“” 就是实参
  • 函数的调用是可以有多次的,每次调用的实参,也是可以不同的
  • 函数的实参,就是在函数调用的时候,要赋值给形参
def calcSum(beg, end):  
    theSum = 0  
    for i in range(beg, end + 1):  
        theSum += i  
    print(theSum)  
  
  
# 求 1-100 的和  
calcSum(1,100)  
# 求 300-400 的和  
calcSum(300,400)


"""
运行结果
5050
35350
"""

C++/Java 里面,不光要求实参和形参的个数要匹配,还要求类型也匹配。但是在 Python 里面,只要求个数,对类型没有要求(动态类型)

def test(x, y):
	return x + y


test(10, 20)
test(12.4, 11.5)
test('hello', 'world')


"""
运行结果
30
23.9
helloworld
"""
  • 也不是说传入什么类型都可以,只要保证传入的参数类型,在函数体里面能够支持对应的运算操作即可(字符串和数字就不能一起)

函数的返回值

函数的参数可以视为是函数的 “输入”, 则函数的返回值, 就可以视为是函数的 “输出” .

此处的 “输入”, “输出” 是更广义的输入输出, 不是单纯指通过控制台输入输出.
我们可以把函数想象成一个 “工厂”. 工厂需要买入原材料, 进行加工, 并生产出产品.
函数的参数就是原材料, 函数的返回值就是生产出的产品.

一个 return

beg-end 之间的数的和:

def calcSum(beg, end):  
    theSum = 0  
    for i in range(beg, end + 1):  
        theSum += i  
    return theSum  
  
  
result = calcSum(1,100)  
print(result)
  • 此处的求和代码,在 calcSum 内部只进行了计算,而把打印的逻辑放到了函数的外面,calcSum 把计算结果当做返回值,返回给“函数的调用者
    • 这里把函数里面算好的 5050 赋值给了 result 变量
    • 在实际开发中,一般更倾向于这种写法。
    • 一个通用的编程原则:一个函数只做一件事

解耦合

  • 在一个稍微复杂一点的程序中,经常会涉及到很多个模块,模块之间可能要进行交互
  • 交互就会带来耦合,我们希望通过良好的设计让耦合尽量低

  • 你和你的女朋友,耦合就比较强,一方产生变动,对另一方影响就非常大
    • 比如你的女朋友生病了,你就要去照顾她,去陪她
  • 你和你的其他普通女性朋友之间的耦合就几乎为 0,一方产生变动,对另一方几乎没啥影响
    • 如果这个朋友生病了,你肯定不会去照顾她,你甚至都不会知道

多个 return

一般多个 return 语句是搭配:分支语句/循环语句

def isOdd(num):  
    if num % 2 == 0:  
        return False  
    else:  
        return True  
  
  
print(isOdd(10))  
print(isOdd(19))


"""
运行结果
False
True
"""
  • isOdd 是在判断输入的数字是不是奇数
    • 是,返回
    • 不是,返回
def Odd(num):
	if num % 2 == 0:
		return False
	return True
  • 这个代码逻辑和上面的逻辑是等价的
  • 当函数执行到 return 的时候就不再继续向下执行了,而是回到了调用位置(函数结束了)
  • return True 写到 if 外面,意味着不管条件是否满足,都会执行 return True,但是仔细观察,就会发现当条件满足之后,if 里面有一个 return 了, 所以一旦条件满足,就会执行 if 里面的 return,函数就结束了,就没有机会执行到外面的 return

Python 中的一个函数可以返回多个值,是非常香的特征,C++/Java 都馋哭了

  • C++/Java 中调用一个函数一次只能返回一个值
  • C++要想返回多个值,可以通过输出型参数(指针/引用)
  • Java 要想返回多个值,需要把多个值给包装成一个对象,然后再返回这个对象

多元赋值

def getPoint():  
    x = 10  
    y = 20  
    return x, y  
  
  
a, b = getPoint()
  • 这里就将 x 赋值给了 a,将 y 赋值给了 b

Golang 在设计的时候也把这个机制给引用进去了

虽然现在返回了多个值,但是我只想用其中一部分,不关注其他的

  • 可以使用 _ 来进行占位
def getPoint():  
    x = 10  
    y = 20  
    return x, y  
  
  
_, b = getPoint()
  • 不要 x 了,只要 y,把 y 赋值给 b 即可

变量作用域

def getPoint():  
    x = 10  
    y = 20  
    return x, y  
  
  
x, y = getPoint()
  • 在这个代码中, 函数内部存在 x, y, 函数外部也有 x, y.
  • 但是这两组 x, y 不是相同的变量, 而只是恰好有一样的名字.
  • 比如说,你喊你的女朋友“宝贝”,你的朋友喊他女朋友也是“宝贝”
  • 但是这两个“宝贝”是不同的,这是在各自不同的范围
  • 你喊你的女朋友“宝贝”,是在你俩的圈子里
  • 你朋友喊你的女朋友“宝贝”,是在他俩的圈子里
  • 你们俩在各自圈子里互不影响

函数内的变量

一个变量的有效范围是一定的,只在一个固定的区域内生效

函数内部的变量只在函数内部生效,出了函数就失效了

def getPoint():  
    x = 10  
    y = 20  
    return x, y  
  
  
getPoint()  
print(x,y)

image.png|374

全局变量和局部变量

虽然名字相同,实际上是不同的变量.

x = 10  
def test():  
    x = 20  
    print(f'函数内部 x = {x}')  
  
  
test()  
print(f'函数外部 x = {x}')

"""
运行结果
函数内部 x = 20
函数外部 x = 10
"""
  • 外面的 x全局变量,是在整个程序中都有效的
  • 函数里面的 x局部变量,只在函数内部有效
x = 10  
def test():  
    print(f'x = {x}')  
  
  
test()

"""
运行结果
x = 10
"""
  • 在函数里读取全局变量是可以的
  • 当函数中尝试访问某个变量的时候,会先尝在局部变量中查找,如果找到,就直接访问
    • 如果没有找到,就向上一级作用域中进行查找,test 再往上一级,就是全局了

修改全局变量

如果是想在函数内部修改全局变量的值,需要使用 global 关键字声明

x = 10  
def test():  
    global x  
    x = 20  
  
  
test()  
print(f'x = {x}')

"""
运行结果
x = 20 
"""
  • 如果没有 global,此时就会把 x = 10 当做是在函数内部创建了一个局部变量 x,但实际上是要修改全局变量 x
  • 为了让函数里面知道这里的 x 是一个全局变量,就是用 global 关键字先声明一下

if,else,whilefor 这些关键字也会引入“代码块”,但是这些代码块不会对变量的作用域产生影响,上述语句中的代码块内部定义的变量,可以在外面被访问

for i in range(1, 3):  
    print(i)  
  
  
print('---------------')  
print(i)

"""
1
2
---------------
2
"""
  • C++/Java 中只要是 { } 就会影响到作用域,而 Python 不会,Python 中只有函数能影响作用域

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

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

相关文章

2024“钉耙编程”中国大学生算法设计超级联赛(8)

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,彩笔ACMer一枚。 🏀所属专栏:杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 不是哥们,怎么我tm什么都不会。 📢&…

计算机Java项目|基于SpringBoot的医院药品管理系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参…

大象机械臂myCobot 280 JN 2023和D435i相关环境配置

目录 一、安装Google拼音输入法二、安装CUDA 10.2三、安装conda管理环境四、配置D435i相机SDK五、安装realsense-ros 大象机器人的这款机械臂,用的Jetson nano做的主控,给的系统的ubuntu20,默认python版本是3.8。并且没有配置CUDA&#xff0c…

记录|SPC理解+SPC的监控看板

目录 前言一、Dashboard1.1 分布图1.2 控制图I-MR控制图:单值极差控制图Xbar-R图:均值极差控制图 1.3 趋势图 二、Xbar-R控制图判断异常的条件Xbar控制图R控制图 三、均值极差控制图【Xbar-R】3.1 基础理解XbarR最终绘制的Xbar-R图 3.2 如何看图看图顺序…

Linux下安装python与pip源配置(详细教程)

文章目录 Linux下安装python前置准备解压数据编译安装配置环境变量方式1:设置软连接方式2:添加PATH PIP源配置系统设置pip源临时设置pip源 问题解决缺少zlib包 Linux下安装python 前置准备 # 下载地址 https://www.python.org/ftp/python/3.6.8/# wget…

高精度夹治具的使用技巧和注意事项

在现代工业生产中,高精度夹治具扮演着至关重要的角色。它们能够确保工件在加工过程中的稳定性和精度,提高生产效率和产品质量。然而,要充分发挥高精度夹治具的优势,必须掌握正确的使用技巧和注意事项。以下是时利和整理的一些内容…

大数据-95 Spark 集群 SparkSQL Action与Transformation操作 详细解释与测试案例

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

关于lettuce的一次pipeline反向优化

起因是后台job对一批数据做大量的redis读写操作,为了提高job的执行速度,直接使用pipeline对一些不能批量读写的命令进行管道优化 简单介绍什么是lettuce Spring Boot自2.0版本开始默认使用Lettuce作为Redis的客户端(注1)。Lettu…

WEB渗透免杀篇-绕过

360白名单 需要足够的权限 360的扫描日志和设置白名单日志位置在:C:\Users[username]\AppData\Roaming\360Safe\360ScanLog 查看扫描日志内容可以查询到白名单文件 日志文件记录的是添加或移除白名单的时间、文件名、hash等信息,otc1为添加白名单&#…

SadTalker翻译与代码调试

文章目录 SadTalker原文翻译SadTalker:学习风格化音频驱动单幅图像说话人脸动画的真实 3D 运动系数Abstract1. Introduction2. Related Work3. Method3.1. Preliminary of 3D Face Model3.2. Motion Coefficients Generation through Audio3.3. 3D-aware Face Rende…

操作系统简介:设备管理

设备管理 1. 设备管理概述2. 设备管理技术通道技术DMA技术缓冲技术Spooling技术 3. 磁盘调度 设备管理是操作系统中最繁杂而且与硬件紧密相关的部分,不但要管理实际 I/O 操作的设备(如磁盘机、扫描仪、打印机、键盘和鼠标),还要管理诸如设备控制器、DMA…

Linux信号机制探析--信号的处理

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🍑信号处理信号处理常见方式概览 🍒内核如何实现信号的捕捉 🍎内核态与用户态操作系统是如何正常…

下载cmake操作步骤

cmake官网链接 cmake-3.30.2.tar.gz源代码官网下载链接

中国的人形机器人都有哪些出色的产品?

8月21日,2024世界机器人大会在北京亦庄正式开幕。本次大会共有169家企业集中展出了600余件机器人创新产品,人形机器人占比最大,大会还开设人形机器人专区,共亮相27款整机。 展会中多数人形机器人产品都偏向服务型,主要…

乾坤大挪移!将脚趾移到手指上,江山邦尔骨科医院成功完成一例断指再植手术

2024年6月中旬,家住江山贺村的何阿姨经历一次不小的意外。 那天天气晴朗,何阿姨准备把院子修缮修缮。操作切割工具时,何阿姨没有握稳,让工具一下子飞了出去——飞出去的瞬间,工具切掉了她的左手拇指,血流不…

网络安全大考,攻防演练驱动企业常态化安全运营升级!

当前,网络安全形势日益严峻,恶意软件、勒索软件肆虐,钓鱼攻击手段层出不穷,不断威胁企业数据安全与业务连续性。随着云计算、大数据、物联网等新兴技术的广泛应用,网络边界模糊化,攻击面急剧扩大&#xff0…

Qt (10)【Qt窗口 —— 如何在窗口中创建浮动窗口和状态栏】

阅读导航 引言一、如何在窗口中创建浮动窗口1. 浮动窗口的创建2. 设置停靠的位置 二、如何在窗口中创建状态栏1. 状态栏的创建2. 在状态栏中显示实时消息3. 在状态栏中显示永久消息4. 调整显示消息的位置,并加上进度条 引言 在上一篇文章中,我们一同探索…

数据结构(6_3_1)——图的广度优先遍历

树和图的广度优先遍历区别 树的广度优先遍历&#xff1a; 图的广度优先遍历&#xff1a; 代码&#xff1a; 注:以下代码只适合连通图 #include <stdio.h> #include <stdbool.h>#define MAX_VERTEX_NUM 100typedef struct ArcNode {int adjvex; // 该边所指向的顶…

慧灵夹爪:工业智能的创新先锋

慧灵作为一个知名老品牌&#xff0c;其机器人产品在众多场景中广为人知。随着智能化、自动化技术的不断提升&#xff0c;智能工业飞速发展&#xff0c;慧灵夹爪在其中发挥的作用也越来越多。 在工业自动化生产中&#xff0c;精准与灵活是衡量设备性能的重要标尺。慧灵夹爪以其卓…

Criteria 是干什么用的?

我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 &#x1f393;擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号&#xff1a;热爱技术的小郑。回复 Java全套视频教程 或 前端全套视频…