函数知识总结

一、函数参数

函数的参数按位置顺序传递

#Example
x = '全局变量'
def example(a,b='2b',*c,**d):
    y = '实参'
    print('所有参数:', a, b, c, d, y)
    return print('已执行函数')

example('1a','2B','3c',**{'4d':'1234'},one = 'first')

执行结果:

所有参数: 1a 2B ('3c',) {'4d': '1234', 'one': 'first'} 实参
已执行函数

形参变量:只在被调用时分配到内存单元,调用结束后释放,只在函数内部有效。如:a,b,c,d

实参:已确定的变量,在函数调用时必须先赋值。 如:变量x,y

默认参数:在写函数时指定该参数的默认值,但只能放在形参的最后。 如:b

关键参数:不按照顺序传递参数时,可在调用时指定参数名传递参数,但不可重复传递。

非固定参数(元组型):把多传递的参数变成元组的形式存放。 如:*c

非固定参数(字典型):把有对应键和值的参数以字典的形式存放。 如:**d

函数返回值:函数执行时遇到return语句会停止执行并返回return后的语句,没有则为None。

全局变量:函数外部定义的变量。如:x 在函数内部调用时可用global x在函数内部修改。

局部变量:函数内部定义的变量。如:y

作用域:global操作可在函数内部修改全局变量。

二、高阶函数

1、匿名函数

example = lambda x,y:x**y 
example(2,4)

执行结果

2**4
结果为16

2、高阶函数

  1.接受一个或多个函数作为输入

  2.return返回另一个函数

3、递归

  在一个函数内部调用自身

def calc(n):
    print(n)
    if int(n/2) == 0:
        return n
    return calc(int(n/2))

递归的特性:

  1.必须有一个明确的结束条件

  2.每次进入深一层的递归时,问题规模相比上一次递归都应有所减少

  3.递归效率不高,递归层次过多会导致栈溢出。

4、函数进阶

1.名称空间

  locals:函数内的名称空间,包括局部变量和形参

  globals:全局变量函数定义所在模块的名称空间

  builtins:内置模块的名称空间

2.作用域

  全局范围:全局存活,全局有效

  局部范围:临时存放,局部有效

  查看作用域方法 globals()、locals()

5、闭包和装饰器

闭包:函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问他们所在的外部函数中声明的所有局部变量、参数。当其中一个这样的内部函数在包含它们的外部函数之外被调用,就会形成闭包。

def outer(fuc):
    name = 'abc'
    def inner():
        print('打印外层函数的变量',name)
     fuc()
return inner f = outer() f()

闭包的意义:返回的函数对象不仅仅是一个函数对象,在该函数外还包裹了一层作用域,使得该函数无论在何处调用,优先使用自己外层包裹的作用域。

 三、生成器&迭代器

1、列表生成式

b = [i + 1 for i in range(10)]
print(b)

2、生成器

 在Python中,这种一边循环一边计算的机制,称为生成器:generator。

1.将列表生成式的[ ] 改为 ()

2.在函数中插入yield关键字

g = (x * x for x in range(10))
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

yield既可以中断并返回该值,也可以用send传递参数给该生成器。

def test1():
    while True:
        name = yield
        print('我的名字叫%s'%(name))

for i  in name:
    te = test1()
    te.__next__()  # 生成器必须先运行后才可用send传入参数。
    te.send(i)

我的名字叫a
我的名字叫b
我的名字叫c
我的名字叫d

生成器可以用for循环或__next__()调用生成下一个值。

3、迭代器

可以直接作用于for循环的对象成为可迭代对象:Iterable。可以用isinstan()判断一个对象是否是Iterable。

主要包括:集合数据类型如list、tuple、dict、set、str,生成器generator。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

生成器都是Iterator,但list、tuple、dict、set、str虽然是可迭代对象但并不是迭代器。但可以用iter()函数变成迭代器。

猜你喜欢

转载自www.cnblogs.com/llh372084423/p/10221457.html