阅读更多
当我开始学习Python的时候,有些事我希望我一早就知道。我花费了很多时间才学会这些东西。我想要把这些重点都编纂到一篇文章当中。这篇文章的目标读者,是刚刚开始学习Python语言的有经验的程序员,想要跳过前几个月研究Python使用的那些他们已经在用的类似工具。包管理和标准工具这两节对于初学者来说同样很有帮助。

我的经验主要基于Python 2.7,但是大多数的工具对任何版本都有效。

如果你从来没有使用过Python,我强烈建议你阅读Python introduction,因为你需要知道基本的语法和类型。

包管理

Python世界最棒的地方之一,就是大量的第三方程序包。同样,管理这些包也非常容易。按照惯例,会在 requirements.txt 文件中列出项目所需要的包。每个包占一行,通常还包含版本号。这里有一个例子,本博客使用Pelican
pelican==3.3
Markdown
pelican-extended-sitemap==1.0.0

Python 程序包有一个缺陷是,它们默认会进行全局安装。我们将要使用一个工具,使我们每个项目都有一个独立的环境,这个工具叫virtualenv。我们同样要安装一个更高级的包管理工具,叫做pip,他可以和virtualenv配合工作。

首先,我们需要安装pip。大多数python安装程序已经内置了easy_install(python默认的包管理工具),所以我们就使用easy_install pip来安装pip。这应该是你最后一次使用easy_install 了。如果你并没有安装easy_install ,在linux系统中,貌似从python-setuptools 包中可以获得。

如果你使用的Python版本高于等于3.3, 那么Virtualenv 已经是标准库的一部分了,所以没有必要再去安装它了。

下一步,你希望安装virtualenvvirtualenvwrapper。Virtualenv使你能够为每个项目创造一个独立的环境。尤其是当你的不同项目使用不同版本的包时,这一点特别有用。Virtualenv wrapper 提供了一些不错的脚本,可以让一些事情变得容易。
sudo pip install virtualenvwrapper

当virtualenvwrapper安装后,它会把virtualenv列为依赖包,所以会自动安装。

打开一个新的shell,输入mkvirtualenv test 。如果你打开另外一个shell,则你就不在这个virtualenv中了,你可以通过workon test 来启动。如果你的工作完成了,可以使用deactivate 来停用。



IPython

IPython是标准Python交互式的编程环境的一个替代品,支持自动补全,文档快速访问,以及标准交互式编程环境本应该具备的很多其他功能。

当你处在一个虚拟环境中的时候,可以很简单的使用pip install ipython 来进行安装,在命令行中使用ipython 来启动



另一个不错的功能是”笔记本”,这个功能需要额外的组件。安装完成后,你可以使用ipython notebook,而且会有一个不错的网页UI,你可以创建笔记本。这在科学计算领域很流行。



测试

我推荐使用nose或是py.test。我大部分情况下用nose。它们基本上是类似的。我将讲解nose的一些细节。

这里有一个人为创建的可笑的使用nose进行测试的例子。在一个以test_开头的文件中
的所有以test_开头的函数,都会被调用:
def test_equality():
    assert True == False

不出所料,当运行nose的时候,我们的测试没有通过。
nose.tools中同样也有一些便捷的方法可以调用
from nose.tools import assert_true
def test_equality():
    assert_true(False)

如果你想使用更加类似JUnit的方法,也是可以的:
from nose.tools import assert_true
from unittest import TestCase
 
class ExampleTest(TestCase):
 
    def setUp(self): # setUp & tearDown are both available
        self.blah = False
 
    def test_blah(self):
        self.assertTrue(self.blah)

