python学习笔记:函数与变量作用域

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WilliamCode/article/details/85181807

1、函数的参数传递
    是引用传递,如果传入的是可变对象(列表,字典,集合等),则对其进行修改(注意,不是赋值,而是修改),则在主函数中该对象被修改;
    传入的形参,是一个局部变量,只是一开始引用了实参,如果绑定关系被改变,那么不会修改原对象的值
    参数传递有四种方法:
        直接传参
        示意序列传参
        关键字传参
        字典关键字传参
2、函数的示意序列传参
    可以用list的地址作为参数传入
    比如
    def mysum(l1,l2):
        return l1+l2
    List = {1,2}
    mysum(*List)
3、关键字传参
    关键字传参是指传参时,利用形参的名称给参数赋值
    比如
    def mysum(l1,l2):
        return l1+l2
    mysum(l2 = 1,l1 = 3)
    #这种传参方式对参数的顺序并没有要求,但是关键字名称和形参的名称必须是一致的
4、字典关键字传参
    def mysum(l1,l2):
        return l1+l2
    d1 = {"l1":33,"l2",44}
    mysum(**d1)
    说明:
    字典的关键字必须和形参一致
    必须前面加两个星
5、综合传参
    函数的传参方式在能确定形参能够唯一匹配到实参的情况下,可以任意组合
    def mysum(l1,l2):
        return l1+l2
    mysum(1,*{23})
    #没多大意义
    有一种错误传参:mysum(l1 = 1,2)
6、函数的缺省参数
    语法:def 函数名(形参名1 = 默认实参,参数名2 = 默认实参2,参数名3 = 默认实参3 ...)
    比如:
    def myfunc(a, b=1,c=3):
        print(a,b,c)
    myfunc(a)
    在这种情况下,必须传入参数a,但是可以不传入实参b,c
    如果不是关键字传参,那么传入参数顺序应该遵循原有顺序
    混合传参时(有关键字传参存在时),缺省值的参数的传入,必须放在非缺省值的前面    

7、练习题:模仿range()函数,传入一个、两个、三个参数值时分别返回列表对象
    代码:
    def myrange(end,start=None,step=1):
    if step == 0:
        return None
    l = list()
    if start is not None:
        start,end = end,start
    else:
        start = 0
    tmp = start
    if step > 0:
        while(tmp < end):
            l.append(tmp)
            tmp += step
        return l
    else:
        while(tmp > end):
            l.append(tmp)
            tmp += step
        return l
    for i in myrange(10):
        print(i,end=' ')
    print()
    for i in myrange(4,10):
        print(i,end=' ')    
    print()
    for i in myrange(10,4,-1):
        print(i,end=' ')
    print()
8、函数字符串
    每个函数都可以有一个字符串用于说明函数功能,这个字符串放在函数的开头,当输入help(函数名)查询时,会显示这个字符串,该字符串可以包含回车,直接用def myrange(end,start=None,step=1):
    if step == 0:
        return None
    l = list()
    if start is not None:
        start,end = end,start
    else:
        start = 0
    tmp = start
    if step > 0:
        while(tmp < end):
            l.append(tmp)
            tmp += step
        return l
    else:
        while(tmp > end):
            l.append(tmp)
            tmp += step
        return l
for i in myrange(10):
    print(i,end=' ')
print()
for i in myrange(4,10):
    print(i,end=' ')    
print()
for i in myrange(10,4,-1):
    print(i,end=' ')
print()
8、函数的文档字符串
    放在函数的开始,说明函数使用方法及功能,通常用""" """括起,可以包含回车符
9、函数的属性
    __name属def myrange(end,start=None,step=1):
    if step == 0:
        return None
    l = list()
    if start is not None:
        start,end = end,start
    else:
        start = 0
    tmp = start
    if step > 0:
        while(tmp < end):
            l.append(tmp)
            tmp += step
        return l
    else:
        while(tmp > end):
            l.append(tmp)
            tmp += step
        return l
for i in myrange(10):
    print(i,end=' ')
print()
for i in myrange(4,10):
    pr int(i,end=' ')    
print()
for i in myrange(10,4,-1):
    print(i,end=' ')
print()

8、函数的文档字符串
    用于说明函数使用方法及功能,一般放在函数开头,用""""""括起,可直接包含回车,当输入help函数查询时显示这些信息

9、函数的属性
    __name__属性:同于记录函数名
        说明:以双下划线__开头,以下划线结尾的标识符通常代表python的特殊变量(属性)
    示例:
    def abc():
        pass
    fn = abc
    print("fn绑定的函数名是",fn.__name__)
    print("abc绑定的函数名是",abc.__name__)
    
    __doc__属性即函数的文档字符串

10、函数变量
    函数在创建时会生成一个以函数名为名称的变量,绑定这个函数,可以通过该变量来调用函数
11、一个函数可以作为另外一个函数的参数进行传递、也可以作为另一个函数的返回值来返回
12、全局变量与局部变量
    局部变量:在函数内部创建的变量成为局部变量,只能在函数内部使用,在函数调用时自动创建,在函数结束时自动销毁
    全局变量:定义在函数外部,模块内部的变量称为全局变量,所有函数都可以访问,但是不能直接赋值,如果直接赋值,会创建新的局部变量
13、python作用域
    也叫命名空间,是访问变量时查找变量的范围空间
    python的四个作用域LEGB
    局部作用域(函数内,Local Function,L)
    外部函数嵌套作用域(Enclosing function,E)
    全局作用域(即函数所定义模块的作用域,Global,G)
    Python内置模块的作用域(Builtin,B)
14、在函数内赋值全局已经存在的变量时,会创建新的变量
15、global语句
    告诉解释器,将变量映射到全局作用域global
    语法:global var1,var2
        或者直接赋值
        global var1 = 100
    说明:全局变量如果在函数内部被赋值,则必须经过global关键字声明,否则创建新的局部变量
    全局变量在函数内部不经过声明就可以直接访问    
    不能先声明局部变量,再用global声明为全局,否则出错
    形参列表里的变量是一定存在的局部变量,所以也不能再次用global声明,否则出错

16、nonlocal语句
    告诉解释器,nonlocal生命的变量不是局部变量也不是全局变量,而是外部嵌套函数内的变量
    说明:
    只能在被嵌套的函数内部使用;当有两层或以上嵌套时,只访问最近的那一层;nonlocal声明的变量不能出现在此函数的参数列表里

猜你喜欢

转载自blog.csdn.net/WilliamCode/article/details/85181807