检查列表是否为空的最好方法 ?
a = [ ] # 如何检查 a 是空列表?
if not a: # 用隐藏的空列表的布尔值才是最Pythonic的方法.
print ("List is empty")
if __name__ == "__main__":
是干嘛的?
有时你需要你写的模块既可以直接的执行,还可以被当做模块导入到其他模块中去.通过检查是不是主函数,可以让你的代码只在它作为主程序运行时执行,而当其他人调用你的模块中的函数的时候不必执行.
在循环中获取索引(数组下标)
ints = [8, 23, 45, 12, 78] # 如何获取该列表的索引值?
最好的选择就是用内建函数enumerate
for idx, val in enumerate(ints):
print ( idx, val )
Python中的 appen 和 extend 区别?
x = [1, 2, 3]
x.append([4, 5])
print (x) # 输出:[1, 2, 3, [4, 5]]
x = [1, 2, 3]
x.extend([4, 5])
print (x) # 输出:[1, 2, 3, 4, 5]
extend
接受一个参数,这个参数总是一个 list,并且把这个 list 中的每个元素添加到原 list 中。
append
接受一个参数,这个参数可以是任何数据类型,并且简单地追加到 list 的尾部。
当一个字典被创建了,能不能在字典里添加元素?好像没有.add()
的方法.
In [28]: a = {'a':1}
In [29]: a['b'] = 1 # 只能赋值,简单粗暴
In [30]: a
Out[30]: {'a': 1, 'b': 1}
在一行里获取多个异常?
try:
# 可能错的地方
except (IDontLIkeYouException, YouAreBeingMeanException) as e:
pass # 用括号扩起来
如何移除换行符?
试试rstrip
方法:
>>> 'test string\n'.rstrip() # 必须 \n 在最后
'test string'
同样也有lstrip
和strip
方法:
>>> s = " \n abc def "
>>> s.strip()
'abc def'
>>> s.rstrip()
' \n abc def'
>>> s.lstrip()
'abc def '
鸭子类型
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。
比如在python中,有很多file-like
的东西,比如StringIO
,GzipFile
,socket
。它们有很多相同的方法,我们把它们当作文件使用。
又比如list.extend()
方法中,我们并不关心它的参数是不是list,只要它是可迭代的,所以它的参数可以是list
/tuple
/dict
/字符串/生成器等.
鸭子类型在动态语言中经常使用,非常灵活,使得python不想java那样专门去弄一大堆的设计模式。
为什么 Python 不支持函数重载?
在静态语言中,方法重载是希望类可以以统一的方式处理不同类型的数据提供了可能。多个同名函数同时存在,具有不同的参数个数/类型,重载是一个类中多态性的一种表现。
而在动态语言中,有鸭子类型,如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子。一个对象的特征不是由它的类型决定,而是通过对象中的方法决定,所以函数重载在动态语言中就显得没有意义了,因为函数可以通过鸭子类型来处理不同类型的对象,鸭子类型也是多态性的一种表现。
所以,并不太需要。
数据库索引 (难)
聚集索引,非聚集索引,B-Tree,B+Tree,最左前缀原理
推荐: http://tech.meituan.com/mysql-index.html
MySQL索引背后的数据结构及算法原理
Redis原理
Redis是什么?
- 是一个完全开源免费的
key-value
内存数据库 - 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构
strings
、map
、list
、sets
、sorted sets
Redis数据库
通常局限点来说,Redis也以消息队列的形式存在,作为内嵌的
List
存在,满足实时的高并发需求。在使用缓存的时候,redis
比memcached
具有更多的优势,并且支持更多的数据类型,把redis
当作一个中间存储系统,用来处理高并发的数据库操作
Redis 优点
- 速度快:使用标准C写,所有数据都在内存中完成,读写速度分别达到10万/20万
- 持久化:对数据的更新采用Copy-on-write技术,可以异步地保存到磁盘上,主要有两种策略,一是根据时间,更新次数的快照(save 300 10 )二是基于语句追加方式(Append-only file,aof)
- 自动操作:对不同数据类型的操作都是自动的,很安全
- 快速的主--从复制,官方提供了一个数据,Slave在21秒即完成了对Amazon网站10G key set的复制。
- Sharding技术: 很容易将数据分布到多个Redis实例中,数据库的扩展是个永恒的话题,在关系型数据库中,主要是以添加硬件、以分区为主要技术形式的纵向扩展解决了很多的应用场景,但随着web2.0、移动互联网、云计算等应用的兴起,这种扩展模式已经不太适合了,所以近年来,像采用主从配置、数据库复制形式的,Sharding这种技术把负载分布到多个特理节点上去的横向扩展方式用处越来越多。
Redis缺点
- 是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
- Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
数据库锁机制 - 乐观锁与悲观锁
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
参考文章