Chapter 15 Python函数进阶

news2024/11/15 4:40:40

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!

文章目录

  • 前言
  • 一、函数多返回值
  • 二、函数的多种传参方式
  • 三、匿名函数


前言

在Python中,函数是组织代码、提高重用性与可读性的基本构建块。随着程序逻辑的复杂性增加,函数的使用也逐渐演变出更多的形式和技巧。本章详细讲解了Python函数的进阶使用,包括函数的多返回值、函数的多种传参方式以及匿名函数。


本篇文章参考:黑马程序员

一、函数多返回值

思考:如果一个函数有两个return (如下所示),程序会如何执行?

def test_return():
    return 1
    return 2
result=test_return()
print(result)

输出结果:
1

可以看出,该段代码只执行了第一个return。因为return可以退出当前函数,导致return下方的代码不执行,所以代码执行到第一个return后,就会退出函数,导致第二个return不被执行。

那如果一个函数要有多个返回值,该如何书写代码?
基本语法:
def 函数名():
  return 返回值1,返回值2
变量1,变量2= 函数名()
print(变量1)
print(变量2)

按照返回值的顺序,写对应顺序的多个变量接收即可,变量之间用逗号隔开,支持不同类型的数据return。

def test_return():
    return 1,"Hello",True

x,y,z=test_return()
print(x)
print(y)
print(z)

输出结果:
1
Hello
True

二、函数的多种传参方式

函数有四种常见的参数使用方式:

  1. 位置参数
  2. 关键字参数
  3. 缺省参数
  4. 不定长参数

①位置参数:
调用函数时根据函数定义的参数位置来传递参数。
注意:传递的参数和定义的参数的顺序及个数必须一致

def user_info(name,age,gender):
    print(f"姓名:{name},年龄:{age},姓名是:{gender}")
# 位置参数
# 需按照参数定义的顺序传参
user_info("小明",20,"男")
#错误示范:不按照固定的顺序会导致内容错乱
user_info("男","小明",20)

姓名:小明,年龄:20,姓名是:男
姓名:男,年龄:小明,姓名是:20

②关键字参数:
函数调用时通过“键=值”形式传递参数。
作用:可让函数更加清晰、容易使用,同时也清除了参数的顺序需求。

def user_info(name,age,gender):
    print(f"姓名:{name},年龄:{age},姓名是:{gender}")
# 关键字参数
# 可不按照参数定义的顺序传参
user_info(name="小王",age=11,gender="女")
user_info(age=12,gender="女",name="小晓")

输出结果:
姓名:小王,年龄:11,姓名是:女
姓名:小晓,年龄:12,姓名是:女

③位置参数和关键字参数混用:
位置参数和关键字参数混用时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。

def user_info(name,age,gender):
    print(f"姓名:{name},年龄:{age},姓名是:{gender}")
# 位置参数和关键字参数混用
user_info("小菲",age=15,gender="女")
# 错误示范:会报错 SyntaxError: positional argument follows keyword argument
# user_info(name="小菲",15,"女")

输出结果:
姓名:小菲,年龄:15,姓名是:女

④缺省参数:
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传递该默认参数的值。
作用:当调用函数时没有传递参数, 就会使用缺省参数对应的值。
注意:所有无默认值的参数必须放在任何带有默认值的参数之前。

# 缺省参数
# 所有无默认值参数的参数必须放在任何带有默认值的参数之前
def user_info(name,age=11,gender="男"):
    print(f"姓名:{name},年龄:{age},姓名是:{gender}")

user_info("小天",)
user_info("小美",13,"女")

# 错误示范,会报错 yntaxError: parameter without a default follows parameter with a default
# def user_info(name="小美",age,gender):
    #print(f"姓名:{name},年龄:{age},姓名是:{gender}")

输出结果:
姓名:小天,年龄:11,姓名是:男
姓名:小美,年龄:13,姓名是:女

⑤不定长参数:
不定长参数也叫可变参数,用于函数调用时不确定传递多少个参数(不传参也可以)的场景。
不定长参数的类型:

  • 位置传递
    传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型。(*)表示可以接收不定数量的位置参数。
    基本语法:
    def 参数名(*args):
      print(args)
  • 关键字传递:
    参数是“键=值”的形式, 所有的“键=值”都会被kwargs接受, 同时会根据“键=值”组成字典。(**)表示接收不定数量的关键字参数。
    基本语法:
    def 参数名(**kwargs):
      print(args)
# 位置不定长,*号
# 不定长定义的形式参数会作为元组存在,接收不定长数量的参数传入
def user_info(*args):
    print(f"args参数的类型为{type(args)},内容为{args}")

user_info(1,2,3,"小明","男孩")

输出结果:
args参数的类型为<class ‘tuple’>,内容为(1, 2, 3, ‘小明’, ‘男孩’)

# 关键字不定长,**号
def user_info(**kwargs):
    print(f"kwargs参数的类型为{type(kwargs)},内容为{kwargs}")
