天天看点

Python错题集

01 课堂

0. Python 是什么类型的语言?

Python是脚本语言

脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序。以简单的方式快速完成某些复杂的事情通常是创造脚本语言的重要原则,基于这项原则,使得脚本语言通常比 C语言、C++语言 或 Java 之类的系统编程语言要简单容易。

也让脚本语言另有一些属于脚本语言的特性:

语法和结构通常比较简单

学习和使用通常比较简单

通常以容易修改程序的“解释”作为运行方式,而不需要“编译”

程序的开发产能优于运行性能

一个脚本可以使得本来要用键盘进行的相互式操作自动化。一个Shell脚本主要由原本需要在命令行输入的命令组成,或在一个文本编辑器中,用户可以使用脚本来把一些常用的操作组合成一组串行。主要用来书写这种脚本的语言叫做脚本语言。很多脚本语言实际上已经超过简单的用户命令串行的指令,还可以编写更复杂的程序。

5. 如果我需要在一个字符串中嵌入一个双引号,正确的做法是?

你有两个选择:可以利用反斜杠(\)对双引号转义:\ ",或者用单引号引起这个字符串。例如:’ I l"o"ve fishc.com '。

0. 动手试试直接输入 >>>5+8 与输入 >>>print(5+8) 有何不同?

不妨试试直接直接输入 >>>‘I love fishc.com!’ 与输入 >>>print(‘I love fishc.com!’) 有何不同?

没错,直接输入是将结果及类型打印到屏幕上,而print是将结果打印到屏幕上,自己试试并观察结果!

02 课堂

2. 在 Python 看来:‘FishC’ 和 ‘fishc’ 一样吗?

不一样,因为 Python 是一个“敏感的小女孩”,所以不要试图欺骗她,对 Python 来说,fishc 和 FishC 是完全不同的两个名字,所以编程的时候一定要当心。不过 Python 会帮助解决可能因此出现的问题,例如只有当标识符已经赋值后(还记得吗,小甲鱼在课堂中说过 Python 的变量是不用先声明的)才能在代码中使用,未赋值的标识符直接使用会导致运行时错误,所以你很快就可以根据经验发现此问题。

0. 编写程序:hello.py,要求用户输入姓名并打印“你好,姓名!”

name = input(“请输入您的姓名:”)

