day 26 函数专题

article/2025/7/5 22:32:47

一、函数的基本写法

def function_name(parameter1, parameter2, ...):"""Docstring: 描述函数的功能、参数和返回值 (可选但强烈推荐)"""# 函数体: 实现功能的代码# ...return value # 可选,用于返回结果
  • def 关键字:用于声明开始定义一个函数。
  • function_name(函数名):遵循 Python 命名约定,通常由小写字母和下划线组成。
  • parameter1, parameter2, …(参数):也称为形参,是函数在被调用时接收输入值的变量。参数是可选的。
  • ()(括号):参数列表需放在括号内,即使无参数,括号也不可省略。
  • :(冒号):标志函数定义头部结束,随后缩进的代码块为函数体。
  • Docstring(文档字符串):可选,位于函数定义第一行的多行字符串,用于解释函数作用、参数及返回值等信息。可通过 help(function_name) 或 function_name.__doc__ 查看。
  • 函数体(Function Body):缩进的代码块,包含实现函数功能的语句。
  • return value(返回语句)return 语句用于从函数返回一个值。若无 return 语句或 return 后无值,函数自动返回 None。函数可在不同条件分支中包含多个 return 语句。

1、不带参数的函数

# 定义一个简单的问候函数
def greet():"""打印一句问候语。"""message = "大家好!欢迎学习Python函数定义!"print(message)
greet()
# 查看文档字符串,方便查看函数的使用,这个方法可以不掌握
print(greet.__doc__)
# 实际上,当你在py文件中,鼠标悬停在函数上时按住ctrl即可点击函数跳转到其内部查看函数的定义

2、带参数的函数

形参(Parameters):函数定义中列出的变量名,如 namefeature1feature2 等。形参相当于一个占位符,代表函数在被调用时将会接收到的数据。形参在函数内部有自己的作用域,它们就像函数内部定义的局部变量。

实参(Arguments):函数调用时传递给函数的实际值,如 "张三"1025 等。实参是实实在在的数据,它们会被赋值给函数定义中的形参。实参本身在函数外部有自己的作用域。

传递关系:当实参的值传递给形参后,在函数内部对形参的修改,一般不会影响到函数外部实参的值(对于不可变数据类型,如整数、字符串、元组等),如:

def change_number(num):num = num + 1return numoriginal_num = 5
new_num = change_number(original_num)
print(original_num)  
print(new_num)  
# 输出:
5
6

在这个例子中,形参 num 在函数 change_number 内部被修改,但函数外部的 original_num 值并没有改变。 

然而,对于可变数据类型(如列表、字典),如果在函数内部通过形参修改了其内容,会影响到函数外部的实参。例如:

def change_list(lst):lst.append(4)return lstmy_list = [1, 2, 3]
new_list = change_list(my_list)
print(my_list)  
print(new_list)  
# 输出:
[1, 2, 3, 4]
[1, 2, 3, 4]

这里函数内部对形参 lst(指向外部传入的 my_list)的修改,导致my_list本身内容的改变。

3、带返回值的函数

# 定义一个计算和并返回结果的函数
def calculate_sum(a, b):"""计算两个数的和并返回结果。Args:a (float or int): 第一个数。b (float or int): 第二个数。Returns:float or int: 两个数的和。"""result = a + breturn resultprint("hhh")  # 此代码不会执行,因为函数遇到 return 语句后立即返回
calculate_sum(2, 3)
# 输出:5

二、变量作用域

局部变量(Local Variables):在函数内部定义的变量,仅在该函数内部有效,函数执行完毕后通常会被销毁。

全局变量(Global Variables):在所有函数外部定义的变量,可在程序任何地方访问(但在函数内部修改全局变量需使用 global 关键字声明,初学者可先避免)。

print("\n--- 变量作用域示例 ---")
global_var = "我是一个全局变量"def scope_test():# 声明使用的是全局变量global global_var  local_var = "我是一个局部变量"print(f"在函数内部,可以看到局部变量: '{local_var}'")print(f"在函数内部,也可以看到全局变量: '{global_var}'")global_var = "尝试在函数内修改全局变量" print(f"在函数内部,修改后的 '全局' 变量: '{global_var}'")scope_test()print(f"\n在函数外部,可以看到全局变量: '{global_var}'")
# 会产生 NameError,因为 local_var 只在函数内存在
print(f"在函数外部,不能看到局部变量: {local_var}")

三、函数的参数类型

位置参数(Positional Arguments):

调用函数时按顺序匹配参数。

def describe_pet(animal_type, pet_name):"""显示宠物的信息。"""print(f"\n我有一只 {animal_type}.")print(f"我的 {animal_type} 的名字叫 {pet_name}.")
describe_pet("猫", "咪咪")
# 输出:
我有一只 猫.
我的 猫 的名字叫 咪咪.

