zoukankan      html  css  js  c++  java
  • 函数基础

    函数的作用:

    1.减少重复代码
    2.使程序可以扩展
    3.使程序变得易维护

    1.定义函数

    定义空函数
    定义无参函数
    定义有参函数

    python中函数定义方法:
    def test(x):
        "The function definitions"
        x+=1
        return x
    
    def:定义函数的关键字
    test:函数名
    ():内可定义形参
    "":文档描述(非必要,但是强烈建议为你的函数添加描述信息)
    x+=1:泛指代码块或程序处理逻辑
    return:定义返回值
    

    # **2.调用函数**
    def bar(x,y):
        z = x + y
        return z
        
    res = bar(1,2)    # 有参函数调用
    res = bar(1,2)*10    # 函数调用为表达式形式
    res = bar(bar(1,2),3)    # 函数调用为另一个函数的参数
    

    # **3.函数的返回值**

    返回值数=0:返回None
    返回值数=1:返回object
    返回值数>1:返回tuple

    4.函数的参数

    def calc(x,y):  # 形参
        res = x**y
        return res
    c = calc(a,b)   # 实参
    print(c)
    

    ##**形参** **形参**变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,**形参只在函数内部有效**。函数调用结束返回主调用函数后则不能再使用该形参变量
    **位置参数和默认参数:**
    必须传值的参数是位置参数
    默认参数,把常用的参数定义时赋值。
    **位置参数必须放在默认参数的前面**

    ##**实参**
    **实参**可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
    **实参传值**
    1.按照位置传值
    `res = function(1,2)` 2.按照关键字传值
    `res = function(x=1,y=2)` 3.混合使用
    `res = function(1,y=2)` **混合使用时,位置传值必须在关键字传值的前面
    一个形参只能赋值一次**
    #**5.*arg和**kwargs** **按位置传值时,多余的值会给*进行处理,存成元祖** **按关键字传值时,多余的值会给**处理** ``` def foo(*args): print(args) foo(1, 2, 3, 4, 5, 6, 7, 8, 9) # 函数返回(1, 2, 3, 4, 5, 6, 7, 8, 9) ```
    # 位置传值求和
    def my_sum(*nums):
        res = 0
        for i in nums:
            res += i
        return res
    z = my_sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    print(z) # z = 55
    

    传递*args和**kwargs时

    def foo(*args, **kwargs):
        print(args)
        print(kwargs)
    foo(1, 2, 3, a=1, b=2, c=3)
    # 返回值
    # (1, 2, 3)
    # {'b': 2, 'a': 1, 'c': 3}
    

    6.函数的名称空间和作用域

    内置名称空间
    全局名称空间
    局部名称空间<br
    找变量名或者函数名时,先到局部名称空间中寻找,再到全局名称空间中寻找,最后到内置名称空间中找。

    注意:全局的局部名称空间就是全局名称空间

    def func():
        y = 1
        print("全局:",globals())  #  全局: {'func': <func at 0x00E856F0>,'x': 1}
        print("局部:",locals())   # 局部:{'y': 1}
    x = 1
    func()
    a = globals() # 此时a 和 b 相等,全局的局部就是全局
    b = locals()  
    

    在全局中查看局部和全局名称空间一样

    7.函数的嵌套

    嵌套调用

    # 函数的嵌套调用
    def my_max(x,y):
        res = x if x > y else y
        return res
    
    
    def my_max4(a, b, c, d):
        res1 = my_max(a, b)
        res2 = my_max(res1, c)
        res3 = my_max(res2, d)
        return res3
    
    a = my_max(10,1)
    print(a)
    print(my_max4(23, 123, 43, 12))
    

    嵌套定义

    # 嵌套定义
    x = 0
    def f1(x):
        print("--->f1",x)
        def f2():
            print("-->f2", x)
            def f3():
                print("->f3",x)
            f3()
        f2()
    
    f1(5) # 执行函数f1,依次执行f2,f3,嵌套时也必须遵守先定义后使用
    

    8.函数对象与闭包

    函数的闭包
    函数嵌套定义中,内部函数的代码包含对外部作用域的引用,且不是对全局作用域的引用,就叫函数的闭包。

    # 函数的闭包
    x = 1111
    def f1(x):
        y = 1
        z = 3
        def f2():
            print(x, y, z)
        return f2
    f = f1(333)
    x = 1234
    f()
    print(f.__closure__) #查看函数是否有闭包,None没有闭包,打印内存地址则存在闭包
    print(f.__closure__[0].cell_contents) 
    print(f.__closure__[2].cell_contents)
    
    # 333 1 3
    # (<cell at 0x01105BF0: int object at 0x010F6EC0>, <cell at   #0x011BC550: int object at 0x1D535910>, <cell at 0x011BC570: int # object at 0x1D535930>)
    # 333
    # 3
    




    把函数当对象使用

    函数名存放的是函数的内存地址,可以把函数名存在字典或列表中,直接加()调用。

    # 函数当作对象来使用
    def search():
        print("----search----")
    
    
    def add():
        print("----add----")
    
    
    def modify():
        print("----modify----")
        
    
    def delete():
        print("----delete----")
        
    
    def menu():
        msg="""
        search
        add
        modify
        delete
        """
        print(msg)
    
    
    cmd_dict = {
        "search": search,
        "add": add,
        "modify": modify,
        "delete": delete
    }
    while True:
        menu()
        choice = input("请输入操作的内容")
        cmd_dict[choice]()      # 执行函数
    
  • 相关阅读:
    [导入]C#中将字符串转成 Base64 编码
    [导入]GridView中实现并列排名的例子
    VB.net编程中可能用到的边边角角(二) —— 取Mac地址、取某String的MD5值、多线程、RAR压缩、ADOX生成数据库、加载工程内的Form、一个滚动条控制两个DataGridView
    (转)Setup Factory 打包工具部分功能代码解析
    (转)SQL 优化原则
    VB.net编程中可能用到的边边角角(一) —— 反射添加Form、向Excel中写值
    自写的简单屏蔽特定字符的TextBox和数字TextBox
    spring import resource 文件后bean找不到问题解决
    mysql插入记录后获取插入数据的id值
    cookie+memcached实现单点登陆
  • 原文地址:https://www.cnblogs.com/zouruncheng/p/6678938.html
Copyright © 2011-2022 走看看