第四天内容20180427(函数的定义与调用、函数的参数、递归函数)

##########主要内容###########
函数的定义与调用
函数的参数
递归函数
#############################

一、函数
    1、函数是一段可以重复使用的代码。函数能提高应用模块和代码的重复利用率。
    2、函数的定义与调用
        1.格式:
            def 函数名(形参表):
            函数体语句序列
            [return 表达式]  ##可选项,即有的函数没有返回值
        2.函数调用:
            函数名(实参表)  ##加()表示执行函数
            def func(r):
                return r**2
            print(func(3))  #--> 9

二、函数的参数
    1、Python通过名称绑定的机制,把实际参数的值和形式参数的名称绑定在一起,形式参数和实际参数指向内存中同一个存储空间。

2、形式参数类型(定义函数时使用):普通参数、默认值参数、可变参数
    a.普通参数:必须以正确的顺序传入函数。调用时的数量必须和声明时的一样
        def func(a,b):
            return a+b
        print(func( 1 + 2 )) ###--->3
    b.默认值参数:函数的参数支持默认值。当某个参数没有传递实际的值时,函数将使用默认参数计算
                  带默认值的参数不能位于没有默认值参数前面(默认值参数位于普通参数后面)
        def func(name,age=35):
            print('名字:' + name,'年龄:' + age)
        func(lili,20) ##---->名字: lili 年龄: 20
        func(lilei)      ##---->名字: lilei 年龄: 35
    c.动态参数
        1.加一个*。可以接受任意多个参数,接受的参数会以元组的方式组织。*args
            def f1(*args):
                print(args)
            f1(11,22,[2,3,4],{"k1":456})    #-->(11,22,[2,3,4],{"k1":456})
        2.加两个**。则代表使用该形式参数可以接收任意多个传入的键-值对参数(关键字实参),而且接收的参数将会以字典的方式组织。**kwargs
            def f2(**kwargs):
                print(kwargs)    #输出类型为字典dict
            f2(k1=132,k2=456)    #-->{"k1":123,"k2":456}
        3.不加*表示普通参数,输出类型为a的类型。   
           *args 必须在 **kwargs 前面        
           默认写法:def func(*args,**kwargs)
            def func(*args,**kwargs):
                print(type(args),args)
                print(type(kwargs),kwargs)
            func(11,22,33 k1=123,k2=456)
            #-->(<type "tuple"> (11,22,33))
            #-->(<type "dict"> {'k2':456,"k1":123})
        4.动态参数为列表、字典、元组
            def f1(*args):
                print(args,type(args))
            li = [11,12,33,44]
            f1(li)   #输出类型为元组,li整体表示元组第一个元素
            #-->([11,12,33,44])
            f1(li,123)
            #-->([11,12,33,44],123)
            f1(*li)  #输出类型为元组,li的每个元素表示元组的每个元素
            #-->(11,12,33,44)
            
            def f1(**kwargs):
                print(kwargs,type(kwargs))
            f1(k1=123,k2="sasa")

            dic = {"k1":123,"k2":"sasa"}
            f1(dic)     ##报错,因为dic会作为输出的value。
            f1(k=dic)   ##-->{'k': {'k1': 123, 'k2': 'sasa'}} <class 'dict'>
            f1(**dic)   ##-->{'k1': 123, 'k2': 'sasa'} <class 'dict'>
                
3、实际参数类型(调用函数时使用):位置实参、关键字实参、结构实参
                

 


                
三、递归函数
    1、递归的过程分为两个阶段:递推和回归
    2、递归函数原理:
        第一阶段,递归函数在内部调用自己。每一次函数调用又重新开始执行此函数的代码,直到某一级递归程序结束。
        第二阶段,递归函数从后往前返回。递归函数从最后一级开始返回,一直返回到第一次调用的函数体内。即递归函数逐级调用完毕后,再按相反的顺序逐级返回。
    3、实例:
        1.利用递归完成阶乘计算:

def func(num):
    if num == 1:
        return 1
    else:
        return num * func(num-1)
print(func(5)) ##---->120    

        2.斐波那契数列

1 def func(num):
2     if num == 1 or num == 2:
3         return 1
4     else:
5         return func(num-1)+func(num-2)
6 
7 for x in range(1,11):
8 print(func(x))  ###遍历输出,斐波那契数列的前10项    

 

posted @ 2018-04-27 17:56  Monomania丶pp  阅读(119)  评论(0)    收藏  举报