为提高可读性,推荐使用关键字参数传递所有参数。例如对于复杂函数:

# 位置参数写法不清晰
plot_data(data, x_col, y_col, "blue", "-", True, False, "My Plot", "X-axis", "Y-axis") # 关键字参数写法更清晰
plot_data(data=my_data, x_column='time', y_column='value',color='blue', linestyle='-', show_grid=True, use_log_scale=False,title="My Awesome Plot", xlabel="Time (s)", ylabel="Value") 

在 Python 函数调用中,关键字参数通过 “参数名 = 值” 的形式传递。这样一来,Python 解释器根据参数名来匹配值,而不是位置,即此时与赋值顺序无关。

默认参数值(Default Parameter Values)

定义函数时给参数指定默认值,调用时若未提供该参数,则使用默认值。注意,带默认值的参数必须放在无默认值的参数之后。

# animal_type 有默认值
def describe_pet_default(pet_name, animal_type="狗"): """显示宠物的信息,动物类型默认为狗。"""print(f"我有一只 {animal_type}.")print(f"我的 {animal_type} 的名字叫 {pet_name.title()}.")
# animal_type 使用默认值 "狗"
describe_pet_default(pet_name="小黑") 
# 提供 animal_type时,覆盖默认值
describe_pet_default(pet_name="雪球", animal_type="仓鼠") 

可变数量参数(*args 和 **kwargs):

*args(收集位置参数):将多余的位置参数收集为一个元组。函数调用时,Python 先尝试用位置参数填充明确定义的、非关键字的形参(即普通无*或**前缀的参数)。若填充后还有剩余位置参数,这些参数将被收集成元组赋值给 *args 指定的变量(通常为 args)。若位置参数数量正好或少于明确定义的形参数量且满足必需参数,*args 为空元组 ()

def make_pizza(size, *toppings):"""概述要制作的比萨。*toppings 会将所有额外的位置参数收集到一个元组中。"""print(f"\n制作一个 {size} 寸的比萨,配料如下:")if toppings: # 只要toppings不为空元组,就会执行for topping in toppings:print(f"- {topping}")else:print("- 原味 (无额外配料)")make_pizza(12, "蘑菇")
make_pizza(16, "香肠", "青椒", "洋葱")
make_pizza(9) # toppings 会是空元组

 

**kwargs(收集关键字参数):将多余的关键字参数收集为一个字典。函数调用时,Python 先处理位置参数,再尝试用关键字参数(形如 name=value)填充明确定义的同名形参。若填充后还有剩余关键字参数,这些参数将被收集成字典赋值给 **kwargs 指定的变量(通常为 kwargs)。若所有关键字参数都能匹配明确形参名,**kwargs 为空字典 {}

def build_profile(first_name, last_name, **user_info):"""创建一个字典,其中包含我们知道的有关用户的一切。**user_info 会将所有额外的关键字参数收集到一个字典中。"""profile = {}profile['first_name'] = first_nameprofile['last_name'] = last_namefor key, value in user_info.items():profile[key] = valuereturn profileuser_profile = build_profile('爱因斯坦', '阿尔伯特',location='普林斯顿',field='物理学',hobby='小提琴')
print(f"\n用户信息: {user_profile}")
# 输出: {'first_name': '爱因斯坦', 'last_name': '阿尔伯特', 'location': '普林斯顿', 'field': '物理学', 'hobby': '小提琴'}

当函数 build_profile 被调用时,Python 解释器首先将位置参数 '爱因斯坦' 和 '阿尔伯特' 分别赋值给 first_name  last_name。然后,对于剩下的 location='普林斯顿', field='物理学', hobby='小提琴' 关键字参数,由于在函数定义中没有与之直接对应的普通形参,所以会被收集到 user_info 字典中。

*args **kwargs 核心目的是让函数能接收不定数量的参数,并以元组和字典的形式在函数内部处理。即当位置参数用完就自动变成 *args,当关键词参数用完就自动变成**kwarges

