Python函数总结

目录

一、普通函数

1.1 函数的定义与调用

1.2 函数的说明文档

1.3 函数的参数

1.4 函数的返回值

二、函数的作用域和关键字

2.1 局部作用域

2.2 全局作用域

2.4 global关键字和nonlocal关键字的使用

三、函数的递归与嵌套

3.1 嵌套函数

3.2递归函数

四、函数名的应用

4.1 函数名可以作为另一个函数的参数或者返回值

4.2 函数名可以成为字典、集合、列表、元组中的元素

五、匿名函数与高阶函数

5.1 匿名函数

5.2 高阶函数

六、函数的闭包与装饰器

6.1 闭包

6.2 装饰器


一、普通函数

1.1 函数的定义与调用

定义:

def 函数名(参数):
    函数体
    return 返回值

函数通过def关键字定义,def关键字后面跟着函数的函数名,函数名后面跟着小括号,小括号里面传入函数需要的参数(函数可以有参数也可以没有参数)。中间写函数体,最后写返回值(返回值可以有可以没有,默认为None)。

1.2 函数的说明文档

定义:函数说明文档(docstring)是用来描述函数功能、参数、返回值等信息的字符串,直接写在函数定义的第一行,使用三重引号 """ """ 包裹。它可以帮助其他开发者快速理解函数的用途,也方便自动生成文档。

使用内置函数help()可以查看函数的说明文档、使用函数名.__doc__的方式也能够查看。

示例:

def add(a, b):"""计算两个数的和。参数:a (int or float): 第一个加数b (int or float): 第二个加数返回:int or float: 两数之和"""return a + bhelp(add)
print(add.__doc__)
1.3 函数的参数

函数的参数有可变参数与不可变参数

不可变参数:位置参数、关键字参数、仅关键字参数、默认参数。

可变参数:可变位置参数(*args)、可变关键字参数(**kwargs)。

参数的定义顺序为:位置参数-->关键字参数-->可变位置参数(*args)-->仅关键字参数-->可变关键字参数(**kwargs)

1.4 函数的返回值

函数的返回值可以有多个(当有多个返回值时,会自动打包成元组),也可以没有返回值,返回值默认为None

二、函数的作用域和关键字

函数作用域遵循以下规则:Python 按 LEGB 顺序查找变量:Local(局部作用域)→ Enclosing(闭包作用域) → Global(全局作用域) → Built-in(内置作用域)。

2.1 局部作用域

定义在函数内的变量称为局部变量,该变量只能在局部作用域中访问和修改。

2.2 全局作用域

定义在函数外的变量称为全局变量,该变量可以在任意作用域中访问。

2.3 可变类型与不可变类型

可变类型:指的是在对某一可变类型进行修改时不会随着修改而改变内存地址的,即对象本身不变。(可变类型有:列表,字典,集合)

不可变类型:该对象在内存中的地址固定,一旦确定了将不会发生改变,如果对该对象进行修改则会改变它在内存中的地址。(不可变类型有:字符串,元组,数值类型,布尔类型)

可变类型与不可变类型在函数作用域的影响:我们都知道,在局部作用域中如果不使用global关键字声明的话就只能对对象进行访问不能进行修改,如果该对象是一个可变类型的,那么我们在局部作用域中也能够对该对象进行访问和修改的操作(这里的修改不是改变该对象本身)

2.4 global关键字和nonlocal关键字的使用

global关键字:

如果想通过局部作用域来修改全局变量的话,那么就需要使用global关键字来声明。被global关键字声明的变量可以在局部作用域中被修改(未声明的变量只能访问)。

示例:

使用global:在函数内部,如果想要修改函数外部(全局作用域)定义的变量,必须使用 global 关键字声明该变量。
x = 10  # 全局变量def modify():global x  # 声明x是全局变量x = 20    # 修改全局变量xmodify()
print(x)  # 输出 20

不使用global:如果没有使用 global,函数内部对同名变量的赋值会创建一个新的局部变量,不会影响全局变量。

x = 10def modify():x = 20  # 这里创建了一个局部变量x,和全局变量无关modify()
print(x)  # 输出 10,未被修改

