有参装饰器和迭代器/生成器作业

本文探讨如何使用装饰器在Python中实现动态标记功能,如`@tag`装饰器根据参数调整返回值格式,并展示了一个模拟斗地主发牌过程的代码实例。同时,介绍了如何根据运算符改变函数返回值的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 写一个装饰器@tag要求满足如下功能:

    def tag(name):
        def tag_(func):
            def new_func(*args,**kwargs):
                result=func(*args,**kwargs)
                if type(result) != str:
                	return f'<{name}>{result}</{name}>'
                return result
            return new_func
        return tag_
    
    
    @tag(name='p')
    def render(text):
        # 执行其他操作
        return text
    
    
    @tag(name='div')
    def render2():
        return 'abc'
    
    
    print(render('Hello'))  # 打印出: <p>Hello</p>
    print(render2())  # 打印出: <div>abc</div>
    
  2. 为函数写一个装饰器,根据参数不同做不同操作。

    '''
    flag为 True,则 让原函数执行后返回值加 100,并返回。
    flag为 False,则 让原函数执行后返回值减 100,并返回。
    '''
    def change(flag):
        def change_(func):
            def new_func(*args,**kwargs):
                result = func(*args, **kwargs)
                if type(result) in (int,float)l:
                    if flag :
                        return result+100
                    else:
                        return result-100
                return result
            return new_func
        return change_
    
    @change(True)
    def _():
        return 10
    result_=_()
    print(result_)
    
  3. 为函数写一个装饰器,根据不同的运算符和数据对原函数的返回值进行相应的数值操作

    '''例如:
    运算符是+,数据是 100, 就对原函数的返回值进行加100的处理
    运算符是-, 数据是 20,就对原函数的返回值进行减20的处理
    运算符是*, 数据是 3, 就对原函数的返回值进行乘3的处理
    运算符是/, 数据是 2, 就对原函数的返回值进行除2的处理
    其他情况的符号不做处理'''
    def change(operator:str,num):
        def change_(func):
            def new_func(*args,**kwargs):
                result = func(*args, **kwargs)
                if type(reult) not in (int,float):
                	return result
                if operator =='+':
                    return result+num
                elif operator == '-':
                    return result - num
                elif operator =='/':
                    return result/num
                elif operator =='*':
                    return result*num
                else:
                	return result
            return new_func
        return change_
    
    @change('+',10)
    def _():
        return 10
    result_=_()
    print(result_)
    
    
  4. 写一个斗地主发牌器


num_board = {2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A'}
board_w = {'大王', '小王'}
flower_color = {'梅花', '黑桃', '方块', '红桃'}


def deal_cards():
    # 准备一副牌
    # 洗牌(打乱顺序)(集合是无序的,可以放在集合里,也可以导入模块,调用shuffle函数打乱)
    boards = {f"{j}{i}" for i in num_board for j in flower_color}
    boards =iter( board_w | boards)
    # 发牌
    player1=[]
    player2=[]
    player3=[]
    for _ in range(17):
        player1.append(next(boards))
        player2.append(next(boards))
        player3.append(next(boards))
        
    # 返回分配好的4组牌
    return f'player1:{player1}, player2:{player2}, player3:{player3},地主牌:{list(boards)}'

print(deal_cards())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值