# 同时出现 *args 和 **kwargs,注意参数的传入顺序
def process_data(id_num, name, *tags, status="pending", **details): # 注意,这里的status 是仅关键字参数,必须通过关键词传值print(f"ID: {id_num}")print(f"Name: {name}")print(f"Tags (*args): {tags}")print(f"Status: {status}")          # status 是一个有默认值的普通关键字参数print(f"Details (**kwargs): {details}")print("-" * 20)# 调用1:
process_data(101, "Alice", "vip", "new_user", location="USA", age=30)
# ID: 101
# Name: Alice
# Tags (*args): ('vip', 'new_user')  <-- "vip", "new_user" 是多余的位置参数,被 *tags 收集
# Status: pending                    <-- status 使用默认值,因为调用中没有 status=...
# Details (**kwargs): {'location': 'USA', 'age': 30} <-- location 和 age 是多余的关键字参数,被 **details 收集
# --------------------# 调用2:
process_data(102, "Bob", status="active", department="Sales")
# ID: 102
# Name: Bob
# Tags (*args): ()                   <-- 没有多余的位置参数
# Status: active                     <-- status 被关键字参数 'active' 覆盖
# Details (**kwargs): {'department': 'Sales'} <-- department 是多余的关键字参数
# --------------------# 调用3:
process_data(103, "Charlie", "admin") # 'admin' 会被 *tags 捕获
# ID: 103
# Name: Charlie
# Tags (*args): ('admin',)
# Status: pending
# Details (**kwargs): {}
# --------------------# 调用4: (演示关键字参数也可以用于定义中的位置参数)
process_data(name="David", id_num=104, profession="Engineer")
# ID: 104
# Name: David
# Tags (*args): ()
# Status: pending
# Details (**kwargs): {'profession': 'Engineer'}
# --------------------

@浙大疏锦行


http://www.hkcw.cn/article/BREIvjBWWy.shtml

相关文章

目标检测学习

RCNN 默认找出2000个可能存在目标的候选区域 region proposal将候选区域调整为适合AlexNet网络的输入图像的大小&#xff0c;通过CNN对候选区域提取特征向量&#xff0c;2000个建议区域经过Alexnet生成20004096的特征矩阵将20004096的特征向量经过20个类别的svm分类器进行分类&…

谷歌Gemma模型实现智能看病、翻译手语、与海豚沟通

目录 引言&#xff1a;AI的新篇章——从通用走向专属的智慧革命 一、 MedGemma&#xff1a;智能医疗的守护者与革新者 1.1 MedGemma的双重火力 1.2 高效部署与开发者生态 1.3 未来展望 二、SignGemma&#xff1a;跨越无声世界的沟通桥梁 2.1 SignGemma的核心能力 2.2 从…

TDengine 运维——巡检工具(定期检查)

背景 TDengine 在运行一段时间后需要针对运行环境和 TDengine 本身的运行状态进行定期巡检&#xff0c;本文档旨在说明如何使用巡检工具对 TDengine 的运行环境进行自动化检查。 安装工具使用方法 工具支持通过 help 参数查看支持的语法 Usage: taosinspect [OPTIONS]Check…

火语言UI组件--地图

【组件功能】&#xff1a;调用高德地图api,可通过定义经纬度定位显示具体位置。 样式预览 设置 基础设置 属性名称属性释义输入值类型开发者Key(key)高德地图 JSAPI 开发者Key字符串类型安全密钥(securityJsCode)高德地图 JSAPI 安全密钥字符串类型缩放级别(zoom)设置地图缩…

安防通信枢纽新贵:HT-CKNU 网络报警服务器深度解析

在安防体系不断升级的当下&#xff0c;报警服务器作为连接前端设备与接警中心的关键枢纽&#xff0c;其性能优劣直接关乎安全防护的成效。HT-CKNU 网络报警服务器凭借卓越的技术架构、广泛的兼容性和便捷的操作体验&#xff0c;正逐渐成为安防行业的中流砥柱&#xff0c;为各领…

打通仿真数据孤岛,实现精细化权限管理,「共享空间」深度解析

在上一期《资深仿真工程师必备&#xff01;详解平台“控制中枢”——「命令终端」》中&#xff0c;我们详解了如何通过命令行实现作业高效提交与资源调度。然而&#xff0c;工业仿真从来不是单兵作战——复杂模型的多方协作、海量数据的跨团队流转&#xff0c;才是研发场景的常…

桌面工具站

桌面工具站软件&#xff0c;可以将桌面软件、word文档和网页等拖拽到工具站&#xff0c;在工具站点击直接跳转&#xff0c;方便快捷。 可以拖拽进入软件&#xff0c;也可以迪纳基添加&#xff0c;添加界面如下&#xff1a; 支持自定义排序 可自定义背景&#xff0c;效果如下; 支…

人工智能编程学习心得:从零基础到独立开发的蜕变之路

引言&#xff1a;一场改变认知的技术之旅 2022年冬天&#xff0c;我在深夜的办公室里经历了第一次深度学习模型的完整训练过程。当GPU使用率曲线从波动到平稳&#xff0c;当验证集准确率突破85%的那一刻&#xff0c;显示器的蓝光映照着满桌的咖啡杯&#xff0c;这个场景成为我…

Docker 与 Serverless 架构:无服务器环境下的容器化部署

Serverless(无服务器)架构作为云计算领域的革命性范式,以其无需管理服务器、按需付费、自动伸缩的特性,正在改变着应用开发和部署的方式。然而,传统的函数即服务(Function-as-a-Service, FaaS),如 AWS Lambda,在运行时环境、部署包大小和复杂依赖管理方面存在一定的局…

