自学python笔记

附录:

《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)一行可以书写多个语句吗? 可以,语句之间用分号隔开即可,如: 

扫描二维码关注公众号,回复: 1102513 查看本文章
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修饰符即可将其转为静态方法。静态方法最大的优点是:不会绑定到实例对象上,换而言之就是节省开销。

猜你喜欢

转载自blog.csdn.net/replus_/article/details/80143174
今日推荐