目录
  • 1、函数的作用
  • 2、定义函数
  • 3、函数的参数
    • 3.1 参数的默认值
    • 3.2 可变参数
  • 4、用模块管理函数
    • 4.1 示例代码module.py
  • 5、变量的作用域

    1、函数的作用

    编程大师martin fowler先生曾经说过:“代码有很多种坏味道,重复是最坏的一种! ”。

    可以将重复的功能封装到一个称之为“函数”的功能模块中,用来实现单一,或相关联功能的代码段。

    2、定义函数

    定义函数的规则如下所示:

    • 函数代码块以 def 关键词开头,后接函数名和圆括号 () 。
    • 函数名命名规则跟变量的命名规则是一致
    • return关键字用于退出函数,选择性地向调用方返回一个表达式。

    语法如下所示:

    def 函数名(参数列表):
        函数体
        return语句
    
    
    # 定义一个函数 往里面穿两个参数
    def sum(arg1, arg2):
        # 返回2个参数的和."
        total = arg1 + arg2
        return total
    
    
    # 调用sum函数
    sumnum = sum(10, 20)
    print(sumnum) // 30
    
    

    3、函数的参数

    除了定义函数和调用函数等基本操作之外,在函数中还可以使用参数。函数的参数简单的来说就是可以函数的函数体中使用的变量。与变量不同的是,这样的变量的是在函数体之前传递进去的。

    3.1 参数的默认值

    调用函数时,如果没有传递参数,则会使用默认参数。

    def printinfo(name, age=12):
        "打印任何传入的字符串"
        print("名字: ", name)
        print("年龄: ", age)
        return
    
    
    # 调用a函数
    printinfo(age=10, name="小红")
    print("------------------------")
    printinfo(name="小明")
    
    

    3.2 可变参数

    所谓可变参数指的是在调用函数时,可以向函数传入0个或任意多个参数。

    # 用星号表达式来表示stamp可以接收0个或任意多个参数
    def printinfo(*stamp):
    
        # 可变参数可以放在for循环中取出每个参数的值
        for i in stamp:
            print(i)
        return
    
    
    printinfo("一碗周")
    printinfo(1, 2, 3, 4, 5, 6, 7)
    printinfo("hello", "hi")
    
    

    4、用模块管理函数

    在同一个.py文件中如果有两个函数名是重名的,由于python没有函数重载的概念,那么后面的定义会覆盖之前的定义,也就意味着两个函数同名函数实际上只有一个是存在的。这个时候模块的作用就体现出来了。

    python中的每个文件就代表了一个模块(module),在不同的模块中可以有同名的函数,在使用某个函数的时候可以通过import关键字引入指定的模块就可以区分每个函数了。

    例:定义两个模块,分别为module1module2,然后测试引入流程

    module1

    def printinfo():
        print("这是第一个模块的printinfo函数")
    
    

    module2

    def printinfo():
        print("这是第二个模块的printinfo函数")
    
    

    使用import关键字直接引入:

    import module1
    import module2
    # 通过模块名加.函数名的方式引入
    module1.printinfo()
    module2.printinfo()
    
    

    使用import…as关键字重命名引入:

    import module1 as m1
    import module2 as m2
    # 可以通过重命名后的名字加.函数名的方式引入
    m1.printinfo()
    m2.printinfo()
    
    

    使用from…import…as关键字重命名引入某个函数:

    from module1 import printinfo as p1
    from module2 import printinfo as p2
    # 可以通过重命名后的名字加.函数名的方式引入
    p1()
    p2()
    
    
    • 值得注意的是:这里如果不使用as进行重命名的话,因为有两个printinfo就会导致错误,所以需要为其重命名

    __name__ == '__main__'的用法
    __name__python中一个隐含的变量它代表了模块的名字,如果直接打印__name__,则出现__main__。

    4.1 示例代码module.py

    def printinfo():
        print("这是函数内的内容")
    
    print(__name__)
    print("这是模块函数外的内容")
    

    输出结果:

    # __main__
    # 这是模块函数外的内容
    
    

    如果将module.py作为模块引入则打印的结果为模块的名称(不带路径、扩展名)
    示例代码

    import module

    输出结果:

    module
    这是模块函数外的内容

    此时输出的结果就不一样了,简单来说:在module.py自己眼中name就是main,然而在别的文件眼中name就是module

    module.py改造一下

    def printinfo():
        print("这是函数内的内容")
    
    printinfo()
    if __name__=="__main__":
        print(__name__)
        print("这是模块函数外的内容")
    
    

    输出结果:

    这是函数内的内容
    __main__
    这是模块函数外的内容

    当其他文件引入时

    import module

    输出结果:

    这是函数内的内容

    因为其他文件引入时不会执行模块中if条件成立时的代码 因为模块的名字是module而不是__main__

    __name__ == '__main__'在实际场景中非常有用,一般在写模块的过程中肯定要进行测试,在导入的时候肯定不能将测试结果也打印出来,如果删除了,想要改进模块的时候又要重新写一遍,这个时候__name__ == '__main__'就派上了用场

    5、变量的作用域

    请看如下代码:

    def test():
        b = "这是函数的变量"
    
        def test_nested():
            c = "这是嵌套的函数变量"
            print(a)
            print(b)
            print(c)
        test_nested()
    
    
    if __name__ == "__main__":
        a = "这是全局作用域"
        test()
    
    

    根据这段代码,来理解变量的作用域

    此时在函数test_nested体内调用a,b,c三个函数都不会报出任何错误,

    如果在函数体外调用b变量就会报出

    print(b)
    nameerror: name 'b' is not defined
    
    

    变量b未定义的错误,因为b属于局部变量,属于局部作用域,在函数体外是访问不到的

    如果在test函数体内调用c则会报出

    print(c)
    nameerror: name 'c' is not defined
    
    

    变量c未定义的错误,因为c是在test_nested函数体内,对于test函数来说属于局部作用域,但是对于test函数内部的test_nested函数来说,变量b属于嵌套作用域,在test_nested函数中我们是可以访问到它的。

    如果通过global来将b提升为全局变量,则在函数体外调用b变量就会正常打印

    nonlocal关键字只能作用于局部变量,且始终找离当前最近的上层局部作用域中的变量

    def outer():
        aa = 111
    
        def inner():
            nonlocal aa
            aa = 222
            print(aa)
        inner()
        print(aa)
    
    
    outer()
    
    

    如果没有这个nonlocal关键字则函数体inner打印222,函数体outer打印111,加上之后则直接打印两个222

    python查找一个变量时会按照“局部作用域”–>“嵌套作用域”–>“全局作用域”–>“内置作用域”的顺序进行搜索,所谓的“内置作用域”就是python内置的那些标识符,之前用过的inputprintint等都属于内置作用域。

    到此这篇关于python函及模块的使用的文章就介绍到这了,更多相关python函及模块使用内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!