nonlocal关键字:

nonlocal 用于在嵌套函数中声明变量,表示该变量不是当前函数的局部变量,而是外层(但不是全局)函数作用域中的变量。这样,内层函数就可以修改外层函数中的变量。

示例:多层嵌套

def outer():x = 10def middle():nonlocal xdef inner():nonlocal xx = 30inner()middle()print(x)  # 输出 30outer()

三、函数的递归与嵌套

3.1 嵌套函数

定义:在一个函数内部定义另一个函数,或者在函数内部调用另一个函数,满足其中任意一个条件即称为嵌套函数。

示例:inner_function 是定义在 outer_function 内部的嵌套函数,outer_function 内部调用了 inner_function。

def outer_function(x):def inner_function(y):return y * yreturn inner_function(x) + 1print(outer_function(3))  # 输出 10,因为 3*3+1=10
3.2递归函数

定义:递归函数就是函数自己调用自己

注意事项:在使用递归函数的时候要给递归函数设置一个出口,否则函数会一直执行下去直到栈溢出。

示例:factorial 函数通过递归计算阶乘,if n == 0 是递归出口,防止无限递归。

def factorial(n):if n == 0:  # 递归出口return 1else:return n * factorial(n - 1)  # 函数自己调用自己print(factorial(5))  # 输出 120

四、函数名的应用

4.1 函数名可以作为另一个函数的参数或者返回值

示例:函数名本质上是指向函数对象的引用,可以作为参数传递给其他函数,也可以作为函数的返回值返回。

def greet():return "Hello!"def call_func(func):return func()  # 调用传入的函数result = call_func(greet)
print(result)  # 输出:Hello!def get_greet_func():return greet  # 返回函数对象f = get_greet_func()
print(f())  # 输出:Hello!
4.2 函数名可以成为字典、集合、列表、元组中的元素

示例:函数名作为函数对象,可以存储在各种数据结构中,便于动态调用。

def add(x, y):return x + ydef multiply(x, y):return x * yfunc_list = [add, multiply]
print(func_list[0](2, 3))  # 输出:5
print(func_list[1](2, 3))  # 输出:6func_dict = {'加法': add, '乘法': multiply}
print(func_dict['加法'](4, 5))  # 输出:9func_tuple = (add, multiply)
print(func_tuple[1](3, 7))  # 输出:21func_set = {add, multiply}
for f in func_set:print(f(1, 2))  # 依次输出3和2(顺序不确定)

五、匿名函数与高阶函数

5.1 匿名函数

匿名函数指的是只用一串代码就能定义的函数,使用lambda关键字声明。

语法:lambda 参数:函数体+返回值(函数体就是返回值,返回值就是函数体)

应用场景:对一些比较简单的函数的创建与使用,作为高阶函数中的参数,对一些只使用一次的简单函数的创建。

示例:

# 普通函数定义
def add(x, y):return x + yprint(add(3, 5))  # 输出 8# 使用匿名函数
add_lambda = lambda x, y: x + y
print(add_lambda(3, 5))  # 输出 8# 作为高阶函数参数
numbers = [1, 2, 3, 4, 5]# 用lambda对列表元素平方
squares = list(map(lambda x: x ** 2, numbers))
print(squares)  # 输出 [1, 4, 9, 16, 25]# 用lambda筛选偶数
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # 输出 [2, 4]# 用lambda排序,根据字符串长度排序
words = ['apple', 'banana', 'pear', 'grape']
words_sorted = sorted(words, key=lambda s: len(s))
print(words_sorted)  # 输出 ['pear', 'grape', 'apple', 'banana']
5.2 高阶函数

定义:一个函数如果他的参数中有函数名,或者是他的返回值有函数名就可以被称为高阶函数

常见的高阶函数有:

1、map(function, iterable) 

参数:第一个参数为函数,第二个参数为可迭代对象

返回值:返回一个迭代器对象

作用:对可迭代对象中的每个元素执行指定函数。返回一个新的迭代器(返回结果为该迭代器的内存地址)

