day_14 函数的定义 函数的三种定义方式 函数的调用 函数的返回值 函数的参数 可变长参数 函数对象 函数嵌套 名称空间与作用域 闭包函数 装饰器 迭代器 三元表达式 列表推导式 字典生成式 生成器表达式 生成器 递归 匿名函数 内置函数 面向过程编程

def 函数名():
    pass

函数的三种定义方式

空函数

def func():
    pass

有参函数

def func(args):
    pass

无参函数

def func():
    pass

函数的调用

函数名()

函数的返回值

  1. return 可以返回值
  2. return 可以终止函数
  3. return 可以返回多个值,用元组返回

函数的参数

形参

位置形参

从左到右依次接收位置实参

默认形参

具有默认值;它必须放在位置形参后面

实参

位置实参

从左到右依次传值给位置形参

关键字实参

按照形参名传值;它必须放在位置实参后面

可变长参数

*

*形参:接收多余的位置实参,用元组接收

*实参:打散可迭代对象,当作位置实参传给形参

**

**形参:接收多余的关键字实参,用字典接收

**实参:打散字典,当作关键字实参传给形参

def func(*args,**kwargs): # 接收所有多余的参数
    pass

函数对象

def func():
    pass

引用

f1 = func

容器类元素

lt = [func]

函数的返回值

def f2():
    return func

f3 = f2()

函数的参数

def f2(func):
    pass

f2(func)

函数嵌套

def f1():
    def f2():
        pass

名称空间与作用域

内置名称空间

内置函数

全局名称空间

除了内置和局部都是全局

局部名称空间

函数内部的

执行顺序

内置 --》 全局 --》 局部

搜索顺序

从当前开始 局部 -》 全局 -》 内置

全局作用域

全局的x和局部的x没有半毛钱关系

x = 1

def f1():
    x = 3

f1()
print(x)

局部作用域

局部1x和局部2的x没有半毛钱关系

def f1():
    x = 1
    def f2():
        x = 3
        
def f3():
    x = 4

global

x = 1

def f1():
    global x  # 让下面的x变成全局的x
    x = 3

f1()
print(x)

nonlocal

def f1():
    x = 1
    def f2():
        nonlocal x
        x = 3
        
def f3():
    x = 4

可变数据类型会打破作用域关系

闭包函数

def a(x):
    
    def b():
        print(x)
    return b

c = a(100)
x = 20
c()

装饰器

  1. 本质就是函数
  2. 不修改源代码
  3. 不改变调用方式

二层装饰器

import time

def index(x):
    
	return 123

def time_count(func):

    def wrapper(*args,**kwargs):
        start = time.time()
        res = func(*args,**kwargs)
        end = time.time()
        print(end - start)
        
        return res
       
    return wrapper
    
index = time_count(index)
res = index(10)  # wrapper()

两层装饰器模板

def deco(func):
    def wrapper(*args,**kwargs):
        res = func(*args,**kwargs)
        return res
    return wrapper

@deco
def index():
    pass

三层装饰器

def sanceng(x):
    def deco(func):
        def wrapper(*args,**kwargs):
            res = func(*args,**kwargs)
            return res
        return wrapper
    return deco

@sanceng(10)
def index():
    pass

迭代器

可迭代对象

含有iter方法 --》除了数字

迭代器对象

含有iter和next方法的 --》 文件

三元表达式

列表推导式

字典生成式

生成器表达式

g = (i for i in range(10))

print(next(g)) # g.__next__()

生成器

含有yield的函数

yield

  1. 暂停函数
  2. 一个next可以拿到一个yield的值

递归

函数调用函数本身;有退出条件

count = 0
def a():
    global count
    print(count)
    count += 1
    if count == 100:
        return 
    a()

递归能干的事情,绝大多数能用循环代替

匿名函数

lambda 参数:返回值

与max/min/filter/map/sorted/sum

内置函数

enumerate 获取索引+值

面向过程编程

类似与流水线