你的好朋友 Marta 最近得到了梦寐以求的工作,在当地一家历史博物馆的藏品部门工作。 他们知道你热爱编程,便向你倾诉了工作中遇到的一个难题:博物馆即将举办一场关于计算机历史的展览。 当地一所大学的数学系捐赠了几箱历史打印资料,但考虑到这些文件保存状况很差,大家决定把上面的文本数字化。 不过,那所大学的旧打印机在表示文本的方式上有一些古怪之处,你的朋友需要你的帮助才能顺利提取出数据。
光学字符识别(OCR)是一种把文本图像转换成机器可读文本的软件。
给定一个由字符组成的网格,表示若干个数字,请把这个网格转换成由数字组成的字符串。
如果网格包含多行单元格,输出中的各行之间应该用","分隔。
"|")、下划线("_")和空格(" ")绘制。"?"。下面的输入(不含注释)会被转换成"1234567890"。
_ _ _ _ _ _ _ _ #
| _| _||_||_ |_ ||_||_|| | # Decimal numbers.
||_ _| | _||_| ||_| _||_| #
# The fourth line is always blank,
下面的输入会被转换成"123,456,789"。
_ _
| _| _|
||_ _|
_ _
|_||_ |_
| _||_|
_ _ _
||_||_|
||_| _|
有时需要抛出异常。这时,你应当始终附上有意义的错误信息,指明错误的来源。这让代码更易读,也大大有助于调试。如果你知道错误来源一定是某种类型,可以选择抛出某个内置错误类型,但仍然要附上有意义的信息。
本练习要求你在 convert() 函数收到不是合法 OCR 数字的字符串时,用 raise 语句“抛出”一个 ValueError。只有既 raise 这个 exception,又附上信息,测试才会通过。
要抛出带信息的 ValueError,把这条信息写成 exception 类型的参数:
# when the rows aren't multiples of 4
raise ValueError("Number of input lines is not a multiple of four")
# when the columns aren't multiples of 3
raise ValueError("Number of input columns is not a multiple of three")