2、reduce(function, iterable[, initializer])

参数:第一个参数为函数,第二个参数为可迭代对象。initializer用于指定计的初始值。

  • 如果指定了 initializer,累计时的第一个调用会用 initializer 和可迭代对象的第一个元素作为参数调用 function。
  • 如果不指定,reduce 会用可迭代对象的前两个元素作为第一次调用的参数,累计结果从第一个元素开始。

返回值:返回一个数值型对象。

作用:对可迭代对象的元素累计执行函数(函数必须接收两个参数),将函数返回的结果与下一个元素做累积处理,最终返回单一值。

示例:

​
from functools import reduce# 计算列表元素之和
result = reduce(lambda x, y: x + y, [1, 2, 3, 4], 10)
print(result)  # 输出 20,因为初始值是 10,累计结果是 10+1+2+3+4=20​

3、filter(function, iterable)

参数:第一个参数是一个函数,第二个参数是可迭代对象

作用:根据函数定义的规则过滤可迭代对象,保留函数返回值为True的元素,返回一个过滤后的迭代器对象。

返回值:返回一个迭代器对象

4、sorted(iterable, *, key=None, reverse=False)

参数:第一个参数为可迭代对象,第二个参数为‘*’目的是为了使key和reverse变为仅关键字参数,key是一个函数用于指定排序规则,默认为None。reverse为False时为升序排序,为True时为降序排序。

返回值:返回一个列表。

作用:对可迭代对象排序,按照key所定义的规则,返回一个新的列表。

示例:

# 对数字列表升序排序(默认)
print(sorted([3, 1, 4, 2]))  # 输出 [1, 2, 3, 4]# 对数字列表降序排序
print(sorted([3, 1, 4, 2], reverse=True))  # 输出 [4, 3, 2, 1]# 根据字符串长度排序
words = ['apple', 'banana', 'cherry', 'date']
print(sorted(words, key=len))  # 输出 ['date', 'apple', 'banana', 'cherry']

5、zip(*iterables, strict=False)

参数:第一个参数为任意数量的可迭代对象,第二个参数strict默认为False

  • 如果为 False(默认),zip 会以最短的可迭代对象长度为准,生成对应数量的元组,超出部分会被忽略。
  • 如果为 True,则要求所有可迭代对象长度相同,否则会抛出 ValueError 异常。

返回值:返回一个迭代器对象

作用:合并参数一中的可迭代对象,参数二默认值为False,当strict为True时,要求每个可迭代对象的元素个数要一样多,否则发生报错。

6、enumerate(iterable, start=0)

参数:第一个参数是可迭代对象,第二个参数是指定索引起始值,默认从 0 开始计数。可以设置为任意整数。

返回值:返回一个迭代器对象

作用:可迭代对象进行遍历时,同时获取元素的索引(序号)和元素本身。返回一个枚举对象(迭代器),其中每个元素是一个由索引和值组成的元组。

高阶函数应用场景:

六、函数的闭包与装饰器

6.1 闭包

定义:一个前提两个条件,满足就为闭包。在嵌套函数中,内部函数使用了外部函数的参数并且内部函数的返回值为外部函数的函数名,那么就把这个使用了外部函数参数的内部函数称为闭包。

闭包的作用:我们都知道,当一个函数执行结束时,函数内部的变量都将被销毁。如果使用了闭包,那么该函数执行结束将不会被销毁,并且在全局作用域中可以通过闭包间接访问局部变量。

示例:

def outer(x):def inner(y):return x + y  # 内部函数使用了外部函数的参数xreturn inner  # 返回内部函数f = outer(10)  # f是inner函数的闭包,记住了x=10
print(f(5))   # 输出 15
6.2 装饰器

定义和作用:装饰器(Decorator)是一种特殊的函数它接受一个函数作为参数,并返回一个新的函数。它的主要作用是在不修改被装饰函数的源代码和调用方式的前提下,为函数增加额外功能(装饰器的本质是:高阶函数+闭包)

装饰器的基本语法:使用语法糖@后面跟上装饰器的函数名。在函数定义时装饰需要被装饰的函数。

