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声明的变量不能出现在此函数的参数列表里