当前位置: 首页 > news >正文

《python编程从入门到实践》8-10章

8 函数

8.1 定义函数

def greet_user():           # def 定义一个函数"""显示简单的问候语"""  # 文档字符串(docstring)的注释print("Hello!")greet_user()

第一行代码使用关键字 def 来告诉 Python,你要定义一个函数。这是函数定义。

这些字符串通常前后分别用三个双引号引起,能够包含多行。

8.2 传递实参

8.2.2 关键字实参

关键字实参是传递给函数的名值对。这样会直接在实参中将名称和值关联起来,因此向函数传递实参时就不会混淆了

def describe_pet(animal_type, pet_name):"""显示宠物的信息"""print(f"\nI have a {animal_type}.")print(f"My {animal_type}'s name is {pet_name.title()}.")describe_pet(animal_type='hamster', pet_name='harry')

8.2.3 默认值

在编写函数时,可以给每个形参指定默认值。如果在调用函数中给形参提供了实参,
Python 将使用指定的实参值;否则,将使用形参的默认值。

def describe_pet(pet_name, animal_type='dog'):"""显示宠物的信息"""print(f"\nI have a {animal_type}.")print(f"My {animal_type}'s name is {pet_name.title()}.")describe_pet(pet_name='willie')
# 可以简单使用 describe_pet('willie')

8.2.4 等效的函数调用

位置可以混乱

# 一条名为 Willie 的小狗
describe_pet('willie')
describe_pet(pet_name='willie')# 一只名为 Harry 的仓鼠
describe_pet('harry', 'hamster')
describe_pet(pet_name='harry', animal_type='hamster')
describe_pet(animal_type='hamster', pet_name='harry')

8.3 返回值

8.3.1 返回简单的值

def get_formatted_name(first_name, last_name):"""返回标准格式的姓名"""full_name = f"{first_name} {last_name}"return full_name.title()musician = get_formatted_name('jimi', 'hendrix')
print(musician)

8.3.2 让实参变成可选的

有时候,需要让实参变成可选的,以便使用函数的人只在必要时才提供额外的信息。可以使用默认值来让实参变成可选的。

def get_formatted_name(first_name, last_name, middle_name=""):"""返回标准格式的姓名"""if middle_name:full_name = f"{first_name} {middle_name} {last_name}"else:full_name = f"{first_name} {last_name}"return full_name.title()musician = get_formatted_name('jimi', 'hendrix')
print(musician)musician = get_formatted_name('john', 'hooker', 'lee')
print(musician)

输出

Jimi  Hendrix
John Hooker Lee

8.4 传递列表

你经常会发现,向函数传递列表很有用,可能是名字列表、数值列表或更复杂的对象列表(如字典)。将列表传递给函数后,函数就能直接访问其内容。下面使用函数来提高处理列表的效率

def greet_users(names):"""向列表中的每个用户发出简单的问候"""for name in names:msg = f"Hello, {name.title()}!"print(msg)usernames = ['hannah', 'ty', 'margot']
greet_users(usernames)

输出

Hello, Hannah!
Hello, Ty!
Hello, Margot!

8.4.1 在函数中修改列表

来看一家为用户提交的设计制作 3D 打印模型的公司。需要打印的设计事先存储在一个列表中,打印后将被移到另一个列表中。下面是在不使用函数的情况下模拟这个过程的代码:

# 首先创建一个列表,其中包含一些要打印的设计
unprinted_designs = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []# 模拟打印每个设计,直到没有未打印的设计为止
# 打印每个设计后,都将其移到列表 completed_models 中
while unprinted_designs:current_design = unprinted_designs.pop()print(f"Printing model: {current_design}")completed_models.append(current_design)# 显示打印好的所有模型
print("\nThe following models have been printed:")
for completed_model in completed_models:print(completed_model)

输出

Printing model: dodecahedron
Printing model: robot pendant
Printing model: phone caseThe following models have been printed:
dodecahedron
robot pendant
phone case

8.4.2 禁止函数修改列表

function_name(list_name[:])

8.5 传递任意数量的实参

特性 *args **kwargs
全称及含义 "arguments" 的缩写,用于接收任意数量的位置参数 "keyword arguments" 的缩写,用于接收任意数量的关键字参数
参数类型 接收多个位置参数,将其打包成一个元组(tuple) 接收多个关键字参数,将其打包成一个字典(dict)
调用方式示例 function(1, 2, 3) function(a=1, b=2, c=3)
函数定义示例 def function(*args):<br> print(args) def function(**kwargs):<br> print(kwargs)
在函数内部的使用 像使用元组一样访问和操作这些参数,如通过索引 args[0] 访问第一个参数,使用循环遍历等 像使用字典一样访问和操作这些参数,如通过键 kwargs['key'] 获取对应的值,使用 kwargs.items() 遍历键值对
参数顺序要求 位置参数必须放在关键字参数之前,如果函数同时有普通位置参数,*args 要放在普通位置参数之后 必须放在 *args 和普通参数之后,在函数定义中位置参数、*args**kwargs 的顺序通常为:def func(普通参数, *args, **kwargs):
应用场景 适用于不知道会传入多少个位置参数的情况,例如计算多个数字的总和等 适用于不知道会传入多少个关键字参数的情况,比如传递用户的多个属性信息、配置参数等
示例代码 def sum_numbers(*nums):<br> result = sum(nums)<br> return result<br> print(sum_numbers(1, 2, 3, 4)) def print_user_info(**user):<br> for key, value in user.items():<br> print(f"{key}: {value}")<br> print_user_info(name="Alice", age=25, city="New York")

