第一讲 吟诗作句(续)
第一讲 吟诗作句(续)
由于内容较多,故“第一讲 吟诗作句”分几次写。本次内容接续上一篇第二部分,接着介绍Python语言的相关功能。
我们在上一篇写了一个不到10行的小程序,由两个字符串:<五绝>和<回文>和一个函数:吟句()构成。字符串<回文>实际上是利用索引方法将<五绝>中的字符序列倒置而成。现在让我们看一下:
首先启动python3的互动环境,然后调入我们程序
>>> from yinshi import *
这里的星号表示调用yinshi程序包中所有的内容。这里所谓的程序包其实就是我们在文本编辑器中写入的内容,Python通常以一个扩展名为”.py”的文件为一个单位,英文称作module,中文通常叫做程序包。
调入程序包之后,我们上次写的程序就被调入到计算机内存中,所以我们可以用字符串、函数的名称调用,引用。
>>> 回文
'花艳舞风流雾香迷月薄霞淡雨红幽树芳飞雪落'
为了和<五绝>的内容进行比较,我们把<五绝>的内容也引用进来
>>> 五绝
'落雪飞芳树幽红雨淡霞薄月迷香雾流风舞艳花'
对比一下,<回文>果然是<五绝>的回文诗。回文诗是中国古代文人创造的一种文字游戏,其中包含了许多语言学和文学的智慧。什么样的语言结构可以成为回文诗?这是语言学中一个非常有趣的话题,我们会在以后探讨。
我们上次写的那个吟句函数,其基本原理就是<五绝>字符串作为词汇表,然后从任意一个位置开始取后面连续5个字符串。现在我们再来看一下这个程序:
#/usr/bin/env python3
五绝 = '落雪飞芳树幽红雨淡霞薄月迷香雾流风舞艳花'
回文 = 五绝[::-1] # 回文是将原<五绝>字符顺序倒置
def 吟句(l):
"""
导入随机数生成函数,通过随机数,
从<五绝>中随机取五个连续字符,连字成诗
"""
from random import randint
length = len(五绝)
start = randint(0, length)
print(五绝[start:start+l])
"""
程序到此为
"""
现在我们以<回文>作为词汇表,看看吟句函数能否产生新的‘诗句’。我们所要做的很简单,就是把函数中所有出现<五绝>的地方用<回文>代替即可。修改的地方有两处:
length = len(回文)
print(回文[start:start+5])
由于<回文>的长度和<五绝>一样,所以改或不改没有实质影响,只是读程序时让人感觉很难理解。改完以后,保存源文件,然后在互动环境中重新调入
from yinshi import *
如果重新调入不起作用,可以用下列表达式
>>> exec(open(‘yinshi.py’).read())
从英文单词就可知道,这个表达式的意思是:打开‘yinshi.py’,将其内容读入然后运行。
>>> 吟句()
淡雨红幽树
>>> 吟句()
幽树芳飞雪
>>> 吟句()
迷月薄霞淡
如果将上面的‘诗句’与<回文>相比较就可以看出上面每一句都是回文字符串的一部分,这样的字符串,我们称之为【子字符串】,或简称【子串】。字符串和子串之间的关系与集合和子集合的关系一样,都是包含和被包含的关系,而空字符串是任意字符串的字串,一个字符串如果长度为n,那么该字符串共包含2的n次方个子串,例如我们的‘诗句’有五个字符,所以一共包含32个子串。通常,给定字符串求某个子串是字符串的基本操作之一。Python中我们使用索引方法获得子串。和字符串一样,如果有需要子串也可以赋予名称。遗憾的是,我们现在这个程序还无法直接给生成的子串命名。为什么,看一下就知道了:
我们希望当引用“吟句()”函数时,这个函数可以返回所生成的‘诗句’,这个返回的‘诗句’作为一个“值”使得我们可以命名。按照这个思路,我们先试试,看看问题出在哪里:
>>> 诗句 = 吟句()
霞淡雨红幽
>>>
这些我们期望<诗句>就是‘淡霞雨红幽’的名称,我们来试试
>>> 诗句
>>>
<诗句>没有返回任何内容。如果没有内容,名称<诗句>代表什么呢?
>>> print(诗句)
None
我们得到一个特殊的值:None。注意,None并不是字符串,也不是名称,就是前面所说,一个特殊的值。我们可以验证一下:
>>> None == ‘None’
False
这里的双等号我们称之【谓词】,包含【谓词】的表达式,通常都会返回真假值,如果双等号两边的内容相等,则返回True,否则返回False,前者为真,后者为假。所以,上面的表达式的意思是:None是否等于‘None’,互动环境返回的值是False。True、False和None一样都是特殊的值,而不是英文单词——字符串。“值”的意思是,它们和1,2,3等数字一样只能是某个名称的内容。这里举个例子,假定我们正在填一张身份调查表:
>>> 姓名 = '张三'
>>> 年龄 = 32
>>> 身高 = 1.72
>>> 婚否 = True
在这个调查表中,等号左面都是名称,右面都是值,我们可以看到,值可以有各种类型,姓名属于字符串类型,年龄是整数,身高是实数,而婚否则是真假值。因此在给定名称后,我们还需知道名称所代表的值的类型。如何知道呢?Python提供一个特殊的函数type()可以帮助我们判断名称的类型:
>>> type(姓名)
<class 'str'>
>>> type(年龄)
<class 'int'>
>>> type(身高)
<class 'float'>
>>> type(婚否)
<class 'bool'>
当使用type()函数时,我们在括号中填入要进行判断的名称,这个函数就会返回关于这个名称的类型信息,从给出的信息来看,尖括号右侧给出了这些名称所代表的类型:
str: 是字符串类型,这种类型由双引号、或单引号括入任何符号,str是string的简写
int: 是整数类型,这种类型包括正整数、0和负整数,int是integer的简写
float: 是实数类型,这种类型包括小数、分数。需要注意的是5.0和5虽然值相同,但是类型不同,前者是整数类型,后者是实数类型。对此我们仍然可以用type()判断:
>>> type(5.0)
<class 'float'>
>>> type(5)
<class 'int'>
float是floating point number:浮点数的简写,是大部分计算机对实数的称呼,至于为什么请自行百度、google。
bool: 称作布尔类型,这种类型只包括两个值:True和False,表示“真”与“假”。
通常Python并不要求你明确规定数据类型,因为Python本身有一套“类型推理”(type inference)机制,这个机制可以从用户给定的值来推断类型。
至于上面提到的None,它的类型是什么呢?
>>> type(None)
<class 'NoneType'>
所以,None的类型是NoneType,现在我们在判断<诗句的类型>
>>> type(诗句)
<class 'NoneType'>
>>>
说明<诗句>的值是None,而类型是NoneType。
现在回到主题,我们无法将所生成的诗句命名。因此,这个程序需要修改。修改的部分就是程序正文的最后那句:
print(回文[start:start+5])
这句的意思是在屏幕上显示回文中从start开始之后的五个连续字符。要让吟句()函数的值可以命名,我们就不能简单地在屏幕上显示了事,而是要将所得到的诗句“送出去”——将“诗句”从函数返回到函数调用之处。因此,在print的地方,我们需要一个新的表达式:
return 回文[start:start+5]
这样,函数将不会通过print显示,而是由互动环境显示,就像我们直接键入一样,例如我们可以键入
>>> ‘淡雨红幽树’
‘淡雨红幽树’
互动环境原封不动第返回我们键入的内容,如果我们是用print
>>> print(‘淡雨红幽树’)
淡雨红幽树
引号不见了。不过从用户角度,没有引号可能可读性更强一些,但是二者效果差异并不是很明显。但是如果显示的内容比较长,同时又有许多格式信息,那么如果直接复制粘贴到互动环境,这些格式信息都会丢失,只有用print才能还原这些格式信息。
因此,我们的函数如果用return代替print,互动环境将其视为和直接键入一样,会原封不动显示而没有格式信息。当出现修改完毕
#/usr/bin/env python3
五绝 = '落雪飞芳树幽红雨淡霞薄月迷香雾流风舞艳花'
回文 = 五绝[::-1] # 回文是将原<五绝>字符顺序倒置
def 吟句():
"""
导入随机数生成函数,通过随机数,
从<五绝>中随机取五个连续字符,连字成诗
"""
from random import randint
length = len(回文)
start = randint(0, length)
return 回文[start:start+5]
"""
程序到此为
"""
保存后退出,在互动环境从新导入
from yinshi import *
>>> 诗句 = 吟句()
>>> 诗句
'薄霞淡雨红'
>>>
此时,吟句()函数不再直接显示结果,而是将结果作为值由名称<诗句>代表,因此当我们键入<诗句>时,其值就会显示。如果我们不用名称,直接使用吟句()
>>> 吟句()
'雾香迷月薄'
>>>
此时的显示和print相比多了引号。
总之,一个函数,当完成任务时,可以把结果直接显示在屏幕上,但更多的时候是将结果送出去——返回到调用函数的地方,因为这样更灵活,可以由用户决定如何处理返回的结果。
我们在上面一开始提到,可以用<回文>代替<五绝>作为词汇表。但是这种来回改写很麻烦,如果我们的程序很长,在多个地方需要修改,不但费时而且容易因遗漏而出错。对这个问题,我们可以利用函数的参数解决。所谓函数参数,就是在函数后面的括号中加入信息,使得函数的作用更加灵活。例如我们使用过的type(),每次不同的参数返回的类型信息值也不相同。因此,我们可以在程序的函数开头加入一个参数:
def 吟句(词库):
….
length = len(词库)
….
return 词库[start:start+5]
经过这三处修改后保存源文件,并重新导入,这个时候,我们就可以在互动环境中很方便地指定词汇表了:
>>> 吟句(五绝)
'薄月迷香雾'
>>> 吟句(回文)
'淡雨红幽树'
除此之外,我们甚至可以更大胆一些,将五言诗改成七言诗:首先,在函数定义处在加上一个参数控制句子的长度
def 吟句(词库, 句长):
…..
return 词库[start:start+句长]
修改原文件后保存,再次重新导入,
>>> 吟句(回文,7)
'薄霞淡雨红幽树'
>>>
这样,我们对函数的运行有了更多的控制权。这当然不错,但仍然有一个遗憾,每次键入吟句(),都必须要指定词汇表和句长,比修改之前打字更多了。有没有两全其美的办法?
要做到两全其美,我们需要对函数参数的设定要做一些修改。Python允许函数参数预先设定一个【预设值】,亦即,如果函数在运行时如果不指定参数值,函数将使用【预设值】,换句话说,有了【预设值】,函数运行时的参数就可有可无了——需要时指定,不需要时留空——这正是我们所需要的。
def 吟句(词库=五绝, 长度=5):
这个定义的意思就是:当函数运行时,如果括号中没有设定参数,那么<参数>的内容就由<五绝>的内容充当,如果长度没有设定那么长度就为5。这种【预设值】又称作【缺省值】。
如果源文件保存重新导入没有问题,再运行吟句()函数,
>>> 吟句(回文,7)
'月薄霞淡雨红幽'
>>>
>>> 吟句()
'红雨淡霞薄'
>>>
>>> 吟句(回文)
'舞风流雾香'
>>>
现在,我们可以什么都不指定,此时词汇表是<五绝>,句子长度是5,也可以只指定词汇表,此时词汇表改变为指定的词汇表,也可以同时指定词汇表和句长。现在唯一不可以的就是单独指定句长而不指定词汇表,因为这样一来,互动环境会将句长的数字当做词汇表,这样就会有类型不匹配的错误发生。有没有办法做到尽善尽美呢?当然有,但这里先按下不表。
小结:
本篇笔记,我们进一步完善了吟句()函数,使其更加灵活:
1. 手动替换词汇表;
2. 将函数中的显示句子改成返回句子,使得函数不再负责显示,只负责将结果传回;
3. 添加函数参数,使得替换词汇表不再随时修改源文件,只要在函数运行时指定即可;
4. 用函数参数改变句长,使得我们可以生成七言诗句
5. 设置函数参数缺省值,使得运行函数更加方面,可以应对三种情况:
第一,不指定词汇表,也不指定句长,此时,缺省词汇表是<五绝>,句长是5
第二,指定词汇表,不指定句长,此时,词汇表是参数设定的词汇表,句长是5
第三,指定词汇表,指定句长,此时,词汇表是参数设定的词汇表,句长是参数设定的句长。
缺陷:无法单独指定句长。
最后修改后的程序如下:
#/usr/bin/env python3
五绝 = '落雪飞芳树幽红雨淡霞薄月迷香雾流风舞艳花'
回文 = 五绝[::-1] # 回文是将原<五绝>字符顺序倒置
def 吟句(词库=五绝,句长=5):
"""
导入随机数生成函数,通过随机数,
从<五绝>中随机取五个连续字符,连字成诗
"""
from random import randint
length = len(词库)
start = randint(0, length)
return 词库[start:start+句长]
"""
程序到此为
"""
~
由于内容较多,故“第一讲 吟诗作句”分几次写。本次内容接续上一篇第二部分,接着介绍Python语言的相关功能。
我们在上一篇写了一个不到10行的小程序,由两个字符串:<五绝>和<回文>和一个函数:吟句()构成。字符串<回文>实际上是利用索引方法将<五绝>中的字符序列倒置而成。现在让我们看一下:
首先启动python3的互动环境,然后调入我们程序
>>> from yinshi import *
这里的星号表示调用yinshi程序包中所有的内容。这里所谓的程序包其实就是我们在文本编辑器中写入的内容,Python通常以一个扩展名为”.py”的文件为一个单位,英文称作module,中文通常叫做程序包。
调入程序包之后,我们上次写的程序就被调入到计算机内存中,所以我们可以用字符串、函数的名称调用,引用。
>>> 回文
'花艳舞风流雾香迷月薄霞淡雨红幽树芳飞雪落'
为了和<五绝>的内容进行比较,我们把<五绝>的内容也引用进来
>>> 五绝
'落雪飞芳树幽红雨淡霞薄月迷香雾流风舞艳花'
对比一下,<回文>果然是<五绝>的回文诗。回文诗是中国古代文人创造的一种文字游戏,其中包含了许多语言学和文学的智慧。什么样的语言结构可以成为回文诗?这是语言学中一个非常有趣的话题,我们会在以后探讨。
我们上次写的那个吟句函数,其基本原理就是<五绝>字符串作为词汇表,然后从任意一个位置开始取后面连续5个字符串。现在我们再来看一下这个程序:
#/usr/bin/env python3
五绝 = '落雪飞芳树幽红雨淡霞薄月迷香雾流风舞艳花'
回文 = 五绝[::-1] # 回文是将原<五绝>字符顺序倒置
def 吟句(l):
"""
导入随机数生成函数,通过随机数,
从<五绝>中随机取五个连续字符,连字成诗
"""
from random import randint
length = len(五绝)
start = randint(0, length)
print(五绝[start:start+l])
"""
程序到此为
"""
现在我们以<回文>作为词汇表,看看吟句函数能否产生新的‘诗句’。我们所要做的很简单,就是把函数中所有出现<五绝>的地方用<回文>代替即可。修改的地方有两处:
length = len(回文)
print(回文[start:start+5])
由于<回文>的长度和<五绝>一样,所以改或不改没有实质影响,只是读程序时让人感觉很难理解。改完以后,保存源文件,然后在互动环境中重新调入
from yinshi import *
如果重新调入不起作用,可以用下列表达式
>>> exec(open(‘yinshi.py’).read())
从英文单词就可知道,这个表达式的意思是:打开‘yinshi.py’,将其内容读入然后运行。
>>> 吟句()
淡雨红幽树
>>> 吟句()
幽树芳飞雪
>>> 吟句()
迷月薄霞淡
如果将上面的‘诗句’与<回文>相比较就可以看出上面每一句都是回文字符串的一部分,这样的字符串,我们称之为【子字符串】,或简称【子串】。字符串和子串之间的关系与集合和子集合的关系一样,都是包含和被包含的关系,而空字符串是任意字符串的字串,一个字符串如果长度为n,那么该字符串共包含2的n次方个子串,例如我们的‘诗句’有五个字符,所以一共包含32个子串。通常,给定字符串求某个子串是字符串的基本操作之一。Python中我们使用索引方法获得子串。和字符串一样,如果有需要子串也可以赋予名称。遗憾的是,我们现在这个程序还无法直接给生成的子串命名。为什么,看一下就知道了:
我们希望当引用“吟句()”函数时,这个函数可以返回所生成的‘诗句’,这个返回的‘诗句’作为一个“值”使得我们可以命名。按照这个思路,我们先试试,看看问题出在哪里:
>>> 诗句 = 吟句()
霞淡雨红幽
>>>
这些我们期望<诗句>就是‘淡霞雨红幽’的名称,我们来试试
>>> 诗句
>>>
<诗句>没有返回任何内容。如果没有内容,名称<诗句>代表什么呢?
>>> print(诗句)
None
我们得到一个特殊的值:None。注意,None并不是字符串,也不是名称,就是前面所说,一个特殊的值。我们可以验证一下:
>>> None == ‘None’
False
这里的双等号我们称之【谓词】,包含【谓词】的表达式,通常都会返回真假值,如果双等号两边的内容相等,则返回True,否则返回False,前者为真,后者为假。所以,上面的表达式的意思是:None是否等于‘None’,互动环境返回的值是False。True、False和None一样都是特殊的值,而不是英文单词——字符串。“值”的意思是,它们和1,2,3等数字一样只能是某个名称的内容。这里举个例子,假定我们正在填一张身份调查表:
>>> 姓名 = '张三'
>>> 年龄 = 32
>>> 身高 = 1.72
>>> 婚否 = True
在这个调查表中,等号左面都是名称,右面都是值,我们可以看到,值可以有各种类型,姓名属于字符串类型,年龄是整数,身高是实数,而婚否则是真假值。因此在给定名称后,我们还需知道名称所代表的值的类型。如何知道呢?Python提供一个特殊的函数type()可以帮助我们判断名称的类型:
>>> type(姓名)
<class 'str'>
>>> type(年龄)
<class 'int'>
>>> type(身高)
<class 'float'>
>>> type(婚否)
<class 'bool'>
当使用type()函数时,我们在括号中填入要进行判断的名称,这个函数就会返回关于这个名称的类型信息,从给出的信息来看,尖括号右侧给出了这些名称所代表的类型:
str: 是字符串类型,这种类型由双引号、或单引号括入任何符号,str是string的简写
int: 是整数类型,这种类型包括正整数、0和负整数,int是integer的简写
float: 是实数类型,这种类型包括小数、分数。需要注意的是5.0和5虽然值相同,但是类型不同,前者是整数类型,后者是实数类型。对此我们仍然可以用type()判断:
>>> type(5.0)
<class 'float'>
>>> type(5)
<class 'int'>
float是floating point number:浮点数的简写,是大部分计算机对实数的称呼,至于为什么请自行百度、google。
bool: 称作布尔类型,这种类型只包括两个值:True和False,表示“真”与“假”。
通常Python并不要求你明确规定数据类型,因为Python本身有一套“类型推理”(type inference)机制,这个机制可以从用户给定的值来推断类型。
至于上面提到的None,它的类型是什么呢?
>>> type(None)
<class 'NoneType'>
所以,None的类型是NoneType,现在我们在判断<诗句的类型>
>>> type(诗句)
<class 'NoneType'>
>>>
说明<诗句>的值是None,而类型是NoneType。
现在回到主题,我们无法将所生成的诗句命名。因此,这个程序需要修改。修改的部分就是程序正文的最后那句:
print(回文[start:start+5])
这句的意思是在屏幕上显示回文中从start开始之后的五个连续字符。要让吟句()函数的值可以命名,我们就不能简单地在屏幕上显示了事,而是要将所得到的诗句“送出去”——将“诗句”从函数返回到函数调用之处。因此,在print的地方,我们需要一个新的表达式:
return 回文[start:start+5]
这样,函数将不会通过print显示,而是由互动环境显示,就像我们直接键入一样,例如我们可以键入
>>> ‘淡雨红幽树’
‘淡雨红幽树’
互动环境原封不动第返回我们键入的内容,如果我们是用print
>>> print(‘淡雨红幽树’)
淡雨红幽树
引号不见了。不过从用户角度,没有引号可能可读性更强一些,但是二者效果差异并不是很明显。但是如果显示的内容比较长,同时又有许多格式信息,那么如果直接复制粘贴到互动环境,这些格式信息都会丢失,只有用print才能还原这些格式信息。
因此,我们的函数如果用return代替print,互动环境将其视为和直接键入一样,会原封不动显示而没有格式信息。当出现修改完毕
#/usr/bin/env python3
五绝 = '落雪飞芳树幽红雨淡霞薄月迷香雾流风舞艳花'
回文 = 五绝[::-1] # 回文是将原<五绝>字符顺序倒置
def 吟句():
"""
导入随机数生成函数,通过随机数,
从<五绝>中随机取五个连续字符,连字成诗
"""
from random import randint
length = len(回文)
start = randint(0, length)
return 回文[start:start+5]
"""
程序到此为
"""
保存后退出,在互动环境从新导入
from yinshi import *
>>> 诗句 = 吟句()
>>> 诗句
'薄霞淡雨红'
>>>
此时,吟句()函数不再直接显示结果,而是将结果作为值由名称<诗句>代表,因此当我们键入<诗句>时,其值就会显示。如果我们不用名称,直接使用吟句()
>>> 吟句()
'雾香迷月薄'
>>>
此时的显示和print相比多了引号。
总之,一个函数,当完成任务时,可以把结果直接显示在屏幕上,但更多的时候是将结果送出去——返回到调用函数的地方,因为这样更灵活,可以由用户决定如何处理返回的结果。
我们在上面一开始提到,可以用<回文>代替<五绝>作为词汇表。但是这种来回改写很麻烦,如果我们的程序很长,在多个地方需要修改,不但费时而且容易因遗漏而出错。对这个问题,我们可以利用函数的参数解决。所谓函数参数,就是在函数后面的括号中加入信息,使得函数的作用更加灵活。例如我们使用过的type(),每次不同的参数返回的类型信息值也不相同。因此,我们可以在程序的函数开头加入一个参数:
def 吟句(词库):
….
length = len(词库)
….
return 词库[start:start+5]
经过这三处修改后保存源文件,并重新导入,这个时候,我们就可以在互动环境中很方便地指定词汇表了:
>>> 吟句(五绝)
'薄月迷香雾'
>>> 吟句(回文)
'淡雨红幽树'
除此之外,我们甚至可以更大胆一些,将五言诗改成七言诗:首先,在函数定义处在加上一个参数控制句子的长度
def 吟句(词库, 句长):
…..
return 词库[start:start+句长]
修改原文件后保存,再次重新导入,
>>> 吟句(回文,7)
'薄霞淡雨红幽树'
>>>
这样,我们对函数的运行有了更多的控制权。这当然不错,但仍然有一个遗憾,每次键入吟句(),都必须要指定词汇表和句长,比修改之前打字更多了。有没有两全其美的办法?
要做到两全其美,我们需要对函数参数的设定要做一些修改。Python允许函数参数预先设定一个【预设值】,亦即,如果函数在运行时如果不指定参数值,函数将使用【预设值】,换句话说,有了【预设值】,函数运行时的参数就可有可无了——需要时指定,不需要时留空——这正是我们所需要的。
def 吟句(词库=五绝, 长度=5):
这个定义的意思就是:当函数运行时,如果括号中没有设定参数,那么<参数>的内容就由<五绝>的内容充当,如果长度没有设定那么长度就为5。这种【预设值】又称作【缺省值】。
如果源文件保存重新导入没有问题,再运行吟句()函数,
>>> 吟句(回文,7)
'月薄霞淡雨红幽'
>>>
>>> 吟句()
'红雨淡霞薄'
>>>
>>> 吟句(回文)
'舞风流雾香'
>>>
现在,我们可以什么都不指定,此时词汇表是<五绝>,句子长度是5,也可以只指定词汇表,此时词汇表改变为指定的词汇表,也可以同时指定词汇表和句长。现在唯一不可以的就是单独指定句长而不指定词汇表,因为这样一来,互动环境会将句长的数字当做词汇表,这样就会有类型不匹配的错误发生。有没有办法做到尽善尽美呢?当然有,但这里先按下不表。
小结:
本篇笔记,我们进一步完善了吟句()函数,使其更加灵活:
1. 手动替换词汇表;
2. 将函数中的显示句子改成返回句子,使得函数不再负责显示,只负责将结果传回;
3. 添加函数参数,使得替换词汇表不再随时修改源文件,只要在函数运行时指定即可;
4. 用函数参数改变句长,使得我们可以生成七言诗句
5. 设置函数参数缺省值,使得运行函数更加方面,可以应对三种情况:
第一,不指定词汇表,也不指定句长,此时,缺省词汇表是<五绝>,句长是5
第二,指定词汇表,不指定句长,此时,词汇表是参数设定的词汇表,句长是5
第三,指定词汇表,指定句长,此时,词汇表是参数设定的词汇表,句长是参数设定的句长。
缺陷:无法单独指定句长。
最后修改后的程序如下:
#/usr/bin/env python3
五绝 = '落雪飞芳树幽红雨淡霞薄月迷香雾流风舞艳花'
回文 = 五绝[::-1] # 回文是将原<五绝>字符顺序倒置
def 吟句(词库=五绝,句长=5):
"""
导入随机数生成函数,通过随机数,
从<五绝>中随机取五个连续字符,连字成诗
"""
from random import randint
length = len(词库)
start = randint(0, length)
return 词库[start:start+句长]
"""
程序到此为
"""
~
> 我来回应