【python-09】

python第9天

生成器
'''
# 生成器其本质为迭代器
# 关键字:yield
# 只要函数中加入yield就会变成生成器
# yield会暂停和返回值
# 序列类型,符串、列表、元组
# 是否可迭代,可以for循环输出试试,报错即不是
# 可迭代对象相较于普通对象多了一个__iter__的魔法方法
# 迭代器相较于可迭代对象多了一个__next__的魔法方法
# 赋值实质为对应类的实例化对象
# dir(对象即变量),展示其可使用的函数
'''
a = 5
b = [1,3,6,10,14]
c = iter(b) # 把可迭代对象转换为迭代器

next(c)
#|> 1
next(c)
#|> 3
next(c)
#|> 6
next(c)
#|> 10
next(c)
#|> 14


def func():
    print(1)
    yield 2
    print(3)
    yield 4
    print(5)
    yield 6
    print(7)


a = func()
next(a)
#|> 1
#|> 2
next(a)
#|> 3
#|> 4
next(a)
#|> 5
#|> 6
next(a)
#|> 7
#|> 报错StopIteration


'''
var = 1
var = var + 1
### 注意以下两种方式赋值的区别
### 赋值的三步流程
# 第一步:获取var的值
# 第二步:让var加1
# 第三步:把运算的结果赋值给var
# 交换值时,先交换,后复制,没有刷新内存
'''

a = 1;b = 2;a = b
b = a+b
a
#|> 2
b
#|> 4

a = 1
b = 2
a,b = b,a+b
a
#|> 2
b
#|> 3

def hh():
    print("哈哈哈")

a = hh  # 函数名实质为函数体,可以赋值
a()
#|> 哈哈哈

装饰器
'''
装饰器:
	作用:不修改对方代码的前提下,进行二次修改
	结构:闭包
	实质:嵌套函数
	特点:
		1、外层函数返回内层函数的函数名
		2、装饰器必须在被装饰函数上方
		3、把被装饰函数作为参数传给@符号后面的装饰器函数
	执行本质:
		1、把被装饰函数作为参数传给@符号后面的装饰器函数
		2、执行装饰器函数,并返回一个包装了原函数的函数;同时,改变原函数hh的指向,现在原函数指向了包装函数,**包装函数的实质是装饰器函数的内部函数**
		3、执行原函数其实是执行了包装后的函数
		4、如果还想实现原函数功能,就加回调
'''

def hh():
    print("测试中test测试中".center(60,"#"))


def checkhh():
    print("这是checkhh函数的调用")
    def check():
        print("正在检查权限")
    return check


test = checkhh()  # 实质为test = check
#|> 这是checkhh函数的调用
test
#|> <function checkhh.<locals>.check at 0x000001C636014940>
test()
#|> 正在检查权限


def hh():
    print("测试中test测试中".center(60,"#"))


def checkhh(func): # func = hh
    print("这是checkhh函数的调用")
    def check():
        print("正在检查权限")
        func()  # hh(),即回调
    return check


test = checkhh(hh)  # 实质为test = check
#|> 这是checkhh函数的调用
test
#|> <function checkhh.<locals>.check at 0x0000014E5E674940>
test()
#|> 正在检查权限
#|> #########################测试中test测试中#########################

#### 真正的装饰器
def checkhh(func): # func = hh
    print("这是checkhh函数的调用")
    def check():
        print("正在检查权限")
        func()  # hh()
    return check

@checkhh
def hh():
    print("测试中test测试中".center(60,"#"))

#|> 这是checkhh函数的调用
hh
#|> <function checkhh.<locals>.check at 0x000001CB7FA64940>
hh()
#|> 正在检查权限
#|> #########################测试中test测试中#########################

def checkhh(func): # func = hh
    print("这是checkhh函数的调用")
    def check(*args,**kwargs):
        print("正在检查权限")
        return func(*args,**kwargs)  # hh()
    return check


@checkhh
def adpr(a,b):
    return a+b
#|> 这是checkhh函数的调用
adpr(2,3)
#|> 正在检查权限
#|> 5
异常
try:
    # 可能会报错的代码块
    a = int(input("请输入数字:"))
except:
    # 报错才会执行的代码块
    print("这里出现错误了")
else:
    # 不报错才会执行的代码块
    print("输入正确")
finally:
    # 不管会不会报错都会执行的代码块
    print("程序结束了")


#########    第一次执行    #########    
#|> 请输入数字:ads
#|> 这里出现错误了
#|> 程序结束了

#########    第一次执行    #########
#|> 请输入数字:123
#|> 输入正确
#|> 程序结束了

try:
    # 可能会报错的代码块
    a = int(input("请输入数字:"))
except Exception as e:
    # 报错才会执行的代码块
    print("错误信息:",e)
else:
    # 不报错才会执行的代码块
    print("输入正确")
finally:
    # 不管会不会报错都会执行的代码块
    print("程序结束了")


#|> 请输入数字:ads
#|> 错误信息: invalid literal for int() with base 10: 'ads'
#|> 程序结束了


'''
# assert 1==2 #和if类型,但不同的是如果为假,会报错,主要用于测试
# 判断为False的情况:False,None,"",'',0,空数据类型[],{},(),set()
'''

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值