SI24R05国产低功耗2.4GHz+125K低频唤醒SoC人员定位/畜牧业牛羊定位/资产管理定位方案芯片

目录 SI24R05简介功能框图 主要特性开发工具方案特性 SI24R05简介 Si24R05 是一款高度集成的低功耗 SOC 芯片&#xff0c;具有低功耗、Low Pin Count、 宽电压工作范围&#xff0c;集成了 13/14/15/16 位精度的 ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、无线收发器、…

Apptrace:APP安全加速解决方案

2021 年&#xff0c;某知名电商平台在 “618” 大促期间遭遇 DDoS 攻击&#xff0c;支付系统瘫痪近 2 小时&#xff1b;2022 年&#xff0c;一款热门手游在新版本上线时因 CC 攻击导致服务器崩溃。观察发现&#xff0c;电商大促、暑期流量高峰和年末结算期等关键商业周期&#…

AI生态警报:MCP协议风险与应对指南(中)——MCP Server运行时安全​​

作为连接AI模型与外部工具的“USB-C接口”&#xff0c;MCP协议成为AI生态的核心枢纽&#xff0c;其安全风险已从理论威胁转化为实际攻击目标。 AI生态警报&#xff1a;MCP协议风险与应对指南&#xff08;上&#xff09;——架构与供应链风险https://blog.csdn.net/WangsuSecur…

黑河流域30弧秒分辨率月尺度地表水及地下水灌溉量数据集(1981-2013)

时间分辨率&#xff1a;月空间分辨率&#xff1a;< 0.01共享方式&#xff1a;开放获取数据大小&#xff1a;573.97 MB数据时间范围&#xff1a;1981-01-13 — 2014-01-12元数据更新时间&#xff1a;2021-04-19 数据集摘要 农业灌溉占人类用水量的80%左右, 是人类水资源管理…

反对内卷式恶性竞争 中国汽车工业协会发布倡议

反对“内卷式”恶性竞争 中国汽车工业协会发布重要倡议记者从中国汽车工业协会获悉,针对行业“内卷式”竞争,协会发布重要倡议,企业不应采取无序“价格战”,应维护公平竞争秩序。协会提出的四项倡议包括:一是所有企业严格遵从公平竞争原则,依法依规开展经营活动;二是优势…

时间序列数据如何转化为动态图实践笔记

文章目录 1 时间序列的状态的定义2 时序转化的实际案例解析2.1 步骤一&#xff1a;数据准备与特征提取2.2 步骤二&#xff1a;状态识别与节点构建2.3 步骤三&#xff1a;演化状态图构建2.4 步骤四&#xff1a;图神经网络&#xff08;GNN&#xff09;建模2.5 配套代码实践 看到 …

对COM组件的调用返回错误 HRESULT E_FAIL

方法1 网上的加载DLL到缓存&#xff0c;我通过GPT写了个批处理 1.bat 放到 Common7\IDE\PublicAssemblies 下 2. 添加环境变量 Path 按这个&#xff0c;DLL加入了缓存 但是 VS创建MFC项目还是失败 方法2&#xff1a;项目创建失败了&#xff0c;其实这个项目已经创建出来了…

Odoo OWL 框架深度研究(VIP10万字版)

一、核心理念、架构定位与实践价值 前言:为什么需要一份新的前端框架? 在Odoo的漫长发展历程中,其前端部分长期依赖于一个基于Backbone.js的自定义Widget系统。这个系统在当时是有效的,但随着前端技术的飞速发展(以React, Vue, Svelte等框架为代表),其固有的命令式编程…

TiDB 发布 MCP Server:引领国产数据库迈向智能 AI 代理新应用范式

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;我们已经进入了Agentic AI 时代——一个由大型语言模型&#xff08;LLM&#xff09;推动的智能化阶段。这个阶段不仅要求 LLM 理解指令&#xff0c;还要求其能主动做出决策并执行任务。在这个进化过程中&…

深入理解Transformer架构:从原理到实践

深入理解Transformer架构&#xff1a;从原理到实践 引言 Transformer架构自2017年由Google在论文《Attention Is All You Need》中提出以来&#xff0c;已经彻底改变了自然语言处理(NLP)领域&#xff0c;并逐渐扩展到计算机视觉、语音识别等多个领域。本文将深入解析Transfor…

Live Helper Chat 安装部署

Live Helper Chat(LHC)是一款开源的实时客服聊天系统,适用于网站和应用,帮助企业与访问者即时沟通。它功能丰富、灵活、可自托管,常被用于在线客户支持、销售咨询以及技术支持场景。 🧰 系统要求 安装要求 您提供的链接指向 Live Helper Chat 的官方安装指南页面,详细…