# 错误示范:传进的参数必须是“键=值”的形式,否则会报错 TypeError: user_info() takes 0 positional arguments but 5 were given
# user_info(1,2,3,"小明","男孩")
user_info(name="小明",age=15,gender="男")

输出结果:
kwargs参数的类型为<class ‘dict’>,内容为{‘name’: ‘小明’, ‘age’: 15, ‘gender’: ‘男’}

三、匿名函数

①函数作为参数传递:
在前面的函数学习中,我们一直使用的函数都是接受数据(数字、字符串、字典、列表、元组等)作为参数传入。
其实,函数本身也可作为参数传入另一个函数内。

# 定义一个函数,接收另一个函数作为传入参数
def test_func(compute):
    result=compute(1,2) #确定compute是函数
    print(f"compute参数的类型为{type(compute)}")
    print(f"计算结果为{result}")

# 定义一个函数,准备作为参数传入另一个函数
def compute(x,y):
    return x+y
# 调用并传入参数
test_func(compute)

输出结果:
compute参数的类型为<class ‘function’>
计算结果为3

【分析】
函数compute作为参数传入了test_func函数中使用,这是一种计算逻辑的传递而非数据的传递。
在这里插入图片描述
②lambda匿名函数:
函数的定义:

  • def关键字可定义带有名称的函数,有名称的函数,可以基于名称重复使用。
  • lambda关键字可定义匿名函数(无名称),无名称的匿名函数,只可临时使用一次。

