Day18_函数定义_形参_实参_可变参数

一. 上节课复习

  1. write补充
    • f.write('111\n')
      f.write('111\n')
    • f.writelines(['111\n','222\n']) #writelines 用法相当于write多行
      • writelines() 方法用于向文件中写入一序列的字符串。
        这一序列字符串可以是由迭代对象产生的,如一个字符串列表。
        换行需要制定换行符 \n
  2. truncate
    • truncate() 方法用于从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小

二. 定义函数

  1. 函数的定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

    • 特性:
      减少重复代码
      使程序变的可扩展
      使程序变得易维护
    • 注:函数的定义相当于变量的赋值,函数名相当于变量名,函数的代码相当于变量值;且定义阶段只检测函数的语法是否正确,但调用阶段则不同
  2. 函数分类

    1. 内置函数
    2. 自定义函数
    def 函数名(arg1,arg2,arg3):  
        '描述信息'  
        函数体  
        return 1  
    
  3. 函数的定义和调用

    1. 定义无参函数:调用时为函数调用的语句形式foo()
    2. 定义有参函数:定义时有参,调用时必须传参,且一般有返回值;调用时为函数调用的表达式形式res=bar(1,2)
    3. 定义空函数
  4. 函数的返回值

    1. 未在函数中指定return,那这个函数的返回值为None
    2. 如果return返回值为多个,会以元组的形式返回
    3. 总结:
      • 可以返回任意类型
      • return 1 ----> 1
      • return 1,2,3 -----> (1,2,3)
      • 没有return -----> None
      • 函数执行到return就会结束掉
  5. 变量的解压

    • '_'、'*_'
  6. 函数的参数

  7. 形参:在函数定义阶段,括号内定义的参数,本质就是变量名

  8. 实参:在函数调用阶段,括号内定义的参数,必须要有一个明确的值,可被当成变量值

    • 注意:实参的值要为不可变类型
    • 在函数中不要去修改全局的变量
```python
def foo(x,y)        #形参
    print(x)
    print(y)

foo(1,2)        #实参
```
  1. 在实参的角度的三种传值方式

    1. 按位置传值:
        def foo(x,y):
            print(x)
            print(y)
    
        foo(1,2)
    
    1. 按照关键字传值
        def foo(x,y):
            print(x)
            print(y)
    
        foo(x=1,y=2)
    
    1. 混用
    • 按位置传值必须在按关键字传值的前面
    • 对于一个形参,只能赋值一次,不能重复赋值
        def foo(x,y):
            print(x)
            print(y)
    
        foo(1,y=2)
    
  2. 从形参的角度分析

    1. 位置参数,必须传值的参数
    def foo(x,y):
        print(x)
        print(y)
    
    foo(1,2)
    
    1. 默认参数
      1. 默认参数必须放到位置参数的后面
    def foo(x,y=1):
        print(x)
        print(y)
    foo(2)
    
    • 默认参数在函数定义阶段,他的值就已经确定了
    sex ='male'
    def register(sex=x):        #register-----[sex = 'male']
        print(sex)
    
    sex = None
    register()    #输出为male
    
    • 在函数中不要去修改全局的变量(不推荐下述方式)
    x=[]
    def register(name,name_list=x):
        name_list.append(name)
        
    register('ASB')
    register('YSB')
    register('WSB')
    print(x)        #['ASB','YSB','WSB']
    

三. 可变参数

  1. *args

    def foo(x,*args):    #args = (2,3,4,5,6,'a','b')
        print(x)        
        print(args)
    foo(1,2,3,4,5,6,'a','b')        #输出为1;(2,3,4,5,6,'a','b') 
    

    1.1 *args 与位置参数和默认参数混用:*args要放到位置参数的后面

    def foo(x,*args,y=2)
        print(x)
        print(args)
        print(y)
    foo(1,2,3,4,5,y=1000)    #>>1;(2,3,4,5);1000
    

    1.2. 从形参的角度

    def foo(*args):    #args=(1,2,3)
        print(args)
    foo(1,2,3)
    

    1.3. 从实参的角度

    def bar (x,y,z)
        print(x)
        print(y)
        print(z)
    bar(*(1,2,3))    #bar(1,2,3)
    
  2. **kwargs

    def foo(x,**kwargs):
        print(x)
        print(kwargs)
    foo(1,y=2,a=3,b=4)    #<<1;{'b':4,'y':2,'a':3}
    
    • 注意:**kwargs (按关键字传值),按位置传之后剩下的会给**,处理结果为{}字典的形式
    • args (按位置传值),按关键字传值剩下的会给*,处理结果为()元组的形式

    2.1. 混用

    def foo(x,*args,**kwargs):
        print(x)
        print(args)
        print(kwargs)
    foo(1,y=1,z=2)    #>>1,(),{'y':1,'z':2}
    

    2.2. 从形参的角度

    def foo(**kwargs):    #{'x': 1, 'y': 2, 'z': 3}
        print(kwargs)
    foo(x=1,y=2,z=3)
    

    2.3.从实参的角度

    def foo(x,y,z=3):
        print(x)
        print(y)
        print(z)
    foo(**{'x':1,'y':2,'z':3})    #foo(x=1,y=2,z=3)
    
  3. 嵌套

    def auth(name,password,sex='male'):
        print(name)
        print(password)
        print(sex)
    def foo(*args,**kwargs):    #args =('egon','123') kwargs= {}
        print('from foo')
        auth(*args,**kwargs)    #auth(*('egon','123'),**{})---------auth('egon','123')
    
    foo('egon','123')    >> 
    
posted @ 2017-11-20 20:43  LexSama  阅读(162)  评论(0编辑  收藏  举报