【Python】函数(二)

链式调用

# 判定是否是奇数
def isOdd(num):
    if num % 2 == 0:
        return False
    else:
        return True
  
result = isOdd(10)
print(result)

实际上也可以简化写作

print(isOdd(10))

把一个函数的返回值, 作为另一个函数的参数, 这种操作称为 链式调用

嵌套调用

函数内部还可以调用其他的函数, 这个动作称为 “嵌套调用”.

def test():
    print("执行函数内部代码")
    print("执行函数内部代码")
    print("执行函数内部代码")

test 函数内部调用了 print 函数, 这里就属于嵌套调用。

一个函数里面可以嵌套调用任意多个函数。

函数嵌套的过程是非常灵活的。

def a():
    print("函数 a")
def b():
    print("函数 b")
    a()
def c():
    print("函数 c")
    b()
def d():
    print("函数 d")
    c()
d()

在这里插入图片描述
函数之间的调用关系, 在 Python 中会使用一个特定的数据结构来表示, 称为 函数调用栈 . 每次函数调用, 都会在调用栈里新增一个元素, 称为 栈帧

可以通过 PyCharm 调试器看到函数调用栈和栈帧.
在调试状态下, PyCharm 左下角一般就会显示出函数调用栈

在这里插入图片描述

函数递归

递归是 嵌套调用 中的一种特殊情况, 即一个函数嵌套调用自己.

代码示例: 递归计算 5!

def factor(n):
   if n == 1:
        return 1
    return n * factor(n - 1)
result = factor(5)
print(result)

上述代码中, 就属于典型的递归操作. 在 factor 函数内部, 又调用了 factor 自身.

注意: 递归代码务必要保证

  • 存在递归结束条件. 比如 if n == 1 就是结束条件. 当 n 为 1 的时候, 递归就结束了.
  • 每次递归的时候, 要保证函数的实参是逐渐逼近结束条件的.
    如果上述条件不能满足, 就会出现 “无限递归” . 这是一种典型的代码错误
def factor(n):
    return n * factor(n - 1)
result = factor(5)
print(result)

在这里插入图片描述

如前面所描述, 函数调用时会在函数调用栈中记录每一层函数调用的信息.
但是函数调用栈的空间不是无限大的. 如果调用层数太多, 就会超出栈的最大范围, 导致出现问题.

递归的优点

  • 递归类似于 “数学归纳法” , 明确初始条件, 和递推公式, 就可以解决一系列的问题.
  • 递归代码往往代码量非常少.

递归的缺点

  • 递归代码往往难以理解, 很容易超出掌控范围
  • 递归代码容易出现栈溢出的情况
  • 递归代码往往可以转换成等价的循环代码. 并且通常来说循环版本的代码执行效率要略高于递归版本.

参数默认值

Python 中的函数, 可以给形参指定默认值.
带有默认值的参数, 可以在调用的时候不传参

代码示例: 计算两个数字的和

def add(x, y, debug=False):
    if debug:
        print(f'调试信息: x={x}, y={y}')
    return x + y
print(add(10, 20))
print(add(10, 20, True))

此处 debug=False 即为参数默认值. 当我们不指定第三个参数的时候, 默认 debug 的取值即为 False.

带有默认值的参数需要放到没有默认值的参数的后面


def add(x, debug=False, y):
    if debug:
        print(f'调试信息: x={x}, y={y}')
    return x + y
print(add(10, 20))

在这里插入图片描述

关键字参数

在调用函数的时候, 需要给函数指定实参. 一般默认情况下是按照形参的顺序, 来依次传递实参的.

但是我们也可以通过 关键字参数, 来调整这里的传参顺序, 显式指定当前实参传递给哪个形参.

def test(x, y):
    print(f'x = {x}')
    print(f'y = {y}')
test(x=10, y=20)
test(y=100, x=200)

在这里插入图片描述
形如上述 test(x=10, y=20) 这样的操作, 即为 关键字参数.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Elasticsearch 】 聚合分析:桶聚合

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证7)

本文验证基于请求头中传递token信息的认证方式,webapi项目的控制器类中新建如下函数,仅通过验证的客户端能调用,需要客户端请求在Header中添加’Authorization’: Bearer token’的键值对且通过token验证后才能调用。 [Authorize] [HttpGet]…

游戏AI,让AI 玩游戏有什么作用?

让 AI 玩游戏这件事远比我们想象的要早得多。追溯到 1948 年,图灵和同事钱伯恩共同设计了国际象棋程序 Turochamp。之所以设计这么个程序,图灵是想说明,机器理论上能模拟人脑能做的任何事情,包括下棋这样复杂的智力活动。 可惜的是…

9. 神经网络(一.神经元模型)

首先,先看一个简化的生物神经元结构: 生物神经元有多种类型,内部也有复杂的结构,但是可以把单个神经元简化为3部分组成: 树突:一个神经元往往有多个树突,用于接收传入的信息。轴突:…

Docker可视化管理工具Portainer

Portainer简介 Portainer 是一个轻量级的、开源的容器管理工具,提供了一个直观的 Web 用户界面(UI),用于管理 Docker 和 Kubernetes 环境。它简化了容器的部署、监控和管理,特别适合不熟悉命令行操作的用户或团队。 …

maven helper插件使用