print('你好’ + name )//使用了拼接,不需要对name变量做 ’ '(字符串是引号内的一切东西,字符串必须引号)

请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

学了BIF,dir(__builtins__两边)查bif,以及help()查bif用法

学了if,else的用法,学了temp和input的概念和用法

03 课堂

3. 在不上机的情况下,以下代码你能猜到屏幕会打印什么内容吗?

first = 520

second = ‘520’

first = second

print(first)

会打印:520,注:这里没有单引号括起来,但是他是一个字符串,因为使用 print() 打印,所以不包含单引号。可以试试直接>>>first,它是一个字符串的。

5. 如果非要在原始字符串结尾输入反斜杠,可以如何灵活处理?

str = r’C:\Program Files\FishC\Good’’\\只有两个反斜杠’

6. 在这一讲中,我们说变量的命名需要注意一些地方,但小甲鱼在举例的时候貌似却干了点儿“失误”的事儿,你能看得出小甲鱼例子中哪里有问题吗?

在例子中小甲鱼起了个 str 名字的变量,但事实上我们发现,str 的颜色跟普通变量貌似不同?没错,str() 和 print() 都是内置函数,但 Python 貌似不介意我们对内置函数进行赋值操作,所以这点我们以后就要注意啦,否则可能会出现以下的 BUG:

print = 1

print(“I love FishC”)

Traceback (most recent call last):

File “<pyshell#37>”, line 1, in

print(“I love FishC”)

TypeError: ‘int’ object is not callable

请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

python中的变量更像是指针,只有名字没有储存

变量的命名规则,字符串和引号的关系

原始字符串(在字符串前加r即可):作用 当字符里存在反斜杠\时使用

长字符串:三引号

04课堂

0. 请问以下代码会打印多少次“我爱鱼C!”

死循环,会一直打印“我爱鱼C!”(嗯,这也算是永远支持鱼C的方法之一),直到崩溃或者用户按下快捷键 CTRL + C(强制结束)

造成死循环的原因是 while 后边的条件永远为真(True),在 Python 看来,只有以下内容会被看作假(注意冒号括号里边啥都没有,连空格都不要有!):False None 0 “” ‘’ () [] {}

其他一切都被解释为真!

3. Python3 中,一行可以书写多个语句吗?

可以,语句之间用分号隔开即可,不妨试试:

print(‘I love fishc’);print(‘very much!’)

4. Python3 中,一个语句可以分成多行书写吗?

可以,一行过长的语句可以使用反斜杠或者括号分解成几行,不妨试试:

3 > 4 and

1 < 2

或者

( 3 > 4 and

1 < 2 )

5. 【该题针对有C或C++基础的朋友】请问Python的 and 操作符 和C语言的 && 操作符 有何不同?

and: 1 and 3 ------>3

1 and 0 ------>0

&&: 1 && 3 -------->1

1 && 0 -------->0

6. 听说过“短路逻辑(short-circuit logic)”吗?

逻辑操作符有个有趣的特性:在不需要求值的时候不进行操作。这么说可能比较“高深”,举个例子,表达式 x and y,需要 x 和 y 两个变量同时为真(True)的时候,结果才为真。因此,如果当 x 变量得知是假(False)的时候,表达式就会立刻返回 False,而不用去管 y 变量的值。

这种行为被称为短路逻辑(short-circuit logic)或者惰性求值(lazy evaluation),这种行为同样也应用与 or 操作符,这个后边的课程小甲鱼会讲到,不急。

实际上,Python 的做法是如果 x 为假,表达式会返回 x 的值(0),否则它就会返回 y 的值(例子参考楼上那题)。

05课堂

1. 你知道为什么布尔类型(bool)的 True 和 False 分别用 1 和 0 来代替吗?

你可能听说过计算机是很“笨”的,究其根本是因为它只认识二进制数,所以所有的编程语言最终都会转换成简单的二进制序列给 CPU 按照一定的规则解析。

由于二进制只有两个数:0 和 1,因此用 0 和 1 来表示 False 和 True 再适合不过了,因为不用浪费资源在转换的过程上!

2. 使用 int() 将小数转换为整数,结果是向上取整还是向下取整呢?

我们可爱的小甲鱼说了,小数取整会采用比较暴力的截断方式,即向下取整。(注:5.5 向上取整为 6,向下取整为 5)

但那是对于正数来说……对于负数则刚好相反 —— 是向上取整。

4. 取得一个变量的类型,视频中介绍可以使用 type() 和 isinstance(),你更倾向于使用哪个?

建议使用 isinstance(),因为它的返回结果比较直接,另外 type() 其实并没有你想象的那么简单,我们后边会讲到。

5. Python3 可以给变量命名中文名,知道为什么吗?

Pyhton3 源码文件默认使用utf-8编码(支持中文),这就使得以下代码是合法的:

小甲鱼 = ‘我爱你’

print(小甲鱼)

我爱你

2. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

数字类型,e记法(科学计数法)

类型转换

type()和isinstance()的用法

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。

06课堂

2. 不使用 IDLE,你可以轻松说出 5 ** -2 的值吗?

0.04,也就是 1/25

幂运算操作符比其左侧的一元操作符优先级高,比其右侧的一元操作符优先级低。

4. 请用最快速度说出答案:not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9

如果你的回答是 0,那么小甲鱼很开心你中招了!

答案是: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。

并且 当or为true时,取前值!(and为true时,取后值!)

所以答案是:4

温馨提示:为了更好的表达你的程序,小甲鱼再次呼吁有些括号还是不能省下的,毕竟不是所有程序员都跟你一样都将优先级烂透于心的。

1. 我们说过现在的 Python 可以计算很大很大的数据,但是…真正的大数据计算可是要靠刚刚的硬件滴,不妨写一个小代码,让你的计算机为之崩溃?

print(2 ** 2 ** 32)

一般很多机子都会在一会儿之后:Memory Overflow,内存不够用。

设计到幂操作,结果都是惊人滴。

那我再考考你 :

你猜猜为何 print( (2 ** 2) ** 32) 就可以计算出结果呢?

一个是2的(2**32)幂,下面不过是4的32次幂

3. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

算术运算符(/的用法和C有大不同,新学习**幂运算和//地板除法)

运算符优先级(主要是* *幂运算的优先级有特殊)

以及逻辑运算符

07课堂

打飞机小游戏框架讲解

08课堂

*2. 假设有 x = 1,y = 2,z = 3,请问如何快速将三个变量的值互相交换?

x, y, z = z, y, x

3. 猜猜 (x < y and [x] or [y])[0] 实现什么样的功能?

这其实是 Python 的作者还没有为 Python 加入三元操作符之前,Python 社区的小伙伴们灵活的使用 and 和 or 搭配来实现三元操作符的功能,这里边有涉及到列表和切片的知识,这部分知识很快就会讲解,迫不及待的朋友可以先稍微预习下。

4. 你听说过成员资格运算符吗?

Python 有一个成员资格运算符:in,用于检查一个值是否在序列中,如果在序列中返回 True,否则返回 False。

例如:

name = ‘小甲鱼’

‘鱼’ in name

True

‘肥鱼’ in name

False

当下节课我们讲解 for 语句的时候,你看到 in 会不会就有了更深入的理解?!

1. Python 的作者在很长一段时间不肯加入三元操作符就是怕跟 C 语言一样搞出国际乱码大赛,蛋疼的复杂度让初学者望而生畏,不过,如果你一旦搞清楚了三元操作符的使用技巧,或许一些比较复杂的问题反而迎刃而解。

请将以下代码修改为三元操作符实现:

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)

2. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

2.学习了elif和三元操作符

学习了assert断言BIF

009课堂

1. 下面的循环会打印多少次"I Love FishC"?

for i in 5:

print(‘I Love FishC’)

会报错,上节课的课后习题我们提到了 in 是“成员资格运算符”,而不是像 C 语言那样去使用 for 语法。Python 的 for 更像脚本语言的 foreach。

5. 目测以下程序会打印什么?

while True:

while True:

break

print(1)

print(2)

break

print(3)

会打印:

2

3

因为 break 只能跳出一层循环,记住咯!(此处和C有大不同,C为跳出所有循环)

6. 什么情况下我们要使循环永远为真?

while Ture:

循环体

同样用于游戏实现,因为游戏只要运行着,就需要时刻接收用户输入,因此使用永远为真确保游戏“在线”。操作系统也是同样的道理,时刻待命,操作系统永远为真的这个循环叫做消息循环。另外,许多通讯服务器的客户端/服务器系统也是通过这样的原理来工作的。

所以永远为“真”虽然是“死循环”,但不一定是坏事,再说了,我们可以随时用 break 来跳出循环!

7. 【学会提高代码的效率】你的觉得以下代码效率方面怎样?有没有办法可以大幅度改进(仍然使用while)?

i = 0

string = ‘ILoveFishC.com’

while i < len(string)):

