美文网首页
Python基础总结--09(函数应用)

Python基础总结--09(函数应用)

作者: zxhlcl | 来源:发表于2018-10-11 16:45 被阅读0次

    函数的应用

    一、匿名函数

    语法:
    lambda 参数列表:返回值
    函数别名=lambda 参数列表:返回值

    sum1= lambda x,y,z:x+y+z
    print(sum1(1,2,3))
    
    sum2_0=lambda n:sum(range(n+1)) #返回值只能是一个语句,不能写循环
    print(sum2_0(5))
    
    sum2_1= lambda *n:sum(n)
    print(sum2_1(1,2,3,4,5))
    
    string_print_0=lambda x,y,z:print("zhe shi yi ge han shu ") #print函数的返回值为None
    print(string_print_0(1,2,3))
    string_print_1=lambda x,y,z:print(x,y,z) #print函数的返回值为None
    print(string_print_1(1,2,3))
    
    sum3=lambda x=1,y=1,z=1:sum1 #将sum1函数作为返回值
    print(sum3())
    
    sum4=lambda x=1,y=1,z=1:sum1(1,2,3) #在sum4中调用sum1
    print(sum4())
    
    sum5=lambda x=1,y=1,z=1:sum1
    print(sum5()(1,2,3)) #在sum5的返回值为sum1,再调用sum1
    
    col=[]
    
    for item in range(1,5):
        col.append(lambda x:x*item)
    print(col[0](2))  #打印的值是多少?
    print(col[1](2))  #打印的值是多少?
    #注意:函数在调用的时候才执行函数体
    '''
    item=1~4
    item=1--> [lambda x:x*item]
    item=2--> [lambda x:x*item,lambda x:x*item]
    item=3--> [lambda x:x*item,lambda x:x*item,lambda x:x*item]
    item=4--> [lambda x:x*item,lambda x:x*item,lambda x:x*item,lambda x:x*item]
    col[0](2)=x*item=2*4=8
    col[1](2)=x*item=2*4=8
    '''
    

    二、变量作用域

    变量的作用域是指变量能够使用的范围
    作用域链:变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错
    1、全局变量:
    申明在函数或类外面的变量都是全局变量,作用域从申明开始到整个py文件结束
    (与C和Java都有区别,Python没有块级作用域)

    for x in range(1,5):
        for y in range(1,5):
            z=100
    print(x,y,z) #x,y,z 都是全局变量
    

    2、局部变量
    申明在函数或类里面的变量都是局部变量,作用域从申明开始到整个函数或者类结束

    def func1():
        name = "Band"
        print(name)
    func1()
    

    **3、global关键字 **
    注意:只能用于函数中
    作用:在局部域中定义全局变量

    name="James"
    def func2():
        print(name)
    def func3():
        global name  #在函数中申明一个name全局变量
        global age   #在函数中申明一个age全局变量
        name = "James Band"
        age = 30
        print(name)
    func2() #调用函数,打印局部变量
    func3() #全局变量指向的地址被func3修改
    print(name,age)#打印在func3中申明的全局变量
    

    **4、nonlocal关键字 **
    只能用于函数中
    作用:在局部域的局部域中修改变量的值

    name="James"  #全局变量
    def func4():
        name="James Band"  #局部变量(func4作用域)
        def func5():
            name="James Band 007" #局部变量(func5作用域)
            print(name)
        func5()
        print(name)
    func4()   #James Band 007  James Band 
    print(name)  #James 
    
    name="James"
    def func6():
        name="James Band"
        def func7():
            nonlocal name  #在func7中申明了一个在func6作用域的变量,在作用域链中扩大了一个层级
            name="James Band 007"
            print(name)
        func7()
        print(name)
    func6()        #James Band 007  James Band 007(局部参数被重新申明)
    print(name)    #James
    
    

    三、函数作为变量使用

    申明函数就是申明一个function类型的变量,函数名就是变量名
    1、函数作为变量赋值给其他变量

    func1=lambda x,y:x*y
    a=func1#函数作为变量赋值给a
    b=func1(2,3)#返回值赋值给b
    

    2、函数作为序列的元素

    def func2():
        print('调用了func2函数')
        return 10
    list1=[1,func2,func2()]
    print(list1[1]())
    print(list1[2])
    

    3、将函数作为参数

    def func11(n):
        n()
    def func12():
        print("调用func12函数")
    func11(func12)
    re=func11(func12)
    print(re)
    

    4、将函数作为返回值
    将函数的申明写在函数里面,可以隐藏函数的实现

    #根据操作符进行相关的数字计算
    def opration(oprater:str):
        if oprater=="+":
            def func1(*param1,**param2):
                sums=0
                for x in param1:
                    sums+=x
                for x in param2:
                    sums+=param2[x]
                return sums
            return func1
        if oprater=="*":
            def func2(*param1,**param2):
                sums=1
                for x in param1:
                    sums*=x
                for x in param2:
                    sums*=param2[x]
                return sums
            return func2
    f1=opration("+")
    re=f1(1,2,3,4,a=5,b=6)
    print(re)
    print(opration("*")(3,4,a=5))
    

    函数可以将自己作为返回值

    def func21(n):
        print("调用func21函数")
        n()
        return func21
    def func22():
        print("调用func22函数")
        return func22
    func21(func22()) #调用func22函数、调用func21函数、调用func22函数
    func21(func22)  #调用func21函数、调用func22函数
    

    分析:func21(func22())-->func22()对func22函数进行调用,就打印了一次"调用func22函数",同时将func22的返回值(函数自身)作为函数func21的变量,调用func22函数,打印了一次"调用func21函数",然后n()相当于func21()又调用了一次,打印了一次"调用func22函数"

    关于sort()的应用
    sort(key=None,reverse=False):可以给key赋值一个函数变量,指定元素的排序规则
    要求:
    (1)函数变量要求有一个参数和返回值;
    (2)参数代表列表中的元素,返回值代表排序规则

    list2=[{'name':"James","age":25,"city":"guangzhou"},
           {'name': "James Band", "age": 22, "city": "chengdu"},
           {'name': "James Band 007", "age": 33, "city": "chongqing"}]
    def get_age(items):
         return items['age']
    list2.sort(key=get_age)
    print(list2)
    #[{'name': 'James Band', 'age': 22, 'city': 'chengdu'}, {'name': 'James', 'age': 25, 'city': 'guangzhou'}, {'name': 'James Band 007', 'age': 33, 'city': 'chongqing'}]
    

    四、函数的调用

    注意:函数的调用过程是一个压栈的过程
    每次调用函数系统都会在内存中(栈)开辟空间存储执行过程中产生的数据(函数中申明的变量);当函数调用结束后,该内存空间会自动销毁
    1、函数可以有多个返回值

    def sum_and_average(*param):
        """返回数组的和以及平均值"""
        sums=sum(param)
        average=sums/len(param)
        return sums,average
    result=sum_and_average(1,2,3,4,5,6,7,8,9)
    print(result)
    

    2、函数递归调用
    怎么写递归函数:
    1、确定临界值(循环结束的条件),让函数结束
    2、找关系,假设函数的功能已经实现,找f(n)和f(n)的关系
    3、根据关系,用f(n-1)实现f(n)的功能

    def My_sums(n):
        if n==1:return 1
        return My_sums(n-1)+n
    print(My_sums(5))
    

    注意:不推荐使用递归调用,运行时消耗内存

    相关文章

      网友评论

          本文标题:Python基础总结--09(函数应用)

          本文链接:https://www.haomeiwen.com/subject/sbfbaftx.html