函数

一.函数优点

二.函数分类

三.函数定义

四.函数定义的三种形式

五.函数的返回值

六.函数参数详解

七.函数对象

八.函数嵌套

九.名称空间和作用域

十.闭包函数

十一.装饰器

一.函数优点

#函数的优点:
1.减少代码的冗余
2.是代码结构更加的清晰
3.方便功能的扩展、便于维护

二.函数分类

#函数的分类:
1.内置函数
Python解释器已经为我们定义好的,开箱即用的函数。例如,max,len,sum...
2.自定义函数
用户自己通过自定义创建的函数,更多的是一种定制化的函数

三.函数定义

定义函数的三种形式:
1.无参数函数:一般都是一些简单的交互或者打印,不需要进一步的处理。
2.有参函数:一般需要传入参数,然后在代码逻辑里边进行进一步的处理。
3.空函数:使用pass站位。

#1.无参函数:
def foo():
    print('from foo')

foo()

#2.有参函数:
def foo(x,y):
    print(x + y)

foo(1,2)

#3.空函数:用于展示程序的体系结构。
def foo():
    pass


#函数的三种调用形式
1.直接加括号调用:foo()
2.在表达式中调用:3*len('你好')
3.作为另外一个函数的参数形式的调用:range(len('hello'))
'''
定义,调用

四.函数定义的三种形式

定义函数的三种形式:
1.无参数函数:一般都是一些简单的交互或者打印,不需要进一步的处理。
2.有参函数:一般需要传入参数,然后在代码逻辑里边进行进一步的处理。
3.空函数:使用pass站位。

#1.无参函数:
def foo():
    print('from foo')

foo()

#2.有参函数:
def foo(x,y):
    print(x + y)

foo(1,2)

#3.空函数:用于展示程序的体系结构。
def foo():
    pass
    
View Code

五.函数的返回值

#函数的返回值:return
1.无返回值:无返回值的函数默认也是有返回值的,为:None
2.一个返回值,返回一个值。
3.多个返回值,返回多个值,多个值之间用逗号分隔,返回的结果是个元组。

六.函数参数详解

'''
#函数的参数:
形参:形参就是变量名,在定义函数的时候出现的参数。
实参:实参就是变量值,在函数调用的时间对应传入的参数。

形参:位置参数,默认参数。
实参:位置参数,关键字参数。


位置参数:
    形参位置参数:必须被传值,一个不能多,一个不能少。
    实参位置参数:按照位置给形参传值。

默认参数:
    可以传值,可以不传值。
    默认参数必须放到位置参数后边
    通常默认参数必须定义为不可变参数。

关键字参数:实参中 key = values的形式。
    1.必须放到位置参数右边
    2.不需要按照位置给形参传值。
    3.对同一个形参不能重复传值。



可变长参数:实参的个数不固定
指形参可以接收来自实参的不定个数的参数
*args用于接收溢出的位置参数
**kwargs 用于接收溢出的关键字参数
例如:
#== == == == == =*args == == == == == =


def foo(x, y, *args):#形参位置的*args中的'*'号会接收多余的位置参数并放入元组然后赋值给args,args=(3,4,5)
    print(x, y)
    print(args)


foo(1, 2, 3, 4, 5)


def foo(x, y, *args):
    print(x, y)
    print(args)


foo(1, 2, *[3, 4, 5])#实参中的"*"号会先打散所有元素,变成一般的位置参数,变成(1,2,3,4,5)


def foo(x, y, z):
    print(x, y, z)


foo(*[1, 2, 3])

#== == == == == = ** kwargs == == == == == =


def foo(x, y, **kwargs):#形参中的"**"会接收溢出的关键字参数并转换成字典形式,然后赋值给kwargs.变成了(x,y,{a:1,b:2,c:3})
    print(x, y)
    print(kwargs)


foo(1, y=2, a=1, b=2, c=3)


def foo(x, y, **kwargs):
    print(x, y)
    print(kwargs)


foo(1, y=2, **{'a': 1, 'b': 2, 'c': 3})#实参中的"**"号会首先打散后边的字典,变成一般的关键字参数。


def foo(x, y, z):
    print(x, y, z)


foo(**{'z': 1, 'x': 2, 'y': 3})

#== == == == == =*args + ** kwargs == == == == == =


def foo(x, y):
    print(x, y)


def wrapper(*args, **kwargs):
    print('====>')
    foo(*args, **kwargs)
    
注意:对于上边的这用嵌套函数,两次函数中都用到了*args, **kwargs,这样的话,就相当于把外边传过来的参数原封不动的传给内部参数。

'''
参数详解

七.函数对象

函数是一种对象,可以用以下几种方式来使用:
#1 可以被引用
#2 可以当作参数传递
#3 返回值可以是函数
#3 可以当作容器类型的元素

八.函数嵌套

#函数的嵌套:
1.函数的嵌套定义
def foo():
    print('from foo')
    def bar():
        print('from inner bar')
2.函数的嵌套调用
def max(x,y):
    return x if x > y else y

def max4(a,b,c,d):
    res1=max(a,b)
    res2=max(res1,c)
    res3=max(res2,d)
    return res3
print(max4(1,2,3,4))

九.名称空间和作用域

名称空间定义:
存放名字的地方,x = 1,x是存放到名称空间的,存放的是x和1的绑定关系

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

名称空间的查找顺序:
局部名称空间--->全局名称空间--->内置名称空间
#需要注意的是:在全局无法查看局部的,在局部可以查看全局的
作用域:
#1、作用域即范围
        - 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效
      - 局部范围(局部名称空间属于该范围):临时存活,局部有效
#2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下
x=1
def f1():
    def f2():
        print(x)
    return f2
x=100
def f3(func):
    x=2
    func()
x=10000
f3(f1())

#3、查看作用域:globals(),locals()


LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
locals 是函数内的名字空间,包括局部变量和形参
enclosing 外部嵌套函数的名字空间(闭包中常见)
globals 全局变量,函数定义所在模块的名字空间
builtins 内置模块的名字空间
 

十.闭包函数

 

posted @ 2018-04-22 19:41  grape_lee  阅读(118)  评论(0编辑  收藏  举报