zoukankan      html  css  js  c++  java
  • python_函数进阶1

    动态参数
    '''
    动态参数:也叫不定长传参,就是你需要传给函数的参数很多,不定个数,那这种情况下,你就用*args,
    **kwargs接收,args是元祖形式,接收除去键值对以外的参数,kwargs接收的只是键值对参数
    并保存在字典中
    '''
    def trans_param(*args,**kwargs):
    print(args,type(args))
    print(kwargs,type(kwargs))

    trans_param('a',1,[2,3],('c','d'),{'name':'alex'},age='male',a=123)

    函数:
    # 命名空间一共分为三种
    # 全局命名空间
    # 局部命名空间
    # 内置命名空间

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

    2、三种命名空间之间的加载与取值顺序
    加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上至下加载)->
    局部命名空间(程序运行中,调用时才加载)

    3、取值顺序:
    在局部调用:局部命名空间->全局命名空间->内置命名空间
    在全局调用:全局命名空间->内置命名空间

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

    4、作用域:
    作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域
    全局作用域:包含内置名称空间、全局名称空间、在整个文件的任意位置都能被引用,全局有效
    局部作用域:局部名称空间,只能在局部范围生效
    globals和locals
    print(globals())
    print(locals())

    def func():
    a = 10
    b = 20
    print(globals())
    print(locals())
    func()

    global和nonlocal关键字
    global
    1:声明一个全局变量
    2:在局部作用域想要对全局作用域全局变量进行修改时,需要用到global(限于字符串,数字)
    def func():
    global a
    a = 3
    func()
    print(a)

    count = 1
    def search():
    global count
    count = 2
    search()
    print(count)

    对可用数据类型(list,dict,set),可以直接引用不通过global
    li = [1,2,3]
    dic = {'name':'alex'}
    def change():
    li.append(4)
    dic['age'] = 18
    print(li)
    print(dic)
    change()
    print(li)
    print(dic)

    nonlocal:
    不能修改全局变量
    在局部作用域中,对父集作用域(或者更外层作用域,非全局作用域)的变量进行引用和修改,并且引用的那层
    从那层及以下变量全部发生改变
    def add_b():
    b = 42
    def do_global():
    nonlocal b
    b += 10
    print(b)
    def dd_nonlocal():
    nonlocal b
    b = b + 20
    print(b)
    dd_nonlocal()
    print(b)
    do_global()
    print(b)
    add_b()

    函数的嵌套和作用域链
    函数的嵌套调用
    def max2(x,y):
    m = x if x>y else y
    return m

    def max4(a,b,c,d):
    res1 = max2(a,b)
    res2 = max2(res1,c)
    res3 = max2(res2,d)
    return res3

    print(max4(23,-7,31,11))

    函数的嵌套定义
    def f1():
    print("in f1")
    def f2():
    print("in f2")

    f2()
    f1()

    def f1():
    def f2():
    def f3():
    print("in f3")
    print("in f2")
    f3()
    print("in f1")
    f2()
    f1()

    函数的作用域链:
    小范围作用域可以使用大范围的变量,但是反之不行,他是单向的
    def f1():
    a = 1
    def f2():
    def f3():
    print(a)
    f3()
    f2()
    f1()

    def f1():
    a = 1
    def f2():
    a = 2
    def f3():
    print(a)
    f3()
    f2()
    print('a in f1 : ',a)
    f1()

    函数名的本质
    函数名本上质就是函数的内存地址
    1、可以被引用
    def f1():
    print('aa')
    f = f1()
    print(f)

    2、可以被当做容器类型的元素
    def f1():
    print('f1')

    def f2():
    print('f2')

    def f3():
    print('f3')

    l = [f1,f2,f3]
    d = {'f1':f1,'f2':f2,'f3':f3}
    调用
    l[0]()
    d['f2']()

    3、可以当做函数的参数和返回值
    def f1():
    print('f1')

    def func1(argv):
    argv()
    return argv

    f = func1(f1)
    f()
     
  • 相关阅读:
    JavaSE学习笔记(二十六)—— IO流概述&字节流
    JavaSE学习笔记(二十五)—— File类
    JavaSE学习笔记(二十四)—— 异常
    JavaSE学习笔记(二十三)—— Collections工具类
    JavaSE学习笔记(二十二)—— Map集合
    JavaSE学习笔记(二十一)—— Set集合
    Gin框架
    Go gRPC Hello World
    Go
    Gin框架
  • 原文地址:https://www.cnblogs.com/echo-up/p/9489927.html
Copyright © 2011-2022 走看看