上节课课堂回顾

函数对象

函数名就是变量名

a = 1

def func():
    print('from func')

print(func)  # 函数名等同于变量名

b = a  # 1

f = func
f()  # func()

可变长参数

# 做形参
# def func(x, *args, a=1):  # *args接收多余的位置实参,并且用元组的形式存储
#     print(x, a)
#     print('args:', args)
#
#
# func(1, 2, 3)  # 1,1
#
#
# def func(x, a=1, **kwargs):  # **kwargs接收多余的关键字实参,并且以字典的形式存储了
#     print(x, a)
#     print('kwargs:', kwargs)
#
#
# func(1, y=1)  # 1,1


# 实参

# def func(x,y,z):
#     print(x,y,z)
#
# func(*(1,2,3))  # *(1,2,3)就是把元组打散成位置实参传给对应的位置形参


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


func(**{'x': 1, 'y': 2, 'z': 3})  # **{'x': 1, 'y': 2, 'z': 3}把字典打散成关键字实参x=1,y=2,z=3,传给对应的位置形参

名称空间与作用域

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

作用域:

内置和全局 --》 全局作用域

局部 --> 局部作用域

  1. 全局作用域的(x=1)和局部作用域的(x=3)没有关系
x = 1

def func():
    x = 3
func()

print(x)  # 1
  1. 局部作用域1(x=1) 和 局部作用域2 中的(x=3)没有关系
def f1():
    x = 1
    def f2():
        x = 3

    f2()
    print(x)

f1()  # 1

闭包函数

把函数A和变量x 包在一个函数B内部, 然后通过函数B的返回值 把函数A和变量x 共同返回出来

x = 1


def f1():
    print(x)


x = 2
f1()


# 如果不使用闭包,可能出现这种情况,全局变量的变化会影响函数值


# def f2():
#     x = 100
#
#     def f1():
#         print(x)
#
#     return f1
#
# x = 2
#
# f = f2()  # f = f1  # 不受外界变量的影响了
# # print(f'f.__closure__[0].cell_contents: {f.__closure__[0].cell_contents}')  # 闭包函数f的闭包元素
# f()  # f1()


def f2(x):

    def f1():
        print(x)

    return f1

x = 2

f_100 = f2(100)  # f = f1  # 不受外界变量的影响了
f_100()  # f1()
f_100()  # f1()
f_100()  # f1()

f_200 = f2(200)
f_200()
f_200()
f_200()
f_200()

装饰器

# 装饰器:装饰的一个函数,写装饰器就是写函数,装饰一个函数

# 1. 被装饰的函数不能改变其调用方式
# 2. 被装饰的函数不能改变其源代码

import time





# start = time.time()
# index()
# end = time.time()
# print(end - start)


# 装饰器
# def index():
#     start = time.time()
#     index()
#     end = time.time()
#     print(end - start)

# 完整的两层装饰器, 三层装饰器就是给两层加参数
def sanceng(engine):
    def outter(func):
        def wrapper(*args, **kwargs):  # 形参
            if engine == 'file':
                start = time.time()
                res = func(*args, **kwargs)  # 原始的index  # 实参
                end = time.time()
                print(end - start)

                return res
            elif engine == 'db':
                res = func(*args, **kwargs)
                return res

        return wrapper
    return outter

@sanceng('file')
def index(x):
    print(x)
    print('from index')

    return 123
# outter = sanceng('db')  # outter = outter
# index = outter(index)  # index = wrapper
index(1)  # wrapper()



# 装饰器:装饰的一个函数,写装饰器就是写函数,装饰一个函数

# 1. 被装饰的函数不能改变其调用方式
# 2. 被装饰的函数不能改变其源代码

import time





# start = time.time()
# index()
# end = time.time()
# print(end - start)


# 装饰器
# def index():
#     start = time.time()
#     index()
#     end = time.time()
#     print(end - start)

# 完整的两层装饰器, 三层装饰器就是给两层加参数
def sanceng(engine):
    def outter(func):
        def wrapper(*args, **kwargs):  # 形参
            if engine == 'file':
                start = time.time()
                res = func(*args, **kwargs)  # 原始的index  # 实参
                end = time.time()
                print(end - start)

                return res
            elif engine == 'db':
                res = func(*args, **kwargs)
                return res

        return wrapper
    return outter

@sanceng('file')
def index(x):
    print(x)
    print('from index')
    

    return 123
# outter = sanceng('db')  # outter = outter
# index = outter(index)  # index = wrapper
index(1)  # wrapper()



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

@outter
def index(x):
    print('from index')

def sanceng(engine):
    def outter(func):
        def wrapper(*args, **kwargs):
            res = func(*args, **kwargs)
            return res
    
        return wrapper
    return outter

@sanceng('file')
def index(x):
    print('from index')


迭代器

# 含有__iter__方法的对象叫做可迭代对象,可迭代对象不一定是迭代器对象
# 含有__iter__和__next__方法的对象叫做迭代器对象,迭代器对象一定是可迭代对象


for i in lt:
	print(i)
	
1. 把lt变成迭代器对象
2. 用__next__方法迭代取值
3. 遇到StopItera异常捕捉异常中断while循环


# 不依赖索引迭代取值
posted @ 2026-01-24 13:55  Fart*  阅读(1)  评论(0)    收藏  举报