出场人物介绍
小美:小学4年级学生,参加了学校的编程兴趣小组,已经了解了Python语言的基本语法,能够看懂一些简单的程序。她做事风风火火,对所有的事物都很好奇,喜欢打破砂锅问到底,是一个叫人又爱又恨的小丫头。 阿福:一个酷爱编程的8年级男生。大家都说他长得像国宝大熊猫,动作缓慢,憨态可掬。他做事情确实够慢的,连说话也慢条斯理,可是他一点也不担心,他常常说:“慢就是快,只要坚持下去,蜗牛也能爬上金字塔。”古老师:虽然年近不惑,但依然对生活充满热情。“爱生活爱运动”是他的人生信条,和孩子们一起编程是他最大的乐趣。他神出鬼没,总是在孩子们最需要帮助的时候出现。当然,你也不能动不动就找古老师,因为他很忙,非常非常忙。所以,遇到问题还是先自己思考吧。
“Python算法之旅”微信群等着你扫码加入“Python算法之旅”微信群,和斌哥面对面交流,更多资料和更有趣的话题等你一起来分享。
正文
字符串游戏之拼接字符串
小美:阿福,最近老师教了我们一种很实用的 Python 数据结构——字符串,他说 Python 的字符串操作比其他编程语言都要简明自然呢。 阿福:是啊, Python 语言的最大特征就是简明易懂,代码和自然语言接近,容易理解。 小美:老师给我们举了一个用字符串画五角星方阵的例子,我觉得很好玩,代码也很简洁呢。 阿福:是吗,那发给我瞧瞧吧。 问题1 五角星方阵。 函数功能:生成大小为 n 的五角星方阵,其中 n 为奇数。 函数名: sort_1(a:str)->str 参数表: n -- 五角星方阵的大小。 返回值:直接输出方阵,没有返回值。 示例 1 :输入 n=3 时,生成五角星方阵: ☆★☆ ★★★ ☆★☆ 示例 2 :输入 n=5 时,生成五角星方阵: ☆☆★☆☆ ☆★★★☆ ★★★★★ ☆★★★☆ ☆☆★☆☆ 代码1def draw_stars(n:int)->None: s = [] for i in range(1, n+1): b = 2 * i - 1 if i <= n // 2 else 2 *(n - i) + 1 #黑色五角星数量 w = (n - b) // 2 #白色五角星数量 s.append("☆" * w + "★" * b + "☆" * w) for i in s: print(i)
阿福:确实是一个很棒的例子,利用
Python
字符串的
”+”
和
”*”
运算符,只需一重循环就完成了方阵的输出。这在其他编程语言中是很难办到的,充分体现了
Python
简洁明了的特性。
知识小贴士
Python字符串运算符简介:
操作符”+”,用作字符串连接,例如a=”1”,b=”2”,则a+b的结果为”12”。
操作符”*”,用作重复输出字符串,例如a=”1”,则a*3的结果为”111”。
顺序拼接字符串,例如a=”1”,b=”2”,则执行a=a+b后,a=”12”。
逆序拼接字符串,例如a=”1”,b=”2”,则执行a=b+a后,a=”21”。
古老师:一段时间不见,大家长进都不小!已经对字符串有了比较深刻的认识了。今天我就来考查一下,看看你们对字符串拼接操作的熟练度如何。 小美:好啊,在家憋了好长一段时间了,正想释放一下大脑的压力呢。 题目2 字符串拼接练习 1 。 将一个存储了非递减序列的字符串 a 中的字符转存到字符串 b 中,使得字符串 b 的字符呈现中间小,并逐次向两边增大的特征。 函数功能:将存储了非递减序列的字符串 a 中的字符转存到字符串 b 中,使得字符串 b 的字符呈现中间小,并逐次向两边增大的特征。 函数 名:sort_1(a:str)->str 参数表:a -- 存储了非递减序列的字符串a。 返回值:转换后的字符串b。 示例1:当a="12345678"时,b="75312468"。 示例2: 当a="123456789"时,b="975312468"。 小美:这道题目比五角星方阵要难呢,需要先找到字符串b 拼接的规律。 阿福:是的,我注意到字符串b 拼接的规律是左- 右- 左- 右交替进行的。 小美:没错,我也看到了。我还画了一幅示意图,你看对不对。 阿福:真棒!正是这样。有了示意图,代码就好写多了。 代码2def sort_1(a:str)->str: b = "" for i, c in enumerate(a): if i % 2 == 0: b = c + b else: b = b + creturn b
古老师:不错不错!看来你已经领会到字符串拼接操作的精髓了。不知道你们注意到没有,我刚才给自定义函数取名为
sort_1
。其实它还有一道姊妹题,一并发给你们吧。慢慢思考,我有事先走了。
题目3
字符串拼接练习
2
。
将一个存储了非递减序列的字符串
a
中的字符转存到字符串
b
中,使得字符串
b
的字符呈现中间小,并逐次向两边增大的特征。
函数功能:将存储了非递减序列的字符串
a
中的字符转存到字符串
b
中,使得字符串
b
的字符呈现中间小,并逐次向两边增大的特征。
函数名:
sort_2(a:str)->str
参数表:
a --
存储了非递减序列的字符串
a
。
返回值:转换后的字符串
b
。
示例
1
:当
a="12345678"
时,
b="75312468"
。
示例
2
:当
a="123456789"
时,
b="864213579"
。
温馨提示:
有事没事最好拉到文末看看,说不定作者今天提供了彩蛋哦!
说在后面
Python算法之旅系列文章源于我平时收集和整理的一些题目,我尝试用自己的语言把这些题目进行了再创作。由于本人水平有限,表述中难免出现疏漏甚至错误之处,敬请谅解。
无论是赞同还是反对我的看法,都请你给我留言。如果你有新的想法,千万不要憋在心里,请发出来大家一起讨论。让我们相互学习,共同进步!
需要本文word版的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,“Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。
我们专注Python算法,感兴趣就一起来!
彩蛋
小美:什么姊妹题啊?看上去一模一样啊。 阿福:字符串a 的长度为偶数时,二者确实一模一样,但长度为奇数时,二者还是有区别的。小美:哦,原来是这样。我看出来了!它的规律是这样的:
阿福:小美不错啊,这么快就发现规律了!那代码怎么写呢? 小美:这个很简单,只需要先判断一下字符串的长度是否为奇数,如果是奇数需要把a[0]放在最中间,然后按照左-右,左-右的顺序依次拼接字符串就行了。代码3
def sort_2(a:str)->str: b, begin = "", 0 if len(a) % 2 == 1: b, begin = a[0], 1 for i in range(begin, len(a), 2): b = a[i] + b + a[i+1]return b
阿福:这个方法确实不错,但是没必要从中间开始拼接字符串。我发现无论字符串的长度如何,新字符串总是把最大值放在右端,次大值放在左端,然后依次向中间缩进。规律如图所示:
小美:还真是这样呢,阿福你的观察力可以啊!那就请把代码也一起写出来吧。
阿福:没问题,只要设置两个变量bL和bR,分别存储左右两侧的字符,然后拼接起来就行了。循环结构可以模仿sort_1函数的做法。
代码4
def sort_2(a:str)->str: bL, bR = "", "" for i, c in enumerate(a[::-1]): if i % 2 == 0: bR = c + bR else: bL = bL + c return bL + bR
相关优秀文章:
阅读代码和写更好的代码
最有效的学习方式
字符串游戏之身份证号的秘密
字符串游戏之无效的身份证
字符串游戏之9路棋盘
列表的纷争之双指针扫描
列表的纷争之回文数列
字典的狂舞之石头剪刀布