首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 10章 编写高效的函数
10.1 函数名
10.2 函数大小的权衡
10.3 函数的形参和实参
10.3.1 默认参数
10.3.2 使用*和**向函数传参
10.3.3 使用*创建可变参数函数
10.3.4 使用**创建可变参数函数
10.3.5 使用*和**创建包装函数
10.4 函数式编程
10.4.1 副作用
10.4.2 高阶函数
10.4.3 lambda 函数
10.4.4 在列表推导式中进行映射和过滤
10.5 返回值的数据类型应该不变
10.6 抛出异常和返回错误码
第 11章 注释、文档字符串和类型提示
11.1 注释
11.1.1 注释风格
11.1.2 内联注释
11.1.3 说明性的注释
11.1.4 总结性的注释
11.1.5 “经验之谈”的注释
11.1.6 法律注释
11.1.7 注释的专业性
11.1.8 代码标签和TODO 注释
11.1.9 神奇的注释和源文件编码
11.2 文档字符串
11.3 类型提示
11.3.1 使用静态分析器
11.3.2 为多种类型设置类型提示
11.3.3 为列表、字典等设置类型提示
11.3.4 通过注释向后移植类型提示
第 12章 通过Git管理项目
12.1 Git 提交和仓库
12.2 使用Cookiecutter新建Python项目
12.3 安装Git
12.3.1 配置Git 用户名和电子邮件
12.3.2 安装GUI Git 工具
12.4 Git 的工作流程
12.4.1 Git 是如何追踪文件状态的
12.4.2 为什么要暂存文件
12.5 在计算机上创建Git 仓库
12.5.1 添加供Git 追踪的文件
12.5.2 忽略仓库中的文件
12.5.3 提交修改
12.5.4 从仓库中删除文件
12.5.5 重命名和移动仓库中的文件
12.6 查看提交日志
12.7 恢复历史修改
12.7.1 撤销未提交的本地修改
12.7.2 取消暂存的文件
12.7.3 回滚近期的提交
12.7.4 回滚到单个文件的某次提交
12.7.5 重写提交历史
12.8 GitHub 和git推送命令
12.8.1 将一个已存在的仓库推送到GitHub
12.8.2 克隆已存在的GitHub仓库
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(四)
小册名称:Python编程轻松进阶(四)
### 10.3.2 使用*和**向函数传参 在Python编程中,函数是组织代码、实现特定功能的强大工具。随着程序复杂度的增加,我们经常会遇到需要向函数传递多个参数的情况。Python提供了灵活的方式来处理这种场景,其中使用`*`(星号)和`**`(双星号)操作符向函数传递参数就是其中的一种高效方法。这两种操作符在函数定义和函数调用时有着不同的用途,但它们共同增强了Python函数参数的灵活性。 #### 10.3.2.1 理解*操作符 ##### 1. 在函数定义中使用* 在函数定义时,`*`操作符用于接收任意数量的位置参数,并将它们收集到一个元组(tuple)中。这允许我们在不知道具体会有多少个参数传入的情况下,编写能够接受这些参数的函数。 ```python def my_func(*args): for arg in args: print(arg) my_func(1, 2, 3, 'a', 'b', 'c') # 输出: # 1 # 2 # 3 # a # b # c ``` 在这个例子中,`*args`允许`my_func`函数接收任意数量的位置参数,并将它们作为元组`args`的元素进行处理。 ##### 2. 在函数调用中使用* 在函数调用时,`*`操作符用于将可迭代对象(如列表、元组等)解包成位置参数传递给函数。 ```python def add(a, b, c): return a + b + c numbers = [1, 2, 3] result = add(*numbers) # 解包列表为位置参数 print(result) # 输出: 6 ``` 这里,`*numbers`将列表`numbers`解包为三个单独的位置参数,传递给`add`函数。 #### 10.3.2.2 理解**操作符 ##### 1. 在函数定义中使用** 在函数定义时,`**`操作符用于接收任意数量的关键字参数,并将它们收集到一个字典(dict)中。这允许我们编写能够接受任意关键字参数的函数,而不必事先知道这些参数的名称。 ```python def my_func(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") my_func(name='Alice', age=30, job='Engineer') # 输出: # name: Alice # age: 30 # job: Engineer ``` 在这个例子中,`**kwargs`允许`my_func`函数接收任意数量的关键字参数,并将它们作为字典`kwargs`的键值对进行处理。 ##### 2. 在函数调用中使用** 在函数调用时,`**`操作符用于将字典解包成关键字参数传递给函数。 ```python def greet(name, greeting='Hello'): print(f"{greeting}, {name}!") person = {'name': 'Bob', 'greeting': 'Hi'} greet(**person) # 解包字典为关键字参数 # 输出: Hi, Bob! ``` 这里,`**person`将字典`person`解包为两个关键字参数`name`和`greeting`,传递给`greet`函数。 #### 10.3.2.3 混合使用*和** 在Python中,`*`和`**`操作符可以在同一个函数定义或调用中混合使用,以提供最大的灵活性。 ##### 在函数定义中混合使用 ```python def my_complex_func(*args, **kwargs): for arg in args: print(arg, end=' ') print() # 换行 for key, value in kwargs.items(): print(f"{key}: {value}") my_complex_func(1, 2, 3, name='Alice', age=30) # 输出: # 1 2 3 # name: Alice # age: 30 ``` 在这个例子中,`*args`收集了所有的位置参数,而`**kwargs`收集了所有的关键字参数。 ##### 在函数调用中混合使用 ```python def complex_operation(a, b, **extra): result = a + b for key, value in extra.items(): print(f"{key} is {value}") return result args = (1, 2) kwargs = {'multiplier': 2, 'debug': True} result = complex_operation(*args, **kwargs) print(f"Result: {result * kwargs['multiplier']}") # 使用额外的参数 # 输出: # multiplier is 2 # debug is True # Result: 6 ``` 在这个例子中,`*args`和`**kwargs`分别用于解包列表和字典,作为位置参数和关键字参数传递给`complex_operation`函数。 #### 10.3.2.4 注意事项与最佳实践 - **可读性**:虽然`*`和`**`提供了极大的灵活性,但过度使用可能会降低代码的可读性。建议仅在确实需要时才使用这些特性。 - **命名冲突**:在函数定义中,`*args`必须在`**kwargs`之前出现,因为位置参数必须在关键字参数之前被处理。 - **文档字符串**:当使用`*args`和`**kwargs`时,确保在函数的文档字符串中清楚地说明哪些参数是必需的,哪些是可选的,以及它们的用途。 - **避免滥用**:虽然可以使用`*args`和`**kwargs`来编写非常灵活的函数,但这并不意味着应该这样做。过度灵活的函数可能会使代码难以理解和维护。 通过使用`*`和`**`操作符,Python提供了强大的机制来处理函数参数的灵活性。掌握这些技巧,将使你能够编写出更加灵活、强大的Python程序。
上一篇:
10.3.1 默认参数
下一篇:
10.3.3 使用*创建可变参数函数
该分类下的相关小册推荐:
Python机器学习基础教程(下)
剑指Python(万变不离其宗)
Python合辑9-判断和循环
Python与办公-玩转Word
Python数据分析与挖掘实战(下)
Python合辑8-变量和运算符
Python与办公-玩转PPT
Python合辑14-面向对象编程案例(下)
Python合辑7-集合、列表与元组
Python编程轻松进阶(二)
Python高性能编程与实战
Python合辑6-字典专题