Python隐藏特性揭秘: unpack、链式比较与默认参数陷阱

0 下载量 58 浏览量 更新于2024-08-30 收藏 74KB PDF 举报
"这篇文章主要介绍了Python编程语言中的一些不太为人所知的特性,包括函数参数的unpack、链式比较操作符、默认参数的注意事项、字典的get()方法、带关键字的字符串格式化、for...else语法以及dict的__missing__特殊方法。" 1. **函数参数unpack**: 在Python中,可以使用星号(*)和双星号(**)来对列表或字典进行解包。星号用于解包列表,将列表元素作为单独参数传递;双星号用于解包字典,将字典键值对作为关键字参数传递。例如,在`foo(*alist)`和`foo(**adict)`的例子中,列表和字典被适当地拆解并传入函数。 2. **链式比较操作符**: Python允许在一个表达式中使用多个比较操作符,如`1 < x < 5`,这会检查x是否在1和5之间。同样,`4 > x >= 3`检查x是否大于4且不小于3。这种写法提高了代码的可读性。 3. **注意函数的默认参数**: 当函数定义包含默认值的参数时,如`def foo(x=[]):`,默认参数在函数定义时只会初始化一次。这意味着每次调用函数时,都会引用同一个列表。为了防止这种意外行为,可以将默认参数设置为None,然后在函数体内检查并根据需要创建新对象,如`def foo(x=None): if x is None: x = []`。 4. **字典的get()方法**: 字典的get()方法允许我们安全地获取键对应的值,如果键不存在,可以提供一个默认值。例如,`dct.get(key, default_value)`会返回键为key的值,如果key不存在则返回default_value。 5. **带关键字的字符串格式化**: Python提供了两种不同的字符串格式化方式。一种是传统的百分号(`%`)格式化,如`"Hello%(name)s!"%{'name':'James'}`。另一种是更现代的`.format()`方法,如`"Hello{name}!".format(name="James")`,这种方式更加灵活,可以用于复杂的格式化。 6. **for...else语法**: 在Python的for循环中,可以使用else子句,它会在循环正常结束(即没有遇到break语句)后执行。例如,如果在for循环中没有找到偶数,else块中的代码将被执行。 7. **dict的__missing__特殊方法**: 自定义字典类时,可以定义`__missing__`方法。当尝试访问字典中不存在的键时,Python会调用这个方法。例如,`class Dict(dict): def __missing__(self, key): self[key] = []; return self[key]`,这样当访问的键不存在时,会自动创建一个空列表并返回。 以上是Python中一些鲜为人知但非常实用的特性。了解并掌握这些特性可以提升代码的效率和可读性,让编程变得更加简洁高效。