多类型传值和冗余参数以及递归调用

一、函数的多类型传值。
1.通常我们定义一个函数是这样的
def fun(x,y):
print x + y
函数在调用的时候我们只需要输入2个实参就可以了。
fun(2,3) 这样就会给出结果
多类型传值和冗余参数以及递归调用
当我们要把一个元祖传入呢?直接fun(t)是不行的会报错,因为t会当成一个实参。而我们定义了2个形参,所以报错。
多类型传值和冗余参数以及递归调用
如果在给一个实参呢?也是会报错的。会提示元祖和整形不能进行相加运算。其他类型也不行。
多类型传值和冗余参数以及递归调用
这里就涉及到了多类型传值。
2.怎么把元祖里的2个元素作为参数传进去呢?
(1)使用这样的方式:
fun(*t)
多类型传值和冗余参数以及递归调用
多类型传值和冗余参数以及递归调用
这样就传进去了,这是传入元祖元素的固定格式,传入元祖就要加*。但是元祖的元素个数相比形参个数,可以少于形参,但不能多余形参。

(2)也可以用这样的方式:
fun(*(1,2))
多类型传值和冗余参数以及递归调用
传入元祖。
(3)如果元祖里的元素少于形参个数可以这么传,参数的个数一定要一致。
fun(1,*t)
多类型传值和冗余参数以及递归调用
如果把元祖放前面呢?这样是不行的。
多类型传值和冗余参数以及递归调用
提示在名字参数后面才能跟这样一个表达式,也就是说应该放到命名参数的后面才可以。

3.字典传值。
字典的值要传入参数中,需要加2个*号。
fun(**dict1)
多类型传值和冗余参数以及递归调用
必须注意的是,字典里的key 必须和形参的参数一致,我们定义函数的形参是x,y,z所以字典的key 也必须是x,y,z如果key为其他。那么就会报错。
多类型传值和冗余参数以及递归调用
多类型传值和冗余参数以及递归调用
传元祖和字典的* **是固定写法。

二、冗余参数
1.冗余参数的运用,当我们传了多个参数进函数里,这些多的参数,函数怎么去处理呢,这就是冗余参数。处理多余的参数。
定义冗余参数:
def fun(x,*args,**kwargs):
print x
print args
print kwargs
多类型传值和冗余参数以及递归调用
这就是冗余参数的定义,*args 和**kwargs 这2个就是定义冗余参数的。
这个args和kwargs 可以是任意字符串,不一定用这2个单词定义。
可以发现*args 返回的是元祖,**kwargs返回的是字典。
fun(1,2)
多类型传值和冗余参数以及递归调用
可以看到第二个参数2,就是冗余参数,写入到了*args里。因为我们只定义了一个命名参数,所以第二个参数就是冗余参数。
fun(1,2,'aaa',[3,'w'])
多类型传值和冗余参数以及递归调用
可以传任何类型进元祖。
2.如何写入到**kwargs里
使用默认参数的方法来写入。
fun(1,2,'aaa',[3,'w'],y=4)
多类型传值和冗余参数以及递归调用
这样就存进了kwgrgs里,y成为了key 4成为了value。
当然还可以用多类型传值。
fun(1,2,'aaa',[3,'w'],y=4,*a)
多类型传值和冗余参数以及递归调用
凡是多余参数都存到元祖里,凡是默认参数类型都会传入到字典里。也就是以=号或者字典类型的参数 都会放到字典里。

三、递归函数的调用
1.什么是递归呢?
在定义函数的时候,在函数内部自己调用自己。就是递归。
通常用递归调用来计算阶层。阶层就是从大到小的计算。比如5*4*3*2*1,这就是阶层。
2.有2种方法计算阶层
(1)普通方法:使用循环
def a(n):
sum = 1
for i in range(1,n+1):
sum *= i #当i 为1时 sum的值是1*1,i为2时,sum=1*2 i为3时,sum=2*3
return sum
print a(5)
多类型传值和冗余参数以及递归调用
这样是5的阶层。每次循环的值都相乘。
再来看一个加法的阶层
(1)普通方法:使用循环
def a(n):
sum = 0
for i in range(1,n+1):
sum += i
return sum
print a(100)
多类型传值和冗余参数以及递归调用
这是100的阶层。

(2)递归方法:
在用递归的时候,有2个条件必须满足。
1.必须有最后的默认结果,不能一直调用自己,到最后一定要有一个默认结果。这默认结果是什么呢?默认结果是当参数为0的时候,返回是1
if n == 0: return 1
2.递归参数必须向默认结果收敛的。也就是要一直要减小,一直到减少到0

看一个小例子
def b(n):
if n == 0:
return 1
else:
return n * b(n-1)
print n(5)
多类型传值和冗余参数以及递归调用
在看一个相加的例子
def b(n):
if n == 0:
return 0
else:
return n + b(n-1)
print n(100)
多类型传值和冗余参数以及递归调用
为什么乘法和加法的返回结果不一样,因为0乘以任何数都为0 所以要返回1
加法是0+0 还是0