04. 函数

目录

1、前言

2、Python中的函数

2.1、内置函数

2.2、自定义函数

2.3、函数调用

3、函数的参数

3.1、形参和实参

3.2、位置参数(Positional Arguments)

3.3、默认参数(Default Arguments):

3.4、关键字参数(Keyword Arguments):

3.5、可变位置参数(Arbitrary Argument Lists):

3.6、可变关键字参数(Arbitrary Keyword Argument Lists):

4、函数高级特性

4.1、匿名函数(Lambda)

4.2、闭包(Closure)

4.3、装饰器(Decorator)

4.4、递归函数

5、小结


1、前言

在Python编程中,函数是一项强大而灵活的工具,它不仅能够使代码更有组织性,还能提高代码的重用性。函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。前面我们已经有接触过一些Python提供的内建函数了,比如print()。我们也可以自己创建函数,这被叫做用户自定义函数。

2、Python中的函数

Python中函数大体上可以分为两类:内置函数、自定义函数。

2.1、内置函数

Python内置了很多函数,我们可以直接调用。如常见的len(),list(),print()等。Python已内置的函数可以通过如下日志查看:https://docs.python.org/3/library/functions.html

2.2、自定义函数

Python中如果想定义一个自己的函数,遵循以下简单的规则:

  • 函数代码块以 def ()
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 

如自定义一个加法运算的函数:

# def为定义函数的关键字
# my_add为该函数的名称,提供给被调用方调用
# a, b为该函数体的参数,也就是形参。调用方可以传入指定类型参数进行传递运算
# a + b为函数体,指该函数具体执行的动作
# return为该函数的返回结果
def my_add(a, b):
    return a + b

所以上述定义的函数具体表现为:定义了一个名为my_add的加法运算函数,接收a和b两个参数,返回a和b的加法运算结果。

2.3、函数调用

要调用一个函数,只需要知道该函数名称和该函数接收的参数类型即可。如调用上述的my_add方法:

调用函数时,如果传入的参数数量不对,会提示TypeError,如:

if __name__ == '__main__':
    print(my_add(3, 4, 5))

这里很明确的指出my_add()方法接收2个参数,但是却给了3个。

如果传输的数量是对的,但是类型无法被接受,也会包TypeError错误,如:

if __name__ == '__main__':
    print(my_add(3, '12'))

因为函数体具体实现用的是+加法运算,程序默认a和b均为int类型。这里传入了'abc'明显是字符串,因此程序出错。要正确使用也很简单,只要做个类型转换即可:

if __name__ == '__main__':
    # 这里将'12'字符串类型通过int()转换为int型
    print(my_add(3, int('12')))

3、函数的参数

定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。

在Python中,函数的参数是在函数定义中列出的变量,用于接收传递给函数的值。函数参数分为几种不同类型:位置参数,默认参数,关键字参数,可变位置参数,可变关键字参数。

3.1、形参和实参

在编程中,函数参数通常分为两种:形式参数(形参)和实际参数(实参)。

形式参数(形参): 在函数定义中声明的参数称为形式参数。形参是函数定义的一部分,它们是函数内部的变量名,用于接收调用函数时传递的实参的值。形参在函数定义中充当占位符,告诉函数应该接受什么样的输入。

def example_function(parameter1, parameter2):
    # 函数体
    pass

其中,parameter1和parameter2就是形式参数。

实际参数(实参): 在函数调用时提供的具体数值或对象称为实际参数。实参是传递给函数的真实数据,它们与函数定义中的形参一一对应,按照顺序传递或使用关键字参数进行指定。

example_function(value1, value2)

其中,value1和value2就是实际参数。它们被传递给函数 example_function,并分别赋值给函数定义中的 parameter1 和 parameter2。

3.2、位置参数(Positional Arguments)

Python中这是最常见的参数类型,按照位置顺序传递给函数。函数定义时,参数的顺序和数量必须与函数调用时传递的顺序和数量一致。

def example_function(arg1, arg2, arg3):
    # 函数体
    pass

# 调用函数
example_function(value1, value2, value3)

3.3、默认参数(Default Arguments)

在函数定义时,可以为某些参数指定默认值,这样在调用函数时如果不提供相应参数的值,将使用默认值。

def example_function(arg1, arg2, arg3="default_value"):
    # 函数体
    pass

# 调用函数
example_function(value1, value2)

3.4、关键字参数(Keyword Arguments)

在函数调用时,可以通过参数名直接指定传递的值,而不依赖于参数的位置。

def example_function(arg1, arg2, arg3):
    # 函数体
    pass

# 调用函数,使用关键字参数
example_function(arg1=value1, arg3=value3, arg2=value2)

3.5、可变位置参数(Arbitrary Argument Lists)

使用星号*可以让函数接受可变数量的位置参数,这些参数将被封装为一个元组。

def example_function(*args):
    # args是一个包含所有位置参数的元组
    pass

# 调用函数
example_function(value1, value2, value3)

3.6、可变关键字参数(Arbitrary Keyword Argument Lists)

