函数2

函数2

1.命名关键字参数

def func(x,n=3,*,m=333,y):
    print(x)
    print(y)
    print(m)
    print(args)
    print(kwargs)


func(1,2,3,4,y=4,m=5555)

*之后的叫命名关键字参数,必须要用关键字实参为其传值。

2.type hinting

def register(name:str,age:int)->str:
    print(name,age)
    return 'ok'

res = register(111111111,"aaaaa")

可以在形参之后为其加上数据类型,但是和没加一样,只是有一个提示的效果,python是一个动态类型的语言,这就有一点向静态类型靠近的意思,所以用不用就见仁见智了,提示写在文档里也是可以的。

3.函数对象

函数对象:函数是第一类对象,函数是第一等公民

简单的说就是函数可以被当成变量去用

 

定义一个函数。函数名绑定的就是函数体代码的内存地址,和变量一样,如果print()的话就是一个内存地址

1.可以被赋值

函数可以赋值给一个变量,赋值之后变量也是函数的内存地址,变量也可以用来运行函数体代码

 y = x
 f = func
 print(f is func)
 f()

2.可以当作参数传给另一个函数

函数可以作为一个参数为其他函数传值

 def foo(a):
     print(a)
     a()

 foo(func)

3、可以当做函数的返回值

 def foo(f):
     return f

 res = foo(func)
 print(res)
 res()

4.可以当作容器类型的元素

这样,我们就可以把登陆之类的操作变得简洁

def login():
    print('登录'.center(50,'*'))

def register():
    print('注册'.center(50,'*'))

def transfer():
    print('转账'.center(50,'*'))

def withdraw():
    print('提现'.center(50,'*'))

func_dic = {
    "1":["登录",login],
    "2":["注册",register],
    "3":["转账",transfer],
    "4":["提现",withdraw],
}

while True:
    print("0 退出")
    for k in func_dic:
        print(k,func_dic[k][0])

    choice =  input("请输入您的命令编号:").strip()
    if choice == "0":
        break

    if choice in func_dic:
        func_dic[choice][1]()
    else:
        print("输入命令错误")

4.函数嵌套

1.函数的嵌套定义

函数体代码中也可以定义一个函数

下面是算圆的周长和面积

 from math import pi

 def circle(radius,mode=0):
     def perimiter(radius):
         return 2 * pi * radius

     def area(radius):
         return pi * (radius ** 2)

     if mode == 0:
         return perimiter(radius)
     elif mode == 1:
         return area(radius)

 circle(3,1)

2、函数的嵌套调用

通过比较2个值大小的函数,调用在4个参数的函数中,可以为4个值比较大小

def max2(x,y):
    if x > y:
        return x
    else:
        return y

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

res = max4(1,2,3,4)
print(res)

5.名称空间和作用域

名称空间Namespaces:存放名字与其对应的内存地址的地方

名称空间分为三大类:

1.内置名称空间:存放的是python解释器自带的名字

          生命周期:python解释器启动则产生,解释器关闭则销毁

2.全局名称空间:存放的是顶级的名字

       生命周期:py程序刚开始运行则立即产生,py程序结束就销毁

3.局部名称空间:存放的是函数内的名字

       生命周期:函数调用则产生,函数调用结束则销毁

 

一 、名字的访问优先级

      基于自己所在的位置向外一层一层查找,L-E-G-B

      L是本身空间,E是外层函数空间,G是全局空间,B是内置空间

二、名称空间的‘嵌套’关系是在函数定义阶段、扫描语法是生成的,与调用位置无关

posted @ 2021-03-26 15:03  余鑫  阅读(108)  评论(0)    收藏  举报