Python函数的认识

一、函数

  简述:函数指的是具有特定功能的语句组通过调用函数使用语句组的功能,使用函数是因为程序本身结构性差、可读性差、可扩展性差、代码冗余通过函数可以减少代码的重复使程序模块化。

二、函数的分类

  1、内置函数(Python解释器内部为方便我们使用为我们内置的一些具有简单功能的函数)

  2、自定义函数(Python解释器为我们内置的函数功能简单无法满足我们的使用这就需要我们自定义函数的功能来方便我们以后的使用,这就是自定义函数)

三、函数的组成及定义与调用方式

  函数的组成:

      def 函数名(参数):

        """

        语句组

        """

      注意:函数在定义阶段不执行代码,在定义阶段只检测语法。

  函数的定义方式:

    1、有参函数:必须被传参,可用于统计。

      def f1(x,y):
        return x+y

      f1(1,2)

    2、无参函数:只用于不需要最终结果的用途如:打印

      def f1():
        print("hello world")

      f1()

    3、空函数:设计函数

      def f1():

        pass

      f1()

  函数的调用方式:

    1、语句形式

      def f1():

        print("hello world")

      f1()

    2、表达形式

      def f1(x,y):
        return x+y

      f1(1,2)

    3、能够被当做另一个函数的参数

      def f1():

        return "liuze"

      def f2(name):

        return name+"qiang"

      print(f2(f1()))

  return的理解:

    return无值时函数返回None、

    return有一个值就返回一个值、

    return返回多个值时以元组形式返回

四、函数对象

  1、函数能够当做返回值

    

def age():
    return "liuze"
def f1():
    return age()+"qiang"
print(f1())

  2、能够被引用

def age():
    return "liuze"
def f1():
    return b
b=age()
print(f1())

  3、能够当做另一个函数的参数

def age():
    return "liuze"
def f1(name):
    return name+"qiang"
print(f1(age()))

  4、能够当做容器的元素

def age():
    return "liuzeqiang"
name=[]
name.append(age())
print(name)

补充:可以优雅的取缔if多分支

def age():
    print("liuzeqiang")

def name():
    print("qiang")

dict_name={
    "age":age,
    "name":name,
    }
while True:
    name=input("请输入你的选择:").strip()
    if name in dict_name.keys():
        dict_name[name]()
        break
View Code

五、名称空间

  简述:名称空间指的是用来存放名字与内存地址绑定关系的地方

  分为:

    内置名称空间:用来存放Python解释器内名字的地方

    全局名称空间:用来存放文件级别上名字的地方

    局部名称空间:用来存放函数上的名字的地方

  加载顺序以及生存周期:

    内置名称空间:在Python解释器启动后加载内置名称空间,Python解释器启动结束后失效

    全局名称空间:在执行test.py文件时加载全局名称空间在执行完test.py文件后失效

    局部名称空间:在调用函数时加载局部名称空间在函数调用结束后失效

  查找顺序:从当前位置开始查找(当前位置:局部--》全局---》内置)

六、作用域

  简述:作用域分为:全局作用域(全局存活、全局有效)、局部作用域(局部存活、局部临时有效)。

七、闭包函数

  简述:一个函数内部的函数对其外部函数变量的应用,使用闭包函数的意义在于函数返回的函数对象不管在什么位置调用都会优先执行本身的语法。

  global:用于函数内部的同名变量能够修改全局变量的值,并且修改后后的变量id与使用global前面的变量id不同。

  nonlocal:用于函数内部的同名的局部变量能够修改其他局部变量的变量值,修改后的变量id与之前的变量id不同。

查看名称空间的方法:globals(全局)、locals(局部)、builtins(内置)、enclosing(外部函数的名称)

八、装饰器

  简述:在遵循封闭开放原则的基础上对被装饰的对象添加新功能。

  封闭开放原则:对修改源文件的内容和源文件的调用方式封闭,对被装饰的对象添加新功能。

  语法糖:@,在执行到@即装饰器时将被装饰的对象的内存地址当作装饰器的参数,当装饰器得到结果后将结果返回给被装饰的对象。

  多个装饰器:检测由下往上,执行又由上往下。

  组成:

    有参装饰器:

def auth(driver='file'):
                    def auth2(func):
                        def wrapper(*args,**kwargs):
                            name=input("user: ")
                            pwd=input("pwd: ")

                            if driver == 'file':
                                if name == 'egon' and pwd == '123':
                                    print('login successful')
                                    res=func(*args,**kwargs)
                                    return res
                            elif driver == 'ldap':
                                print('ldap')
                        return wrapper
                    return auth2

                @auth(driver='file')
                def foo(name):
                    print(name)

                foo('egon')

    无参装饰器:

          import time
                def timmer(func):
                    def wrapper(*args,**kwargs):
                        start_time=time.time()
                        res=func(*args,**kwargs)
                        stop_time=time.time()
                        print('run time is %s' %(stop_time-start_time))
                        return res
                    return wrapper

                @timmer #foo=timmer(foo)  
                def foo():
                    time.sleep(3)
                    print('from foo')
                foo()

    

原文地址:https://www.cnblogs.com/ageliu/p/12335929.html