Day5 - 03 函数的参数-位置参数和默认参数
位置参数
调用函数时,传入函数的参数,按照位置顺序依次赋值给函数的参数。
#计算乘方的函数
def power(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
在使用power(1,2)时, 会根据位置顺序,将1赋值给x ,2 赋值给n。
默认参数
如果希望不指定指数时,默认按照平方进行计算,可以指定函数的默认参数。
#计算乘方的函数,默认计算平方
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
直接使用power(10) ,则计算10的平方。 如需计算5的3次方,则使用power(5, 3)。
使用默认参数可以简化函数的调用,但是设置默认参数时有几点需要留意:
1.必选参数在前,默认参数在后,否则会报错。
2.当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面, 变化小的参数就可以作为默认参数。
3.默认参数必须指定为不变对象!
如果希望不指定指数时,默认按照平方进行计算,可以指定函数的默认参数。
#计算乘方的函数,默认计算平方
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
直接使用power(10) ,则计算10的平方。 如需计算5的3次方,则使用power(5, 3)。
使用默认参数可以简化函数的调用,但是设置默认参数时有几点需要留意:
1.必选参数在前,默认参数在后,否则会报错。
2.当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面, 变化小的参数就可以作为默认参数。
3.默认参数必须指定为不变对象!
默认参数的使用
#在这里对默认参数的几点留意进行一下详解。
#首先定义一个函数,用来登记身份信息,使用4个参数:姓名,年龄,性别,国籍。
#在这里,年龄、性别、国籍都可以从某一个维度上根据需要设定为默认参数,例如:班级学生大多数年龄一样大、足球队员性别大多数都是一样的、国籍更是有相当的一致性。
def info(name,age,sex,intl):
print(name,'来自于',intl,'是一个',age,'岁的',sex,'孩')
return None
>>> info('小A',10,'男','中国')
小A 来自于 中国 是一个 10 岁的 男 孩
#假设现在有10个人,都是中国籍的男孩子,其中有两个孩子分别是14岁和12岁,其他人都是10岁,那么这种录入操作就很适合做默认参数了。
def info(name,age=10,sex='男',intl='中国'):
print(name,'来自于',intl,'是一个',age,'岁的',sex,'孩')
return None
>>> info('小B')
小B 来自于 中国 是一个 10 岁的 男 孩
>>> info('小C')
小C 来自于 中国 是一个 10 岁的 男 孩
>>> info('小D',12)
小D 来自于 中国 是一个 12 岁的 男 孩
>>> info(age=14,name='小E')
小E 来自于 中国 是一个 14 岁的 男 孩
#可以看出,在使用默认参数的时候其实很灵活,可以根据顺序传入参数,也可以指定参数名赋值的方式不按照顺序提供参数。
默认参数的坑:一定要设为不可变对象。
先来试试将默认参数设置为可变对象的情况:
>>> def nn(name,ext=[]):
... ext.append('over')
... print(name,ext)
...
>>> nn('a')
a ['over']
>>> nn('a')
a ['over', 'over']
可以看到,list作为默认参数时,发生了意料之外的结果。
函数在定义的时候,默认参数ext的值就被计算出来了,在这里是[],ext参数实际上是一个指向[]的变量,如果改变了ext参数( 就是 [] )的内容,则下次调用时默认参数的内容就变了,指向到了修改后的[]的位置,而不再是最先定义函数时的[]了。
为了避免上面的情况,可以使用这种方式来解决:
>>> def nn(name,ext=None):
... if ext is None:
... ext = []
... ext.append('over')
... print(name,ext)
...
>>> nn('aa')
aa ['over']
>>> nn('aa')
aa ['over']
>>> nn('aa','bb')
aa bb
使用不可变对象能够减少由于修改数据导致的错误,由于对象不变,多任务环境下同时读取对象也不需要加锁,可以同时进行读动作。在编写程序时,如果可以设计为不变对象,就尽可能设计成不变对象。
#在这里对默认参数的几点留意进行一下详解。
#首先定义一个函数,用来登记身份信息,使用4个参数:姓名,年龄,性别,国籍。
#在这里,年龄、性别、国籍都可以从某一个维度上根据需要设定为默认参数,例如:班级学生大多数年龄一样大、足球队员性别大多数都是一样的、国籍更是有相当的一致性。
def info(name,age,sex,intl):
print(name,'来自于',intl,'是一个',age,'岁的',sex,'孩')
return None
>>> info('小A',10,'男','中国')
小A 来自于 中国 是一个 10 岁的 男 孩
#假设现在有10个人,都是中国籍的男孩子,其中有两个孩子分别是14岁和12岁,其他人都是10岁,那么这种录入操作就很适合做默认参数了。
def info(name,age=10,sex='男',intl='中国'):
print(name,'来自于',intl,'是一个',age,'岁的',sex,'孩')
return None
>>> info('小B')
小B 来自于 中国 是一个 10 岁的 男 孩
>>> info('小C')
小C 来自于 中国 是一个 10 岁的 男 孩
>>> info('小D',12)
小D 来自于 中国 是一个 12 岁的 男 孩
>>> info(age=14,name='小E')
小E 来自于 中国 是一个 14 岁的 男 孩
#可以看出,在使用默认参数的时候其实很灵活,可以根据顺序传入参数,也可以指定参数名赋值的方式不按照顺序提供参数。
默认参数的坑:一定要设为不可变对象。
先来试试将默认参数设置为可变对象的情况:
>>> def nn(name,ext=[]):
... ext.append('over')
... print(name,ext)
...
>>> nn('a')
a ['over']
>>> nn('a')
a ['over', 'over']
可以看到,list作为默认参数时,发生了意料之外的结果。
函数在定义的时候,默认参数ext的值就被计算出来了,在这里是[],ext参数实际上是一个指向[]的变量,如果改变了ext参数( 就是 [] )的内容,则下次调用时默认参数的内容就变了,指向到了修改后的[]的位置,而不再是最先定义函数时的[]了。
为了避免上面的情况,可以使用这种方式来解决:
>>> def nn(name,ext=None):
... if ext is None:
... ext = []
... ext.append('over')
... print(name,ext)
...
>>> nn('aa')
aa ['over']
>>> nn('aa')
aa ['over']
>>> nn('aa','bb')
aa bb
使用不可变对象能够减少由于修改数据导致的错误,由于对象不变,多任务环境下同时读取对象也不需要加锁,可以同时进行读动作。在编写程序时,如果可以设计为不变对象,就尽可能设计成不变对象。
个个原创文章
欢迎讨论
https://www.cnblogs.com/konggg/
欢迎转载收藏,转载请注明来源,谢谢支持!