Python项目学习一:项目一:自动添加标签--再次实现

背景:调试"在次实现"的代码时,费了1天半的时间;一方面,是代码缩进有问题;另一方面,是书中给的代码有问题。下面,把调试后的代码,粘贴出来,供参考。

思考:学习项目,一方面是成功运行代码;一方面是根据项目用到的技术,回顾知识点,加强记忆。

注意:为了调试代码之间的调用关系,我在代码中加了很多print函数,方便查看调用信息。

书中原始内容,请自行去看电子书、纸质书,或者留言,我给你大家。

说明:test_input.txt、util.py在初次实现中,已提供,这里就不在添加。

(初次实现:https://blog.csdn.net/weixin_42163563/article/details/103235891

class Handler:

    def callback(self, prefix, name, *args):
        method = getattr(self, prefix + name, None)
        if callable(method):
            # print("调用callable为True")
            return method(*args)

    def start(self, name):
        self.callback('start_', name)

    def end(self, name):
        self.callback('end_', name)

    def sub(self, name):
        def substitution(match):
            result = self.callback('sub_', name, match)
            if result is None:
                match.group(0)
                return result

        return substitution


class HTMLRenderer(Handler):

    def start_document(self):
        print('<html><head><title>...</title></head><body>')

    def end_document(self):
        print('</body></html>')

    def end_paragraph(self):
        print('</p>')

    def start_heading(self):
        print('<h2>')

    def end_heading(self):
        print('</h2>')

    def start_list(self):
        print('<ul>')

    def end_list(self):
        print('</ul>')

    def start_listitem(self):
        print('<li>')

    def end_listitem(self):
        print('</li>')

    def start_title(self):
        print('<h1>')

    def end_title(self):
        print('</h1>')

    def sub_emphasis(self, match):
        return '<em>{}</em>'.format(match.group(1))

    def sub_url(self, match):
        return '<a href="{}">{}</a>'.format(match.group(1), match.group(1))

    def sub_mail(self, match):
        return '<a href="mailto:{}">{}</a>'.format(match.group(1), match.group(1))

    def feed(self, data):
        print(data)
class Rule:

    def action(self, block, handler):
        handler.start(self.type)
        handler.feed(block)
        handler.end(self.type)
        return True


class HeadingRule(Rule):
    type = 'heading'

    def condition(self, block):
        return not '\n' in block and len(block) <= 70 and not block[-1] == ':'


class TitleRule(HeadingRule):
    type = 'title'
    first = True

    def condition(self, block):
        if not self.first:
            return False
        self.first = False
        # print("调用HeadingRule.condition方法,返回值:")
        # print(HeadingRule.condition(self, block))
        return HeadingRule.condition(self, block)


class ListItemRule(Rule):
    type = 'listitem'

    def condition(self, block):
        # print("调用ListItemRule condition方法")
        return block[0] == '-'

    def action(self, block, handler):
        handler.start(self.type)
        handler.feed(block[1:].strip())
        handler.end(self.type)
        return True


class ListRule(ListItemRule):
    type = 'list'
    inside = False

    def condition(self, block):
        # print("调用ListRule condition")
        return True

    def action(self, block, handler):
        # print("打印ListItemRule.condition:")
        # print(ListItemRule.condition(self, block))
        if not self.inside and ListItemRule.condition(self, block):
            # print("调用ListRule action方法")
            handler.start(self.type)
            self.inside = True
        elif self.inside and not ListItemRule.condition(self, block):
            handler.end(self.type)
            self.inside = False
        return False


class ParagraphRule(Rule):
    type = 'paragraph'

    def condition(self, block):
        return True

 

import re
import sys

from handlers import *
from rules import *
from util import *


class Parser:

    def __init__(self, handler):
        # print("调用Parser方法")
        self.handler = handler
        self.rules = []
        self.filters = []

    def addRule(self, rule):
        # print("调用addRule方法")
        self.rules.append(rule)

        # print(self.rules)

    def addFilter(self, pattern, name):
        #  print("调用addFilter方法1")

        def filter(block, handler):
            #   print("调用addFilter方法")
            return re.sub(pattern, handler.sub(name), block)

        self.filters.append(filter)

        # print(self.filters)

    def parse(self, file):
        # print("调用parse函数")
        self.handler.start('document')
        # print("调用handler start方法")
        for block in blocks(file):
            # print("调用blocks方法")
            for filter in self.filters:
                # print("调用filter方法")
                block = filter(block, self.handler)
                for rule in self.rules:
                    if rule.condition(block):
                        #  print("调用rule方法")
                        last = rule.action(block, self.handler)
                        # print("last begin:")
                        # print(last)
                        # print("last end:")
                        if last:
                            break
                if last:
                    break

        self.handler.end('document')


class BasicTextParser(Parser):

    def __init__(self, handler):
        # print("调用BasicTextParser构造方法")
        Parser.__init__(self, handler)
        self.addRule(ListRule())
        self.addRule(ListItemRule())
        self.addRule(TitleRule())
        # self.addRule(HeadingRule())
        self.addRule(ParagraphRule())

        self.addFilter(r'\*(.+?)\*', 'emphasis')
        self.addFilter(r'(http://[\.a-zA-Z/]+)', 'url')
        self.addFilter(r'([\.a-zA-Z]+@[\.a-zA-Z]+[a-zA-Z]+)', 'mail')


handler = HTMLRenderer()
parser = BasicTextParser(handler)

parser.parse(open("test_input.txt", "r+"))
# parser.parse(sys.stdin)

 PyCharm控制台输出:

上述结果,保存为html文件,浏览器打开如下:

 代码改进的地方:

 

重复显示的结果如下:

 

至此,再次实现项目完成,代码供参考。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python 是一种脚本语言,广泛应用于各类编程和数据分析任务。在机器学习和人工智能领域,Python 也是一门常用的编程语言。基于 Python 的 gym-carracing 是 OpenAI Gym 的一个环境,用于模拟汽车驾驶场景。 这个自动驾驶项目的目标是让计算机通过机器学习算法来自动驾驶模拟的汽车。首先,我们需要安装 gym-carracing 环境及其相关依赖库。然后,我们可以使用强化学习算法,比如深度强化学习算法(如深度 Q 网络),训练一个智能驾驶代理程序。 在训练过程中,代理程序会不断与环境进行交互,获取当前的观测状态,然后根据某种策略选择一个动作作为响应。之后,代理程序会根据环境给予的反馈来调整自己的策略和动作选择,以逐步提升驾驶技能。 在 gym-carracing 环境中,汽车会在一个虚拟的赛道上行驶,玩家需要使用方向键控制汽车的转向,以应对各种道路和弯道情况。在自动驾驶项目中,我们的目标是通过训练智能代理程序,使它能够自动控制汽车,适应不同的道路和驾驶情景,并以高效、安全的方式行驶。 该项目的难点在于设计和实现一个合适的驾驶策略,并通过强化学习算法不断优化代理程序的决策能力。为了取得好的效果,我们可能需要进行大量的训练和参数调整,并结合一些技巧和经验,优化代理程序的性能。 总而言之,Python 和 gym-carracing 提供了一个有趣且实用的平台,可用于开发自动驾驶项目。通过合理的算法和大量的训练,我们希望能够训练出一个高效、智能的驾驶代理程序,使其能够在模拟环境中完成自动驾驶任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖哥真不错

您的鼓励,将是我最大的坚持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值