zoukankan      html  css  js  c++  java
  • python语法基础(4)_函数与函数参数

    函数

    关键字def

    1.写法格式

    函数名 ():
    函数体

    #例子如下
    func():
     函数体
    

    2.函数返回值

    关键字return
    return的内容返回函数的调用
    return下方代码不执行,可以终止函数,不可以终止终止循环
    return 返回多个内容的时候是元祖形式
    return 没有写返回值的时候是None 不写返回值时也是None

    3.参数

    形参:是指函数定义中括号里面的参数
    实参:函数的调用括号里的是实参
    传参:是将实参传递给形参的过程
    混合参数:位置参数和关键字参数在一起的
    优先级
    位置参数>关键字参数

    4.三元运算符

    变量=条件成立 条件判断 条件不成立 结果

    def a(a,b):
        return a if a>b else b
    print(a(1,2))
    

    5.动态参数

    *args是万能位置参数

    def func(a,b,*args):
        print(a,b,args) #args传递的参数是元祖类型
    func(1,2,3,45,['SkyRabbit'])
    #结果如下
    1 2 (3, 45, ['SkyRabbit'])
    
    def func(a,b,**kwargs,):
        print(a,b,kwargs) #args传递的参数是字典类型
    func(3,4,args=16,cs=5)
    #结果如下
    3 4 {'args': 16, 'cs': 5}
    

    位置参数>动态参数>默认参数(关键字参数)>动态关键字参数

    万能传参:动态位置参数,动态关键字参数

    6.空间

    内置空间 例子print() input()
    全局空间 在当前py文件需要开辟的空间存放在全局空间
    局部空间 函数中开辟的空间就是局部空间

    加载顺序
    内置空间>全局空间>局部空间

    取值顺序
    局部空间>全局空间>内置空间

    7.作用域

    全局作用域:内置空间+全局空间
    局部作用域: 局部空间

    8.函数嵌套

    不管子啊什么位置,只要函数名+()就是调用此函数
    函数调用执行后,函数体中开辟的空间就自动销毁了

    9.修改变量

    global关键字 声明修改,全局变量
    nonlocal 关键字 在外层函数中,在修改局部空间的变量值,空间不涉及全局空间,只修改距离它最近一层,直到找到最外层函数.

    10函数注释

    查看函数的注释
    格式如下
    函数名 : doc

    查看函数的名字
    格式如下
    函数名: name

    第一类对象-特点

    1.可以当做值被赋值给变量
    2.当做元素,存放在容器中
    3.函数名可以当做函数的参数
    4.函数名可以当做函数的返回值

    格式化用途

    1.支持F
    2.表达式
    3.函数调用
    4.数字计算
    字典取值

    匿名函数

    匿名函数 lambda
    lambda 形参:返回值 - lambda x:x
    形参可以不写,返回值必须写 返回值只能是一个数据类型
    匿名函数的名字叫做 lambda

    函数参数-动态参数

    形参的第三种:动态参数

    动态参数分为两种:

    形参的顺序: 位置参数 , 动态参数 , 默认参数
    位置参数 > *args(动态位置参数) > 默认值参数 > **kwargs(动态默认参数)
    这四种参数可以任意的使用

    加载顺序:

    1. 内置命名空间
    2. 全局命名空间
    3. 局部命名空间(函数被执行的时候)

    取值顺序:

    1. 局部命名空间
    2. 全局命名空间
    3. 内置命名空间

    我们给存放名字和值的关系的空间起一个名字叫: 命名空间. 我们的变量在存储的时候就 是存储在这片空间中的.

    命名空间分类:

    1. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
    2. 全局命名空间--> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间
    3. 局部命名空间--> 在函数中声明的变量会放在局部命名空间

    1.动态接受位置参数
    首先我们来回顾下位置参数

    def eat(a,b,c):
        print('我想吃%s%s%s'%(a,b,c))
    eat('大米饭','中米饭','小米饭')
    

    2.在参数位置用*表示接受任意参数

    def eat(a,b,c):
        print('我想吃%s%s%s'%(a,b,c))
    eat('大米饭','中米饭','小米饭')
    

    3.动态接收参数的时候要注意: 动态参数必须在位置参数后面

    def eat(*args,a,b):
        print('我想吃',args,a,b)
    eat('大米饭','中米饭','小米饭')
     
    结果:
    TypeError: eat() missing 2 required keyword-only arguments: 'a' and 'b'
     
    # eat函数在调用的时候发现缺少俩个位置参数没有进行传递
    
    #正确操作
    def eat(a,b,*args):
        print('我想吃',args,a,b)
    eat('大米饭','中米饭','小米饭')
    
    结果:
    我想吃 ('小米饭',) 大米饭 中米饭
    

    动态接收参数的时候要注意:动态参数必须在位置参数后面
    4.默认值参数呢?

    def eat(a,b,c='白菜',*args):
        print('我想吃',a,b,c,args)
    eat('豆腐','粉条','猪肉','大葱')
     
    结果:
    我想吃 豆腐 粉条 猪肉 ('大葱',)  # 我们定义好的白菜没有生效,被猪肉给覆盖了
    我们发现默认值参数写在动态参数前面,默认值的参数是不会生效的
    def eat(a,b,*args,c='白菜'):
        print('我想吃',a,b,args,c)
    eat('猪肉','粉条','豆腐','大葱')
    结果:
    我想吃 猪肉 粉条 ('豆腐', '大葱') 白菜  # 这样默认参数就生效了
    

    5.动态接收关键字参数

    def func(**kwargs):
        print(kwargs)
    func(a=1, b=2, c=3)
    结果:
    {'a': 1, 'b': 2, 'c': 3}
    动态关键字参数最后获取的是一个dict字典形式
    顺序的问题, 在函数调用的时候, 如果先给出关键字参数, 则整个参数列表会报错.
    def func(a,b,c,d):
        print(a,b,c,d)
    func(1,2,c=3,4)
    结果:
      File "D:/python_object/path2/test.py", line 806
        func(1,2,c=3,4)
    SyntaxError: positional argument follows keyword argument
    关键参数必须要放在位置参数后边,由于实参是这个顺序,所以形参接收的时候也是这个顺序.
    也就是说位置参数必须在关键字参数前面.动态接收关键字参数也要在后面
    

    6.如果想接收所有的参数:

    def func(*args,**kwargs):
        print(args,kwargs)
    func(1,23,5,a=1,b=6)
    #动态参数还可以这样传参:
    lst = [1,4,7]
    # 方法一
    def func(*args):
        print(args)
     
    func(lst[0],lst[1],lst[2])
     
    # 方法二
    def func(*args):
        print(args)
    func(*lst)  
    # 在实参的位置上用*将lst(可迭代对象)按照顺序打散
    # 在形参的位置上用*把收到的参数组合成一个元祖
    

    7.字典也可以进行打散,不过需要**

    dic = {'a':1,'b':2}
    def func(**kwargs):
        print(kwargs)
    func(**dic)
    

    gloabal、nonlocal

    global 表示. 不再使用局部作用域中的内容了. 而改用全局作用域中的变量
    nonlocal 表示在局部作用域中, 调用父级命名空间中的变量.
    如果父级命名空间中没有这个变量名,就继续向上查找.最多找到最外成的函数就结束了

  • 相关阅读:
    WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构
    WCF后续之旅(13): 创建一个简单的WCF SOAP Message拦截、转发工具[上篇]
    Enterprise Library深入解析与灵活应用(6):自己动手创建迷你版AOP框架
    [原创]WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
    WCF技术剖析之七:如何实现WCF与EnterLib PIAB、Unity之间的集成
    WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘
    谈谈基于SQL Server 的Exception Handling
    Is this a MS EnterLib DAAB BUG or not?
    难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?
    WCF中的Binding模型之一: Binding模型简介
  • 原文地址:https://www.cnblogs.com/SkyRabbit/p/11203715.html
Copyright © 2011-2022 走看看