4.8 【实战】编写一些有趣的代码

经过前几章的学习,我们已经初步掌握了Python的基础数据结构和流程控制语句,有了这些“武器”我们就能够编写出很有趣的代码。

扫码看教学视频

4.8.1 走马灯文字

当你走在市中心的大街上,经常会看到马路两边的店铺上挂着各种广告牌,五颜六色非常好看。其中有一种广告牌就是走马灯文字,这种文字特效用Python也能实现。

例4-28 走马灯文字特效

走马灯文字特效的逻辑是把第一个字符也就是content[0]移动到整个字符串content[I:]的后面,然后再重新赋值给content列表,完成一个循环,如此周而复始,就形成了走马灯特效。

4.8.2 杨辉三角

在中国古代,数学家在数学的许多重要领域中处于世界领先的地位。中国古代数学史曾经有自己光辉灿烂的篇章,而杨辉三角的发现就是精彩的一页。

杨辉三角,又称为贾宪三角形、帕斯卡三角形,它在中国最早由贾宪在《释锁算术》中提出,后来南宋数学家杨辉在所著的《详解九章算法》中进行了详细说明。杨辉三角把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。

杨辉三角的定义如下:每个数等于它上方两数之和;每行数字左右对称,由1开始逐渐变大;第n行的数字有n项;前n行共[(1+n)n]/2个数。

在图4-5中,观察杨辉三角的结构,三角形的两条边都是1,其内部的数字都是上一层两个数字之和,比如1+1=2,1+2=3,2+1=3等。

图4-5 杨辉三角

由此推理每一行的元素都是由上一行的元素计算所得,所以把每一行看作一个list,试写一个generator,不断输出下一行的list。

例4-29 杨辉三角应用

num表示三角的最大行数,赋值为6,row代表每一行中的元素,col代表每一列中的元素。col==0 or col==row表示如果这是第一列或者是行数等于列数值为1,也就是位于三角形斜边上的那些元素为1。剩下位置的数值则需要计算,计算规则是yh[row][col]=yh[row-1][col]+yh[row-1][col-1],也就是每个数等于它上方两数之和。

解决这个问题的主要逻辑是,把杨辉三角看作是两个大小一样的三角形拼接成的正方形,然后分别按照行和列来打印出每一个数值。

4.8.3 初识排序

除了前面介绍的几种用途,迭代还有一种很广泛的用途,那就是排序。相信大家已经了解排序的含义,那么在Python中,我们如何排序呢?首先我们先学习冒泡排序(Bubble Sort),这也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果顺序错误就把他们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的成员,也就是说该数列已经排序完成。这个冒泡算法名字的由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,就像水中的气泡一样。

比如,现在有一组数字[1,23,15,29,98,445,97,32],对这组数字进行排序。

拿到这个问题,我们从数学的角度来分析这个问题。第一步,是将数字1和23进行比较,很显然23大于1,所以保持数字顺序不变。第二步,将数字23和15进行比较,15是小于23的,所以将15和23调换位置,于是数字顺序就变成了[1,15,23,29,98,445,97,32]。第三步,将数字23和29进行比较,23小于29,数字顺序不变。第四步,比较29和98,顺序不变。第五步,比较98和445,顺序不变。第六步,445大于97,于是调换97和445的位置,顺序变成[1,15,23,29,,445,98,97,32]。第七步,比较98和445,很明显445大于98,于是调换数字位置[1,15,23,29,98,445,97,32]。第八步,比较97和445后调换两者位置。第九步,比较445和32的大小,然后调换位置。最终顺序变成[1,15,23,29,98,97,32,445]。至此,第一次循环已经完成,这个数列中最大的数字是445,被排到了最后。同理,第二次循环排在倒数第二位的是98。第三次循环则会把数字97排在倒数第三位,等等。有n个数字就会循环n-1次。最后得到从小到大的数列为[1,15,23,29,32,97,98,445]。

例4-30 冒泡排序算法

在for j in range(len(nums)-i-1)代码中,这个j就是控制每一次具体的冒泡过程,我们第一次冒泡需要冒几次,也就是说需要比较几次,假如有8个数,那只需要7次就可以了,当下一次时,最后一个已经是有序的了,少冒泡一次,所以这里j每次都会减去i的值。