Python 程序员需要知道的 30 个技巧.docx

上传人:b****5 文档编号:8320849 上传时间:2023-01-30 格式:DOCX 页数:21 大小:23.91KB
下载 相关 举报
Python 程序员需要知道的 30 个技巧.docx_第1页
第1页 / 共21页
Python 程序员需要知道的 30 个技巧.docx_第2页
第2页 / 共21页
Python 程序员需要知道的 30 个技巧.docx_第3页
第3页 / 共21页
Python 程序员需要知道的 30 个技巧.docx_第4页
第4页 / 共21页
Python 程序员需要知道的 30 个技巧.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

Python 程序员需要知道的 30 个技巧.docx

《Python 程序员需要知道的 30 个技巧.docx》由会员分享,可在线阅读,更多相关《Python 程序员需要知道的 30 个技巧.docx(21页珍藏版)》请在冰豆网上搜索。

Python 程序员需要知道的 30 个技巧.docx

Python程序员需要知道的30个技巧

如果你让一个Python程序员说一下Python的优势,他会说简洁以及高可读是最有影响力的优势。

为证明上述两点,在这个Python教程里,我们将聊聊许多基本的Python建议和技巧。

我们从开始使用Python便收集这些有用的捷径(贴士与技巧)。

分享一些我们知道,同时又能造福于人的知识,有什么事情比这更棒吗?

过去我们分享过 一些给初学者的Python编程贴士 旨在优化代码并且减少编码工作,我们的读者仍旧很乐意阅读它。

所以今天我们带来另一些基本的Python贴士与技巧,所有的这些技巧都能帮助你压缩代码并且优化运行。

此外,你可以在日常工作中很容易地在真实项目中使用他们。

每一个技巧都有一个示例并且给出简短的解释,如果要测试这些代码片段,你可以看一下这些 在线虚拟Python运行终端。

 

最近我们发布的另两个必看的Python资源:

💡 9中优化Python代码的主要方式

💡 发现在编程时应该避免的最常见的错误

使用下面的TOC来快速地浏览这些Python贴士与技巧。

给程序员的30个基本Python贴士与技巧

贴士#1.原地交换两个数字

Python提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例:

1

2

3

4

5

6

7

8

x,y=10,20

print(x,y)

 

x,y=y,x

print(x,y)

 

#1(10,20)

#2(20,10)

赋值的右侧形成了一个新的元组,左侧立即解析(unpack)那个(未被引用的)元组到变量  和 

一旦赋值完成,新的元组变成了未被引用状态并且被标记为可被垃圾回收,最终也完成了变量的交换。

贴士#2.链状比较操作符

比较操作符的聚合是另一个有时很方便的技巧:

1

2

3

4

5

6

7

8

9

10

n=10

result=1

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(

展开阅读全文
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1