• 函数(二)


    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()

     10

  • 相关阅读:
    javascript中数据类型转换那些事
    CSS布局奇淫技巧之高度自适应
    用innerHTML插入html代码中有样式表时需注意的地方
    详解ASP.NET Core API 的Get和Post请求使用方式
    Speex 一个开源的声学回声消除器(Acoustic Echo Cancellation)(转)
    c# int byte转换
    Linux操作系统内核源码目录结构详解
    Linux/Ubuntu sudo不用输入密码的方法
    DirectX简介
    在VC工程中添加多语言支持
  • 原文地址:https://www.cnblogs.com/sxchen/p/11165862.html
Copyright © 2020-2023  润新知