匿名函数基本语法:
lambda 传入参数 : 函数体(一行代码)

  • lambda 是关键字,表示定义匿名函数
  • 传入参数表示匿名函数的形式参数,如x, y 表示接收两个形式参数
  • 函数体即函数的执行逻辑(注意:函数体内只能写一行代码,无法写多行代码
# 定义一个函数,接收另一个函数作为传入参数
def test_func(compute):
    result=compute(1,2)
    print(f"计算结果为{result}")

# 通过lambda匿名函数的形式,将匿名函数作为参数传入
test_func(lambda x,y:x+y)

输出结果:
计算结果为3

lambda匿名函数更为简易,能提高代码的灵活性和可读性,适用于只需要使用一次的简单操作。

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

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

相关文章

动手学深度学习——6.循环神经网络

1.序列模型 处理序列数据需要统计工具和新的深度神经网络架构。 为了简单起见&#xff0c;我们以 图8.1.1所示的股票价格&#xff08;富时100指数&#xff09;为例。 图8.1.1 近30年的富时100指数 其中&#xff0c;用&#x1d465;&#x1d461;表示价格&#xff0c;即在时间…

【Linux】gcc简介+编译过程

gcc是Linux系统下一款专门针对于C语言的代码编译软件。g则是Linux下针对于CPP语言的代码编译软件&#xff0c;实际上g底层也大量用了gcc代码。 目录 1.gcc基本认识与安装2.gcc编译过程2.1编译 和 链接2.2编译步骤形成的原因2.3编译器的自举2.4链接 1.gcc基本认识与安装 gcc是一…

案例实践 | 基于长安链的福建省气象综合治理区块链平台

案例名称-【福建省气象综合治理区块链平台】 ■ 实施单位 福建福链科技有限公司 ■ 业主单位 福建省气象信息中心 ■ 上线时间 2023年10月 ■ 用户群体 福建省气象、防灾减灾相关单位 ■ 用户规模 全省2100余个气象站、气象局以及防灾减灾部门 案例背景与解决痛点 …

【C++中线程学习】

1、多线程 C11之前没有引入线程的概念&#xff0c;如果想要实现多线程&#xff0c;需要借助操作系统平台提供的API&#xff0c;比如Linux的<pthead.h>&#xff0c;或者windows下的<windows.h>。 C11提供了语言层面上的多线程&#xff0c;包含在头文件<thread.h…

[微信小程序] css 解决纯数字或字母不自动换行的问题、控制文字行数

效果 css 代码 word-break: break-all; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;解释 word-break: break-all; 作用&#xff1a;这个属性允许在单词内部进行换行&#xff0c;即使单词很长也…

正向解析、反向解析、DNS主从、DNS多区域、ntp时间同步

DNS配置回顾 编号主机名IP地址说明1web服务器192.168.1.17发布部署web服务2dns服务器192.168.1.20用于解析域名和IP地址3clien主机192.168.1.18用于模拟客户机 修改 client主机&#xff1a;修改了dns的访问主机&#xff1b;临时修改echo "nameserver IP地址"&…

【Git多人协作开发】不同的分支下的多人协作开发模式

目录 0.前言背景 1.开发者1☞完成准备工作&协作开发 1.1查看分支情况 1.2创建本地分支feature-1 1.3三板斧 1.4push推本地分支feature-1到远程仓库 2.开发者2☞完成准备工作&协作开发 2.1创建本地分支feature-2 2.2三板斧 2.2push推送本地feature-2到远程仓库…

redis构建集群时,一直Waiting for the cluster to join

redis构建集群时&#xff0c;一直Waiting for the cluster to join 前置条件参考 前置条件 这是我搭建的集群相关信息&#xff0c;三台虚拟机&#xff0c;分别是一主一从。在将所有虚拟机中redis服务器用到的tcp端口都打开之后&#xff0c;进行构建集群。但是出现上面的情况。 …

MyCms开源免费的自媒体商城博客CMS企业建站系统

MyCms是一款基于Laravel开发的开源免费的自媒体博客CMS系统&#xff0c;适用于个人网站及企业网站开发使用&#xff0c;MyCms基于Apache2.0开源协议发布&#xff0c;免费且不限制商业使用。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89575879 更…

DC系列靶场---DC 3靶场的渗透测试(一)

信息收集 Nmap扫描 nmap -sS -sV -T4 -p- -O 172.30.1.142//-sS TCP的SYN扫描 //-sV 服务版本检测 //-T4 野蛮的扫描&#xff08;常用&#xff09; //-O 识别操作系统 使用Nmap扫描只看到一个80端口&#xff0c;Apache的2.4.18版本。 http探测 使用Wappalyzer插件可以到…

防火墙限制docker了

今天有个安全方面的需求&#xff0c;演示环境禁止将3306等高危端口暴露到外网。 于是同事开启了防火墙&#xff0c;仅将应用端口暴露。结果导致演示环境无法使用。 由于公司的应用是基于docker部署的。结果他问我为什么同一台机器&#xff0c;应用无法访问mysql。 docker对于…

Apollo使用(3):分布式docker部署

Apollo 1.7.0版本开始会默认上传Docker镜像到Docker Hub&#xff0c;可以按照如下步骤获取 一、获取镜像 1、Apollo Config Service 获取镜像 docker pull apolloconfig/apollo-configservice:${version} 我事先下载过该镜像&#xff0c;所以跳过该步骤。 2、Apollo Admin S…

自动驾驶(八十七)---------虚拟机Hypervisor

在汽车电子电气架构发展中&#xff0c;SOA和中央计算是重要的趋势&#xff0c;boach的下图广为流传。因为仪表、座舱、智驾根据不同的需求选择不同的系统&#xff0c;这就导致虚拟机技术是实现中央计算的重要技术。 Hypervisor可以在一台硬件上运行多个虚拟机&#xff08;VM&am…

C# 知识点总结

入门 C#程序在.NET上运行&#xff0c;.NET framework包含两个部分&#xff1a; ①&#xff1a;.NET framework类库 ②&#xff1a;公共语言运行库CLR&#xff08;.NET虚拟机&#xff09; CLS&#xff08;公共语言规范&#xff09; CTS&#xff08;通用类型系统&#xff09; .N…

Leetcode3219. 切蛋糕的最小总开销 II

Every day a Leetcode 题目来源&#xff1a;3219. 切蛋糕的最小总开销 II 解法1&#xff1a;贪心 谁的开销更大&#xff0c;就先切谁&#xff0c;并且这个先后顺序与切的次数无关。 代码&#xff1a; /** lc appleetcode.cn id3219 langcpp** [3219] 切蛋糕的最小总开销 I…

智能爬虫管理:定制化数据抓取方案为企业赋能

摘要&#xff1a; 在数据驱动的时代&#xff0c;精准而高效的数据抓取成为企业决策的命脉。本文将探讨如何通过定制化的智能爬虫管理方案&#xff0c;赋能企业实现数据洞察力的飞跃。我们将深入解析定制化数据抓取的核心优势&#xff0c;分享成功案例&#xff0c;并揭秘如何利…

【HTML — 构建网络】HTML 入门

在本文中,我们将介绍 HTML 的绝对基础知识。为了帮助您入门,本文定义了元素、属性以及您可能听说过的所有其他重要术语。它还解释了这些在 HTML 中的位置。您将学习 HTML 元素的结构、典型的 HTML 页面的结构以及其他重要的基本语言功能。在此过程中,也将有机会玩转 HTML! …

动手学深度学习6.5 汇聚层-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;池化层_哔哩哔哩_bilibili 本节教材地址&#xff1a;6.5. 汇聚层 — 动手学深度学习 2.0.0 docume…

数据结构--二叉树详解

一&#xff0c;概念 1&#xff0c;结点的度&#xff1a;一个结点含有子树的个数称为该结点的度 2&#xff0c; 树的度&#xff1a;一棵树中&#xff0c;所有结点度的最大值称为树的度&#xff1b; 3&#xff0c;叶子结点或终端结点&#xff1a;度为0的结点称为叶结点&#x…

C++内存管理(候捷)第四讲 笔记

上中下三个classes分析 Loki allocator的三个类&#xff0c;从低阶到高阶分别为&#xff1a;Chunk, FixedAllocator, SmallObjAllocator Chunk&#xff1a;pData指针&#xff0c;指向分配的一个chunk&#xff0c;firstAvailableBlock_索引&#xff0c;指向第一个可用区块是第几…