def decorator(func):def wrapper():# 在调用原函数前可以做一些操作print("开始执行函数")func()# 在调用原函数后可以做一些操作print("函数执行完毕")return wrapper@decorator  # 语法糖,等同于 foo = decorator(foo)
def foo():print("这是被装饰的函数")foo()
"""
输出:
复制
开始执行函数
这是被装饰的函数
函数执行完毕
"""

应用场景:

日志记录:在函数执行前后打印日志信息

权限校验:在函数执行前检查用户权限

性能测试:计算函数执行时间

缓存:保存函数的计算结果,避免重复计算

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

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

相关文章

sqlite-gui:一款开源免费、功能强大的SQLite开发工具

sqlite-gui 是一个轻量级的 SQLite 编辑器,基于 C/mingw64/WinAPI 开发,支持 Windows 平台。 sqlite-gui 是一个免费开源的项目,代码托管在 GitHub: https://github.com/little-brother/sqlite-gui 功能特性 支持 SQL 语法高亮…

Ethan独立开发新品速递 | 2025-08-19

每日精选Product Hunt上最值得关注的独立产品,发现全球创新灵感,助力你的产品成长。 下面挑选出对独立开发者最有参考价值的 10 个项目,侧重开发工具、AI 工具、SaaS 和创业支持类产品,去除娱乐、小众垂直和大公司产品。每条保留原…

从 Hive 数仓出发,全面剖析 StarRocks、MySQL、HBase 的使用场景与区别

以 Hive 数仓为底座,深入理解 StarRocks、MySQL 和 HBase 的区别与使用场景 一、前言 在现代大数据架构中,Hive 通常作为离线数仓的核心底座,负责批量数据的接入、清洗、计算与存储。然而,为了满足 实时计算、低延迟查询、业务交互型操作和高并发存储 等不同需求,我们往…

低延迟、跨平台与可控性:直播SDK的模块化价值解析

引言 音视频直播已经从单纯的娱乐应用,成长为产业级的实时交互基础设施。无论是安防监控的秒级告警联动、工业巡检的远程可视化操作,还是智慧教育中的多终端互动课堂、远程医疗里的超低延迟手术协作,都离不开一条低延迟、高稳定性、跨平台可…

JVM参数优化

