print(result)
#True
result=1>n<=9
print(result)
#False
贴士#3.使用三元操作符来进行条件赋值
三元操作符是if-else语句也就是条件操作符的一个快捷方式:
1
[表达式为真的返回值]if[表达式]else[表达式为假的返回值]
这里给出几个你可以用来使代码紧凑简洁的例子。
下面的语句是说“如果y是9,给x赋值10,不然赋值为20”。
如果需要的话我们也可以延长这条操作链。
1
x=10if(y==9)else20
同样地,我们可以对类做这种操作:
1
x=(classAify==1elseclassB)(param1,param2)
在上面的例子里classA与classB是两个类,其中一个类的构造函数会被调用。
下面是另一个多个条件表达式链接起来用以计算最小值的例子:
1
2
3
4
5
6
7
8
9
10
defsmall(a,b,c):
returnaifa<=banda<=celse(bifb<=aandb<=celsec)
print(small(1,0,1))
print(small(1,2,2))
print(small(2,2,3))
print(small(5,4,3))
#Output
#0#1#2#3
我们甚至可以在列表推导中使用三元运算符:
1
2
3
[m**2ifm>10elsem**4forminrange(50)]
#=>[0,1,16,81,256,625,1296,2401,4096,6561,10000,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600,1681,1764,1849,1936,2025,2116,2209,2304,2401]
贴士#4.多行字符串
基本的方式是使用源于C语言的反斜杠:
1
2
3
4
5
multiStr="select*frommulti_row
whererow_id<5"
print(multiStr)
#select*frommulti_rowwhererow_id<5
另一个技巧是使用三引号:
1
2
3
4
5
6
multiStr="""select*frommulti_row
whererow_id<5"""
print(multiStr)
#select*frommulti_row
#whererow_id<5
上面方法共有的问题是缺少合适的缩进,如果我们尝试缩进会在字符串中插入空格。
所以最后的解决方案是将字符串分为多行并且将整个字符串包含在括号中:
1
2
3
4
5
6
multiStr=("select*frommulti_row"
"whererow_id<5"
"orderbyage")
print(multiStr)
#select*frommulti_rowwhererow_id<5orderbyage
贴士#5.存储列表元素到新的变量中
我们可以使用列表来初始化多个变量,在解析列表时,变量的数目不应该超过列表中的元素个数:
【译者注:
元素个数与列表长度应该严格相同,不然会报错】
1
2
3
4
5
6
testList=[1,2,3]
x,y,z=testList
print(x,y,z)
#->123
贴士#6.打印引入模块的文件路径
如果你想知道引用到代码中模块的绝对路径,可以使用下面的技巧:
1
2
3
4
5
6
7
8
importthreading
importsocket
print(threading)
print(socket)
#1-
#2-
贴士#7.交互环境下的“_”操作符
这是一个我们大多数人不知道的有用特性,在Python控制台,不论何时我们测试一个表达式或者调用一个方法,结果都会分配给一个临时变量:
_(一个下划线)。
1
2
3
4
5
6
>>>2+1
3
>>>_
3
>>>print_
3
“_”是上一个执行的表达式的输出。
贴士#8.字典/集合推导
与我们使用的列表推导相似,我们也可以使用字典/集合推导,它们使用起来简单且有效,下面是一个例子:
1
2
3
4
5
6
7
8
testDict={i:
i*iforiinxrange(10)}
testSet={i*2foriinxrange(10)}
print(testSet)
print(testDict)
#set([0,2,4,6,8,10,12,14,16,18])
#{0:
0,1:
1,2:
4,3:
9,4:
16,5:
25,6:
36,7:
49,8:
64,9:
81}
注:
两个语句中只有一个 <:
> 的不同,另,在Python3中运行上述代码时,将 改为 。
贴士#9.调试脚本
我们可以在 模块的帮助下在Python脚本中设置断点,下面是一个例子:
1
2
importpdb
pdb.set_trace()
我们可以在脚本中任何位置指定 并且在那里设置一个断点,相当简便。
贴士#10.开启文件分享
Python允许运行一个HTTP服务器来从根路径共享文件,下面是开启服务器的命令:
#Python2
1
python-mSimpleHTTPServer
#Python3
1
python3-mhttp.server
上面的命令会在默认端口也就是8000开启一个服务器,你可以将一个自定义的端口号以最后一个参数的方式传递到上面的命令中。
贴士#11.检查Python中的对象
我们可以通过调用dir()方法来检查Python中的对象,下面是一个简单的例子:
1
2
test=[1,3,5,7]
print(dir(test))
1
['__add__','__class__','__contains__','__delattr__','__delitem__','__delslice__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__getslice__','__gt__','__hash__','__iadd__','__imul__','__init__','__iter__','__le__','__len__','__lt__','__mul__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__reversed__','__rmul__','__setattr__','__setitem__','__setslice__','__sizeof__','__str__','__subclasshook__','append','count','extend','index','insert','pop','remove','reverse','sort']
贴士#12.简化if语句
我们可以使用下面的方式来验证多个值:
1
ifmin[1,3,5,7]:
而不是:
1
ifm==1orm==3orm==5orm==7:
或者,对于 in 操作符我们也可以使用 '{1,3,5,7}' 而不是 '[1,3,5,7]',因为 set 中取元素是O
(1)操作。
贴士#13.运行时检测Python版本
当正在运行的Python低于支持的版本时,有时我们也许不想运行我们的程序。
为达到这个目标,你可以使用下面的代码片段,它也以可读的方式输出当前Python版本:
1
2
3
4
5
6
7
8
9
10
importsys
#DetectthePythonversioncurrentlyinuse.
ifnothasattr(sys,"hexversion")orsys.hexversion!
=50660080:
print("Sorry,youaren'trunningonPython3.5n")
print("Pleaseupgradeto3.5.n")
sys.exit
(1)
#PrintPythonversioninareadableformat.
print("CurrentPythonversion:
",sys.version)
或者你可以使用 sys.version_info>=(3,5) 来替换上面代码中的 sys.hexversion!
=50660080,这是一个读者的建议。
在Python2.7上运行的结果:
Python
1
2
3
4
5
6
7
Python2.7.10(default,Jul142015,19:
46:
27)
[GCC4.8.2]onlinux
Sorry,youaren'trunningonPython3.5
Pleaseupgradeto3.5.
在Python3.5上运行的结果:
Python
1
2
3
4
5
6
Python3.5.1(default,Dec2015,13:
05:
11)
[GCC4.8.2]onlinux
CurrentPythonversion:
3.5.2(default,Aug222016,21:
11:
05)
[GCC5.3.0]
贴士#14.组合多个字符串
如果你想拼接列表中的所有记号,比如下面的例子:
1
>>>test=['I','Like','Python','automation']
现在,让我们从上面给出的列表元素新建一个字符串:
1
>>>print''.join(test)
贴士#15.四种翻转字符串/列表的方式
#翻转列表本身
1
2
3
4
5
testList=[1,3,5]
testList.reverse()
print(testList)
#->[5,3,1]
#在一个循环中翻转并迭代输出
1
2
3
4
5
6
forelementinreversed([1,3,5]):
print(element)
#1->5
#2->3
#3->1
#一行代码翻转字符串
1
"TestPython"[:
:
-1]
输出为“nohtyPtseT”
#使用切片翻转列表
1
[1,3,5][:
:
-1]
上面的命令将会给出输出[5,3,1]。
贴士#16.玩转枚举
使用枚举可以在循环中方便地找到(当前的)索引:
1
2
3
4
5
6
7
testlist=[10,20,30]
fori,valueinenumerate(testlist):
print(i,':
',value)
#1->0:
10
#2->1:
20
#3->2:
30
贴士#17.在Python中使用枚举量
我们可以使用下面的方式来定义枚举量:
1
2
3
4
5
6
7
8
9
10
11
12
classShapes:
Circle,Square,Triangle,Quadrangle=range(4)
print(Shapes.Circle)
print(Shapes.Square)
print(Shapes.Triangle)
print(Shapes.Quadrangle)
#1->0
#2->1
#3->2
#4->3
贴士#18.从方法中返回多个值
并没有太多编程语言支持这个特性,然而Python中的方法确实(可以)返回多个值,请参见下面的例子来看看这是如何工作的:
1
2
3
4
5
6
7
8
9
10
#functionreturningmultiplevalues.
defx():
return1,2,3,4
#Callingtheabovefunction.
a,b,c,d=x()
print(a,b,c,d)
#->1234
贴士#19.使用 * 运算符(splatoperator)来unpack函数参数
* 运算符(splatoperator)提供了一个艺术化的方法来unpack参数列表,为清楚起见请参见下面的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
deftest(x,y,z):
print(x,y,z)
testDict={'x':
1,'y':
2,'z':
3}
testList=[10,20,30]
test(*testDict)
test(**testDict)
test(*testList)
#1->xyz
#2->123
#3->102030
贴士#20.使用字典来存储选择操作
我们能构造一个字典来存储表达式:
1
2
3
4
5
6
7
8
9
10
stdcalc={
'sum':
lambdax,y:
x+y,
'subtract':
lambdax,y:
x-y
}
print(stdcalc['sum'](9,3))
print(stdcalc['subtract'](9,3))
#1->12
#2->6
贴士#21.一行代码计算任何数的阶乘
Python2.x.
1
2
3
4
result=(lambdak:
reduce(int.__mul__,range(1,k+1),1))(3)
print(result)
#->6
Python3.x.
1
2
3
4
5
importfunctools
result=(lambdak:
functools.reduce(int.__mul__,range(1,k+1),1))(3)
print(result)
#->6
贴士#22.找到列表中出现最频繁的数
1
2
3
4
test=[1,2,3,4,2,2,3,1,4,4,4]
print(max(set(test),key=test.count))
#->4
贴士#23.重置递归限制
Python限制递归次数到1000,我们可以重置这个值:
1
2
3
4
5
6
7
8
9
10
importsys
x=1001
print(sys.getrecursionlimit())
sys.setrecursionlimit(x)
print(sys.getrecursionlimit())
#1->1000
#2->1001
请只在必要的时候采用上面的技巧。
贴士#24.检查一个对象的内存使用
在Python2.7中,一个32比特的整数占用24字节,在Python3.5中利用28字节。
为确定内存使用,我们可以调用 getsizeof 方法:
在Python2.7中
1
2
3
4
5
importsys
x=1
print(sys.getsizeof(x))
#->24
在Python3.5中
1
2
3
4
5
importsys
x=1
print(sys.getsizeof(x))
#->28
贴士#25.使用 __slots__ 来减少内存开支
你是否注意到你的Python应用占用许多资源特别是内存?
有一个技巧是使用 __slots__ 类变量来在一定程度上减少内存开支。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
importsys
classFileSystem(object):
def__init__(self,files,folders,devices):
self.files=files
self.folders=folders
self.devices=devices
print(sys.getsizeof(FileSystem))
classFileSystem1(object):
__slots__=['files','folders','devices']
def__init__(self,files,folders,devices):
self.files=files
self.folders=folders
self.devices=devices
print(sys.getsizeof(FileSystem1))
#InPython3.5
#1->1016
#2->888
很明显,你可以从结果中看到确实有内存使用上的节省,但是你只应该在一个类的内存开销不必要得大时才使用 __slots__。
只在对应用进行性能分析后才使用它,不然地话,你只是使得代码难以改变而没有真正的益处。
【译者注:
在我的win10python2.7中上面的结果是:
1
2
3
#InPython2.7win10
#1->896
#2->1016
所以,这种比较方式是不那么让人信服的,使用 __slots__ 主要是用以限定对象的属性信息,另外,当生成对象很多时花销可能会小一些,具体可以参见 python官方文档:
The slots declarationtakesasequenceofinstancevariablesandreservesjustenoughspaceineachinstancetoholdavalueforeachvariable.Spaceissavedbecause dict isnotcreatedforeachinstance.】
贴士#26.使用lambda来模仿输出方法
1
2
3
4
5
importsys
lprint=lambda*args:
sys.stdout.write("".join(map(str,args)))
lprint(