day12-三大神器和递归元素

总结

  • 迭代器

    • 什么是迭代器( iter)

    •   '''
        迭代器是个容器类型数据(序列) 迭代器无法直接获取所有元素,也无法统计所有元素的个数
        获取迭代器的元素会导致在各个元素从迭代器中消失.(元素取一个少一个)
        
        '''
      
    •   # 2)创建迭代器
        # 创建迭代器的两种方法:1)将其他序列转换成迭代器
                            2) 创建迭代
      
    •   # 3) 迭代器的操作     -   获取迭代器中的元素
        # 1)   获取单个元素,next(迭代器)
        
        
        # 2) 遍历     -  for x in  (itre):
        					print(x)
      
  • 生成器

    •   '''
        生成器从获取数据和保存特点来看,就是迭代器
        生成器保存数据的本质不是保存数据的本身,而是保存产生数据的算法
        
        '''
      
    • 创建生成器

      •   """
          调用带有yield关键字的函数就可以得到一个生成器。
          调用带有yield关键字的函数的时候不会执行函数体,也不会获取函数返回值,只是单纯的创建一个生成器(函数中yield放在哪儿没有关系)。
          """
        
    • 确定生成器的元素 - 生成器可以创造的数据

      •   """
          一个生成器能产生多个数据就看这个生成器对应的函数,执行完函数会遇到几次yield。
          每次遇到yield的时候yield后面的数据就是产生的数据
          """
        
    • 生成器产生数据的原理

      •   """
          当通过生成器对象获取元素(不管以什么样的方式获取)的时候,系统会自动执行生成器对应的函数,执行函数的时候不会直接将整个函数执行完,
          而且每次在执行yield的时候就会停下来,并且将yield后面的数据作为结果返回。
          下次再获取元素的是从上次结束的位置开始执行。
          """
        
  • 装饰器

    • 什么是装饰器

      •   """
          装饰器 = 实参高阶函数 + 返回值高阶函数 + 糖语法  (装饰器的本质是函数)
          作用:给已经定义好的函数添加功能
          """
        
    • 无参装饰器的实现方法

      •   """
          装饰器的工作原理:将需要添加功能的函数传给装饰器,装饰器创建一个保留原函数功能并且添加新功能的一个新的函数,
                         将添加完功能的新函数返回,最后用新的函数替换原来的函数。
                         
          装饰器的套路:
          def 函数名1(参数1: function):
              def 函数名2(*args, **kwargs):
                  添加新的功能
                  result = 参数1(*args, **kwargs)
                  return result
              return 函数2
          
          
          函数名1   -  装饰器功能对应的名字
          参数1     -  类型是function, 指向需要添加功能的原函数,习惯命名成:fn
          函数名2    -  指向添加完功能的新函数, 习惯命名成:new_fn
          
          
          def 装饰器名(fn):
              def new_fn(*args, **kwargs):
                  新功能
                  result = fn(*args, **kwargs)   # 调用原函数
                  return result
              return new_fn
          """
        
  • 递归函数

    •   '''
        在定义函数的时候调用函数本身,这种函数就是递归函数
        理论上,循环能做的事情递归都可以做。(能循环实现就不要用递归)
        注意:使用递归解决循环问题的时候,内存和cpu的消耗会随着循环次数的增加而不断增加
        '''
      
    • 使用递归的套路

      •   """
          第一步:找临界值,在临界值的位置结束函数
          第二步:找关系,找上一次循环结束的结果和当次循环结束的结果的关系(f(n))和f(n-1)的关系)
          第三步:假设函数功能已经实现,通过关系用f(n-1)实现f(n)的功能
          """
        

作业

  1. 为函数写一个装饰器,在函数执行之后输出 after

    def message_1(fn):
        def new_fn(*args, **kwargs):
            result = fn(*args, **kwargs)
            print('after')
            return result
        return new_fn
    
  2. 为函数写一个装饰器,把函数的返回值 乘2再返回值

    def add_num_2(fn):
        def new_fn(*args, **kwargs):
    
            result = fn(*args, **kwargs)
            return result * 2
    
        return new_fn
    
  3. 写一个装饰器@tag要求满足如下功能:

def tag(fn):
    def new_fn(*args, **kwargs):
        result = fn(*args, **kwargs)
        return f'<p>{result}</p>'
    return new_fn


@tag
def render(text):
    # 执行其他操作
    return text

@tag
def render2():
    return 'abc'

print(render('Hello'))   # 打印出: <p>Hello</p>
print(render2())     # 打印出: <p>abc</p>
  1. 写一个创建一副扑克牌的生成器。

    def poker():
        for x in ['A','2','3','4','5','6','7','8','9','10','j','Q','K']:
            for y in ['方块','梅花','红桃','黑桃']:
                yield f'{x}{y}'
            yield f'big joker'
            yield f'litter joker'
    
    result = poker()
    set1 = set()
    set1.update(result)
    
    
    
    print(set1)
    print(len(set1))
    
  2. 使用递归函数画出以下图形:

    n = 5
    *****
    ****
    ***
    **
    *
    
    
    n = 4
    ****
    ***
    **
    *
    def star(n):
        if n > 1:
            print(n*'*')
            star(n-1)
        else:
            print('*')
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值