知乎上有一个问题:Python 有什么奇技淫巧?其中有各类不按套路出牌的招数,也不乏一些惊为天人的"奇技淫巧",会让你大呼:竟然还有这种操做???python
本文就是对平常使用过的或者以为很精妙的"奇技淫巧"的概括总结。json
x = 1 y = 2 print ('no','yes')[x==y]
no
这里巧妙地利用了Python会把False当作序列下标0、把True当作序列下标1的特性,把否认条件的输出放在前面的元组的第一个元素,而把确定条件的输出放在第二个元素。又好比:浏览器
a = [1,2,3] print a[False] print a[True]
1 2
此时是否是一幅"黑人问号"脸呢?服务器
a = [1,2,3] b = a[:] print id(a) print id(b) c = a print id(c)
59952144 60485304 59952144
提到深度拷贝,是否是一会儿就想起来了copy.deepcopy()函数了?可是对于列表来说,深度拷贝根本不用那么麻烦,只需像上面那样:b = a[:]
便可实现,就是这么简单。函数
注:若是a是元组,这样玩是不能够的,切记!好比:命令行
a = (1,2,3) b = a[:] print id(a) print id(b)
59570456 59570456
能够看出a和b的id是相同的,那么就想仍是乖乖用copy.deepcopy()来拷贝吧:code
a = (1,2,3) b = copy.deepcopy(a) print id(a) print id(b)
60481864 60481864
可是结果又让咱们诧异了,这是由于元组是不可变对象,在内存中同一个元组只会存在一个,再怎么深度拷贝也没用(同为不可变对象的字符串也是同理的)。orm
python -m SimpleHTTPServer
打开系统命令行,输入上面这条命令,而后打开浏览器输入地址:http://localhost:8000/
,回车,将会看到命令行所在当前目录下的全部文件和文件夹,简直就是一个浏览器版的文件管理器。对象
s = ('abc' 'de' 'fgh' ) print s
abcdefgh
n = 1 print 0 < n < 5 print 9 > n < 5 print 0 > n < 5 print -1 > 0 < n < 5
True True False False
d = __import__('json').loads('{"a":123,"b":"bbb"}') print type(d) print d
<type 'dict'> {u'a': 123, u'b': u'bbb'}
注:动态导入包只在当前语句生效。内存
dic = {i:i ** 2 for i in xrange(5)} print dic
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
见过列表推导式、生成器推导式,那么有没有见过字典推导式呢?上面就是一例。
s = '123456' print s[::-1]
654321
with open('test.txt','r') as f: content = f.read()
用with语句上下文管理器能够自动地管理文件的打开、关闭,不需手工干预。
a = -1 if a > 0: print 'big' else: print 'small'
small
判断一个数是不是素数:
import math n = 97 for i in range(2,int(math.sqrt(n) + 2)): if n % i == 0: print '{0} is not a prime!'.format(n) break else: print '{0} is a prime!'.format(n)
97 is a prime!
可见,若是循环中有break语句,且直到循环结束都没有执行过break语句,那么就会继续走后面的else分支。
try: print 1/0 except Exception as msg: print str(msg) else: print 'all is OK!'
integer division or modulo by zero
try: print 1/1 except Exception as msg: print str(msg) else: print 'all is OK!'
1 all is OK!
可见,若是没有发生异常,就会走else分支。