zoukankan      html  css  js  c++  java
  • re模块拾遗和递归函数

    一、re模块拾遗

    • split:以匹配的字符为截短(加上分组可以显示分组内容)

      import re
      ret = re.split('d+','alex222wusir')
      print(ret)
      # 输出
      ['alex', 'wusir']
      ----------------------------------------
      import re
      # 加上分组会显示分组的内容
      ret = re.split('d(d)d', 'alex123wusir')
      print(ret)
      # 输出
      ['alex', '2', 'wusir']
    • sub('匹配需要替换内容表达式','替换的新内容',替换次数):替换匹配到的内容

      import re
      ret = re.sub('d+','HH','aa33bb44cc')
      print(ret)
      # 输出
      aaHHbbHHcc
      --------------------------------------
      import re
      ret = re.sub('d+','HH','aa33bb44cc',1) # 替换1次
      print(ret)
      # 输出
      aaHHbb44cc
    • subn:和sub一样,不过以元组的形式返回替换之后的的内容和替换的次数

      import re
      ret = re.subn('d+','H','aa33bb44cc')
      print(ret)
      # 输出
      ('aaHbbHcc', 2)
    • match:在表达式之前默认加了个 ^ 元字符(匹配以什么开头)

      import re
      # 表达式相当于='^d+'匹配任意一个或多个数字开头的字符
      ret = re.match('d+','1234abcd567')  
      print(ret.group())
      # 输出
      1234
    • compile:节省代码时间的工具,没有重复使用同一个正则,也不能节省时间。

      • 假如同一个正则表达式要被多次使用

      • 节省了多次解析同一个正则表达式的时间

      import re
      ret = re.compile('d+')
      res1 = ret.search('abcd1234')
      res2 = ret.findall('abcd1234')
      print(res1)
      print(res2)
      # 输出
      <re.Match object; span=(4, 8), match='1234'>
      ['1234']
    • finditer:返回的是一个迭代器,为了节省空间

      import re
      ret = re.finditer('d+','agks1ak018093')
      print(ret)              # 是一个迭代器
      for i in ret:           # 把匹配出来的结果循环出来,节省了空间的占用
          print(i.group())
      # 输出
      <callable_iterator object at 0x00000204E6721E20>
      1
      018093

    二、分组命名

    • 标准格式

      (?P<组名>正则表达式)
    • 有的时候我们要匹配的内容是包含在不想要的内容之中的

      • 只能先把不想要的内容匹配出来,然后再想办法从结果中去掉

    import re
    exp = '2014-9-23和1999-04-30'
    ret = re.search(r"[1-9]d{3}-(?P<month>[1][0-2]|0?[1-9])-(?P<date>[[1-2][0-9]|[3][01]|0?[1-9])", exp)
    ​
    print(ret.group())
    print(ret.group('month'))
    print(ret.group('date'))
    # 输出
    2014-9-23
    9
    23

    三、递归函数

    递归的最大深度是1000层:为了节省内存空间,不要让用户无限使用内存空间

    每次递归会新开辟一个临时名称空间随着函数的结束而清除,而递归函数是自己调用自己,就会不断的重复开辟新空间占用内存,而又不结束之前的空间。

    count = 0
    def func():
        global count
        count += 1
        print(count)
        func()
    func()
    1. 递归要尽量控制次数,如果需要很多层递归才能解决问题,不适合用递归解决

    2. 循环和递归的关系

      • 递归不是万能的

      • 递归比起循环来说更占内存

    3. 修改递归的最大深度

      import sys
      sys.setrecursionlimit(100000)       # 修改递归深度,会根据电脑的性能来做适当的结束

    一个递归函数要想结束,必须在函数内写一个return,并且return的条件必须是一个可达到的条件 并不是函数中有return,return的结果就一定能够在调用函数的外层接收到

    函数的每层调用自己到为递,结束后的返回值为归

    def func(count):
        count += 1
        print(count)
        if count == 5 : return 5        # 结束递归的条件
        ret = func(count)               
        print(count ,':',ret)
        return ret                      # 在每次结束后把这次的返回值给上一层函数
    print('-->',func(1))                
    # 输出
    2       # 第一层未结束在调用自身       -->递
    3       # 第二层未结束在调用自身       -->递
    4       # 第三层未结束在调用自身       -->递
    5       # 第四层条件满足,并把 5 返回给第三层并结束第四层的函数                      -->归
    4 : 5   # 第三层,并把返回的值返回给上一层函数并结束第三层函数, 5 为第四层函数的返回值  -->归
    3 : 5   # 第二层,把第三层返回的值在返回给第一层并结束                              -->归
    2 : 5   # 第一层,获取第二层的返回值并返回给调用者                                 -->归
    --> 5

    四、递归函数练习

    1. 计算阶乘

      def factorial(count):
          if count == 1:
              return count
          return factorial(count-1) * count
    2. os模块:查看一个文件夹下的所有文件,这个文件夹下面还有文件夹,不能用walk

      import os
      ​
      c = os.path.dirname(__file__)  # 当前文件父目录 练习
      def show_file(path):
          name_lst = os.listdir(path)
          for name in name_lst:
              abs_path = os.path.join(path, name)
              if os.path.isfile(abs_path):
                  print(name)
              elif os.path.isdir(abs_path):
                  show_file(abs_path)
      ​
      show_file(c)
    3. 计算斐波那契数列第10个数:1 1 2 3 5 8 13 21 34 55

      def bonacci_sequence(count):
          if count == 1 or count ==2:
              return 1
          else:
              return bonacci_sequence(count-1)+bonacci_sequence(count-2)
      ​
      print(bonacci_sequence(10))
      # 输出
      55
    4. 三级菜单 可能是n级

      menu = {
          '北京': {
              '海淀': {
                  '五道口': {
                      'soho': {},
                      '网易': {},
                      'google': {}
                  },
                  '中关村': {
                      '爱奇艺': {},
                      '汽车之家': {},
                      'youku': {},
                  },
                  '上地': {
                      '百度': {},
                  },
              },
              '昌平': {
                  '沙河': {
                      '老男孩': {},
                      '北航': {},
                  },
                  '天通苑': {},
                  '回龙观': {},
              },
              '朝阳': {},
              '东城': {},
          },
          '上海': {
              '闵行': {
                  "人民广场": {
                      '炸鸡店': {}
                  }
              },
              '闸北': {
                  '火车战': {
                      '携程': {}
                  }
              },
              '浦东': {},
          },
          '山东': {},
      }
      def threeLM(dic):
          while True:
              for k in dic: print(k)
              key = input('input>>').strip()
              if key == 'b' or key == 'q':
                  return key
              elif key in dic.keys() and dic[key]:
                  ret = threeLM(dic[key])
                  if ret == 'q': return 'q'
      ​
      threeLM(menu)
    学习之旅
  • 相关阅读:
    Android开发四大组件--Activity详解
    <base target="_blank"/>
    MVC EF异常-“序列化类型为 XX 的对象时检测到循环引用”
    错误:[将截断字符串或二进制数据。 语句已终止。]
    EasyUI queryParams属性 在请求远程数据同时给action方法传参
    存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。
    easyui DateTimeBox 取值
    [转载]再次谈谈easyui datagrid 的数据加载
    EasyUI datagrid 改变url属性 实现动态加载数据
    在js中获取easyui datagrid的数据
  • 原文地址:https://www.cnblogs.com/XiaoYang-sir/p/14714877.html
Copyright © 2011-2022 走看看