目录
- 第一章 起步
-
- 0. Python 是什么类型的语言?
- 1. print() 的作用是什么?
- 2. Python 中表示乘法的符号是什么?
- 3. 为什么 >>>print('I love fishc.com ' * 5) 可以正常执行,但 >>>print('I love fishc.com ' + 5) 却报错?
- 4. 如果我需要在一个字符串中嵌入一个双引号,正确的做法是?
- 5. 输入5+8 与输入print(5+8) 有何不同?
- 6. 什么是BIF?
- 7. Python3 提供了多少个 BIF?
- 8. 在 Python 看来:'FishC' 和 'fishc' 一样吗?
- 9. Python 中什么是最重要的?
- 10. 你听说过“拼接”这个词吗?
- 11. 编写程序 要求用户输入1到100之间数字并判断,输入符合要求打印“你妹好漂亮”,不符合要求则打印“你大爷好丑”
- 12. Python3 中,一行可以书写多个语句吗?
- 13. Python3 中,一个语句可以分成多行书写吗?
- 14. Python的 and 操作符 和C语言的 && 操作符 有何不同?
- 15. 听说过“短路逻辑(short-circuit logic)”吗?
- 16. 尝试写代码实现以下截图功能:
- 17. a < b < c 事实上是等于?
- 18. 请用最快速度说出答案:not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9
- 第二章 变量和数据类型
-
- 0. 以下哪个变量的命名不正确?为什么? (A) MM_520 (B) _MM520_ (C)520_MM (D) _520_MM
- 1. 在不上机的情况下,以下代码会打印什么内容?
- 2. 如果非要在原始字符串结尾输入反斜杠,可以如何灵活处理?
- 3. 变量的命名需要注意一些地方,你能看得出哪里有问题吗?
- 4. 为什么布尔类型(bool)的 True 和 False 分别用 1 和 0 来代替吗?
- 5. 使用 int() 将小数的正数及小数的负数转换为整数,结果是向上取整还是向下取整呢?
- 6. 我们人类思维是习惯于“四舍五入”法,你有什么办法使得 int() 按照“四舍五入”的方式取整吗?
- 7. 取得一个变量的类型,可以使用 type() 和 isinstance(),你更倾向于使用哪个?
- 8. Python3 可以给变量命名中文名,知道为什么吗?
- 第三章 字符串
- 第四章 分支和循环
-
- 0. assert 的作用是什么?
- 1. 假设有 x = 1,y = 2,z = 3,如何快速将三个变量的值互相交换?
- 2. 猜猜 (x < y and [x] or [y])[0] 实现什么样的功能?
- 3. 你听说过成员资格运算符吗?
- 4. 请将以下代码修改为三元操作符实现:
- 5. 这个循环 表达什么意识 for i in range(0, 10, 2)?
- 6. for i in 5:print('I Love FishC')会打印多少次"I Love FishC"?
- 7. 请问 range(10) 生成哪些数?
- 8. 什么情况下我们要使循环永远为真?
- 9. 【学会提高代码的效率】你的觉得以下代码效率方面怎样?有没有办法可以大幅度改进(仍然使用while)?
- 10. 三色球问题
- 第五章 列表
-
- 0. 列表都可以存放一些什么东西?
- 1. 向列表增加元素有哪些方法?
- 2. append() 方法和 extend() 方法都是向列表的末尾增加元素,请问他们有什么区别?
- 3. 利用 for 循环打印上边 member 列表中的每个内容
- 4. 请问 list1[0] 和 list1[0:1] 一样吗?
- 5. 如果你每次想从列表的末尾取出一个元素,并将这个元素插入到列表的最前边,你会怎么做?
- 6. 有些鱼油比较调皮,他说我想试试 list1[-3:-1] 会不会报错,怎么知道一试居然显示 [9, 7],这是怎么回事呢?
- 7. 在进行分片的时候,我们知道分片的开始和结束位置需要进行指定,但其实还有另外一个隐藏的设置:步长。
- 8. 课堂上小甲鱼说可以利用分片完成列表的拷贝 list2 = list1[:],那事实上可不可以直接写成 list2 = list1 更加简洁呢?
- 9. 要对一个列表进行逆序排序,请问使用什么方法?
- 10. 列表还有两个内置方法:copy() 和 clear()
- 第六章 元组
- 第七章 函数
-
- 0. 创建函数使用什么关键字,要注意什么?
- 1. 请问这个函数有多少个参数?
- 2. 使用关键字参数,可以有效避免什么问题的出现呢?
- 3. 默认参数和关键字参数表面最大的区别是什么?
- 4. 请问以下这个函数有返回值吗?
- 5. 目测以下程序会打印什么内容:
- 6. 如果希望在函数中修改全局变量的值,应该使用什么关键字?
- 7. 在嵌套的函数中,如果希望在内部函数修改外部函数的局部变量,应该使用什么关键字?
- 8. 请问为什么代码 B 却报错了?应该如何修改?
- 9. 请问这两个如何访问 funIn() 呢?
- 10. 请使用lambda表达式将下边函数转变为匿名函数?
- 11. 请将下边的匿名函数转变为普通的屌丝函数?
- 12. 请将下边的匿名函数转变为普通函数?
- 第八章 递归
- 第九章 字典
-
- 0. 尝试一下将数据('F': 70, 'C': 67,, 's': 115)创建为一个字典并访问键 'C' 对应的值?
- 1. 用方括号(“[]”)括起来的数据叫列表,使用大括号(“{}”)括起来的数据我们就叫字典吗?
- 2. 有些东西字典做得到,但“万能的”列表却难以实现?
- 3. 在字典中,如果试图为一个不存在的键(Key)赋值会怎样?
- 4. 成员资格操作符(in和not in)可以检查一个元素是否存在序列中,当然也可以用来检查一个键(Key)是否存在字典中,那么请问哪种的检查效率更高些?
- 5. Python对键(Key)和值(Value)有没有类型限制?
- 6. 请目测下边代码执行后,字典dict1的内容是什么?
- 7. 如果你需要将字典dict1 = {1: 'one', 2: 'two', 3: 'three'}拷贝到dict2,你应该怎么做?
- 第十章 集合
- 第十一章 文件和异常
-
- 0. 下边只有一种方式不能打开文件,请问是哪一种,为什么?
- 1. 打开一个文件我们使用open()函数,通过设置文件的打开模式,决定打开的文件具有那些性质,请问默认的打开模式是什么呢?
- 2. 请问 >>> open('E:\\Test.bin', 'xb') 是以什么样的模式打开文件的?
- 3. 尽管Python有所谓的“垃圾回收机制”,但对于打开了的文件,在不需要用到的时候我们仍然需要使用f.close()将文件对象“关闭”,这是为什么呢?
- 4. 如何将一个文件对象(f)中的数据存放进列表中?
- 5. 如何迭代打印出文件对象(f)中的每一行数据?
- 6. 文件对象的内置方法f.read([size=-1])作用是读取文件对象内容,size参数是可选的,那如果设置了size=10,例如f.read(10),将返回什么内容呢?
- 7. 如何获得文件对象(f)当前文件指针的位置?
- 8. 还是视频中的那个演示文件(record.txt),请问为何f.seek(45, 0)不会出错,但f.seek(46)就出错了呢?
- 9. 尝试将文件(OpenMe.mp3)打印到屏幕上
- 10. 编写代码,将上一题中的文件(OpenMe.mp3)保存为新文件(OpenMe.txt)
- 11. 我们使用什么方法来处理程序中出现的异常?
- 12. 一个 try 语句可以和多个 except 语句搭配吗?为什么?
- 13. 你知道如何统一处理多类异常吗?
- 14. except 后边如果不带任何异常类,Python 会捕获所有(try 语句块内)的异常并统一处理,但却不建议这么做,你知道为什么吗?
- 15. 如果异常发生在成功打开文件后,Python 跳到 except 语句执行,并没有执行关闭文件的命令(用户写入文件的数据就可能没有保存起来),因此我们需要确保无论如何(就算出了异常退出)文件也要被关闭,我们应该怎么做呢?
- 16. 在 Python 中,else 语句能跟哪些语句进行搭配?
- 17. 请目测以下代码会打印什么内容?
- 18. 使用什么语句可以使你不比再担心文件打开后却忘了关闭的尴尬?
- 19. 使用 with 语句固然方便,但如果出现异常的话,文件还会自动正常关闭吗?
- 第十二章 类和对象
-
- 0. 对象中的属性和方法,在编程中实际是什么?
- 1. 类的属性定义应该尽可能抽象还是尽可能具体?
- 2. 请用一句话概括面向对象的几个特征?
- 3. 函数和方法有什么区别?
- 4. self参数的作用是什么?
- 5. 如果我们不希望对象的属性或方法被外部直接引用,我们可以怎么做?
- 6. 类在实例化后哪个方法会被自动调用?
- 7. 如果按以下方式重写魔法方法 __init__,结果会怎样?
- 8. 当子类定义了与相同名字的属性或方法时,Python 是否会自动删除父类的相关属性或方法?
- 9. 假设已经有鸟类的定义,现在我要定义企鹅类继承于鸟类,但我们都知道企鹅是不会飞的,我们应该如何屏蔽父类(鸟类)中飞的方法?
- 10. super 函数有什么“超级”的地方?
- 11. 多重继承使用不当会导致重复调用(也叫钻石继承、菱形继承)的问题,请分析以下代码在实际编程中有可能导致什么问题?
- 12. 如何解决上一题中出现的问题?
- 13. 什么是组合(组成)?
- 15. 什么时候用组合,什么时候用继承?
- 16. 类对象是在什么时候产生?
- 17. 如果对象的属性跟方法名字相同,会怎样?
- 18. 请问以下类定义中哪些是类属性,哪些是实例属性?
- 19. 请问以下代码中,bb 对象为什么调用 printBB() 方法失败?
- 20. 如何判断一个类是否为另一个类的子类?
- 21. 如何判断对象 a 是否为 类 A 的实例对象?
- 22. 如何优雅地避免访问对象不存在的属性(不产生异常)?
- 23. Python 的一些 BIF 很奇怪,但却十分有用。请问 property() 函数的作用是什么?
第一章 起步
0. Python 是什么类型的语言?
脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序。以简单的方式快速完成某些复杂的事情通常是创造脚本语言的重要原则,基于这项原则,使得脚本语言通常比 C语言、C++语言 或 Java 之类的系统编程语言要简单容易。
也让脚本语言另有一些属于脚本语言的特性:
语法和结构通常比较简单
学习和使用通常比较简单
通常以容易修改程序的“解释”作为运行方式,而不需要“编译”
程序的开发产能优于运行性能
一个脚本可以使得本来要用键盘进行的相互式操作自动化。一个Shell脚本主要由原本需要在命令行输入的命令组成,或在一个文本编辑器中,用户可以使用脚本来把一些常用的操作组合成一组串行。主要用来书写这种脚本的语言叫做脚本语言。很多脚本语言实际上已经超过简单的用户命令串行的指令,还可以编写更复杂的程序。
1. print() 的作用是什么?
print() 会在输出窗口中显示一些文本(输出窗口是IDLE shell窗口)。
2. Python 中表示乘法的符号是什么?
Python中的乘号是*(星号)。
3. 为什么 >>>print('I love fishc.com ’ * 5) 可以正常执行,但 >>>print('I love fishc.com ’ + 5) 却报错?
在 Python 中不能把两个完全不同的东西加在一起,比如说数字和文本,正是这个原因,>>>print('I love fishc.com ’ + 5) 才会报错。不过乘以一个整数来翻倍就具有一定的意义了,前边的例子就是将 “I love fishc.com” 这个字符串打印五次。
4. 如果我需要在一个字符串中嵌入一个双引号,正确的做法是?
你有两个选择:可以利用反斜杠(\)对双引号转义:\ ",或者用单引号引起这个字符串。例如:’ I l"o"ve fishc.com ’
5. 输入5+8 与输入print(5+8) 有何不同?
输入’I love fishc.com!’ 与输入print(‘I love fishc.com!’) 有何不同?
>>> 5+8
13
>>> print(5+8)
13
>>> 'I love fishc.com!'
'I love fishc.com!'
>>> print('I love fishc.com!')
I love fishc.com!
直接输入是将结果及类型打印到屏幕上,而print是将结果打印到屏幕上。
6. 什么是BIF?
BIF 就是 Built-in Functions,内置函数。为了方便程序员快速编写脚本程序(脚本就是要编程速度快快快!!!),Python 提供了非常丰富的内置函数,我们只需要直接调用即可.
7. Python3 提供了多少个 BIF?
在 Python 或 IDLE 中,输入 dir( __ builtins __) 可以看到 Python 提供的内置方法列表(注意,builtins 前后是两个下划线哦)其中小写的就是 BIF。如果想具体查看某个 BIF 的功能,比如 input(),可以在 shell 中输入 help(input),就会得到这个 BIF 的功能描述。哦,答案应该是 68 个。
8. 在 Python 看来:‘FishC’ 和 ‘fishc’ 一样吗?
不一样,对 Python 来说,fishc 和 FishC 是完全不同的两个名字,所以编程的时候一定要当心。不过 Python 会帮助解决可能因此出现的问题,例如只有当标识符已经赋值后(还记得吗, Python 的变量是不用先声明的)才能在代码中使用,未赋值的标识符直接使用会导致运行时错误,所以你很快就可以根据经验发现此问题。
9. Python 中什么是最重要的?
缩进是 Python 的灵魂,缩进的严格要求使得 Python 的代码显得非常精简并且有层次。如果在正确的位置输入冒号“:”,IDLE 会自动将下一行缩进!
10. 你听说过“拼接”这个词吗?
在一些编程语言,我们可以将两个字符串“相加”在一起,如:‘I’ + ‘Love’ + ‘FishC’ 会得到 ‘ILoveFishC’,在 Python 里,这种做法叫做拼接字符串。
11. 编写程序 要求用户输入1到100之间数字并判断,输入符合要求打印“你妹好漂亮”,不符合要求则打印“你大爷好丑”
temp = input("请输入1到100之间的数字:")
num = int(temp)
if 1 <= num <= 100:
print('你妹好漂亮^_^')
else:
print('你大爷好丑T_T')
12. Python3 中,一行可以书写多个语句吗?
可以,语句之间用分号隔开即可,不妨试试:
>>> print('I love fishc');print('very much!')
13. Python3 中,一个语句可以分成多行书写吗?
可以,一行过长的语句可以使用反斜杠或者括号分解成几行,不妨试试:
>>> 3 > 4 and \
1 < 2
或者
>>> ( 3 > 4 and
1 < 2 )
14. Python的 and 操作符 和C语言的 && 操作符 有何不同?
看下图(C\C++ 对比 Python):
对比
15. 听说过“短路逻辑(short-circuit logic)”吗?
逻辑操作符有个有趣的特性:在不需要求值的时候不进行操作。这么说可能比较“高深”,举个例子,表达式 x and y,需要 x 和 y 两个变量同时为真(True)的时候,结果才为真。因此,如果当 x 变量得知是假(False)的时候,表达式就会立刻返回 False,而不用去管 y 变量的值。
这种行为被称为短路逻辑(short-circuit logic)或者惰性求值(lazy evaluation),这种行为同样也应用与 or 操作符。
实际上,Python 的做法是如果 x 为假,表达式会返回 x 的值(0),否则它就会返回 y 的值(例子参考楼上那题)。
16. 尝试写代码实现以下截图功能:
错误做法:
i=8
while i>0:
print(" "*i)
print("*"*i)
i=i-1
正确答案:
i=8
while i>0:
print(" "*i,end='')
print("*"*i)
i=i-1
因为print会自动换行,加end=’'之后print才不会自动换行
17. a < b < c 事实上是等于?
(a < b) and (b < c)
18. 请用最快速度说出答案:not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9
答案是:4
not or and 的优先级是不同的:not > and > or
我们按照优先级给它们加上括号:(not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)
== 0 or 0 or 4 or 6 or 9
== 4
为啥是 4?
大家还记得“短路逻辑”吗?3 and 4 == 4,而 3 or 4 == 3。(可用串并联加上最低水流联想)
所以答案是:4
温馨提示:为了更好的表达你的程序,有些括号还是不能省下的。
第二章 变量和数据类型
0. 以下哪个变量的命名不正确?为什么? (A) MM_520 (B) MM520 (C)520_MM (D) _520_MM
(c)选项不正确,因为 Python 中的变量名不能以数字开头。
1. 在不上机的情况下,以下代码会打印什么内容?
>>>first = 520
>>>second = '520'
>>>first = second
>>>print(first)
会打印:520,注:这里没有单引号括起来,但是他是一个字符串,因为使用 print() 打印,所以不包含单引号。可以试试直接>>>first,它是一个字符串的。
2. 如果非要在原始字符串结尾输入反斜杠,可以如何灵活处理?
使用r前缀。
>>>str = r'C:\Program Files\FishC\Good''\\'
3. 变量的命名需要注意一些地方,你能看得出哪里有问题吗?
在例子中有 str 名字的变量,但我们发现,str 的颜色跟普通变量不同?没错,str() 和 print() 都是内置函数,但 Python 不介意我们对内置函数进行赋值操作,所以这点我们以后就要注意啦,否则可能会出现以下的 BUG:
>>> print = 1
>>> print("I love FishC")
Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
print("I love FishC")
TypeError: 'int' object is not callable
4. 为什么布尔类型(bool)的 True 和 False 分别用 1 和 0 来代替吗?
计算机只认识二进制数,所以所有的编程语言最终都会转换成简单的二进制序列给 CPU 按照一定的规则解析。
由于二进制只有两个数:0 和 1,因此用 0 和 1 来表示 False 和 True 再适合不过了,因为不用浪费资源在转换的过程上!
5. 使用 int() 将小数的正数及小数的负数转换为整数,结果是向上取整还是向下取整呢?
小数的正数向下取整。(5.5 向下取整为 5)
小数的负数向上取整。(-5.5 向下取整为- 5)
6. 我们人类思维是习惯于“四舍五入”法,你有什么办法使得 int() 按照“四舍五入”的方式取整吗?
int() 固然没那么“聪明”,但机器是死的,人是活的!
5.4 “四舍五入”结果为:5,int(5.4+0.5) == 5
5.6 “四舍五入”结果为:6,int(5.6+0.5) == 6
7. 取得一个变量的类型,可以使用 type() 和 isinstance(),你更倾向于使用哪个?
建议使用 isinstance(),因为它的返回结果比较直接,另外 type() 其实并没有你想象的那么简单。
8. Python3 可以给变量命名中文名,知道为什么吗?
Pyhton3 源码文件默认使用utf-8编码(支持中文),这就使得以下代码是合法的:
>>> 小甲鱼 = '我爱你'
>>> print(小甲鱼)
>>> 我爱你
第三章 字符串
0. 写一个程序,判断给定年份是否为闰年。
temp=int(input("请输入一个年份:"))#Python把所有输入当作字符串处理,所以如果想要作为其他类型的数据处理,需要加一个类型转变
if temp%4==0 and temp%100!=0:
print("是闰年")
else:
if temp%400==0:
print("是闰年")
else:
print("不是闰年")
1.字符串的函数
s 为字符串
s.isalnum() 所有字符都是数字或者字母,为真返回 True,否则返回 False。
s.isalpha() 所有字符都是字母,为真返回 True,否则返回 False。
s.isdigit() 所有字符都是数字,为真返回 True,否则返回 False。
s.islower() 所有字符都是小写,为真返回 True,否则返回 False。
s.isupper() 所有字符都是大写,为真返回 True,否则返回 False。
s.istitle() 所有单词都是首字母大写,为真返回 True,否则返回 False。
s.isspace() 所有字符都是空白字符,为真返回 True,否则返回 False。
例如:
>>> s = 'I LOVE FISHC'
>>> s.isupper()
>>> True
2. 还记得如何定义一个跨越多行的字符串吗(请至少写出两种实现的方法)?
方法一:
>>> str1 = '''待我长发及腰,将军归来可好?
醉卧沙场君莫笑,一夜吹彻画角。
江南晚来客,红绳结发梢。'''
方法二:
>>> str2 = '待卿长发及腰,我必凯旋回朝。\
应有得胜归来日,与卿共度良宵。\
盼携手终老,愿与子同袍。'
方法三:
>>> str3 = ('待卿长发及腰,我必凯旋回朝。'
'应有得胜归来日,与卿共度良宵。'
'盼携手终老,愿与子同袍。')
3. 三引号字符串通常我们用于做什么使用?
三引号字符串不赋值的情况下,通常当作跨行注释使用,例如:
'''这是一个三引号字符串用于注释的例子,
例子虽然只是简简单单的一句话,
却毫无遮掩地体现了作者用情至深,
所谓爱至深处情至简!'''
4. file1 = open(‘C:\windows\temp\readme.txt’, ‘r’) 表示以只读方式打开“C:\windows\temp\readme.txt”这个文本文件,但事实上这个语句会报错,知道为什么吗?你会如何修改?
会报错是因为在字符串中,我们约定“\t”和“\r”分别表示“横向制表符(TAB)”和“回车符”(详见:http://bbs.fishc.com/thread-92997-1-1.html),因此并不会按照我们计划的路径去打开文件。
Python 为我们铺好了解决的道路,只需要使用原始字符串操作符(R或r)即可:
>>> file1 = open(r'C:\windows\temp\readme.txt', 'r')
第四章 分支和循环
0. assert 的作用是什么?
assert这个关键字我们称之为“断言”,当这个关键字后边的条件为假时,程序自动崩溃并抛出AssertionError的异常。
什么情况下会需要这样的代码呢?在测试程序的时候就很好用,因为与其让错误的条件导致程序今后莫名其妙地崩溃,不如在错误条件出现的那一瞬间我们实现“自爆”。
一般来说我们可以用Ta在程序中置入检查点,当需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert关键字就非常有用了。
1. 假设有 x = 1,y = 2,z = 3,如何快速将三个变量的值互相交换?
x, y, z = z, y, x
2. 猜猜 (x < y and [x] or [y])[0] 实现什么样的功能?
这其实是 Python 的作者还没有为 Python 加入三元操作符之前,Python 社区的小伙伴们灵活的使用 and 和 or 搭配来实现三元操作符的功能,这里边有涉及到列表和切片的知识。
3. 你听说过成员资格运算符吗?
Python 有一个成员资格运算符:in,用于检查一个值是否在序列中,如果在序列中返回 True,否则返回 False。
>>> name = '小甲鱼'
>>> '鱼' in name
True
>>> '肥鱼' in name
False
4. 请将以下代码修改为三元操作符实现:
```python
x, y, z = 6, 5, 4
if x < y:
small = x
if z < small:
small = z
elif y < z:
small = y
else:
small = z
答案:上面代码只是让我们知道求最小值的功能,并不是要代码一一对应。
small = x if (x < y and x < z) else (y if y < z else z)
5. 这个循环 表达什么意识 for i in range(0, 10, 2)?
5 次,因为从 0 开始,到 10 结束,步进为 2。
6. for i in 5:print(‘I Love FishC’)会打印多少次"I Love FishC"?
会报错,上节课的课后习题我们提到了 in 是“成员资格运算符”,而不是像 C 语言那样去使用 for 语法。Python 的 for 更像脚本语言的 foreach。
7. 请问 range(10) 生成哪些数?
会生成 range(0, 10),list(range(0, 10)) 转换成列表是:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],注意不包含 10 哦。
8. 什么情况下我们要使循环永远为真?
用于游戏实现,因为游戏只要运行着,就需要时刻接收用户输入,因此使用永远为真确保游戏“在线”。操作系统也是同样的道理,时刻待命,操作系统永远为真的这个循环叫做消息循环。另外,许多通讯服务器的客户端/服务器系统也是通过这样的原理来工作的。
我们可以随时用 break 来跳出循环!
9. 【学会提高代码的效率】你的觉得以下代码效率方面怎样?有没有办法可以大幅度改进(仍然使用while)?
i = 0
string = 'ILoveFishC.com'
while i < len(string)):
print(i)
i += 1
这段代码之所以“效率比较低”是因为每次循环都需要调用一次 len() 函数
i = 0
string = 'ILoveFishC.com'
length = len(string)
while i < length:
print(i)
i += 1
10. 三色球问题
有红、黄、蓝三种颜色的求,其中红球 3 个,黄球 3 个,绿球 6 个。先将这 12 个球混合放在一个盒子中,从中任意摸出 8 个球,编程计算摸出球的各种颜色搭配。
print('red\tyellow\tgreen')
for red in range(0, 4):
for yellow in range(0, 4):
for green in range(2, 7):
if red