在函数中,有的时候我们可能一个参数都用不到,有点时候可能需要固定几个就可以了,当然还有时候我们无法确定参数个数,这时候就要用到不定长参数了。
我们可以在形参前加 * 来表示改参数用来作为不定长参数。以元组的形式传入函数。
def func(*x): print(x) func(1,2,3) func() #运行结果 (1, 2, 3) ()同样我们也可以对元组使用 ==*==将其传入到函数中去,但要注意不能与函数中的变量数不匹配。如果函数中已经存在不定长参数,则也可以通过此方法传入。
def func(x,y): z=x+y return z a=(1,2) b=(1,2,3) print(func(*a),func(*b)) # 输出结果 3 TypeError: func() takes 2 positional arguments but 3 were given def func(*x): z=0 for i in x: z+=i return z a=(1,2,3) print(func(*a)) # 输出结果 6我们可以在形参前加 ** 来表示改参数用来作为不定长参数。以字典的形式传入函数。
def func(**x): print(x) func(a=1,b=2,c=3) func() # 输出结果 {'a': 1, 'b': 2, 'c': 3} {}同样我们也可以对字典使用 ==**==将其传入到函数中去。
def func(**x): print(x) dic={'a':1,'b':2,'c':3} func(**dic) # 输出结果 {'a': 1, 'b': 2, 'c': 3}我们可以将以上方法混合,我们可以看一个简单的例子,读者可以灵活使用。
def func(a,b,*x,**y): print(a,b,x,y) a=2 b=3 x=(1,2,4) y={'c':2,'d':3} func(a,b,*x,**y)确切的说递归不是函数,而是一种算法思想。通俗理解递归就是函数调用自己,直到到达指定的终结点,然后就开始返回。
def count(x): if x==1: return x else: return x*count(x-1) num=count(3) print(num) # 运行结果 6尾递归是指在函数返回时调用自身,且return语句不能包含表达式,这样python解释器可以做优化,递归本身无论调用多少帝,都只占用一个栈帧,不会出现栈溢出的情况。
def count(x,y=1): if x==1: return y return(count(x-1,x*y)) num=count(3) print(num) #运行结果 6值得注意的是python3默认的递归深度是很有限的(默认是998),因此当递归深度到999次时,就会引发这样的一个异常。 我们可以引入sys模块来进行设置
import sys sys.setrecursionlimit(100000)博主对上面两个函数分别递归了998次,发现普通没有优化的递归函数运行998次的时间是0.2388629913330078,尾递归则为0.11093950271606445。明显要快很多。
简言之就是同一段代码,不断地重复。常见的就是for循环。
def cou(x): n=1 for i in range(1,x+1): n*=i return n print(cou(3)) #运行结果 6lambda函数又称为匿名函数,what?这么高大上? 不不不,没有你想得那么复杂。匿名函数就是没有名字而已。???没有名字也能用?当然!有些函数如果只是零时一用,而且它的逻辑也比较简单时,就没有必要再可以去规范地创造它。这时候使用匿名函数是十分简编的。 例如下面的add函数,就可以利用lamdba。其使用方法如下: lambda 参数:表达式 lambda arg1, arg2, …argN : expression using arguments
def add(x,y): return(x+y) add_lam=lambda x,y:x+y print(add(1,3),add_lam(1,3)) # 运行结果 4 4map是python中的一个内置函数,其使用方法如下: map(func,*iterables) 其中func是一个函数,iterables是迭代对象,在执行过程中相对应位置的每一个iterable中的元素依次放入func中运行,返回一个列表。
def add(x,y): return(x+y) num1=[1,2,3,'asd'] num2=[4,5,6,'qwe'] re=list(map(add,num1,num2)) print(re) #运行结果 [5, 7, 9, 'asdqwe']注释:如果两个可迭代变量不一样长,则以短的为基准
当然map可以和lambda结合使用:
num1=[1,2,3,] num2=[4,5,6,] re=list(map(lambda x,y: y/x,num1,num2)) print(re) # 运行结果 [4.0, 2.5, 2.0]先让我们看一下函数说明:
filter(function or None, iterable) --> filter object | | Return an iterator yielding those items of iterable for which function(item) | is true. If function is None, return the items that are true.简言之,就是返回那些在函数中为真的值,如果没有函数则返回可迭代变量中的真值。
num=[1,2,3,True,False] # 无函数 print(list(filter(None,num))) # 有函数 print(list(filter(lambda x: x>2,num))) # 输出结果 [1, 2, 3, True] [3]