大数据学习路线 学习笔记 Day9

大数据学习路线 学习笔记 Day9

接上文 Day8

三、函数的参数

函数定义的过程其实就是一种抽象的过程,对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解
所以定义函数的时候,就需要把参数的名字和位置确定下来,完成函数的接口定义,以便调用者直接调用。Python的函数定义非常简单,但灵活度却非常大,除定义的必选参数外,还可使用默认参数、可变参数、关键字参数和命名关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可简化调用者的代码。

1.必选参数

又名位置参数,调用函数时必须按顺序提供不多不少
例如,定义一个计算 x 的平方的函数:

# 定义一个函数power:计算x的平方
def power(x):
    return x*x

#调用函数 
print(power(5))

image.png
然后我们再来定义一个计算 x 的任意 n 次方的函数:

# 定义一个函数power2:计算x的任意n次方
def power2(x,n):
    return x**n
# 调用
print(power2(2,3))
print(power2(3,2))
print(power2(4))

image.png
观察结果发现,在调用函数时,改变了两个参数的位置,结果就不同了。
前者print(power2(2,3)) → 2 * * 3 2的3次方,等于8
后者print(power2(3,2)) → 3 * * 2 3的2次方,等于9

而当只传入一个参数时,报错,错误原因:缺少参数n:
TypeError: power2() missing 1 required positional argument: ‘n’

必选参数又叫位置参数,就是因为是输入的参数是按照位置依次传入函数中,位置改变,函数的结果也会改变。

2.默认参数

还是用前面的举例,如果我想只传入一个 x 参数,不传入参数 n 时,代码也能运行。那就需要用到默认参数,即给参数设置一个默认值
示例:

# 默认参数
# 定义一个函数power3:计算x的任意n次方,n不确定时,默认计算x的平方
def power2(x,n=2):
    return x**n
# 调用
print(power2(2,3))
print(power2(3,2))
print(power2(4))
print(power2(6))

image.png
此时我们发现,即便只传入一个参数 x ,也可以正常运行,返回了 x 的平方值。
就是因为我们在定义函数时 def power2(x,n=2): 给参数n 设置了默认值,这样当没有 n 传入函数时,就会自动使用 n 的默认值有 n 传入,则使用传入的值。


此时若是改变两个参数的位置,将默认参数移到前面:

def power2(n=2,x):
    return x**n
# 调用
print(power2(2,3))

image.png
结果直接报错,错误原因:non-default argument follows default argument(非默认参数应该在默认参数之后)。因为位置参数 x 是依据位置传参,改变位置,则传参失败。故定义函数时一定要注意:位置参数在前,默认在后!!!!!

3.可变参数

在前面描述位置参数时,我们调用函数时少了一个参数,程序直接报错。但是在真正使用过程中,很多时候调用者并不清楚具体要输入几个参数,这就需要我们改进函数定义的代码,此时用到了可变参数
*参数 和 **参数 都是可变参数的使用形式。
*参数 收集 所有未匹配的位置参数组成一个 tuple对象,局部变量args指向此tuple对象
* *参数 收集 所有未匹配的关键字参数组成一个 dict对象,局部变量kwargs指向此dict对象
来看一个示例:
定义一个函数用于登记人员的信息:
函数名:person
参数:name、age、gender、phone_number(可选)、email(可选)、other(可选)
返回值:无,直接将所有信息进行输出

def person(name, age, gender, *args):
    print('name:%s,age:%d,gender:%s' % (name, age, gender), args)

person('小明', 23, '男', 18888888888, '皖A88888')
person('小华', 22, '男', 178, 180)

image.png
!!!!!!!
*args 表示可变参数,收集所有未匹配的位置参数组成一个tuple对象
请着重理解这段话:
当我们调用函数时传入 ‘小明’, 23, ‘男’, 18888888888, ‘皖A88888’ 时,前面三个参数自动与位置参数 name, age, gender 匹配,传入函数内。而剩下的 两个参数,被可变参数args 收集起来组成一个tuple对象,传入函数内的 args变量。再与前面三个位置参数一起在函数体内运行。
!!!!!!!
同理,第二次调用时,将未能与位置参数匹配的 178, 180 两个参数,组成一个元组类型输出。所以运行结果中我们可以看到,后面的两个参数都是带着括号的,证明是tuple类型!!!!

4.关键字参数

上面的例子中,运行结果中虽然使用tuple类型将我们多传入的参数表现了出来。但是我们却不指定这里面某个参数的具体意义。
例如,小华的运行结果中的(178,180),我们无法分清楚这两个哪个是体重,哪个是身高。那么如果可以将参数名和参数一起传进去就可以分得清楚了,所以用到了关键字参数 **kwargs。
示例:

def person2(name, age, gender, **kw):
    print(type(kw))
    print('name:%s,age:%d,gender:%s' % (name, age, gender), kw)

person2('小明', 23, '男', phone_number=18888888888, cars='皖A88888')
person2('小华', 22, '男', height=178, weight=180)

image.png
**kw,表示关键字参数,收集所有未匹配的关键字参数组成一个dict对象
从运行结果我们看到, * *kw将未能匹配的参数以字典的形式储存并参与到函数体运行。(与可变参数很类似)



以下是个人理解:
私以为,可变参数和关键字参数可以理解为一个 回收站 ,当代码运行到此处时,可变参数就收集此刻还未找到**“归宿”的所有参数,分类打包,将所有 没有携带参数名的参数(长得像 位置参数的)打包成一个元组**;将携带参数名的参数(长的像默认参数的)打包成一个字典。然后将元组或字典投入函数体。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值