您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 日喀则分类信息网,免费分类信息发布

python3进阶二:灵活的函数

2024/2/9 10:38:57发布18次查看
上一篇文章我们介绍了函数的定义,使用以及函数的调用跨文件调用,今天我们学习的是函数的一些灵活用法:
python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
举个例子:我们要计算一个数的平方
def ping(x):
return x*x
很简单,要是三次方呢
return x*x*x
如果我们不确定是几次方,我们把n作为次方
def ping(x,n):
s = 1 #定义一个局部变量用来显示结果
for i in range(n): #利用循环来实现乘方
s = s * x
return s
井号后面的是跟着注释
我们来看看结果
结果显示正确,我们按次序传参数给函数就能实现计算,但是如果我们直传一个参数呢?
python3将给出错误typeerror: ping() missing 1 required positional argument: 'n'意思是缺少一个必要位置的参数
这个时候我们可以做一个缺省参数,也就是说我们给出一个参数的时候默认是平方,只需要改动一下
def ping(x,n=2):
s = 1
for i in range(n):
这回运行,只要输入一个参数,默认就是平方,如果两个就按照原有规则。
可变参数:
可变参数的意思是,我的函数可以是一个参数,两个也行,三个甚至多个都行,没有也行。
比方说我们要求一组数字的和
>>> def he(list):
... sum = 0
... for i in list:
... sum = sum + i
... return sum
...
>>>he([1,2,3,4,5])
15
也就是说我们可以通过列表(元组也可以)实现任意参数
但是还有一个弊端就是必须传入列表或者元组我们直接只传参数行不行,答案是肯定的
只需要在函数定义时给出的参数前加上一个星号
>>> def hehe(*list):
>>>hehe(1,2,3,4,5,6)
21
这个时候要传入一个列表的话就要在列标前加上*
>>> s = [3,4,5,6,7]
>>>hehe(*s)
25
关键字参数
所谓的关键字参数就是在某各参数前面加上两个星号,函数会自动将这个参数传入的值变成字典,以此来扩展参数
举个例子:我们在网页上注册信息时一般要我们必须输入一些值,也有很多是可填可不填,比方说名字电话一定要,但是爱好、年龄、性别可填可不填。
def zhuce(name,numb,**other):
print('name=',name,'numb=',numb,other)
return
这个时候输入
>>>zhuce('liudehua',13811111111)
name= liudehua numb= 13811111111 {}
最后一个代表空的字典,我们再传一些参数
>>>zhuce('liudehua',13811111111,aihao='changge',nianl=34,xiangbie='man')
name= liudehua numb= 13811111111 {'aihao': 'changge', 'nianl': 34, 'xiangbie': 'man'}
同样我们也可以组合成一个字典传入,写法要注意了:
>>> other = {'aihao': 'changge', 'nianl': 34, 'xiangbie': 'man'}
>>>zhuce('liudehua',13811111111,**other)
一般来说*某个变量,代表的是列表或者元组,**某个变量则代表字典
在python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
递归函数:
函数内部可以调用别的函数,但是也能调用自己,举个例子,我们算n!阶乘
设函数jiecheng()可以用循环实现,如果调用自己会更简单
def jiecheng(n):
if n = 1:
return 1
return n*jiecheng(n-1)
我们试一下
>>>jiecheng(3)
6
>>>jiecheng(5)
120
还是成功的,只要逻辑清晰理论上所有的递归函数都能用循环代替
但是要小心的是在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
>>>jiecheng(1000)
traceback (most recent call last):
file , line 1, in
file , line 4, in jiecheng
[previous line repeated 994 more times]
file , line 2, in jiecheng
recursionerror: maximum recursion depth exceeded in comparison
如果优化成
return jiecheng_you(n, 1)
def jiecheng_you(num, product):
if num == 1:
return product
return jiecheng_you(num - 1, num * product)
以上函数jiecheng_you()会计算阶乘的每一步,并且计算出函数值再将值传回函数,这样就能规避栈溢出的问题。
今天灵活的函数就讲到这里,大家学会了没有,有什么不明白可以给我留言哦
日喀则分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录