zoukankan      html  css  js  c++  java
  • python函数 二

    一。参数

    1.实参

    2.形参

    从形参的角度分类:

    1)位置参数

    2)默认参数

    参数陷阱
    
    def func(x,l = []):
        l.append(x)
        print(l)
    func('alex')
    func('wusir')
    # 输出结果:
    # ['alex']
    # ['alex', 'wusir']

    3)动态参数(*args ,**kwargs)

    def func(*args):
        print(args)
    func(1,2,4)                     #输出结果:(1, 2, 4)
    
    
    def func(**kwargs):
        print(kwargs)
    func(x = 1,y = 'alex',z = [1,2,3,])         #输出结果:{'x': 1, 'y': 'alex', 'z': [1, 2, 3]}
    
    def func(a,b,*args,sex = '',**kwargs):
        print(a)            #1
        print(b)            #alex
        print(args)         #('asd', [1, 2, 3, 4])
        print(sex)          #
        print(kwargs)       #{'name': 'taibai', 'age': 24}
    func(1,'alex','asd',[1,2,3,4,],sex = '',name = 'taibai',age = 24 )
    
    
    # 魔法运算:
    def func(*args):
        print(args)
    li = [1,2,3]
    l2 = [4,5,6]
    func(li)       #输出结果:([1, 2, 3],)
    func(*li)      #输出结果:(1, 2, 3)
    func(*li,l2)   #输出结果:(1, 2, 3, [4, 5, 6])
    func(*li,*l2)  #输出结果:(1, 2, 3, 4, 5, 6)
    
    
    def func(*args,**kwargs):
        print(args)
        print(kwargs)
    func(*[1,2,3],*{'name':'alex','age':18},**{'name2':'taibai','age2':24},name3 = 'wusir')
    # 输出结果:
    # (1, 2, 3, 'name', 'age')
    # {'name2': 'taibai', 'age2': 24, 'name3': 'wusir'}
    View Code

    二。名称空间(命名空间)

    1)全局命名空间

    2)局部命名空间

    3)内置命名空间:存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

    三种命名空间之间的加载与取值顺序:

    加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

    取值顺序:

      在局部调用:局部命名空间->全局命名空间->内置命名空间

      在全局调用:全局命名空间->内置命名空间

    综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。

    三。作用域

    作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

    1)全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

    2)局部作用域:局部名称空间,只能在局部范围生效

    globals和locals方法

    name = 'wusir'
    def func():
        name = 'alex'
        print(name)
        print(globals())  #全局作用域
        print(locals())   #局部作用域
    func()
    # 输出结果:
    # alex
    # {'__name__': '__main__', '__doc__': "
    def func(x,l = []):
        l.append(x)
        print(l)
    func('alex')
    func('wusir')
    输出结果:
    ['alex']
    ['alex', 'wusir']
    
    
    def func(*args):
        print(args)
    func(1,2,4)                     #输出结果:(1, 2, 4)
    
    
    def func(**kwargs):
        print(kwargs)
    func(x = 1,y = 'alex',z = [1,2,3,])         #输出结果:{'x': 1, 'y': 'alex', 'z': [1, 2, 3]}
    
    def func(a,b,*args,sex = '男',**kwargs):
        print(a)            #1
        print(b)            #alex
        print(args)         #('asd', [1, 2, 3, 4])
        print(sex)          #女
        print(kwargs)       #{'name': 'taibai', 'age': 24}
    func(1,'alex','asd',[1,2,3,4,],sex = '女',name = 'taibai',age = 24 )
    
    
    # 魔法运算:
    def func(*args):
        print(args)
    li = [1,2,3]
    l2 = [4,5,6]
    func(li)       #输出结果:([1, 2, 3],)
    func(*li)      #输出结果:(1, 2, 3)
    func(*li,l2)   #输出结果:(1, 2, 3, [4, 5, 6])
    func(*li,*l2)  #输出结果:(1, 2, 3, 4, 5, 6)
    
    
    def func(*args,**kwargs):
        print(args)
        print(kwargs)
    func(*[1,2,3],*{'name':'alex','age':18},**{'name2':'taibai','age2':24},name3 = 'wusir')
    # 输出结果:
    # (1, 2, 3, 'name', 'age')
    # {'name2': 'taibai', 'age2': 24, 'name3': 'wusir'}
    ", '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000209D3A8A4E0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/python10/day10/02博客.py', '__cached__': None, 'name': 'wusir', 'func': <function func at 0x00000209D3B58B70>}
    # {'name': 'alex'}

    3)global关键字,nonlocal关键字

    globals:

    1)声明一个全局变量。

    2)在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)

    ps:对可变数据类型(list,dict,set)可以直接引用不用通过global

    nonlocal

    1)不能修改全局变量。

    2)在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改        变。

    def add_b():
        b = 42
        def do_global():
            b = 10
            print(b)
            def dd_nonlocal():
                nonlocal b
                b = b + 20
                print(b)
            dd_nonlocal()
            print(b)
        do_global()
        print(b)
    add_b()
    # 输出结果: 10  30  30  42
    View Code

    四。函数的嵌套

    print(1)
    def fun2():
        print(2)
        def fun3():
            print(6)
        print(4)
        fun3()
        print(8)
    print(3)
    fun2()
    print(5)
    输出结果: 1 3 2 4 6 8 5
  • 相关阅读:
    Redis 设计与实现(第三章) -- 链表adlist
    Redis 设计与实现(第二章) -- SDS
    MySQL索引背后的数据结构及算法原理(转)
    MySQL索引原理及慢查询优化(转)
    MySQL常见的一些面试题(未完待续)
    js 获取前天、昨天、今天、明天、后天的时间
    linux 下nohup 使用
    java split 分割字符串用法
    Python 获取URL访问的HEAD头信息
    MySQL日期数据类型、时间类型使用总结
  • 原文地址:https://www.cnblogs.com/zhuzhaoyang/p/8399963.html
Copyright © 2011-2022 走看看