Python函数细节:多数量参数、强制参数传递、返回多值、匿名/内联函数

1. 可接受任意数量参数的函数

  • 接受任意数量的位置参数,使用参数*来解决
# rest是由所有其他位置参数组成的元组
def avg(first, *rest):
    return ( first + sum(rest) ) / (1+len(rest))
    
print(avg(1,2))
# >>> 1.5
print(avg(1,2,3,4))
# >>> 2.5

rest是由所有其他位置参数组成的元组。在代码中把它当成了一个序列来进行后续的计算。

  • 接受任意数量的关键字参数,使用参数**解决
import html

def make_element(name, value, **attrs):
    keyvals = [' %s="%s"' % item for item in attrs.items()]
    attr_str = ''.join(keyvals)
    element = '<{name}{attrs}>{value}</{name}>'.format(
                name=name,
                attrs=attr_str,
                value=html.escape(value))
    return element

# 传递字典={'quantity':6, 'size':'large'} 到 **attrs
# keyvals获得列表 ['quantity="6"', 'size="large"']
# attr_str获得字符串 quantity="6" size="large"
print( make_element('item', 'Albatross', size='large', quantity=6) )
# >>> '<item quantity="6" size="large">Albatross</item>'

2. 只接受关键字参数的函数

将强制关键字参数放到某个*参数或者单个*后面就能达到这种效果。

def minimum(*values, clip=None):
    m = min(values)
    if clip is not None:
        m = clip if clip > m else m
    return m

print( minimum(1, 5, 2, -5, 10) )
# >>> -5
print( minimum(1, 5, 2, -5, 10, clip=0) )
# >>> 0

很多情况下,使用强制关键字参数会比使用位置参数表意更加清晰,程序也更加具有可读性。

3. 返回多值的函数

为了能返回多个值,函数直接return一个元组就行了,需要了解到的是,这里是通过','来构造一个元组,元组与多个返回临时变量对齐的过程可以借助元组解包理解。

def myfun():
    return 1, 2, 3
    
a,b,c = myfun()
print(a, b, c)
# >>> a,b,c
print(myfun())
# >>> (1, 2, 3)

尽管myfun()看上去返回了多个值,实际上是先创建了一个元组然后返回的。 这个语法看上去比较奇怪,实际上使用的是逗号来生成一个元组,而不是用括号。当调用返回一个元组的函数的时候 ,通常会将结果赋值给多个变量,就像上面的那样。

4. 定义匿名或者内联函数

当一个函数非常短的时候,我们没有必要使用def去定义一个函数,这时候可以通过内联函数形式进行定义(lambda表达式)。

# 这种内联函数的表达形式和定义的函数形式是一样的
# def add(x, y):
#    return x+y
add = lambda x, y : x+y
print( add(2, 3) )
# >>> 5
print( add('hello', 'world'))
# >>> helloworld

需要注意的是:尽管lambda表达式允许定义简单函数,但是它的使用是有限制的。 我们只能指定单个表达式,不能包含其他的语言特性(如多个语句、条件表达式、迭代以及异常处理等)。

博文参考《python3-cookbook》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值