zoukankan      html  css  js  c++  java
  • 函数

    如何自定义函数?

    def 函数名(参数1,参数2,参数3,...):
        '''注释'''
        函数体
        return 返回的值
    

    1. 函数名:使用该函数的依据

    2. 函数体:完成功能的代码块

    3. 返回值:功能完成的反馈结果

    4. 参数:完成功能需要的条件信息

    函数使用的原则:先定义,再调用 

    函数即“变量”,“变量”必须先定义后引用。未定义而直接引用函数,就相当于在引用一个不存在的变量名
    #定义阶段
    def foo():
        print('from foo')
        bar()
    def bar():
        print('from bar')
    #调用阶段
    foo()
    
    结论:函数的使用,必须遵循原则:先定义,后调用
    我们在使用函数时,一定要明确地区分定义阶段和调用阶段

    函数在定义阶段
    只检测语法,不执行代码
    也就说,语法错误在函数定义阶段就会检测出来,而代码的逻辑错误只有在执行时才会知道

    定义函数的三种形式
    1、无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印
    2、有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值
    3、空函数:设计代码结构

    #定义阶段
    def tell_tag(tag,n): #有参数
        print(tag*n)
    
    def tell_msg(): #无参数
        print('hello world')
    
    #调用阶段
    tell_tag('*',12)
    tell_msg()
    tell_tag('*',12)
    
    '''
    ************
    hello world
    ************
    '''
    
    #结论:
    #1、定义时无参,意味着调用时也无需传入参数
    #2、定义时有参,意味着调用时则必须传入参数
    

     调用函数

    函数的调用:函数名加括号
    1 先找到名字
    2 根据名字调用代码

    函数的返回值
    无return->None
    return 1个值->返回1个值
    return 逗号分隔多个值->元组
    什么时候该有返回值?
        调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
        通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
    什么时候不需要有返回值?
        调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值
        通常无参函数不需要有返回值

    函数的参数

    实参:调用函数,在括号内传入的实际值,值可以为常量,变量,表达式或三者的组合

    形参:定义函数,在括号内声明的变量名,用来接收外界传来的值

    位置实参:不用明确形参名的传参方式,一定按照位置给形参传值

    位置形参可以由 位置实参 与 关键字实参来传值

    函数对象

    函数是第一类对象,即函数可以当作数据传递

    可以被引用

    可以当作参数传递

    返回值可以是函数

    可以当作容器类型的元素

    def foo():
        print('foo')
    
    def bar():
        print('bar')
    
    dic={
        'foo':foo,
        'bar':bar,
    }
    while True:
        choice=input('>>: ').strip()
        if choice in dic:
            dic[choice]()                                                                     

     名称空间与作用域

    名称空间是指存放名字的地方

    名称空间的加载顺序

    #1、python解释器先启动,因而首先加载的是:内置名称空间
    #2、执行test.py文件,然后以文件为基础,加载全局名称空间
    #3、在执行文件的过程中如果调用函数,则临时产生局部名称空间

    名字的查找顺序
    局部名称空间--->全局名称空间--->内置名称空间
    # max=1
    def f1():
        # max=2
        def f2():
            # max=3
            print(max)
        f2()
    f1()
    print(max) 
    

    作用域

    作用域即范围
            - 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效
          - 局部范围(局部名称空间属于该范围):临时存活,局部有效
    x=1
    def f1():
        def f2():
            print(x)
        return f2
    x=100
    def f3(func):
        x=2
        func()
    x=10000
    f3(f1())
    
    LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
    locals 是函数内的名字空间,包括局部变量和形参
    enclosing 外部嵌套函数的名字空间(闭包中常见)
    globals 全局变量,函数定义所在模块的名字空间
    builtins 内置模块的名字空间



    闭包函数
    闭包函数是
    内部函数包含对外部作用域而非全局作用域的引用
     def counter():
                n=0
                def incr():
                    nonlocal n
                    x=n
                    n+=1
                    return x
                return incr
    
            c=counter()
            print(c())
            print(c())
            print(c())
            print(c.__closure__[0].cell_contents) #查看闭包的元素
    
    闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
     from urllib.request import urlopen
    
        def index(url):
            def get():
                return urlopen(url).read()
            return get
    
        baidu=index('http://www.baidu.com')
        print(baidu().decode('utf-8'))
    

     

    装饰器

    装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能

    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
    

     装饰器语法

    被装饰函数的正上方,单独一行
            @deco1
            @deco2
            @deco3
            def foo():
                pass
    
            foo=deco1(deco2(deco3(foo)))
    

      wrap

    from functools import wraps
    
    def deco(func):
        @wraps(func) #加在最内层函数正上方
        def wrapper(*args,**kwargs):
            return func(*args,**kwargs)
        return wrapper
    
    @deco
    def index():
        '''哈哈哈哈'''
        print('from index')
    
    print(index.__doc__)
    
     

     

     
    
    
  • 相关阅读:
    ExecuteScalar requires the command to have a transaction when the connection assigned to the command is in a pending
    如何从vss中分离程序
    String or binary data would be truncated
    the pop3 service failed to retrieve authentication type and cannot continue
    The POP3 service failed to start because
    IIS Error he system cannot find the file specified _找不到页面
    pku2575Jolly Jumpers
    pku2940Wine Trading in Gergovia
    pku3219二项式系数
    pku1029false coin
  • 原文地址:https://www.cnblogs.com/legend27/p/11032491.html
Copyright © 2011-2022 走看看