这里是一些小知识点的汇集,为的是以后查找的方便。
行与缩进:
物理行:实际看到的代码行数。
逻辑行:在意义上的函数(即解释器执行的行数)
如果一个物理行中包含了多个逻辑行,则每个逻辑行之间需要用分号 “;” 隔开,最后一个逻辑行可以省略分号
一个逻辑行分为了多个物理行的话使用转义符 "\" 进行每个物理行之间的连接
缩进:逻辑行行首的空白,一般情况下行首不留空白
if和while语句的缩进:条件下的一个tab字符
运算符:
//:除法,向下取整
%:取余
&:二进制下的按位“与”运算
|:按位或
^:按位异或(不同为1,相同为0)
~:按位翻转 ~x=-(x+1)
<<:二进制左移,左移n个单位相当于乘以2^n
>>:二进制右移,右移n个单位相当于除以2^n
运算符优先级:
- 函数调用、寻址、下标
- 幂运算**
- 翻转运算
- 正负号
- * / %
- + -
- << >>
- & ^ |
- 比较运算符:> < >= <=
- 逻辑的 not and or
- lambda表达式
表达式和print执行的区别:表达式在命令行中输入单行命令,如:>>>a=“hello” >>>a 则会有’hello‘ 而如果是print(a),则是hello,不加引号。
map和列表解析的区别由以下代码可看出差异:
li =[x for x in range(1,11)] #列表解析
print(li)
def func(x):
return x+10
li2 = map(func,li) #遍历
print(list(li2))
强调一点的是map跟li是等长的,而列表解析则可以加筛选条件使其不等长。
5种 IO model
- blocking IO 阻塞IO
- nonblocking IO 非阻塞IO
IO multiplexing IO多路复用
signal driven IO 信号驱动IO
asynchronous IO 异步IO
同步、异步、io多路复用的区别
同步即一个io操作完成之后才能执行其他io操作,在等待过程中不能执行其他命令,而异步io则可以在启动io操作之后则跳到另一个线程,在该io操作发出执行完毕的操作后将再跳回执行该线程,可以节省等待的时间,但是如果io操作很简单且数量大时,同步比异步还相对省时。同步是执行中阻塞,异步非阻塞
异步和io多路复用的区别:当当前io操作执行完毕之后,异步会将数据传到内存里,等着你去调用,整个过程没有任何的阻塞,io多路复用是依然存在内核中,还需要去调取。io多路复用依然有阻塞,只是阻塞在select或epoll中而不是在select IO中,所以io多路复用并不是异步IO。但是异步的实现过程比较复杂,所以现在最常用的还是IO多路复用
做个不恰当的比喻来区分:
- 阻塞IO相当于你自己寄快递,从拿快递到送快递都需要你完成
- 非阻塞IO相当于你把快递给了快递公司,快递到了之后给你发个短信,你亲自跑去取
- IO多路复用则是你把快递给了很多个快递公司同时进行快递,一有快递则会通知你去取
- 异步IO则是你雇了一个人,让他去寄快递,快递到了之后他帮你取到家门口。