zoukankan      html  css  js  c++  java
  • 函数基础 2------总结

    可变长参数

    *形参

    后约定俗称args,简称为(*args ),作用是会将溢出的位置实参全部接受,然后按照存储 元组 的行式,把元组赋值给*后边的参数。

    def fa(*args):
    
        #retrun *args不能直接返回,会提示语法错误。
        #print(*args)可以直接打印.打印时*可以加也还可以不加。
    

    * 实参

    作用是会将*之后的参数循环取出,打散成位置实参,以后只要遇到实参中带有*的,他就是位置实参,应该马上打散成位置实参去看。

    def f(x,y,z,*args):
        print(x,y,z,*args)
        
    f(1,*(2,3),4,5,6)
    
    #打印结果为:1,2,3,(4,5,6)
    
    注:上述代码块中的*(2,3)是被打散成了位置实参,分给了“y,z”,而*args将实参中剩余的“4,5,6”给集合成一个元组,为(4,5,6)
    

    **形参

    形参中的**会将溢出的关键字实参全部接收,然后存储字典的行式,然后把字典赋值给**后的参数,需要注意的是:**后的参数约定俗称为kwargw,即简称为(**kwargw)

    def f(**kwargw):
        print(kwargw)   #打印时**不可以加,打印出来的值为字典格式
    

    **实参

    实参中的**会将后边参数的值循环取出,打散成关键字实参,哟吼但凡碰到是惨重带**的,他就是关键字实参,应该马上打散成关键字实参去看。

    def func(x, y, z, **kwargs):
        print(x, y, z, kwargs)
    
    func(1, 3, 4, **{'a': 1, 'b': 2})
    
    # 输出为:1 3 4 {'a': 1, 'b': 2}
    

    函数的调用

    对象:python中一切皆对象(字典,列表,元组,集合,布尔值,所有对象都可以做以下四件事)

    1.引用

    def f1():
        print('hello')
     
    f2 = f1  #如果f1加()会直接引用函数
    f1()   # 可以调用函数
    f2()   #也可以调用函数
    

    2.作为容器类型

    def f1(x,y):
        if x > y:
            return x
        else:
            return y
    
    it = [f1(20,30),40,50,60]
    
    print(it[0])
    
    #输出结果为30,函数可以在列表内做元素来使用,取值的方法与列表取值一至
    

    3.作为函数的实参

    def f1():
        return 1010
    
    def f2(f3):
        return f1
    
    print(f2(f1))
    print(f1)
    
    #<function f1 at 0x000002434B62AB70>
    <function f1 at 0x000002434B62AB70>
    
    当f1做实参的时候运行f2函数,不会去运行函数f1()
    

    4.作为函数的返回值

    def f1():
        return 1010
    
    def f2(x):
        return f1()
    
    print(f2(10))     
    #输出结果为 1010,当f2运行的时候f1()会作为返回值,来运行f1()函数
    

    函数嵌套

    定义:函数内再定义一个函数。

    def f1():
        print('hello')
        
        def f2():
            print('nihao')
     内部定义的函数外部不能使用。       
    
    

    名称空间

    名称空间定义

    专门用来存储名称的

    名称空间的分类

    内置名称空间:python解释器自带内置方法(print/len/list......)

    全局名称空间:除了内置和局部都叫全局

    局部名称空间:函数内部定义的都叫局部

    名称空间的执行(生成)顺序

    1.内置名称空间:python解释器启动的时候就有了

    2.全局名称空间:执行文件代码的时候才会有全局

    3.局部内置空间:函数调用的时候才会有局部

    注:定义函数的时候,只检测语法,不执行代码

    名称空间的搜索顺序

    先从当前位置寻找,找不到再按照顺序寻找,不会逆向寻找

    1.在局部:局部 -->> 全局 -->> 内置 -->> 报错

    (return返回的值在全局名称空内)

    2.在全局:全局 -->> 内置 -->> 报错

    全局作用域与局部作用域

    1.全局作用域的x 和局部作用域的x 没有半毛钱关系.

    2.局部作用域1的x 和局部作用域2的x 也没有任何关系,即使局部作用域1和局部作用域在同一个局部作用域下.

    例1:全局作用域
    x = 10
    def f1():
        x = 20
    
    f1()
    print(x)    #输出结果为 10,因为print(x)实在全局作用域进行的只在全局作用域搜索
    
    例2局部作用域
    x = 10
    def f1():
        y = 20
        print(x)   #输出结果为 10,搜索路径为:局部-->全局-->内置-->报错
    
    f1()
    print(x)   #输出结果为 10,是在全局作用域下搜索的
    
    例3:全局与局部作用域
    x = 10
    def f1():
        x = 20
        print(1,x)   #输出结果为(1,1=20)
    
    f1()
    print(2,x)      #输出结果为(2,10)
    
    例4:返回值后搜索
    x = 10
    def f1():
        return x
    
    f1()
    print(x)     #输出结果为 10
    
    

    global与nonlocal

    global:打破 (全局作用域的x 和局部作用域的x 没有半毛钱关系) 这条规则,会使global以下的部分变成局部作用域.

    nonlocal:让 x 成为顶层函数的局部,不是让他成为局部

    it = [10]
    
    def f1():
        it[0] =11
    f1()
    print(it)    #输出值为 11
    
    # 所有可变数据类型都可以打破上述一切规则
    
    
    例1:
    def f1(i,it=[]):
        it.append(i)
        print(it)
        
    for i in range(10):
       f1(i)
    
    #输出
    [0]
    [0, 1]
    [0, 1, 2]
    [0, 1, 2, 3]
    [0, 1, 2, 3, 4]
    [0, 1, 2, 3, 4, 5]
    [0, 1, 2, 3, 4, 5, 6]
    [0, 1, 2, 3, 4, 5, 6, 7]
    [0, 1, 2, 3, 4, 5, 6, 7, 8]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    注:形参具有描述意义
    
    例2:
    def f1(i,it):
        it.append(i)
        print(it)
        
    for i in range(10):
       f1(i,[])
    
    #输出
    [0]
    [1]
    [2]
    [3]
    [4]
    [5]
    [6]
    [7]
    [8]
    [9]
    
    注:实参具有实际意义
    
    
  • 相关阅读:
    Python
    Python
    Redis
    android和.net webservice中的DES加密算法
    android studio中使用recyclerview小白篇(四)
    android studio中使用recyclerview小白篇(三)
    android studio中使用recyclerview小白篇(二)
    android studio中使用recyclerview小白篇(一)
    Fragment之间通过add切换时的显示与隐藏
    android报错:org.ksoap2.SoapFault cannot be cast to org.ksoap2.serialization.SoapObject
  • 原文地址:https://www.cnblogs.com/whkzm/p/11563047.html
Copyright © 2011-2022 走看看