函数

作者: L丶Y1122 | 来源:发表于2018-11-17 10:22 被阅读0次

    1.变量的作用域

    变量能够在程序中使用的范围

    1.全局变量
    • a. 声明在函数或者类的外部的变量都是全局变量
    • b.声明开始变量的作用域是从变量开始到py文件结束,任何位置都可以使用。
    2.局部变量
    • a.声明在函数或者类的里面的变量都是局部变量
    • b.从变量声明开始函数结束,任何位置都可以使用。
    3.global

    只能在函数中使用,用来在函数中声明一个全局变量

    • 语法:
      global 变量名
      变量名 = 值
    4.nonlocal

    当需要在局部的局部中修改局部的变量的值,就使用nonlocal

    • 语法
      nonlocal 变量名
      变量名 = 值
    #==================全局变量================
    a=10
    for x in  range(10):
        y = 20
        print(x)
    print(x,y)
    
    
    def func1():
        print("函数中",a,x,y)
    
    
    func1()
    
    # ===============局部变量========================
    def func2(num1,num2):
        print(num1,num2)
        aa=11
    
    # print(num1) #NameError: name 'num1' is not defined
    
    
    #================global=======================
    #声明一个全局变量a1
    a1 = 100
    def test1():
        #声明一个局部变量a1
        a1 =200
        print("函数内",a1)  
       #声明一个全局变量a1
        global  a1
        a1=200
        print("函数内",a1)
    
    
    test1()
    print("函数外",a1)
    
    
    #===================== nonlocal==========================
    def func1():
        a2 = "abc"
        def func2():
            nonlocal a2
            a2 ="python"
            print("a2:",a2)
            #a3的作用域在func2()中,使用func1()不能使用
            a3 =111
        func2()
        print("func1()中:",a2)
    func1()
    
    
    function =[]
    for x in range(5):
        def func1(a):
            return  a*x
            function.append(func1)
    t1 = function[0]
    t2 = function[2]
    print(t1(2),t2(2))
    

    2.函数作为变量

    python中,声明函数其实就是声明一个类型是function的变量。函数名就是变量名

    函数作为变量,除了可以用来调用函数获取返回值,普通变量能做的,它都能做

    #声明类型是int类型的变量
    a=10
    #声明类型是dict类型的变量
    b = {"a":12,"b":200}
    #声明类型是function类型的变量
    c = lambda x:x*x
    #声明类型是function类型的变量d
    def d(x):
        return x*x
    
    print(type(d)) #<class 'function'>
    
    普通变量能做的:
    • 1.让一个变量给另一个变量赋值
    # 声明一个列表变量list1
    list1 =[1,2,3,4]
    # 使用列表变量list1给list2赋值
    list2 = list1
    #将list2当做列表来用
    print(list2[2]) #3
    
    #声明一个类型为function的变量func11
    def func11():
        print("我是函数")
    #用函数变量func11给ff赋值
    ff = func11
    #将ff当做函数来用
    ff() #我是函数
    
    • 2.将变量作为列表的元素或者是字典的值
    list1 =[1,2,3,4]
    list2 =[list1,100]
    
    # 声明函数变量func2
    def func2():
        print("我是函数2")
    
    list2 = [func2,100]
    print(list2[0]()) #我是函数2
                      #None
    
    3.作为函数的参数

    将函数1作为实参,传递给函数2;这儿的函数2就是一个高阶函数(实参高阶函数)

    def test(x):
        print(x)
    # 声明一个int类型的变量a
    a = 10
    #将变量a作为实参传递给变量test
    test(a)
    
    # 声明一个function类型的变量
    def func3():
        print("我是函数3")
        return "我是函数test"  
    test(func3())  #func3() => "我是函数test" 
    
    4.sort函数

    def sort (key = None ,reverse =False)
    key - 确定排序的时候以什么值为标准来排序(默认情况下,以列表的元素的大小为标准来排序);
    需要传一个函数,函数需要一个参数和一个返回值。这儿的参数是列表的元素
    reverse - 是否降序排序,需要传一个布尔值

    list1 =[1,2,3,4]
    list1.sort()
    
    #取最大年龄对应的列表
    print(max([["a",10],["b",200],["c",30]],key=lambda item:item[1]))
    
    5.将变量作为函数的返回值
    def test2(n):
        sum1 = 1
        for x in range(1,n+1):
            sum1*=x
        return  sum1
    
    re = test2(5)+1
    print(re) #121
    
    def get_operation(char):
        """
        根据不同的符号返回不同的功能(函数功能描述)
        :param char: 运算符符号
        :return: 一个运算符对应的相应的函数
        """
        if char =="+":
            def sum(*args,**kwargs):
                """
                求多个数的和
                :param args:
                :param kwargs:
                :return:
                """
                sum1=0
                for item1 in args:
                    sum1+=item1
                for  key in kwargs:
                    sum1+=kwargs[key]
                return sum1
    
    
            return sum
        elif char =="*":
            def mul(*args,**kwargs):
                sum1=1
                for items in args:
                    sum1*=items
                for  key in  kwargs:
                    sum1*=kwargs[key]
                return sum1
            return mul
        elif char == "-":
            def poor(*args,**kwargs):
                poor1 =args[0]
                for item in args:
                    poor1-=item
                for key in kwargs:
                    poor1 -= kwargs[key]
                return poor1
            return poor
        else:
            def x(*args,**kwargs):
                return "输入不规范"
            return "输入不规范"
    re = get_operation("*")
    
    print(get_operation("-")(1,6,7,a=1,b=2))
    

    3.迭代器

    1.什么是迭代器(iter)

    迭代器是python中的容器类的数据类型,可以同时存储多个数据。
    取迭代器中的数据只能一个一个的取,而且取出来的数据,在迭代器就不存在了

    2.迭代器中数据的来源

    a.将其他序列转换成迭代器
    b.使用生成式、生成器去产生数据

    • 1.将数据转换成迭代器
      所有的序列都可以转换成迭代器
    • 2.将字符串转换成迭代器
    iter1 = iter('abcd')
    print(iter1)
    
    iter2 = iter([1, 10, 100, 1000])
    print(iter2)
    
      iter3 = iter({'name': '小明', 'age': 20})
    print(iter3)
    
    3.获取迭代器中的元素

    a.
    next(迭代器) / 迭代器.next() - 取出迭代器中第一个元素(已经取出来的元素再也回不到迭代器中了)

    iter1 = iter('abcd')
    print(next(iter1)) #a
    print(next(iter1)) #b
    print(next(iter1))#c
    print(next(iter1))#d
    # print(next(iter1))   # 当迭代器是空的时候,使用next获取元素,会出现StopIteration异常
    
    iter2 = iter([1, 10, 100, 1000])
    print(iter2.__next__()) #1
    print(next(iter2)) #10
    

    b.通过for循环取出迭代器中每个元素

    iter2 = iter([1, 10, 100, 1000])
    for x in iter2:
        print('==:', x)#==: 1
                      #==: 10
                      #==: 100
                      #==: 1000
    print(next(iter2))   # 出现异常StopIteration,因为for循环已经将这个迭代器中的元素取完了
    

    4.生成器

    生成器就是迭代器;迭代器不一定是生成器
    生成器就是带有yield关键字的函数的结果

    • 1.调用带有yield关键字的函数,拿到的结果就是一个生成器。生成器的元素就是yield关键字后面的值

    • 2.只要有yield关键字,就不会执行函数体与获取返回值,而是创建一个生成器
      当获取生成器的元素的时候,才会执行函数的函数体,执行到yield语句位置,
      并且将yield后面的值作为结果返回;并且保存当前执行的位置;
      直到函数结束或者遇到yield为止

    • 3.生成器对应的函数,执行完成遇到yield的次数,决定了生成器能产生数据的个数

    def x():
        print("函数里")
        yield 100
        print("!!!")
        yield 200
    
    
    print(x())  #<generator object x at 0x00000000026BF5E8>   生成器
    
    re = x()  #生成一个生成器
    #next(x()) - 执行x()对应的函数体,将yield关键字后面的值作为结果
    print(next(re)) #100
    print(next(re)) #200
    
    def numbers():
        for x in range(101):
            yield x
    
    re = numbers()
    for i in range(101):
        print("迭代器:",next(re))
    
        #写一个生成器可以无限产生学号
    def  creat_id():
        num = 1
        while True:
            yield num
            num+=1
    
    re = creat_id()
    
    print(next(re))
    
    
    #写一个生成器,可以不断产生斐波拉契数列1,1,2,3,5,8,13...
    def fb_num():
        num1 = 0
        num2 = 1
        index = 0
        while True:
            num1,num2=num2,num1+num2
            index+=1
            yield "第%d数为:%d"%(index,num1)
    re = fb_num(10)
    
    for i in re:
        print(re)
    
    print(int(True))
    

    相关文章

      网友评论

          本文标题:函数

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