你预先不知道函数需要接受多少个实参,好在 Python 允许函数从调用语句中收集任意数量的实参。

例如一个制作比萨的函数,它需要接受很多配料,但无法预先确定顾客要点多少种配料。下面的函数只有一个形参 *toppings,不管调用语句提供了多少实参,这个形参都会将其收入囊中:

def make_pizza(*toppings):"""打印顾客点的所有配料"""print(toppings)make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')

输出

('pepperoni',)
('mushrooms', 'green peppers', 'extra cheese')

函数定义时使用*参数名(如*toppings)的语法会将传入的多个位置参数打包成一个元组(tuple)

8.5.2 使用任意数量的关键字实参

有时候,你需要接受任意数量的实参,但预先不知道传递给函数的会是什么样的信息。在这种情况下,可将函数编写成能够接受任意数量的键值对——调用语句提供了多少就接受多少。

在 Python 中,**kwargs 是一个特殊的参数语法,用于接收任意数量的关键字参数(keyword arguments),并将它们作为一个 字典(dict) 传递给函数

def build_profile(first, last, **user_info):"""创建一个字典,其中包含我们知道的有关用户的一切"""user_info['first_name'] = firstuser_info['last_name'] = lastreturn user_infouser_profile = build_profile('albert', 'einstein',location='princeton',field='physics')
print(user_profile)

输出

{'location': 'princeton', 'field': 'physics', 'first_name': 'albert', 'last_name': 'einstein'}

8.6 将函数存储在模块中

http://www.jsqmd.com/news/598564/

相关文章:

  • AI头像生成器快速部署:阿里云ACK一键部署Qwen3-32B头像生成服务
  • PHP如何抛出和接收错误的详细指南
  • 保姆级教程:用Python和Paho-MQTT库5分钟搭建你的第一个物联网通信Demo
  • 计算机基础第一阶段:核心基础学习
  • claw-code 源码详细分析:Bootstrap Graph——启动阶段图式化之后,排障与扩展为什么会变简单?
  • 玻璃钢风机优质供货商品牌推荐与选型指南 - 品牌推荐大师
  • 科技信息最前沿——TurboQuant:以极致压缩重新定义人工智能效率
  • 突破智能音箱局限:MiGPT让小爱设备实现AI语音助手功能
  • 魔兽争霸3性能优化与显示修复完整教程:3步实现完美游戏体验
  • AudioSeal Pixel Studio实战案例:新闻广播AI合成语音的自动水印标注系统
  • BepInEx框架企业级应用开发指南:从架构解析到性能优化
  • BiliBili-UWP:优化Windows平台B站体验的高效解决方案
  • GEE数据集:全球6400万地点数据免费开放(世界实体的点):商家、学校、医院、宗教组织、地标、山峰等
  • 如何免费体验最真实的原神抽卡模拟器:浏览器端终极指南
  • IM022-【对文件夹操作pdf放在文件夹外】当前目录下合并文件夹中的图片为PDF并以文件夹名字命名PDF文件名
  • 2026哪个厂家检验筛/摇摆筛/振动筛质量好?专业选型指南 - 品牌推荐大师
  • 新手福音:用claude code和快马平台开启你的Python编程第一课
  • (97页PPT)DG华为流程管理全景从定位到优化的高效增长策略(附下载方式)
  • 基于Python的电子邮件管理系统设计与实现
  • 【RabbitMQ】RabbitMQ核心知识体系全解(5大核心模块:Exchange类型、消息确认机制、死信队列、延迟队列、镜像队列)
  • NomNom存档编辑器:3分钟掌握《无人深空》终极修改秘籍
  • 告别手速焦虑:大麦抢票自动化系统完整指南
  • Qwen3.5-9B图文理解效果展示:JPEG/PNG上传问答真实作品
  • PHP中防SQL注入的主要方法
  • 深入理解 C# 架构思维:继承的界限、多态的解耦与属性的封装
  • 基于边缘计算、区块链、联邦学习与众包的智能隐私保护系统(上篇)上篇:核心理论、系统架构与应用实践全解析
  • ARC217A - Min of Sum of XOR
  • 自动化、自适应地对一个指定的、基于大模型的问答应用(Application)进行查询攻击
  • STM32H7 SPI4 FLASH HAL库配置优化实践
  • OFA图文语义蕴含系统应用场景:AI绘画平台提示词-图像验证