飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 认识Python

    • Python 历史与特点
    • Python 2 与 Python 3 的核心差异
    • 安装与运行 Python 2.7.18
    • 编码规范 PEP 8
  • 第2章 基础语法

    • 变量与对象
    • 数字类型
    • 字符串 str
    • Unicode 字符串
    • 运算符
    • 空值 None
  • 第3章 流程控制

    • if 条件语句
    • if-else 条件语句
    • if-elif-else 多分支
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 与 xrange
    • 循环控制:break、continue、pass
    • 循环 else 子句
  • 第4章 数据结构

    • 列表基础
    • 列表方法
    • 列表推导式
    • 元组
    • 字典基础
    • 字典方法
    • 字典循环技巧
    • 集合
    • 序列解包
    • 序列比较
  • 第5章 函数

    • 定义函数
    • 参数传递机制
    • 默认参数
    • 关键字参数
    • 可变参数
    • Lambda 表达式
    • 文档字符串
    • 函数对象
  • 第6章 模块与包

    • import 导入
    • 模块搜索路径
    • name 与主程序
    • 编译文件 .pyc 与 .pyo
    • 包结构
    • dir() 函数
  • 第7章 文件与IO

    • 打开与关闭文件
    • 文件读写方法
    • with 上下文管理器
    • 格式化输出:% 操作符
    • 格式化输出:str.format()
    • JSON 序列化
  • 第8章 面向对象

    • 类定义与实例化
    • init 构造方法
    • 类变量与实例变量
    • 方法调用与 self
    • 继承基础
    • 多重继承
    • 新式类与旧式类
    • 私有变量与名称改写
    • 属性装饰器 property
    • 类方法与静态方法
    • 魔术方法
    • 空类与数据记录
  • 第9章 异常处理

    • 异常类型
    • try-except
    • try-except-else-finally
    • 抛出异常 raise
    • 自定义异常
    • with 语句与上下文管理器
  • 第10章 迭代器与生成器

    • 迭代器协议
    • 生成器函数
    • 生成器表达式
    • itertools模块
  • 第11章 标准库精要

    • os模块
    • sys模块
    • datetime模块
    • re模块
    • json模块
    • collections模块
    • math与random模块
    • urllib2与网络请求
    • subprocess与命令执行
    • threading与并发
    • unittest与测试
    • 虚拟环境与包管理
  • 第12章 工程实践

    • 调试技巧
    • 性能分析
    • 文档与注释
    • 下一步学习

关键字参数

关键字参数(Keyword Arguments)让函数调用更清晰、更灵活。调用方通过 name=value 的形式指定参数,不必记住参数的顺序。

基本用法

def greet(name, greeting, punctuation):
    print "%s, %s%s" % (greeting, name, punctuation)

# 位置调用:必须按顺序
greet("Alice", "Hello", "!")

# 关键字调用:顺序任意
greet(punctuation="?", name="Bob", greeting="Hi")

# 混合调用:位置参数在前,关键字参数在后
greet("Charlie", punctuation="...", greeting="Hey")

混合调用时,位置参数按顺序匹配,关键字参数按名字匹配。但关键字参数不能出现在位置参数之前:

greet(name="Alice", "Hello")      # SyntaxError: non-keyword arg after keyword arg

可读性的提升

关键字参数让代码自文档化:

# 不清楚 80 和 30 是什么
connect("example.com", 80, 30)

# 一目了然
connect("example.com", port=80, timeout=30)

在团队协作中,关键字参数能显著降低理解成本。尤其是参数类型相同(都是数字或字符串)时,位置调用极易出错:

def send_email(to, subject, body):
    pass

# 容易搞错顺序
send_email("Hello", "boss@example.com", "Meeting at 3pm")

# 清晰且安全
send_email(to="boss@example.com", subject="Hello", body="Meeting at 3pm")

与默认参数配合

关键字参数和默认参数结合,可以只修改需要的参数:

def draw_circle(x, y, radius=10, color="black", fill=False):
    print "Circle at (%d, %d), r=%d, color=%s, fill=%s" % (x, y, radius, color, fill)

# 只改颜色
draw_circle(100, 200, color="red")

# 只改半径和填充
draw_circle(100, 200, radius=20, fill=True)

注意:调用 draw_circle(100, 200, color="red") 时,radius 使用默认值 10,color 被指定为 "red"。

强制关键字参数(Python 3 特性)

Python 2 没有强制关键字参数的语法。Python 3 可以用 * 实现:

# Python 3
def func(a, b, *, c, d):
    pass

func(1, 2, c=3, d=4)    # 正确
func(1, 2, 3, 4)        # 错误,c 和 d 必须用关键字

Python 2 中可以用 **kwargs 模拟,但没有同等优雅的语法。

关键字参数与字典解包

可以用字典解包来动态传递关键字参数:

def greet(name, greeting, punctuation):
    print "%s, %s%s" % (greeting, name, punctuation)

params = {
    "name": "Alice",
    "greeting": "Hello",
    "punctuation": "!"
}
greet(**params)     # Hello, Alice!

**params 把字典的键值对作为关键字参数传入。这在配置驱动、框架开发中非常常见。

常见错误

重复赋值:

greet("Alice", name="Bob")      # TypeError: greet() got multiple values for keyword argument 'name'

位置参数 "Alice" 已经赋给 name,后面的 name="Bob" 又试图赋值。

未知参数:

greet("Alice", unknown="value")     # TypeError: greet() got an unexpected keyword argument 'unknown'

最佳实践

  1. 参数超过 3 个时,考虑用关键字调用
  2. 布尔参数必须用关键字:func(enable=True) 比 func(True) 清晰
  3. 文档中说明哪些参数推荐用关键字调用
  4. API 设计时,把不常用参数放在后面并设默认值
上一页
默认参数
下一页
可变参数