楼主: CDA网校
507 0

[每天一个数据分析师] 封装函数的3个设计技巧 [推广有奖]

管理员

已卖:189份资源

泰斗

3%

还不是VIP/贵宾

-

威望
3
论坛币
117882 个
通用积分
10225.2437
学术水平
278 点
热心指数
286 点
信用等级
253 点
经验
228030 点
帖子
6909
精华
19
在线时间
4373 小时
注册时间
2019-9-13
最后登录
2025-12-31

初级热心勋章

楼主
CDA网校 学生认证  发表于 2022-4-22 15:38:04 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

作者:麦叔

来源:麦叔编程

函数参数太多了,太麻烦了

这是某位麦友在群里的提问:

函数参数太多了,每次调用都需要传递很多参数。太麻烦了。有什么好的办法吗?

碰巧的是我周一规划本周话题的时候也正好想到了这个话题。

要解决这个问题办法还挺多的,今天我来分享几种。

假设有这样一个函数,它的作用是制作一杯咖啡,它有8个参数,实际上制作咖啡如果足够细,可以有80个参数。

def make_a_coffee(from_country, brand, flavour, size, temperature, sweet, time, hand_made): """制作一杯咖啡,需要如下参数:产地,品牌,口味,大小,温度,甜度,研磨时间,是否手工制作 """ pass

按照上面的函数定义,每次调用这个函数都需要传递8个参数,还是有点麻烦的。

灵活使用Python的参数

解决以上麻烦的第一种方法,这也是pythoner最常用的方法就是灵活地使用Python的参数。

Python支持「可选参数」,「参数默认值」等。通过使用这些特性,可以让调用者只传递必要的少量参数。

下面的例子通过给参数设置了默认值,让所有参数变成了可选,这样调用就方便多了:

def make_a_coffee(flavour='拿铁', size='M', from_country=None, brand=None, temperature=None, sweet=None, time=None, hand_made=None): """制作一杯咖啡,需要如下参数:产地,品牌,口味,大小,温度,甜度,研磨时间,是否手工制作 """ pass make_a_coffee()make_a_coffee(flavour='卡布奇诺')

灵活使用参数,可以有很多玩法,这在很多官方库中也是非常常用的。比如turtle库的init方法设置了默认的大小:

def __init__(self, master, width=500, height=350,                                          canvwidth=600, canvheight=500):

关于参数的详细解说,大家可以看我的B站相关视频。B站上搜:「麦叔编程 参数」。

函数封装

如果调用的时候经常使用同样一批参数,我们可以在原有函数之上封装一个参数更少的函数。

下面的例子封装符合我的口味的函数,以后就调用这个新的函数就行了,不用传参数:

def make_a_coffee(flavour, size, from_country, brand, temperature, sweet, time, hand_made): """制作一杯咖啡,需要如下参数:产地,品牌,口味,大小,温度,甜度,研磨时间,是否手工制作 """ pass def make_my_coffee(): '''我就喜欢大杯的手工制作的星巴克的,产地是巴西的卡布奇诺,必须要加糖''' make_a_coffee('卡布奇诺', 'XXXXL', '巴西', '星巴克', '66.6', '加糖', '60M', True)make_my_coffee()make_my_coffee()把参数封装成对象

如果参数太多,也可以把参数封装成一个对象。在Java等更加注重规范的编程语言中,通常会要求参数个数不能超过6个。

在Python中,把函数封装成对象也很常用。最常见的一个例子就是网络请求的参数被封装到request和response对象中。比如这个函数,就把response参数封装到了response对象中:

def parse(self, response): return scrapy.FormRequest.from_response(    response,    formdata={'username': 'john', 'password': 'secret'},    callback=self.after_login  )

在我们的例子中,只有8个参数,其实是没有必要的。以演示为目的,我们可以这样做:

class CoffeeRequirement: """咖啡需求,包含如下参数:产地,品牌,口味,大小,温度,甜度,研磨时间,是否手工制作""" def __init__(self, flavour, size, from_country, brand, temperature, sweet, time, hand_made): pass def make_a_coffee(coffee_requirement): pass requirement = CoffeeRequirement('卡布奇诺', 'XXXXL', '巴西', '星巴克', '66.6', '加糖', '60M', True)make_a_coffee(requirement)make_a_coffee(requirement)

虽然创建对象的时候也是需要传入参数的,但后面我们可以重用这个对象,还是比较方便的。


      相关帖子DA内容精选
  • 大厂数据分析面试指南!来自亚马逊、谷歌、微软、头条、美团的面试问题!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Requirement response password require Country

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 01:13