使用双星号**可以让函数接受可变数量的关键字参数,这些参数将被封装为一个字典。

def example_function(**kwargs):
    # kwargs是一个包含所有关键字参数的字典
    pass

# 调用函数
example_function(arg1=value1, arg2=value2, arg3=value3)

函数的参数在调用时需要与函数定义中的参数顺序和类型相匹配,但通过使用默认参数、关键字参数、可变位置参数和可变关键字参数等特性,可以增加函数的灵活性,使其更加适应各种使用场景。

4、函数高级特性

4.1、匿名函数(Lambda)

Lambda函数是一种简洁的函数定义方式,适用于一些简单的操作。下面是一个Lambda函数的示例:

square = lambda x: x ** 2

# 调用Lambda函数
result = square(5)
print(result)  # 输出结果:25

Lambda函数通常用于需要一个简单函数作为参数的情况,比如在map和filter等函数中。

4.2、闭包(Closure)

闭包是指在一个函数内部定义另一个函数,并且内部函数可以访问外部函数的局部变量。以下是一个闭包的例子:

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

closure = outer_function(10)
result = closure(5)
print(result)  # 输出结果:15

在这个例子中,outer_function返回了一个内部函数inner_function,并且inner_function可以访问外部函数的变量x,形成了一个闭包。

4.3、装饰器(Decorator)

装饰器是一种用于修改函数行为的高级特性,常用于在不改变原函数代码的情况下添加额外功能。以下是一个简单的装饰器示例:

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

# 调用被装饰后的函数
say_hello()

在上述例子中,my_decorator是一个装饰器函数,通过@my_decorator语法应用到say_hello函数上。调用say_hello时,实际上是调用了被装饰后的函数,从而在执行前后添加了额外的功能。

通过深入了解和灵活运用这些函数的基础概念和高级特性,可以更好地编写清晰、模块化和可维护的Python代码。希望本文的示例代码能够帮助读者更好地理解Python函数的使用和应用。

4.4、递归函数

在函数中,我们除了调用别人定义的函数外,也可以调用自身,这就是函数递归。举个例子:

def factorial(n):
    """计算阶乘的递归函数"""
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n - 1)

# 调用递归函数
result = factorial(5)
print(result)  # 输出结果:120

上述代码中,factorial 函数用于计算阶乘。递归调用发生在 n * factorial(n - 1) 这一行,函数自身被调用并传递了一个较小的参数 n - 1。递归的结束条件是 n == 0 or n == 1,当 n 等于 0 或 1 时,递归停止,直接返回 1。

递归函数通常包括两个部分:

  1. 基本情况(Base Case):定义递归终止的条件。在上面的例子中,基本情况是 n == 0 or n == 1。
  2. 递归情况(Recursive Case):定义函数如何调用自身,并缩小问题规模。在上述例子中,递归情况是 n * factorial(n - 1)。

需要注意的是,递归函数的性能可能不如迭代(循环)实现,因为递归会涉及到多个函数调用,导致函数栈的不断增长。在某些情况下,可以通过尾递归优化或使用迭代方式来提高性能。

当使用递归时,确保设置好递归结束的条件,以避免无限递归。适当的使用递归可以使代码更加清晰、简洁,但在解决一些问题时,迭代可能是更好的选择。

5、小结

Python中函数的重要性无法被低估,它是代码模块化、重用和可维护性的关键。函数是Python编程中不可或缺的一部分,它们为代码提供了结构、可读性和可维护性,是构建复杂程序的基石。函数的设计和使用是成为Python程序员的重要技能之一。

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

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

相关文章

如何为C#WinFrom编译的.exe添加个性化图标

1、在VS中点击菜单栏上的“项目”,找到最下面的属性,单击进去 2、加载自定义的.ico文件,如果没有此格式的文件可以使用此网站去转换:图标制作大师 - 轻松制作网站favicon图标 3、重新编译文件即可

【【水 MicroBlaze 最后的介绍和使用】】

水 MicroBlaze 最后的介绍和使用 我对MicroBlaze 已经有了一个普遍的理解 了 现在我将看的两个 一个是 AXI4接口的 DDR读写实验 还有一个是 AXI DMA 环路实验 虽然是 水文 但是 也许能从中 得到一些收获 第一个是 AXI DDR 读写实验 Xilinx 从 Spartan-6 和 Virtex-6 系列开始…

SSM框架(六):SpringBoot技术及整合SSM

文章目录 一、概述1.1 简介1.2 起步依赖1.3 入门案例1.4 快速启动 二、基础配置2.1 三种配置文件方式2.2 yaml文件格式2.3 yaml读取数据方式(3种) 三、多环境开发3.1 yml文件-多环境开发3.2 properties文件-多环境开发3.3 多环境命令行启动参数设置3.4 多…

【数值计算方法(黄明游)】函数插值与曲线拟合(一):Lagrange插值【理论到程序】

​ 文章目录 一、近似表达方式1. 插值(Interpolation)2. 拟合(Fitting)3. 投影(Projection) 二、Lagrange插值1. 天书1. 人话拉格朗日插值方法a. 线性插值(n1)基本思想线性插值与线…

