前言
本文主要给大家总结介绍了关于Python的一些基础技巧,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
1.startswith()和endswith()参数可以是元组
当检测字符串开头或结尾时,如果有多个检测值,可以用元组作为startswith()和endswith()参数:
1
2
3
4
5
6
7
8
9
10
11
12
|
# bad
if image.endswith( '.jpg' ) or image.endswith( '.png' ) or image.endswith( '.gif' ):
pass
# good
if image.endswith(( '.jpg' , '.png' , '.gif' )):
pass
# bad
if url.startswith( 'http:' ) or url.startswith( 'https:' ) or url.startswith( 'ftp:' ):
pass
# good
if url.startswith(( 'http:' , 'https:' , 'ftp:' )):
pass
|
2.enumerate()设置start参数做为索引起始值
当用enumerate()迭代同时要得到索引时,可以设置start参数作为索引起始值:
1
2
3
4
5
6
|
# bad
for index, v in enumerate (data):
print (index + 1 , v)
# good
for index, v in enumerate (data, start = 1 ):
print (index, v)
|
3.对切片命名
当代码中到处都是硬编码的切片索引时,我们的代码将变得无法阅读。可以对切片命名解决此问题:
1
2
3
4
5
6
7
|
record = '....................100.................513.25......'
# bad
cost = int (record[ 20 : 23 ]) * float (record[ 40 : 46 ])
# good
SHARES = slice ( 20 , 23 )
PRICE = slice ( 40 , 46 )
cost = int (record[SHARES]) * float (record[PRICE])
|
作为一条基本准则,代码中如果有很多硬编码的索引值,将导致可读性合可维护性都不佳。一般来说,内置的slice()函数会创建一个切片对象,可以用在任何允许进行切片操作的地方。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>> items = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 ]
>>> a = slice ( 2 , 4 )
>>> items[ 2 : 4 ]
[ 2 , 3 ]
>>> items[a]
[ 2 , 3 ]
>>> items[a] = [ - 2 , - 3 ]
>>> items
[ 0 , 1 , - 2 , - 3 , 4 , 5 , 6 ]
>>> del items[a]
>>> items
[ 0 , 1 , 4 , 5 , 6 ]
>>>
|
4.上下文管理器可以同时管理多个资源
假设你要读取一个文件的内容,经过处理以后,写入到另一个文件。你能写出pythonic的代码,所以你使用了上下文管理器,满意地的写出了下面这样的代码:
1
2
3
|
with open ( 'input.txt' , 'r' ) as source:
with open ( 'output.txt' , 'w' ) as target:
target.write(source.read())
|
你已经做的很好了,但是上下文管理器可以同时管理多个资源,上面这段代码还可以这样写:
1
2
|
with open ( 'input.txt' , 'r' ) as source, open ( 'output.txt' , 'w' ) as target:
target.write(source.read())
|
5.else子句
Python中的else子句不仅能在if语句中使用,还能在for、while、和try语句中使用。
在for循环或是while循环正常运行完毕时(而不是通过break语句或是return语句或是异常退出循环),才会运行else块。
举个例子:
1
2
3
4
5
6
7
8
9
10
|
>>> for i in range ( 3 ):
... print (i)
... else :
... print ( 'Iterated over everything' )
...
0
1
2
Iterated over everything
>>>
|
如上,for循环正常结束,所以运行了后面的else块。
1
2
3
4
5
6
7
8
9
10
|
>>> for i in range ( 3 ):
... if i = = 2 :
... break
... print (i)
... else :
... print ( 'Iterated over everything' )
...
0
1
>>>
|
由此可以看出,for循环如果没有正常运行完毕(如上面是break结束循环的),是不会运行后面的else块。
仅当try块中没有异常抛出时才运行else块。一开始,你可能觉得没必要在try/except块中使用else子句。毕竟,在下述代码片段中,只有dangerous_call()不抛出异常,after_call()才会执行,对吧?
1
2
3
4
5
|
try :
dangerous_call()
after_call()
except OSError:
log( 'OSError...' )
|
然而,after_call()不应该放在try块中。为了清晰明确,try块中应该只包括抛出预期异常的语句。因此,向下面这样写更好:
1
2
3
4
5
6
|
try :
dangerous_call()
except OSError:
log( 'OSError...' )
else :
after_call()
|
现在很明确,try块防守的是dangerous_call()可能出现的错误,而不是after_call()。而且很明显,只有try块不抛出异常,才会执行after_call()。但要注意一点,else子句抛出的异常不会由前面的except子句处理,也就是说此时after_call()如果抛出异常,将不会被捕获到。
还有更多的python技巧,大家可以参考这篇文章:http://www.zzvips.com/article/135738.html
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://www.revotu.com/python-some-common-tricks.html#more