开始测试:
(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests                                                                                                                                      
F
======================================================================
FAIL: test_blah (test_nose_example.ExampleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/jhaddad/.virtualenvs/test/src/test_nose_example.py", line 11, in test_blah
    self.assertTrue(self.blah)
AssertionError: False is not true
 
----------------------------------------------------------------------
Ran 1 test in 0.003s
 
FAILED (failures=1)

卓越的Mock库包含在Python 3 中,但是如果你在使用Python 2,可以使用pypi来获取。这个测试将进行一个远程调用,但是这次调用将耗时10s。这个例子显然是人为捏造的。我们使用mock来返回样本数据而不是真正的进行调用。
import mock
 
from mock import patch
from time import sleep
 
class Sweetness(object):
    def slow_remote_call(self):
        sleep(10)
        return "some_data" # lets pretend we get this back from our remote api call
 
def test_long_call():
    s = Sweetness()
    result = s.slow_remote_call()
    assert result == "some_data"

当然,我们的测试需要很长的时间。
(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests test_mock.py                                                                                                                         
 
Ran 1 test in 10.001s
 
OK

太慢了!因此我们会问自己,我们在测试什么?我们需要测试远程调用是否有用,还是我们要测试当我们获得数据后要做什么?大多数情况下是后者。让我们摆脱这个愚蠢的远程调用吧:
import mock
 
from mock import patch
from time import sleep
 
class Sweetness(object):
    def slow_remote_call(self):
        sleep(10)
        return "some_data" # lets pretend we get this back from our remote api call
 
def test_long_call():
    s = Sweetness()
    with patch.object(s, "slow_remote_call", return_value="some_data"):
        result = s.slow_remote_call()
    assert result == "some_data"

好吧,让我们再试一次:
(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests test_mock.py                                                                                                                         
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
 
OK

好多了。记住,这个例子进行了荒唐的简化。就我个人来讲,我仅仅会忽略从远程系统的调用,而不是我的数据库调用。

nose-progressive是一个很好的模块,它可以改善nose的输出,让错误在发生时就显示出来,而不是留到最后。如果你的测试需要花费一定的时间,那么这是件好事。
pip install nose-progressive 并且在你的nosetests中添加--with-progressive

调试

iPDB是一个极好的工具,我已经用它查出了很多匪夷所思的bug。pip install ipdb 安装该工具,然后在你的代码中import ipdb; ipdb.set_trace(),然后你会在你的程序运行时,获得一个很好的交互式提示。它每次执行程序的一行并且检查变量。



python内置了一个很好的追踪模块,帮助我搞清楚发生了什么。这里有一个没什么用的python程序:
a = 1
b = 2
a = b

这里是对这个程序的追踪结果:
(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ python -m trace --trace tracing.py                                                                                                        1 ↵  
 --- modulename: tracing, funcname: <module>
tracing.py(1): a = 1
tracing.py(2): b = 2
tracing.py(3): a = b
 --- modulename: trace, funcname: _unsettrace
trace.py(80):         sys.settrace(None)

当你想要搞清楚其他程序的内部构造的时候,这个功能非常有用。如果你以前用过strace,它们的工作方式很相像

在一些场合,我使用pycallgraph来追踪性能问题。它可以创建函数调用时间和次数的图表。



最后,objgraph对于查找内存泄露非常有用。这里有一篇关于如何使用它查找内存泄露的好文

Gevent

Gevent 是一个很好的库,封装了Greenlets,使得Python具备了异步调用的功能。是的,非常棒。我最爱的功能是Pool,它抽象了异步调用部分,给我们提供了可以简单使用的途径,一个异步的map()函数:
from gevent import monkey
monkey.patch_all()
 
from time import sleep, time
 
def fetch_url(url):
    print "Fetching %s" % url
    sleep(10)
    print "Done fetching %s" % url
 
from gevent.pool import Pool
 
urls = ["http://test.com", "http://bacon.com", "http://eggs.com"]
 
p = Pool(10)
 
start = time()
p.map(fetch_url, urls)
print time() - start

非常重要的是,需要注意这段代码顶部对gevent monkey进行的补丁,如果没有它的话,就不能正确的运行。如果我们让Python连续调用 fetch_url 3次,通常我们期望这个过程花费30秒时间。使用gevent:
(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ python g.py                                                                                                                                    
Fetching http://test.com
Fetching http://bacon.com
Fetching http://eggs.com
Done fetching http://test.com
Done fetching http://bacon.com
Done fetching http://eggs.com
10.001791954

如果你有很多数据库调用或是从远程URLs获取,这是非常有用的。我并不是很喜欢回调函数,所以这一抽象对我来说效果很好。

结论

好吧,如果你看到这里了,那么你很可能已经学到了一些新东西。这些工具,在过去的一年里对我影响重大。找打它们花费了不少时间,所以希望本文能够减少其他人想要很好利用这门语言需要付出的努力。
  • 大小: 37.6 KB
  • 大小: 49.9 KB
  • 大小: 198.7 KB
  • 大小: 21.7 KB
  • 大小: 36 KB
来自: 伯乐在线
2
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 致 Python 初学者

    欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力...开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你

  • 写给已有编程经验的Python初学者的总结

    包管理和标准工具这两节对于初学者来说同样很有帮助。我的经验主要基于Python2.7,但是大多数的工具对任何版本都有效。如果你从来没有使用过Python,我强烈建议你阅读Pythonintroduction,因为你需要知道基本的语法...

  • 给 python 初学者的四条忠告

    学习一种编程语言,首先要找一款合用的集成开发工具,似乎是自然而然的想法。为什么不呢?IDE可以自动补齐,可以一键运行,还可以断点调试。使用IDE开发项目,就像驾驶一辆内饰豪华的汽车,尽情享受驾驶的乐趣就好了...

  • 简洁易懂,初学者挑战学习Python编程30天 (四)

    Python 是一种面向对象的编程语言。Python 中的一切都是一个对象,有它的属性和方法。程序中使用的数字、字符串、列表、字典、元组、集合等是相应内置类的对象。我们创建类来创建一个对象。一个类就像一个对象构造...

  • python写给初学者的一封信

    网络上有很多Python入门练手项目,练习项目的同时,可以锻炼自己的编程思维,同时了解Python的内置库和第三方库,开始学习如何使用这些库。 在你入门的路上最好能找一个已经会Python的人,在遇到问题时能适当咨询...

  • 简洁易懂,初学者挑战学习Python编程30天 (一)

    1.2环境设置安装 PythonPython Shell1.3Python基础Python 语法Python 缩进注释数据类型检查数据类型Python文件第 2 天 - 变量、内置函数2.1内置函数2.2变量2.3在一行中声明多个变量2.4数据类型2.5检查数据类型和转换...

  • 初学者怎样看懂python代码_Python 初学者,如何快速的入门

    所以就有了油然而生的想法,何不在这唯一一次长时间的假期来学习一项技能呢。所谓找一个易上手,速效快的项目,python就是一个不错的选择。4天入门15天快速熟悉基本语法2个月可以独立的操作一个小小的项目。那么接...

  • Python1000-Practice-Activities:UML设计的行业标准活动和用例叙述,供有经验的初学者或已完成“ Python 1000”培训的学生使用

    ) 如果您没有编程经验,这是我们的入门知识-它“几乎免费:” 如果您没有使用Python 3的经验,但知道如何编程,请直接跳到@: : 您还可以享受我们的努力吗?概述该项目是为有兴趣使用最常见的UML图集从专业定义的...

  • 最终篇:简洁易懂,初学者挑战学习Python编程30天 (五)

    Python 是一种通用编程语言,可用于许多地方。在本节中,我们将了解如何在 Web 上使用 Python。Python 网页框架作品很多。Django 和 Flask 是最受欢迎的。今天,我们将看到如何使用 Flask 进行 Web 开发。 26.2Flask...

  • 【Python 基础教程 04】超详细Python编程教程:初学者入门至全面了解Python 解析器( CPython、IPython、Jython和PyPy)

    【Python 基础教程 04】超详细Python编程教程:初学者入门至全面了解Python 解析器( CPython、IPython、Jython和PyPy)

  • 太香了,这100 个 Python 代码案例非常适合初学者练习

    大家好,趁着假期,今给大家整理的 100 个 Python 小技巧,喜欢记得收藏、关注、点赞,每天练习几个,假以时日就能全部化为已用,应用到自己的代码中。 注:完整版代码、数据、技术交流,文末提供 ▍1、for循环中的...

  • PYTHON-PROJECTS:适用于初学者和中级人员的基于Python的项目

    适用于初学者和中级的Python项目 介绍 Python是一种解释性的高级通用编程语言。 长期以来,Python一直是十大流行编程语言中的佼佼者,这是因为Python程序员社区易于使用的语法和库支持,因此其发展Swift。 在这里,...

  • 【推荐】这9个 Python 初学者网站值得收藏

    大家好,今天给大家梳理一下知乎高赞的 Python 做题类网站,喜欢本文记得点赞、收藏、关注。 【注】文末提供技术交流群 推荐文章 李宏毅《机器学习》国语课程(2022)来了 有人把吴恩达老师的机器学习和深度学习做...

  • 初学者入门:Python安装及运行指南

    Python是一门强大而受欢迎的编程语言,它在各个领域都有着广泛的应用。要开始编写Python代码,首先需要将Python安装到你的计算机上。本文将向你展示如何在不同平台上安装Python,并提供一些关于Python版本管理的技巧...

  • Python 备忘单是一页展示 Python 3 编程语言精华的参考表.rar

    近年来随着数据科学的出现,Python 的重要性成倍增加,它已成为数据科学和开发的主要编程语言,具有独特、灵活、语法非常简单并且拥有强大的社区等特点。一些全球知名的应用程序如 BitTorrent、DropBox 和 YouTube ...

  • python编程用什么软件-python开发工具有哪些(初学python用什么软件)

    python开发工具有哪些一、jupyternotebookIDE简介—五星推荐jupyternotebook是python学习与开发的一款简介的IDE,是一款Web应用程序,便于创建和编写文档等操作,支持实时编写并运行代码、方程式,同时支持可视化...

  • python开发环境和运行环境的区别_Python 初学者必知:Python 运行与开发环境

    http://codingdao.com/wp/post/py-must-know-run-dev-env/Python 初学者必知:Python 运行与开发环境2011年2月11日Breaker原创发表评论阅读评论这是以前刚开始学习 Python 时收集的一些资源,筛选留下一些好的文章和...

  • 使用 Simulink(R) 在 AWGN 信道上执行带穿孔的软判决维特比解码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

  • 极化码的高斯近似过程,基于matlab平台.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

Global site tag (gtag.js) - Google Analytics