解决uview中uni-popup弹出层不能设置高度问题

开发场景:点击条件筛选按钮,在弹出的popup框中让用户选择条件进行筛选 但是在iphone12/13pro展示是正常,但是切换至其他手机型号就填充满了整个屏幕,需要给这个弹窗设置一个固定的高度 iphone12/13pro与其他型号手机对比 一开始…

智能优化算法应用:基于海洋捕食者算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于海洋捕食者算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于海洋捕食者算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.海洋捕食者算法4.实验参数设定5.算法结果…

工业机器视觉megauging(向光有光)使用说明书(四,轻量级的visionpro)

第三个相机的添加,突然发现需要补充一下: 第一步,假定你对c#编程懂一点,我们添加了一个页面“相机三”在tabcontrol1: 第二步,添加dll到工具箱: 第三步,点击‘浏览’,找…

Web前端JS如何获取 Video/Audio 视音频声道(左右声道|多声道)、视音频轨道、音频流数据

写在前面: 根据Web项目开发需求,需要在H5页面中,通过点击视频列表页中的任意视频进入视频详情页,然后根据视频的链接地址,主要是 .mp4 文件格式,在进行播放时实时的显示该视频的音频轨道情况,并…

Fiddler抓包工具之Fiddler+willow插件应用

安装Fiddler的安装包地址:fillderwillow 解压后安装fiddler4和willow1.4.*版本。 安装成功后,启动fiddler后会出现willow插件按钮: 说明安装成功。 重定向 willow重定向 进入willow界面后,通过右键->Add Project ->Add Ru…

canvas基础:fillStyle 和strokeStyle示例

canvas实例应用100 专栏提供canvas的基础知识,高级动画,相关应用扩展等信息。 canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重要的帮助。 文章目录 上色…

Spring Task 超详解版

目录 一、定时任务的理解 二、入门案例 三、Cron表达式 四、Cron实战案例 五、多线程案例 一、定时任务的理解 定时任务即系统在特定时间执行一段代码,它的场景应用非常广泛: 购买游戏的月卡会员后,系统每天给会员发放游戏资源。管理系…

基于姿态估计的3D动画生成

在本文中,我们将尝试通过跟踪 2D 视频中的动作来渲染人物的 3D 动画。 在 3D 图形中制作人物动画需要大量的运动跟踪器来跟踪人物的动作,并且还需要时间手动制作每个肢体的动画。 我们的目标是提供一种节省时间的方法来完成同样的任务。 我们对这个问题…

EasyMetagenome易宏基因组——简单易用的宏基因组分析流程-来自刘永鑫团队的秘密武器

原仓库地址如下,github有时候无法访问,等一段时间再试就行: YongxinLiu/EasyMetagenome: Easy Metagenome Pipeline (github.com) 相关文章,看文章更清晰这个可干啥: EasyAmplicon: An easy‐to‐use, open‐source…

JAVA高级-1

常用API 第一章 API 产品说明书 第二章 Scanner类(输入) 功能:获取键盘输入 package day7_12.demo01_Scanner;import java.util.Scanner; //1、导包 /* 功能:获取键盘输入引用类型一般使用步骤1、导包:impo…

深入了解汉字转拼音转换工具:原理与应用

一、引言 汉字作为世界上最古老、最具象形意的文字之一,承载了数千年的历史文明。然而,在现代信息技术环境下,汉字的输入、输出和检索等方面存在一定的局限性。拼音作为汉字的一种音标表达方式,能够有效地解决这些问题。本文将为…

JS利用时间戳倒计时案例

我们在逛某宝,或者逛某东时,我们时常看到一个倒计时,时间一到就开抢,这个倒计时是如何做的呢?让我为大家介绍一下。 理性分析一下: 1.用将来时间减去现在时间就是剩余的时间 2.核心:使用将来的时…

完全背包问题 非零基础

目录 之前学过一遍,但是12月2日再练忘光光了: 忘记点1 —— 为什么每个物品要遍历k件: 忘记点2 —— 数学优化: 之前学过一遍,但是12月2日再练忘光光了: 【模板】完全背包_牛客题霸_牛客网 (nowcoder.c…

智慧公厕新风系统是什么?具体作用?

大家好,你们可曾在公厕里遇到那个臭味怪兽,闻得让人头晕目眩?别怕,我们有一把利剑,叫做“智慧公厕新风系统”!不仅是空气净化器的升级版,还有一大堆高级功能等着你来领略! 1. 风清气…

Linux常用命令——awk命令

在线Linux命令查询工具 awk 文本和数据进行处理的编程语言 补充说明 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能…

1+x网络系统建设与运维(中级)-练习3

一.设备命名 AR1 [Huawei]sysn AR1 [AR1] 同理可得,所有设备的命名如上图所示 二.VLAN LSW1 [LSW1]vlan 10 [LSW1-vlan10]q [LSW1]int g0/0/1 [LSW1-GigabitEthernet0/0/1]port link-type access [LSW1-GigabitEthernet0/0/1]port default vlan 10 [LSW1-GigabitEt…