print(i)

i += 1

这段代码之所以“效率比较低”是因为每次循环都需要调用一次 len() 函数(我们还没有学到函数的概念,小甲鱼这里为零基础的朋友形象的解释下:就像你打游戏打得正HIGH的时候,老妈让你去买盐…你有两种选择,一次买一包,一天去买五次,或者一次性买五包回来,老妈要就直接给她。)

i = 0

string = ‘ILoveFishC.com’

length = len(string)

while i < length:

print(i)

i += 1

小甲鱼希望学习咱的课程的朋友不是只为了可以把程序写出来,而是追求把代码写好,写漂亮,做一个有理想、有追求的程序猿!

3. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

while循环

for循环:for 变量 in 表达式:

len()

range(start,stop,step)

break和continue

010 课堂

2. append() 方法和 extend() 方法都是向列表的末尾增加元素,请问他们有什么区别?

append() 方法是将参数作为一个元素增加到列表的末尾。

extend() 方法则是将参数作为一个列表去***扩展***列表的末尾。

请看以下示例:

name = [‘F’, ‘i’, ‘s’, ‘h’]

name.append(‘C’)

name

[‘F’, ‘i’, ‘s’, ‘h’, ‘C’]

name.extend([’.’, ‘c’])

name

[‘F’, ‘i’, ‘s’, ‘h’, ‘C’, ‘.’, ‘c’]

name.append([‘o’, ‘m’])

name

[‘F’, ‘i’, ‘s’, ‘h’, ‘C’, ‘.’, ‘c’, [‘o’, ‘m’]]

1. 利用 for 循环打印上边 member 列表中的每个内容

member = [‘小甲鱼’, 88, ‘黑夜’, 90, ‘迷途’, 85, ‘怡静’, 90, ‘秋舞斜阳’, 88]

for each in member:

print(each)

2. 上一题打印的样式不是很好,能不能修改一下代码打印成下图的样式呢?【请至少使用两种方法实现】

方法一:

count = 0

length = len(member)

while count < length:

print(member[count], member[count+1])

count += 2

方法二:

for each in range(len(member)):

if each%2 == 0:

print(member[each], member[each+1])

3. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

0.列表能处理的数据类型

1.添加元素的三种方法 append()extend()insert()

011 课堂

3. 有些鱼油比较调皮,他说我想试试 list1[-3:-1] 会不会报错,怎么知道一试居然显示 [9, 7],这是怎么回事呢?

Python 的列表很聪明,竟然支持负数索引,如图:

Python错题集

当[ ]切片内函数变成负数时,[ ]变成左开右闭区间,并从右往左计数取值

