Python_函数设计_深入浅出

本文深入探讨Python函数设计,包括关键参数、可变参数长度、参数传递、序列解包、return语句、变量作用域和Lambda表达式。强调了默认值参数的陷阱,以及如何在函数中正确处理变量作用域。同时,介绍了内置函数如map、reduce和filter的使用,以及生成器和函数嵌套的应用。
摘要由CSDN通过智能技术生成

函数设计与使用

  • 如果传递给函数的是Python可变序列,并且在函数内部使用下标或其他方式为可变序列增删改元素值时,形参的变化会映射到实参
  • 如果传递给函数的是不可变变量,而且没有返回,那形参的改变不会映射到实参
# 对于大多数情况,在函数内部直接修改形参的值不会影响实参。
def add_one(a):
    print(a)
    a+=1
    print(a)
a = 3
add_one(a)
a
3
4
3
# 函数内修改可变序列会映射到函数外的实参
def modify_list(v,item):
    v.append(item)
a = [2]
modify_list(a,3)
print(a)
[2, 3]
def modify_dict(dict,key,value):
    dict[key]=value
a = {
   'name':'dong','age':12,'sex':'male'}
modify_dict(a,'name','chanzany')
print(a)
{'name': 'chanzany', 'age': 12, 'sex': 'male'}
  • 特别需要注意:多次调用函数且不为默认值参数传递值时,默认值只在第一次调用时进行解释。对于列表,字典这样复杂类型的默认值参数,这一点会导致很严重的逻辑错误。而且这种错误需要耗费大量精力来定位和纠正
"""错误示范"""
def demo(newitem,old_list=[]):
    old_list.append(newitem)
    return old_list
print(demo('5',[1,2,3,4]))
print(demo('aaa',['a','b']))
print(demo('a'))
print(demo('b')) # 解释器会认为old_list为['a']
print(demo('c'))
[1, 2, 3, 4, '5']
['a', 'b', 'aaa']
['c']
"""正确示范"""
def demo(newitem,old_list=None):
    if old_list is None: #这个初始化过程很重要,避开了只在第一次调用进行默认函数的解释
        old_list=[]
    old_list.append(newitem)
    return old_list
print(demo('5',[1,2,3,4]))
print(demo('aaa',['a','b']))
print(demo('a'))
print(demo('b')) # 解释器会认为old_list为['a']
print(demo('c'))
[1, 2, 3, 4, '5']
['a', 'b', 'aaa']
['a']
['b']
['c']

关键参数

  • 关键参数指的是调用函数时的参数传递方式,而与函数定义无关。
  • 通过关键参数可以按参数名称传递值,实参顺序可以和形参顺序不一致
def demo(a,b,c=5):
    print(f"a={a},b={b},c={c}")

demo(3,7)
demo(c=8,a=9,b=0)
a=3,b=7,c=5
a=9,b=0,c=8

可变参数长度

可变长度参数在定义函数时主要有两种形式:*parameter 和 **parameter

  • *parameter 接收多个实参并将其放入一个元组中
  • **parameter 接收类似于关键参数一样显式赋值形式的多个实参并将其放入字典中
def demo(*p):
    print(p)
    print(type(p))
demo(1,2,3)
(1, 2, 3)
<class 'tuple'>
# 注意使用**parameter时,传递的实参必须是key=value的形式
def demo2(**p):
    print(type(p))
    print(p)
#     for item in p.items():
#         print(item)
# demo2(x=1,y=2,z=3)
demo2(1,2,3)# TypeError: demo2() takes 0 positional arguments but 3 were given
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-24-827d82586fed> in <module>
      5 #         print(item)
      6 # demo2(x=1,y=2,z=3)
----> 7 demo2(1,2,3)


TypeError: demo2() takes 0 positional arguments but 3 were given

参数传递时的序列解包

  • 为含有多个变量的函数传递参数时,可以使用Python列表、元组、集合、字典以及其他可迭代对象作为实参,并且在实参名称前面加一个星号
    Python解释器会将其自动解包,然后传递给多个单变量形参。
    • 如果使用字典对象作为实参,则默认使用字典的Key,
    • 如果需要将字典中的key-value对作为实参则需要使用items()方法。
    • 如果需要将字典中的value作为实参,则需要调用字典的values()方法
def demo(a,b,c):
    print(a+b+c)
seq = [1,2,3]
demo(*seq)
6
tup = (1,2,3)
demo(*tup)
6
dic = {
   1:'a',2:'b',3:'c'}
demo(*dic)
demo(*dic.values())
demo(*dic.items())
6
abc
(1, 'a', 2, 'b', 3, 'c')
myset =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值