今天在项目中碰到一个序号标题的需求,即为文档生成标题序号,中文标题序号倒还好,需求如下:
每个文档中对标题序列的需求都是不同的,即文档中标题的数量不固定,这个文档中的标题可能有百来个,另外文档的标题数量可能有300个,这些标题的序号需要依次生成,标题的层级也不固定,有些文档需求一级到三级标题,而有些需求一级到四级标题。
和序号倒也还好,可以穷举,顶多花点时间来写,和要是穷举的话,那就吓人了,那绝对不是人干的事。
思来想去,这事肯定得写个小算法来解决,想起了python内置库中有个强大的,内部有个方法,它大概可以实现这样的功能:
接收一个可迭代对象,实例是一个生成器对象,当然也是一个可迭代对喜爱那个,循环调用实例的方法时会依次一个实参中的元素。众所周知,一般的生成器迭代殆尽时触发异常,但不会,虽然没看源码(关键是看不懂),但我推测,内部首先构建了一个无尽生成器,当参数被迭代殆尽触发时,捕捉到之后调用无尽生成器对象,再初始化一个入参的生成器对象。
的这个特性完全满足上面的标题序列生成的需求。打算先从最简单的入手,实验代码如下:
二级标题序列的实现
标题序列最高为10,实现的需求
调用方法:
每执行一次上面的方法,就会一次返回序列,实现从的需求。入参决定了序列能达到的限度,入参为10,标题序列组高也只能到10。
三级标题序列的实现
有了的经验,要实现的需求就容易多了,无非多套一层循环,如下:
调用方法与如出一辙。
四级标题序列的实现
如法炮制,再套一层循环
虽然有点不美观,而且套了4层循环,但考虑到这已经实现了需求,那。。。就算了吧。
最后把四个实现封装起来,每个级别的标题调用对应的封装,而且生成器对象按需取,无需循环一次取出来,还能记得住四个级别标题各自取到什么序号了。
如果要求的标题序号是中文呢?那就把数字和中文序号做个映射就好了。
领取专属 10元无门槛券
私享最新 技术干货