JVM 参数优化是提升 Java 应用性能、减少 GC 停顿、避免 OOM(内存溢出)等问题的核心手段。优化的核心目标是平衡内存使用、GC 效率与应用响应速度,需结合应用类型(如 Web 应用、批处理应用)、业务场景(如高…

pytest高级用法之插件开发

背景 pytest,python全功能测试框架(用某句名言,甩unittest几条街),钩子函数、pytest插件、pytest装饰器都能扩展pytest。 提及pytest高级用法,不得不说pytest插件,例如assert断言失败继续断言…

cesium中实时获取鼠标精确坐标和高度

/*** 获取鼠标位置的三维坐标(包含高度信息)* @param {Cesium.Cartesian2} position 鼠标位置* @returns {Cesium.Cartesian3|null} 三维坐标*/ function getMousePosition(position) {if (!position) return null;

Netty 集成 protobuf

什么是 Protobuf Protobuf(Protocol Buffers)是 Google 开发的一种高效、语言中立、平台中立的序列化协议,用于在不同系统或语言之间传输结构化数据。开发者通过 .proto 文件定义消息结构,再使用生成的类进行序列化(转为紧凑的二进制数据)和反序列化(还原为对象),相比…

程序调用 AI 大模型 -- Java

程序调用 AI 大模型 – Java 1、SDK 接入 安装阿里云百炼SDK_大模型服务平台百炼(Model Studio)-阿里云帮助中心 <dependency><groupId>com.alibaba</groupId><artifactId>dashscope-sdk-java</artifactId><!-- 请将 the-latest-version 替…

VMware 虚拟机完全使用教程:从基础到高级应用

VMware 虚拟机完全使用教程&#xff1a;从基础到高级应用 一、引言 在当今数字化时代&#xff0c;计算机技术的飞速发展使得硬件性能不断提升&#xff0c;但同时也带来了资源浪费和管理复杂等问题。虚拟机技术应运而生&#xff0c;它能够在一台物理计算机上模拟出多台独立的计…

函数对象 vs 函数指针 vs lambda:该用哪个才高效?

博主介绍&#xff1a;程序喵大人 35 - 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x…

Java团队项目开发规范——对象分层规范

分层与对象命名规范如上图所示&#xff0c;系统划分成3个层&#xff1a;Controller层&#xff0c;Service层&#xff0c;Domain层 Controller层&#xff1a; Controller层是接入层&#xff0c;提供对外或者前端的接口&#xff0c;该层主要作用是提供对外接口的封装。基于CQRS分…

低功耗模式

1. 什么是低功耗&#xff1f;低功耗模式&#xff1a;MCU 暂停部分时钟/外设&#xff0c;降低电流消耗&#xff0c;等待外部事件&#xff08;中断/复位/唤醒&#xff09;再恢复运行。应用场景&#xff1a;电池供电设备&#xff08;传感器、手持设备、IoT 节点&#xff09;——延…

GPT-5 官方前瞻:它将如何重塑你的数字生活?

你是否曾想过&#xff0c;有一天你的浏览器不再是一个被动等待指令的工具&#xff0c;而是一个能主动为你分忧解难的智能伙伴&#xff1f;OpenAI 的 CEO Sam Altman 最近的发言&#xff0c;以及关于 GPT-5 的种种迹象&#xff0c;都预示着这个未来比我们想象的更近。这不仅是一…

驱动开发系列65 - NVIDIA 开源GPU驱动open-gpu-kernel-modules 目录结构

一:OS相关部分 kernel-open/ 内核接口层 kernel-open/nvidia/ nvidia.ko 的接口层,负责GPU初始化,显存管理,PCIe通信,中断处理,电源管理等底层功能。 kernel-open/nvidia-drm/ nvidia-drm.ko 的接口层,提供标准图形接口,让Xorg、Wayland、Kwin、GNOME等桌面环境能够通…

GPT-4.1旗舰模型:复杂任务的最佳选择及API集成实践

GPT-4.1旗舰模型&#xff1a;复杂任务的最佳选择及API集成实践 概述 GPT-4.1作为新一代旗舰大模型&#xff0c;凭借其卓越的智能表现、强大的跨领域问题解决能力&#xff0c;成为复杂任务处理的首选。本文将详细解析GPT-4.1的核心能力、接口用法、计费方式、功能对比及API集成…

paimon保姆级教程简介

还在纠结 Flink 配 Hudi 还是 Iceberg&#xff1f;别选了&#xff0c;快来试试 Flink 的“天选之子”—— Apache Paimon&#xff01; 忘掉复杂的 Lambda 架构&#xff0c;拥抱真正的流批一体。我们的 Paimon 视频教程&#xff0c;带你用 Flink 原生湖仓格式&#xff0c;轻松构…

Transformer中的编码器和解码器是什么?

今天&#xff0c;我们来具体介绍Transformer的架构设计。 一个完整的Transformer模型就像一个高效的语言处理工厂&#xff0c;主要由两大车间组成&#xff1a;编码车间和解码车间。 首先来看这幅“世界名画”&#xff0c;你可以在介绍Transformer的场景中常常看到这幅图&#x…

uniapp 应用未安装:软件包与现有软件包存在冲突

应用未安装&#xff1a;软件包与现有软件包存在冲突常见原因包名&#xff08;AppID&#xff09;没变&#xff0c;但签名证书不同安卓会把同一包名的 App 当成同一个应用。如果你之前安装的版本用了 A 签名&#xff0c;现在你打包用了 B 签名&#xff0c;就会冲突&#xff0c;导…

MyCAT2的主从配置

1.创建数据源重置配置&#xff1a;/* mycat:resetConfig{} */添加读写的数据源/* mycat:createDataSource {"dbType": "mysql","idleTimeout": 60000,"initSqls": [],"initSqlsGetConnection": true,"instanceType&quo…