附录:
《Python异常总结》
http://bbs.fishc.com/thread-45814-1-1.html
《Python描述符 (descriptor) 详解》
https://www.cnblogs.com/Jimmy1988/p/6808237.html
《Python魔法方法总结》
http://bbs.fishc.com/thread-48793-1-1.html
==================================================================
知识点:
(1)执行以下代码,IDLE会无限循环。
while 1: print("Hello World\n")
可通过"Ctrl+C"强制停止。
(2)一行可以书写多个语句吗? 可以,语句之间用分号隔开即可,如:
print('I love fishc');print('very much!')
(3)一个语句可以分成多行书写吗?可以,一行过长的语句可以使用反斜杠或者括号分解成几行,不妨试试:
>>> 3>4 and \ 1<2
或者,
>>> (3 >4 and 1<2)
(4)三元操作符:
x,y = 3,5 small= x if x<y else y
(5)C++的 floor 除法现在使用 “//” 实现,即3.0 // 2 = 1.0
(6)5 ** -2 等价于 5 ** (-2) =1/25;
-5**2 =-25; (-5)**2=25;
(7)not or and 的优先级是不同的:not > and > or
(8)短路逻辑:
>>> 3 and 4 4 >>> 3 or 4 3
(9)assert 的作用是什么?
assert这个关键字我们称之为“断言”,当这个关键字后边的条件为假的时候,程序自动崩溃并抛出AssertionError的异常。
什么情况下我们会需要这样的代码呢?
当我们在测试程序的时候就很好用,因为与其让错误的条件导致程序今后莫名其妙地崩溃,不如在错误条件出现的那一瞬间我们实现“自爆”。 一般来说我们可以用Ta再程序中置入检查点,当需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert关键字就非常有用了。
(10)假设有 x = 1,y = 2,z = 3,请问如何快速将三个变量的值互相交换?
x, y, z = z, y, x
(11)Python 有一个成员资格运算符:in,用于检查一个值是否在序列中,如果在序列中返回 True,否则返回 False。
例如:
>>> name = '小甲鱼' >>> '鱼' in name True >>> '肥鱼' in name False
(12)下面的循环会打印多少次"I Love FishC"?
for i in range(0, 10, 2): print('I Love FishC')
5 次,因为从 0 开始,到 10 结束,步进为 2。
(13)回顾一下 break 和 continue 在循环中起到的作用:
break语句的作用是终止当前循环,跳出循环体。
continue语句的作用是终止本轮循环并开始下一轮循环(这里要注意的是:在开始下一轮循环之前,会先测试循环条件)。
(14)什么情况下我们要使循环永远为真?
while Ture :
循环体
同样用于游戏实现,因为游戏只要运行着,就需要时刻接收用户输入,因此使用永远为真确保游戏“在线”。操作系统也是同样的道理,时刻待命,操作系统永远为真的这个循环叫做消息循环。另外,许多通讯服务器的客户端/服务器系统也是通过这样的原理来工作的。
所以永远为“真”虽然是“死循环”,但不一定是坏事,再说了,我们可以随时用 break 来跳出循环!
(15)
>>> def Fun1(): x=5 def Fun2(): x*=x return x return Fun2()
由于Fun2()试图对x进行修改,故Fun2的局部空间会定义一个新的x,而由于这个x未被赋值故 无法返回值。
改为以下代码即可运行:
>>> def Fun1(): x=5 def Fun2(): k=x*x return k return Fun2() >>> Fun1() 25
或用列表
>>> def Fun1(): x=[5] def Fun2(): x[0]*=x[0] return x[0] return Fun2() >>> Fun1() 25
(16)对列表使用copy和切片拷贝的性质都是属于深拷贝(即,新建一个内存)
(17)关于“闭包”,感受一下两个代码的区别
def funX(): x = 5 def funY(): nonlocal x x += 1 return x return funY a = funX() print(a()) print(a()) print(a())和
def funX(): x = 5 def funY(): nonlocal x x += 1 return x return funY print(funX()()) print(funX()()) print(funX()())
(18)若类的属性与方法的命名相同,则类的属性会覆盖类的方法
(19)Q:什么情况下适合用递归?
A:快速排序,目录索引(因为你永远不知道这个目录里边是否还有目录),树结构德定义等如果使用递归会事半功倍,否则会导致程序无法实现或相当难以理解。
(20)以下代码是错误的:
>>> num_set = set([1, 2, 3, 4, 5]) >>> num_set[0]
因为集合是无序的。
无序的原因:集合和字典的存储方式一样,都是通过将元素名通过哈希函数计算,将其转换为内存地址值,并将数据存放于此。而相同的元素名对应的内存地址必然相同,故集合通过这种方式可以保持唯一性,并且由于通过哈希函数得到的地址是无序的,所以集合是无序的。而字典通过这种方式可以使得元素名相同的元素互相覆盖,以保证Key(元素名)的唯一性,同时字典也不能通过序号来访问元素,必须通过元素名,可以理解为元素名<=>内存地址。
(21)以下代码会报错,如果修改?
try: f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T print(f.read()) except OSError as reason: print('出错啦:' + str(reason)) finally: f.close()
可修改为:
try: f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T print(f.read()) except OSError as reason: print('出错啦:' + str(reason)) finally: if 'f' in locals(): # 如果文件对象变量存在当前局部变量符号表的话,说明打开成功 f.close()
但是这样写太繁琐了,所以,Python引入了with语句来自动帮我们调用close()方法:
try: with open('data.txt', 'w') as f: for each_line in f: print(each_line) except OSError as reason: print('出错啦:' + str(reason))(22)静态方法是类的特殊方法,只需要在普通方法前加上@staticmethod修饰符即可将其转为静态方法。静态方法最大的优点是:不会绑定到实例对象上,换而言之就是节省开销。