Day10 函数(二)

1.定义函数的三种方式

1.空函数:可以快速搭建框架,使项目架构清晰明了

# 购物车功能
def resgister():  # 注册功能
    pass
def login():  # 登录功能
    pass
def shopping():  # 购物功能
    pass
def pay():  # 支付功能
    pass
def tranfser():  # 充值功能
    pass

2.无参函数

def func():
    print('这是无参函数')

3.有参函数

def fun1(x,y,*args,**kwargs):
    print('这是有参函数')

2.命名关键字(了解)

命名关键字参数:在函数定义阶段,写在*和**可变长参数之间的形参

def func(x,y=1,*args,z=3,m,**kwargs):
    print(x,y)
    print(args)
    print(z,m)
    print(kwargs)
func(1,2,1,2,3,4,5,6,7,78,8,9,0,z=69,m=999,o=666999,l = 999666)

这个函数中,当我们给该函数形参传值时,z和m只能用关键字为他们传值

其中z和m就是命名关键字,不是默认值参数和位置参数

2.函数对象

函数是第一类对象:函数可以被当做数据传递

1.函数名可以被引用

def func(x):
    print(x)
print(func)  # 这是func这个函数所存的地址空间
print(id(func))  # 这个函数名的地址空间
f = func  # 把func这个函数名赋值给一个新的变量名
f(123456)  # 其实这个指向的就是func这个函数

2.函数名可以被当做参数传递给其他函数

def func():
    print('这是func')
def index(args):
    args()
    print(args)
    print('这是index')
# index(1)  # 不能被调用
index(func)

代码运行顺序

3.返回值可以是函数名

def func():
    print('这是func')
def index():
    print('这是index')
    return func  # 把函数名当做返回值
res = index()  # 将返回值赋值给res
print(res)  # 打印这个返回值
res()  # 加了括号之后就执行了函数体,相当于func()

4.函数名可以被当做容器类型的参数

def func():
    print('这是func')
l = [1,'2',3,func,func()]  # func()函数名加括号一旦遇到就直接执行函数体代码,所以会打印函数体内容
print(l)  # func是函数的地址空间,func()返回的值是None

3.函数的嵌套调用

在函数的内部嵌套其他函数,可以使复杂的逻辑简单化

如求两个数的大小

def my_max(x,y):
    if x > y:
        return x
    return y
print(my_max(52,65))

这时候需要求四个数的大小,就需要用到嵌套的方法

def my_max4(a,b,c,d):
    res = my_max(a,b)
    res1 = my_max(res,c)
    res2 = my_max(res1,d)
    return res2
res3 = my_max4(64,89,335,585)
print(res3)

在四个数求大小的函数里嵌套进两个数求大小,能简化逻辑与代码

 

4.函数的嵌套定义

一个函数能通过传参的不同控制函数执行不同的功能

def func():
    print('这是func')
    def index():
        print('这是index')
    return index
res = func()
res()

5.名称空间

什么是名称空间

  存放的是变量名和变量值的内存地址绑定关系的地方,想要访问变量值,必须先去名称空间拿到相应的名字,才能访问变量值

名称空间的分类

  1.内置名称空间:python解释器提前定义好的名字,已经存放在内置名称空间中了

    如:len,max,min,print

  2.全局名称空间:文件级别的代码

    如:x = 1 , if xxx:  y = 2  , while 1 :   z = 3,

    这里的x,y,z都存放在全局名称空间里

    if,while,for中创建的名字都会存放在全局名称空间内

  3.局部名称空间:函数体内创建的名字都属于局部名称空间

    在函数体内创建的

名称空间的生命周期

  1.内置名称空间:只要python解释器启动就立马创建  >>>  关闭python解释器内置名称空间就销毁

  2.全局名称空间:运行py文件是就会自动创建  >>>  py文件运行结束自动销毁

  3.局部名称空间:函数被调用的时候自动创建(动态创建)  >>>  函数指向结束自动销毁(动态销毁)

6.名称空间的查找顺序

用len做例子

len  # 这是内置名称空间  第一个len
print(len)
# len = '这是全局名称空间'  # 第二个len
def func():
    # len = '这是局部名称空间'  # 第三个len
    return len
print(len)  # 站在全局的位置找len会找全局名称空间的len
res = func()  # 运行函数体代码,站在局部的位置找len会找局部名称空间的len
print(res)

当三个名称空间内都有len,即三个len都没被注释时

当局部名称空间没有len时,即第三个len被注销时

当局部名称空间和全局名称空间都没有len时,即第二个和第三个len都被注销时

名字查找的顺序 :

  需要先确定当前查找时所在的位置

    1.站在全局:全局  >>>  内置

    2.站在局部:局部  >>>  全局  >>>  内置  

函数嵌套的名字查找顺序

x = 8
def func():
    print(x)
    def index():
        x = 10
        print(x)
    return index
x = 100
res = func()
res()

这里的执行顺序是这样的

 注意:

函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******)

7.作用域

全局作用域

  全局有效:内置名称空间  全局名称空间

局部作用域

  局部有效:局部名称空间

修改变量

  global:局部修改全局,如果想修改多个,逗号隔开

  nonlocal:局部修改局部,如果想修改多个,逗号隔开

 

局部修改全局

name = 'sxc'
age = 18
print(name, age)
def info():
    global name,age
    name = 'zzj'
    age = 19
    print(name,age)
info()

局部修改局部

def info1():
    username = 'sxc'
    pwd = 123
    print(username, pwd)
    def index():
        nonlocal username,pwd
        username = 'zzj'
        pwd = 'zzj123'
        print(username,pwd)
    index()
info1()

猜你喜欢

转载自www.cnblogs.com/sxchen/p/11165862.html