在intellij idea插件市场搜索maven help并安装安装好后会多一个Dependency Analyzer 场景1:排除某个依赖 点击完exclude pom文件会被修改 然后刷新下maven,相应的依赖就会被排除了。

【VRChat · 改模】Unity2019、2022的版本选择哪个如何决策,功能有何区别;

总览 1.Unity2019、2022的版本的选择 2.Unity添加着色器教程 一、Unity2019、2022的版本的选择 1.Unity2019 和 Unity2022 的区别,VRChat SDK 为何要区分两个版本 我是外行,最开始以为的是,2019 和 2022 的变化是基于这个模型本身的。 也…

RHCE实验详解

目录 实验分析 环境拓扑结构 项目需求 主机环境描述 实验步骤 一、密钥互信和主机名更改 二、DNS 三、NGINX 四、MARIADB 五、NFS 六、NTP 七、论坛服务 结果展示及痛点解答 实验分析 环境拓扑结构 项目需求 1. 172.25.250.101 主机上的 Web 服务要求提供 www.ex…

学Python的人…

学Python的人… 一、Python能干什么? 1.爬虫:前几年,深度学习还没发展起来的时候,书店里Python就和爬虫挂钩,因为Python写爬虫确实方便。 2.数据分析:Python有各种的数据分析库可以方便使用&#xff0…

docker 安装 mysql 详解

在平常的开发工作中,我们经常需要用到 mysql 数据库。那么在docker容器中,应该怎么安装mysql数据库呢。简单来说,第一步:拉取镜像;第二步:创建挂载目录并设置 my.conf;第三步:启动容…

华为E9000刀箱服务器监控指标解读

美信监控易内置了数千种常见设备监测器,能够监测超过20万项指标。这些指标涵盖了从硬件设备到软件系统,从网络性能到安全状态等各个方面。如下基于美信监控易——IT基础监控模块,对华为E9000刀箱服务器部分监控指标进行解读。 一、华为E9000…

自动化标注平台开源,基于 yolov8标注平台可本地部署

yolov8标注平台本地部署(docker部署),已调通yolov8模型自动预标注功能。 下面开始背景知识…… 1)数据标注为什么在人工智能时代如此重要? 数据标注在人工智能时代如此重要,原因如下: 为机器…

PyTorch使用教程(6)一文讲清楚torch.nn和torch.nn.functional的区别

torch.nn 和 torch.nn.functional 在 PyTorch 中都是用于构建神经网络的重要组件,但它们在设计理念、使用方式和功能上存在一些显著的区别。以下是关于这两个模块的详细区别: 1. 继承方式与结构 torch.nn torch.nn 中的模块大多数是通过继承 torch.nn…

海思Hi3516CV610 -----芯片说明

Hi3516CV610这颗超高清智慧视觉SoC芯片是由海思技术有限公司推出的,其首发量产的时间是在2024年4。标志着海思正式回归安防市场,并在IPC SoC市场中展开竞争。 关键特性 ●4K20,6M30分辨率 ●双目实时接入,支撑枪球一体机等双目机…

iOS-支付相关

支付宝支付 #import <AlipaySDK/AlipaySDK.h> //orderStrAliPay为服务端传的订单信息 //fromScheme为应用配置的schemeUrl标识&#xff0c;用户支付包支付成功后跳转会本应用内 //callback回调需要在- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url 中调…

go读取excel游戏配置

1.背景 游戏服务器&#xff0c;配置数据一般采用csv/excel来作为载体&#xff0c;这种方式&#xff0c;策划同学配置方便&#xff0c;服务器解析也方便。在jforgame框架里&#xff0c;我们使用以下的excel配置格式。 然后可以非常方便的进行数据检索&#xff0c;例如&#xff…

热点营销新视角:品牌如何巧妙“跟风”不踩雷?

在当今信息爆炸的时代&#xff0c;热点事件如同流星划过夜空&#xff0c;转瞬即逝&#xff0c;却总能吸引无数眼球。而软文营销作为品牌推广的重要手段之一&#xff0c;如何巧妙“跟风”热点&#xff0c;既能借势提升品牌曝光度&#xff0c;又能避免陷入雷区&#xff0c;成为众…

Trimble三维激光扫描-地下公共设施维护的新途径【沪敖3D】

三维激光扫描技术生成了复杂隧道网络的高度详细的三维模型 项目背景 纽约州北部的地下通道网络已有100年历史&#xff0c;其中包含供暖系统、电线和其他公用设施&#xff0c;现在已经开始显露出老化迹象。由于安全原因&#xff0c;第三方的进入受到限制&#xff0c;在没有现成纸…

TDengine 做 Apache SuperSet 数据源

‌Apache Superset‌ 是一个现代的企业级商业智能&#xff08;BI&#xff09;Web 应用程序&#xff0c;主要用于数据探索和可视化。它由 Apache 软件基金会支持&#xff0c;是一个开源项目&#xff0c;它拥有活跃的社区和丰富的生态系统。Apache Superset 提供了直观的用户界面…

K8S-Pod的环境变量,重启策略,数据持久化,资源限制

1. Pod容器的三种重启策略 注意&#xff1a;k8s所谓的重启容器指的是重新创建容器 cat 07-restartPolicy.yaml apiVersion: v1 kind: Pod metadata:name: nginx-web-imagepullpolicy-always spec:nodeName: k8s233.oldboyedu.com## 当容器异常退出时&#xff0c;始终重启容器r…