python中的常见问题--持续更新
这里可以找到常见的问题,需要的可以直接ctrl+f寻找关键字就能找到:
常见问题汇总
-
== 和 is
- Python中的对象包含三要素:id、type、value,其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值
- is 判断的是a对象是否就是b对象,是通过id来判断的
- == 断的是a对象的值是否和b对象的值相等,是通过value来判断的
-
copy 和 deepcopy
- 寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
- 浅复制并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。这就和我们寻常意义上的复制有所不同了
-
迭代器,生成器,itertools,yield,列表,字典集合推导
-
迭代器: 任何实现了 iter 和 next (python2中实现next()) 方法的对象都是迭代器
- iter 返回迭代器自身
- next 返回容器中的下一个值
- 如果容器中没有更多元素,则抛出StopIteration异常
- 迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果
-
生成器: 生成器是一种特殊的迭代器,不要定义iter 和 next. 只需要一个yiled关键字。 生成器一定是迭代器(反之不成立)
- 生成器是一种特殊的迭代器,它的返回值不是通过return而是用yield
-
-
method , classmethod 和 staticmethod
- method : 通过实例调用时,可以引用类内部的任何属性和方法
- classmethod : 无需实例化, 可以调用类属性和类方法,无法取到普通的成员属性和方法
- staticmethod: 无论用类调用还是用实例调用,都无法取到类内部的属性和方法, 完全独立的一个方法,简单的理解成静态方法与类或者实例没有任何关系,一旦调用后,它的内存地址即确定。
-
单例模式
- 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场
class A(object):
'''单例模式'''
obj = None
def __new__(cls, *args, **kwargs):
if cls.obj is None:
cls.obj = object.__new__(cls)
return cls.obj
else:
return cls.obj
-
Python 性能之困
i. 计算密集型
* CPU 长时间满负荷运行,如图像处理、圆周率计算等
* 计算密集型: 用 C 语言补充
* Profile, timeit
ii. I/O 密集型: 网络 IO,文件 IO, 设备 IO 等
* 多线程 / 多进程 / 协程
* 阻塞 -> 非阻塞
* 同步 -> 异步
iii. GIL 全局解释器锁-- 他能确保任何时候都只有一个Python线程执行 -
进程,线程,协程
- 进程: 进程资源消耗大,系统整体开销大,数据通信不方便
- 线程: 资源消耗小,可以共享数据,上下文开销大,按时间片强制切换,不够灵活
- 协程: 内存开销更小,上下文开销更小,可以根据事件进行切换,更加有效的利用CPU.
-
什么是同步,异步,阻塞,非阻塞
=====
- 字符串
help(str.replace) 返回方法的帮助信息,注意这里不应该是执行该方法
- 字符串方法:
str.find() 返回所找到的第一个字符串的索引的位置
str.replace('old','new') 替换方法
str.split('') 通过选定的分隔符进行切割
str.upper() 把字符串变为大写字母
str.isalpha() 判断是否为字母
str.isdigit() 判断是否为数字
str.rstrip() 去掉字符串右边的空格
- 模式匹配:
import re
match = re.match("pattern","string") # pattern里可以使用()来对所需要的信息进行取用
match.groups() # 使用这个可以对取用的结果进行读取
- 列表
list.append()
list.pop() # 删除特定位置的元素
list.insert() # 在指定位置插入元素
list.sort() # 按照特定进行排序 --改变列表
list.reverse() # 进行翻转 --改变列表
-
列表解析式
[raw[1] for row in list if row[1] < 1] # 这里添加了判断条件 Pythonic -
嵌套
列表的嵌套可以形成数组,多维数组
- 字典
字典无序,但是想用有序可使用 .keys()等方法将列表顺序出来.
- if
不存在键测试,防止程序报错
- 元组
不可变,防止数据在传递过程中被修改.
元组是无序的,相当于一个无值的字典的键.
- 三元表达式:
h = a-b if a>b else a+b
- 逻辑或
h = x or y 只有x为假的时候才会计算y
- lambda 表达式:
lambda 参数: 运算
常常搭配map 函数来进行操作