zoukankan      html  css  js  c++  java
  • 函数(二)

    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

  • 相关阅读:
    Eclipse 导入项目乱码问题(中文乱码)
    sql中视图视图的作用
    Java基础-super关键字与this关键字
    Android LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的参数理解
    Android View和ViewGroup
    工厂方法模式(java 设计模式)
    设计模式(java) 单例模式 单例类
    eclipse乱码解决方法
    No resource found that matches the given name 'Theme.AppCompat.Light 的完美解决方案
    【转】使用 Eclipse 调试 Java 程序的 10 个技巧
  • 原文地址:https://www.cnblogs.com/sxchen/p/11165862.html
Copyright © 2011-2022 走看看