竞争无处不在,青春永不言败!专业撸代码,副业修bug

Talk is cheap , show me the code!



转 -- 一行式

 一行式

本章节,我将向大家展示一些一行式的Python命令,这些程序将对你非常有帮助。

简易Web Server

你是否想过通过网络快速共享文件?好消息,Python为你提供了这样的功能。进入到你要共享文件的目录下并在命令行中运行下面的代码:

    # Python 2
    python -m SimpleHTTPServer

    # Python 3
    python -m http.server

漂亮的打印

你可以在Python REPL漂亮的打印出列表和字典。这里是相关的代码:

    from pprint import pprint

    my_dict = {'name': 'Yasoob', 'age': 'undefined', 'personality': 'awesome'}
    pprint(my_dict)

这种方法在字典上更为有效。此外,如果你想快速漂亮的从文件打印出json数据,那么你可以这么做:

    cat file.json | python -m json.tool

脚本性能分析 这可能在定位你的脚本中的性能瓶颈时,会非常奏效:

    python -m cProfile my_script.py

备注:cProfile是一个比profile更快的实现,因为它是用c写的

CSV转换为json

在命令行执行这条指令

    python -c "import csv,json;print json.dumps(list(csv.reader(open('csv_file.csv'))))"

确保更换csv_file.csv为你想要转换的csv文件

列表辗平

您可以通过使用itertools包中的itertools.chain.from_iterable轻松快速的辗平一个列表。下面是一个简单的例子:

    a_list = [[1, 2], [3, 4], [5, 6]]
    print(list(itertools.chain.from_iterable(a_list)))
    # Output: [1, 2, 3, 4, 5, 6]

    # or
    print(list(itertools.chain(*a_list)))
    # Output: [1, 2, 3, 4, 5, 6]

一行式的构造器

避免类初始化时大量重复的赋值语句

    class A(object):
        def __init__(self, a, b, c, d, e, f):
            self.__dict__.update({k: v for k, v in locals().items() if k != 'self'})

python 2.x 与 python 3.x 兼容问题

22. 目标Python2+3

很多时候你可能希望你开发的程序能够同时兼容Python2+和Python3+。

试想你有一个非常出名的Python模块被很多开发者使用着,但并不是所有人都只使用Python2或者Python3。这时候你有两个办法。第一个办法是开发两个模块,针对Python2一个,针对Python3一个。还有一个办法就是调整你现在的代码使其同时兼容Python2和Python3。

本节中,我将介绍一些技巧,让你的脚本同时兼容Python2和Python3。

Future模块导入

第一种也是最重要的方法,就是导入__future__模块。它可以帮你在Python2中导入Python3的功能。这有一组例子:

上下文管理器是Python2.6+引入的新特性,如果你想在Python2.5中使用它可以这样做:

from __future__ import with_statement

在Python3中print已经变为一个函数。如果你想在Python2中使用它可以通过__future__导入:

print
# Output:

from __future__ import print_function
print(print)
# Output: <built-in function print>

模块重命名

首先,告诉我你是如何在你的脚本中导入模块的。大多时候我们会这样做:

import foo 
# or
from foo import bar

你知道么,其实你也可以这样做:

import foo as foo

这样做可以起到和上面代码同样的功能,但最重要的是它能让你的脚本同时兼容Python2和Python3。现在我们来看下面的代码:

try:
    import urllib.request as urllib_request  # for Python 3
except ImportError:
    import urllib2 as urllib_request  # for Python 2

让我来稍微解释一下上面的代码。
我们将模块导入代码包装在try/except语句中。我们是这样做是因为在Python 2中并没有urllib.request模块。这将引起一个ImportError异常。而在Python2中urllib.request的功能则是由urllib2提供的。所以,当我们试图在Python2中导入urllib.request模块的时候,一旦我们捕获到ImportError我们将通过导入urllib2模块来代替它。

最后,你要了解as关键字的作用。它将导入的模块映射到urllib.request,所以我们通过urllib_request这个别名就可以使用urllib2中的所有类和方法了。

过期的Python2内置功能

另一个需要了解的事情就是Python2中有12个内置功能在Python3中已经被移除了。要确保在Python2代码中不要出现这些功能来保证对Python3的兼容。这有一个强制让你放弃12内置功能的方法:

from future.builtins.disabled import *

现在,只要你尝试在Python3中使用这些被遗弃的模块时,就会抛出一个NameError异常如下:

from future.builtins.disabled import *

apply()
# Output: NameError: obsolete Python 2 builtin apply is disabled

标准库向下兼容的外部支持

有一些包在非官方的支持下为Python2提供了Python3的功能。例如,我们有:

  • enum pip install enum34
  • singledispatch pip install singledispatch
  • pathlib pip install pathlib

想更多了解,在Python文档中有一个全面的指南可以帮助你让你的代码同时兼容Python2和Python3。

 
posted @ 2018-07-02 17:11  云雾散人  阅读(160)  评论(0编辑  收藏  举报

Your attitude not your aptitude will determine your altitude!

如果有来生,一个人去远行,看不同的风景,感受生命的活力!