Python相关技巧

1,529次阅读
没有评论

枚举

不要这么做:

i = <span class="hljs-number">0</span> 
<span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> <span class="hljs-attribute">iterable</span>: 
    <span class="hljs-built_in">print</span> i, item 
    i += <span class="hljs-number">1</span>

而是这样:

<span class="hljs-keyword">for</span> i, item <span class="hljs-keyword">in</span> enumerate(iterable):
    <span class="hljs-built_in">print</span> i, item

Enumerate可以接受第二个参数,例如:

<span class="hljs-prompt">>></span>> list(enumerate(<span class="hljs-string">'abc'</span>)) 
[(<span class="hljs-number">0</span>, <span class="hljs-string">'a'</span>), (<span class="hljs-number">1</span>, <span class="hljs-string">'b'</span>), (<span class="hljs-number">2</span>, <span class="hljs-string">'c'</span>)] 

<span class="hljs-prompt">>></span>> list(enumerate(<span class="hljs-string">'abc'</span>, <span class="hljs-number">1</span>)) 
[(<span class="hljs-number">1</span>, <span class="hljs-string">'a'</span>), (<span class="hljs-number">2</span>, <span class="hljs-string">'b'</span>), (<span class="hljs-number">3</span>, <span class="hljs-string">'c'</span>)]

字典/集合 解析

你可能知道列表解析,但不知道字典/集合解析。字典/集合解析简单而且高效,例如:

my_dict = {i: i * <span class="hljs-function">i <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-title">xrange</span><span class="hljs-params">(<span class="hljs-number">100</span>)</span>} 
my_set </span>= {i * <span class="hljs-number">15</span> <span class="hljs-function"><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-title">xrange</span><span class="hljs-params">(<span class="hljs-number">100</span>)</span>}
# There <span class="hljs-keyword">is</span> only a difference of ':' <span class="hljs-keyword">in</span> both
</span>

强制浮点数除法

如果我们除以一个整数,即使结果是一个浮点数,Python(2) 依旧会给我们一个整数。为了规避这个问题,我们需要这样做:

<span class="hljs-title">result</span> = <span class="hljs-number">1</span>.<span class="hljs-number">0</span>/<span class="hljs-number">2</span>

但是现在有一种别的方法可以解决这个问题,甚至在之前我都没有意识到有这种方法存在。你可以进行如下操作:

<span class="hljs-keyword">from</span> __future__ <span class="hljs-keyword">import</span> division 
result = <span class="hljs-number">1</span>/<span class="hljs-number">2</span>
<span class="hljs-comment"># print(result)</span>
<span class="hljs-comment"># 0.5</span>

需要注意的是这个窍门只适用于Python 2。在Python 3 中就不需要进行import 操作了,因为它已经默认进行import了。

简单的服务器

你想快速简单的分享目录下的文件吗?可以这样做:

<span class="hljs-comment"># Python2</span>
<span class="hljs-title">python</span> -m SimpleHTTPServer

<span class="hljs-comment"># Python 3</span>
python3 -m http.server

这回启动一个服务器

Python表达式求值

我们都知道eval,但也许并不是所有人都知道literal_eval.可以这么做:

<span class="hljs-reserved">import</span> ast 
my_list = ast.literal_eval(expr)

而不是这样:

<span class="hljs-setting">expr = <span class="hljs-value"><span class="hljs-string">"[1, 2, 3]"</span> </span></span>
<span class="hljs-setting">my_list = <span class="hljs-value">eval(expr)</span></span>

我相信对于大多数人来说这种形式是第一次看见,但是实际上这个在Python中已经存在很长时间了。

分析脚本

按下面的方式运行脚本,可以很简单的对其进行分析:

<span class="hljs-title">python</span> -m cProfile my_script.py

对象自检

在Python中,可以通过dir()来检查对象,例如:

<span class="hljs-prompt">>></span>> foo = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>]
<span class="hljs-prompt">>></span>> dir(foo) 
[<span class="hljs-string">'__add__'</span>, <span class="hljs-string">'__class__'</span>, <span class="hljs-string">'__contains__'</span>, 
<span class="hljs-string">'__delattr__'</span>, <span class="hljs-string">'__delitem__'</span>, <span class="hljs-string">'__delslice__'</span>, ... , 
<span class="hljs-string">'extend'</span>, <span class="hljs-string">'index'</span>, <span class="hljs-string">'insert'</span>, <span class="hljs-string">'pop'</span>, <span class="hljs-string">'remove'</span>, 
<span class="hljs-string">'reverse'</span>, <span class="hljs-string">'sort'</span>]

调试脚本

你可以使用pdb模块在脚本中设置断点来调试脚本,就像这样:

<span class="hljs-reserved">import</span> pdb
pdb.set_trace()

你可以在脚本的任何地方加入pdb.set_trace(),该函数会在那个位置设置一个断点。超级方便。你应该多阅读pdb 函数的相关内容,因为在它里面还有很多鲜为人知的功能。

简化if结构

如果必须检查一些值,可以用

<span class="hljs-keyword">if</span> n <span class="hljs-keyword">in</span> [<span class="hljs-number">1</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>]:

而不是用复杂的if结构:

<span class="hljs-keyword">if</span> n==<span class="hljs-number">1</span> <span class="hljs-keyword">or</span> n==<span class="hljs-number">4</span> <span class="hljs-keyword">or</span> n==<span class="hljs-number">5</span> <span class="hljs-keyword">or</span> n==<span class="hljs-number">6</span>:

字符串/数列 逆序

下面的方式可以快速反转一个列表:

<span class="hljs-prompt">>></span>> a = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>]
<span class="hljs-prompt">>></span>> a[<span class="hljs-symbol">:</span><span class="hljs-symbol">:-</span><span class="hljs-number">1</span>]
[<span class="hljs-number">4</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>]

<span class="hljs-comment"># This creates a new reversed list. </span>
<span class="hljs-comment"># If you want to reverse a list in place you can do:</span>

a.reverse()

这种方式同样适用于字符串:

<span class="hljs-prompt">>></span>> foo = <span class="hljs-string">"yasoob"</span>
<span class="hljs-prompt">>></span>> foo[<span class="hljs-symbol">:</span><span class="hljs-symbol">:-</span><span class="hljs-number">1</span>]
<span class="hljs-string">'boosay'</span>

优雅地打印

下面的方式可以用优雅的方式打印字典和列表:

<span class="hljs-keyword">from</span> pprint <span class="hljs-keyword">import</span> pprint 
pprint(my_dict)

这用于字典打印是非常高效的,如果你想从文件中快速优雅的打印出json,可以这样做:

<span class="hljs-title">cat</span> file.json | python -m json.tools

三元运算

三元运算是if-else 语句的快捷操作,也被称为条件运算。这里有几个例子可以供你参考:

[on_<span class="hljs-literal">true</span>] <span class="hljs-keyword">if</span> [expression] <span class="hljs-keyword">else</span> [on_<span class="hljs-literal">false</span>]
x, y = <span class="hljs-number">50</span>, <span class="hljs-number">25</span>
small = x <span class="hljs-keyword">if</span> x < y <span class="hljs-keyword">else</span> y

原文转自:https://freepythontips.wordpress.com/2015/04/19/nifty-python-tricks/

admin
版权声明:本站原创文章,由admin2015-06-07发表,共计1852字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)