Python 版问号表达式
1
2
3
4
5
6
7
8
9
| age = 10
print('adult' if age>18 else 'adolescent')
x,y = 1,2
print(('no','yes')[x==y]) # no
L = [1,2,3]
print(L[False]) # 1
print(L[True]) # 2
|
列表的深度拷贝
1
2
3
4
5
6
7
| a = [1,2,3]
b = a[:]
print id(a)
print id(b)
c = a
print id(c)
|
1
2
3
| 59952144
60485304
59952144
|
提到深度拷贝,是不是一下子就想起来了copy.deepcopy()函数了?但是对于列表来讲,深度拷贝根本不用那么麻烦,只需像上面那样:b = a[:]即可实现,就是这么简单。
注:如果a是元组,这样玩是不可以的,切记!比如:
1
2
3
4
| a = (1,2,3)
b = a[:]
print id(a)
print id(b)
|
可以看出a和b的id是相同的,那么就想还是乖乖用copy.deepcopy()来拷贝吧:
1
2
3
4
| a = (1,2,3)
b = copy.deepcopy(a)
print id(a)
print id(b)
|
但是结果又让我们诧异了,这是因为元组是不可变对象,在内存中同一个元组只会存在一个,再怎么深度拷贝也没用(同为不可变对象的字符串也是同理的)。
在命令行启动一个本地服务器
1
| python -m SimpleHTTPServer
|
打开系统命令行,输入上面这条命令,然后打开浏览器输入地址:http://localhost:8000/,回车,将会看到命令行所在当前目录下的所有文件和文件夹,简直就是一个浏览器版的文件管理器。
把一个字符串写在多行
1
2
3
4
5
| s = ('abc'
'de'
'fgh'
)
print s
|
链式比大小
1
2
3
4
5
| n = 1
print 0 < n < 5
print 9 > n < 5
print 0 > n < 5
print -1 > 0 < n < 5
|
1
2
3
4
| True
True
False
False
|
动态导入包
1
2
3
| d = __import__('json').loads('{"a":123,"b":"bbb"}')
print type(d)
print d
|
1
2
| <type 'dict'>
{u'a': 123, u'b': u'bbb'}
|
注:动态导入包只在当前语句生效。
字典推导式
1
2
| dic = {i:i ** 2 for i in xrange(5)}
print dic
|
1
| {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
|
见过列表推导式、生成器推导式,那么有没有见过字典推导式呢?上面就是一例。
快速反转字符串
1
2
| s = '123456'
print s[::-1]
|
优雅地打开文件
1
2
| with open('test.txt','r') as f:
content = f.read()
|
用with语句上下文管理器可以自动地管理文件的打开、关闭,不需手工干预。
else,不止是else
普通用法
1
2
3
4
5
| a = -1
if a > 0:
print 'big'
else:
print 'small'
|
循环语句搭配else
判断一个数是否是素数:
1
2
3
4
5
6
7
8
| 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)
|
可见,如果循环中有break语句,且直到循环结束都没有执行过break语句,那么就会继续走后面的else分支。
异常处理搭配else
1
2
3
4
5
6
| try:
print 1/0
except Exception as msg:
print str(msg)
else:
print 'all is OK!'
|
1
| integer division or modulo by zero
|
1
2
3
4
5
6
| try:
print 1/1
except Exception as msg:
print str(msg)
else:
print 'all is OK!'
|
可见,如果没有发生异常,就会走else分支。
优雅地格式化字符串
用位置参数格式化
1
2
3
4
| In [33]: s = 'hello {0},I am {1}. My age is {2}.'.format('Tom','Ben',23)
In [34]: s
Out[34]: 'hello Tom,I am Ben. My age is 23.'
|
注:位置参数的索引是从0开始的。
用参数名称格式化
1
2
3
4
| In [35]: s = 'My name is {name}, {name}, {name}!!! And age is {age}'.format(name = 'Tom',age = 22)
In [36]: s
Out[36]: 'My name is Tom, Tom, Tom!!! And age is 22'
|
注:当有多个同名参数的时候,赋值的时候只需赋一次即可。