Chapter 15 Python函数进阶

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

文章目录

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


前言

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


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

一、函数多返回值

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

def test_return():return 1return 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",Truex,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.mzph.cn/news/875165.shtml

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

相关文章

在 Windows 上安装 PostgreSQL

官网下载地址&#xff1a; https://www.enterprisedb.com/downloads/postgres-postgresql-downloadsWindows平台 官网直接提供exe安装包&#xff0c;没有手动安装的压缩包 postgresql-14.4-1-windows-x64.exe几个重要的安装选项 安装界面会指定服务程序和库两个路径&#xf…

压测实操--kafka-consumer压测方案

作者&#xff1a;九月 环境信息&#xff1a; 操作系统centos7.9&#xff0c;kafka版本为hdp集群中的2.0版本。 Consumer相关参数 使用Kafka自带的kafka-consumer-perf-test.sh脚本进行压测&#xff0c;该脚本参数为&#xff1a; thread&#xff1a;测试时的单机线程数&…

刷机维修进阶教程-----何谓“tee损坏” 指纹丢失 掉帧 传感器失效?详细修复步骤教程

TEE损坏指的是安卓机型中Key Attestation密钥认证所依赖的可信应用中的证书库被破坏了。然后拒绝为指纹密匙认证提供服务。加密的密匙由TEE负责管理。tee损坏只影响当前机型的密匙认证。不影响加密。通俗的理解。如果你机型维修或者刷机或者解锁或者格机 全檫除分区等等后有异常…

Elasticsearch集群配置-节点职责划分 Hot Warm 架构实践

前言 本文主要讲了ES在节点部署时可以考虑的节点职责划分&#xff0c;如果不考虑节点部署&#xff0c;那么所有节点都会身兼数职&#xff08;master-eligible &#xff0c;data&#xff0c;coordinate等&#xff09;&#xff0c;这对后期的维护拓展并不利&#xff0c;所以本文…

软件测试10 渗透性测试及验收测试

渗透性测试及验收测试 知识回顾 Web UI自动化测试 引入自动化测试需要满足的条件自动化测试流程简述自动化测试的关键技术Selenium页面元素定位方式 目标 了解安全测试的概念了解常见的安全漏洞了解安全测试流程及测试工具的使用理解验收测试的概念掌握Alpha测试和Beta测试…

【React 】开发环境搭建详细指南

文章目录 一、准备工作1. 安装 Node.js 和 npm2. 选择代码编辑器 二、创建 React 项目1. 使用 Create React App2. 手动配置 React 项目 三、集成开发工具1. ESLint 和 Prettier2. 使用 Git 进行版本控制 在现代前端开发中&#xff0c;React 是一个非常流行的框架&#xff0c;用…

【计算机毕业设计】866校企合作管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Git处理Failed to connect to www.google.com port 80: Timed out

Git处理Failed to connect to www.google.com port 80: Timed out 输入提交代码命令&#xff1a;git push -u origin master 报错&#xff1a;fatal: unable to access https://gitee.com/solitudeYu/gerenzhuye.git/: Failed to connect to www.google.com port 80: Timed ou…

AI数字人+城市交通大数据可视化平台,让交通管理与服务更简便、更智能

如今&#xff0c;AI数字人作为科技革命和产业革命的重要驱动力&#xff0c;AI数字人接入城市交通大数据可视化平台&#xff0c;可以有效地将各硬件与业务系统进行深度融合&#xff0c;完成业务闭环。依托AI数字人的应用&#xff0c;使城市交通大数据可视化平台的使用复杂度大幅…

我在Vscode学Java泛型(泛型设计、擦除、通配符)

Java泛型 一、泛型 Generics的意义1.1 在没有泛型的时候&#xff0c;集合如何存储数据1.2 引入泛型的好处1.3 注意事项1.3.1 泛型不支持基本数据类型1.3.2 当泛型指定类型&#xff0c;传递数据时可传入该类及其子类类型1.3.3 如果不写泛型&#xff0c;类型默认是Object 二、泛型…

Elastic 数据分层策略:为弹性及高效的实施而优化

作者&#xff1a;来自 Elastic Michael Calizo, Tim Lee 在 Elastic&#xff0c;我们大多数成功的客户实施都是从单一用例开始的&#xff0c;旨在满足特定的业务需求。Elastic 最初被采用通常是因为开发人员欣赏它提供的功能。然而&#xff0c;由于其灵活性和可定制性&#xff…

Ubuntu安装QQ教程

Ubuntu安装QQ教程 腾讯更新Linux版的QQ&#xff0c;这里安装一下&#xff1b; 首先&#xff0c;进入官网找到合适对应的安装包&#xff1b; QQLinux版本官网&#xff1a;https://im.qq.com/linuxqq/index.shtml 我们是ubuntu系统选择X86下的deb版本&#xff0c;如果是arm开…

ROS参数服务器增删改查实操C++

ROS参数服务器增删改查实操C 创建功能包参数服务器新增&#xff08;修改&#xff09;参数参数服务器获取参数参数服务器删除参数 ROS通信机制包括话题通信、服务通信和参数服务器三种通信方式&#xff0c;各原理及代码实现如下表 功能博客链接说明VScode配置 ROS 环境VScode创建…

【Vue实战教程】之Vuex状态管理详解

Vuex状态管理 1 Vuex简介 1.1 什么是Vuex Vuex是一个专为Vue.js应用程序开发的状态管理工具。它采用了集中式存储管理应用的所有的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 简单来说&#xff0c;Vuex是一个适用于在Vue项目开发时使用的状态管理…

机器学习 | 回归算法原理——多项式回归

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的最速下降法&#xff08;梯度下降法&#xff09;继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享多项式回归这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目&#xff0c;…

Adaboost集成学习 | Matlab实现基于LSTM-Adaboost长短期记忆神经网络结合Adaboost集成学习多输入单输出时间序列预测

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于LSTM-Adaboost长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 步骤1: 数据准备 收集和整理历史数据。确保数据集经过适当的预处理,如归一…

【人工智能】Transformers之Pipeline(五):深度估计(depth-estimation)

目录 一、引言 二、深度估计&#xff08;depth-estimation&#xff09; 2.1 概述 2.2 技术路径 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pipeline&#xff08…

mysql JSON特性优化

有朋友问到&#xff0c;mysql如果要根据json中的某个属性过滤&#xff0c;数据量大的话&#xff0c;性能很差&#xff0c;要如何提高性能&#xff1f; 为什么要用json串&#xff1f; 由于一些特定场景&#xff0c;mysql需要用到json串&#xff0c;例如文档&#xff0c;不同的…

详解Stable Diffusion 原理图

参考英文文献&#xff1a;The Illustrated Stable Diffusion – Jay Alammar – Visualizing machine learning one concept at a time. 在这个Stable Diffusion模型的架构图中&#xff0c;VAE&#xff08;变分自编码器&#xff09;模型对应的是图中的 E 和 D 部分。 具体来说…

【BUG】已解决:NameError: name ‘python‘ is not defined

NameError: name ‘python‘ is not defined 目录 NameError: name ‘python‘ is not defined 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于…