python基础--学习过程中容易忽略的一些小知识点总结《疑难杂症》
1:断言
assert这个关键字成为“断言”,当这个关键字后面的条件为假得时候,程序自动崩溃并抛出AssertionError的异常。 一般来说,可以用它在程序中置入检查点, 当需要确保程序中某个条件一定为真才能让程序正常工作时,assert关键字就非常有用了。
实例:
list = []
assert len(list) > 0 # 在此处设置断言,如果列表空,则直接抛出异常,不能遍历列表
for i in list:
print(i)
输出结果:
当我们在assert之前为列表中添加上元素,则就可以执行for那条语句了。。
list = []
list.append(10)
assert len(list) > 0
for i in list:
print(i) #最后的输出结果为10
2:列表的拷贝
上述代码解释:我们创建了一个列表list1,然后通过赋值的方式赋给list2,通过切片的方式赋值给list3。 最后输出它们三者的地址,发现list1和list2指向的同一块内存,而list3指向的内存不同。下面画个图解释一下这种情况。
赋值只是复制了指向,并没有复制真正的数据。。而通过切片进行复制时,对数据真正进行了复制(备份).
3:sort()和sorted()的区别
列表中内建方法sort()是实现列表原地排序, 而sorted()是返回一个排序后的新列表。
上述代码解释:我们先创建了一个列表t1,然后用sorted()对原始列表排序紧接着赋值给t2, 此时,输出t1, t2, 我们发现t1是无序的,而t2是有序的,说明sorted()不是原地排序(不会改变原始序列的顺序)。。我们又使用sort()进行排序,然后输出t1,发现此时的t1顺序改变了。 说明是原地排序。。
4: zip()函数的作用
zip(iter1, iter2......) 方法用于返回由各个可迭代参数共同组成的元组。
实例:
记住:里面的参数要是可迭代对象。。
5:闭包
闭包是函数式编程的一个重要的语法结构
如果一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包
实例:
闭包拓展:
刚才在内部函数funY()中不能修改x变量,若想要修改,必须用nonlocal关键字
实例:
6:lambda表达式
以后碰见lambda表达式,就把它赋值的那个变量(在本例中是g)当做函数名, lambda后面的,:符号之前的变量当做参数。 :符号之后的式子为函数体。
7:copy模块中copy()方法和deepcopy()方法
根据上述代码可知 目前b,c都得到了a的值 。。 接着往下看
上述代码,我们给a[0]赋了100。 输出发现只有a中的值改变。。b 和c 都没改变 。。 说明b, c缺失把a中的值复制了一份,不是指复制了索引。。这句话其实有点问题 。。 接着往下看
上述代码:我们把a列表中第三个元素(列表)第一个值改变了。赋值为shawroa。。 此时输出,我们发现a ,b中的那个位置的值发生了变化,而c则没变。。
总结:
注意:
copy对于一个复杂对象的子对象并不会完全复制,什么是复杂对象的子对象呢?就比如序列里的嵌套序列,字典里的嵌套序列等都是复杂对象的子对象。对于子对象,python会把它当作一个公共镜像存储起来,所有对他的复制都被当成一个引用,所以说当其中一个引用将镜像改变了之后另一个引用使用镜像的时候镜像已经被改变了。
deepcopy的时候会将复杂对象的每一层复制一个单独的个体出来
在继承中的区别(自己建两个类试一下,有时间补上):
浅拷贝: copy模块的copy方法, 拷贝父对象,不会拷贝对象的内部的子对象。即浅复制只复制对象本身,没有复制该对象所引用的对象。
深拷贝:copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。即创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联。虽然实际上会共享不可变的子对象,但不影响它们的相互独立性。