正常索引是从左到右索引,负数索引是从右到左。

4. 在进行分片的时候,我们知道分片的开始和结束位置需要进行指定,但其实还有另外一个隐藏的设置:步长。

  1. 之前提到的“简洁”分片操作在这里有效:

list1[::2]

[1, 2, 7]

  1. 步长不能为0,要不就走不动了:

list1[::0]

Traceback (most recent call last):

File “<pyshell#11>”, line 1, in

list1[::0]

ValueError: slice step cannot be zero

  1. 步长可以是负数,改变方向(从尾部开始向左走):

list1[::-2]

[8, 9, 3]

  1. 步子太大容易扯着蛋…

5. 课堂上小甲鱼说可以利用分片完成列表的拷贝 list2 = list1[:],那事实上可不可以直接写成 list2 = list1 更加简洁呢?

千万不可以!

好的,为了大家都可以弄明白这个【必须理解】的概念,我啰嗦一下:

上节课我们提到使用分片创建列表的拷贝,例如:

list1 = [1, 3, 2, 9, 7, 8]

list2 = list1[:]

list2

[1, 3, 2, 9, 7, 8]

list3 = list1

list3

[1, 3, 2, 9, 7, 8]

看上去貌似一样的,对吧?但事实上呢?我们利用列表的一个小伙伴做下修改,大家看一下差别:

list1.sort()

list1

[1, 2, 3, 7, 8, 9]

看到吧,我们的list1已经从小到大排了个序,那list2和list3呢?

list2

[1, 3, 2, 9, 7, 8]

可以看到我们使用分片的方式得到的list2很有原则、很有格调,并不会因为list1的改变而改变,这个原理我待会儿跟大家说,我们接着看下list3:

list3

[1, 2, 3, 7, 8, 9]

大家可以看到了,真正的汉奸、墙头草是list3,Ta跟着list1改变了,这是为什么呢?

不知道大家还记不记得我们在讲解变量的时候说过,Python的变量就像一个标签,就一个名字而已,贴哪是哪,指哪打哪,呃,我还是给大家伙画个图好。

Python错题集

这下大家应该明白了吧,在为一个固定的东西指定另一个名字的做法,只是向同一个东西增加一个新的标签而已

6. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

删除列表中元素的方法:remove() del pop()

列表的切片 list[:]

012课堂

0. 注意,这道题跟上节课的那道题有点儿不同,回答完请上机实验或参考答案。

old = [1, 2, 3, 4, 5]

new = old

old = [6]

print(new)

会打印:[1, 2, 3, 4, 5]

和上堂课结果不同原因为:

上堂课中标签依然对应着同一个地址的值,而这次直接地址改变,标签也随之去了另一个地址之上,原地址依然是new

Python错题集

1. 请问如何将下边这个列表的’小甲鱼’修改为’小鱿鱼’?

list1 = [1, [1, 2, [‘小甲鱼’]], 3, 5, 8, 13, 18]

list1[1][2][0] = ‘小鱿鱼’

牛逼牛逼,我还绕了一大圈

6. 活学活用:请使用列表推导式补充被小甲鱼不小心涂掉的部分

Python错题集

list3 = [name + ‘:’ + slogan[2:] for slogan in list1 for name in list2 if slogan[0] == name[0]]

感悟:使用新的变量进入数组中能取出数组中的字符串内的内容

这是一个迭代。slogan从list1中寻找,name从list2中寻找,若两个字符串的第一个字符一样,则进行前面的拼接,即name + ‘:’ + slogan[2:]

举例说明:

当name=‘1.耐克’时,slogan=‘1.just do it’,此时list3中对应的元素由这个语句构成name+’:’+slogan[2:],即‘1.耐克’和’:'和‘just do it’三个字符串拼接而成,也即‘1.耐克:just do it’,list3的其他元素类似。所以才会出现这个结果。

list3 = [name + ‘:’ + slogan[2:] for slogan in list1 for name in list2 if slogan[0] == name[0]]

将这一句改为正常的循环结构如下:

list3=[]

for slogan in list1:

for name in list2:

if slogan[0] == name[0]:

list3.append(name + ‘:’ + slogan[2:])

7. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

比较操作符

逻辑操作符

连接操作符

重复操作符

成员关系操作符

列表的内置函数BIF

列表推导式(List comprehensions)也叫列表解析,灵感取自函数式编程语言 Haskell。Ta 是一个非常有用和灵活的工具,可以用来动态的创建列表,语法如:

[有关A的表达式 for A in B]

例如

list1 = [x2 for x in range(10)]

list1

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

相当于

list1 = []

for x in range(10):

list1.append(x2)