python关于函数形参

1.函数的默认参数是可变数据类型时,要尤其注意:如果函数执行过程中默认参数被修改,则永久被修改(下次调用时还会使用上一次被改过的默认参数)

Default parameter values are evaluated from left to right when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that the same “pre-computed” value is used for each call. This is especially important to understand when a default parameter is a mutable object, such as a list or a dictionary: if the function modifies the object (e.g. by appending an item to a list), the default value is in effect modified. This is generally not what was intended. A way around this is to use None as the default, and explicitly test for it in the body of the function.

#示例
def whats_on_the_telly(penguin=[]):
    l=[1,2,3,4]
    penguin.append("property of the zoo")
    l.append(666)
    return penguin, l
a,c=whats_on_the_telly()
print(a,c)
b,d=whats_on_the_telly()
print(b,d)
#result
['property of the zoo'] [1, 2, 3, 4, 666]
['property of the zoo', 'property of the zoo'] [1, 2, 3, 4, 666]
#解决方案
def whats_on_the_telly(penguin=None):#修改为None
    if penguin is None:  #增加
        penguin = []      #增加
    l=[1,2,3,4]
    penguin.append("property of the zoo")
    l.append(666)
    return penguin, l
a,c=whats_on_the_telly()
print(a,c)
b,d=whats_on_the_telly()
print(b,d)
#result
['property of the zoo'] [1, 2, 3, 4, 666]
['property of the zoo'] [1, 2, 3, 4, 666]
### Python 中定义带有遍历功能的函数参数Python 中,可以通过多种方式处理可迭代对象作为函数参数。这不仅限于列表或元组,还包括任何实现了 `__iter__` 方法的对象。 #### 使用单一可迭代参数 当希望接收一个可迭代对象(如列表、集合等)作为输入,可以直接将其作为一个参数传递: ```python def process_items(items): for item in items: print(item) my_list = ['apple', 'banana', 'cherry'] process_items(my_list) # 输出: apple banana cherry ``` 此方法适用于已知会接收到特定类型的可迭代对象的情况[^1]。 #### 接收不定数量的位置参数 (*args) 为了使函数能够接受任意数量的位置参数,并能对其进行遍历操作,可以使用星号前缀的形式来收集额外的位置参数到一个元组中: ```python def sum_all(*numbers): total = 0 for number in numbers: total += number return total print(sum_all(1, 2, 3)) # 输出: 6 print(sum_all(1, 2, 3, 4, 5)) # 输出: 15 ``` 这种方式非常适合用于创建灵活度高的接口,允许调用者提供不同长度的参数序列。 #### 处理键值对形式的关键字参数 (**kwargs) 对于需要支持关键字参数的情形,双星号语法可以让函数捕获所有的命名参数进入一个字典结构内: ```python def display_info(**person_data): for key, value in person_data.items(): print(f"{key}: {value}") display_info(name="Alice", age=30, city="Beijing") # 输出: # name: Alice # age: 30 # city: Beijing ``` 这种方法特别适合构建配置类的功能或是其他场景下需动态指定属性的应用程序。 #### 结合使用 * 和 ** 有可能既想要获取固定位置上的必需参数又希望能够捕捉剩余未匹配的部分,这就可以组合运用这两种特性: ```python def greet(greeting, *names, **options): message = f"{greeting}, " separator = options.get('separator', ', ') message += separator.join(names) punctuation = options.get('punctuation', '.') message += punctuation print(message) greet("Hello", "John", "Jane", "Doe", separator=';', punctuation='!') # Hello; John; Jane; Doe! ``` 上述例子展示了如何优雅地混合常规参数与可变数目以及名称化的附加选项一起工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值