Category Archives: python

python

Learning Python – 01

Python中处理变量的方式和其他语言有很大的不同,尽管这些区别看上去没有那么明显。

Python中所有东西都是对象,变量只是指向对象的指针。所以类型是跟着对象走的,而不是跟着变量走。比如下面的代码在Python中是完全正确的(尽管实际上很少有人这么写代码):
a = 300
a = ‘spam’
a = 1.23
第一行,Python新建了一个整数对象,值为300,同时变量a指向这一对象。第二行,Python新建一个字符串对象’spam’,并且让变量a指向这一变量,并且,由于没有其他变量指向300这一对象,这一对象所占用的内容会被Python自动回收。第三行发生的事情是类似的。
好象也没什么,很多解释型的语言,似乎都是这样。下面再来看点不一样的东西。比较一下以下两段代码中的最后一行会返回什么:
代码1:
a = 300
b = 300
a is b
代码2:
a = 300
b = a
a is b
对于代码1,a is b返回False,也就是说,a和b指向了不同的对象,只是他们的值都300。对于代码2,a is b将返回True,a和b指向了同一个对象。如何说明他们确实是同一个对象呢?来看:
a = [1, 2, 3]
b = a
a.append(4)
这时,a等于[1,2,3,4],b也等于[1,2,3,4],因为他们指向的是同一个对象。再来看:
代码3:
a = 300
b = 300
a = a + 100
代码4:
a = 300
b = a
a = a + 100
问,执行完上面两段代码后,a、b各是多少?
毫无疑问,无论代码3还是4,执行后,a都应该是400,关键是b。对于代码3,由于已经知道a,b原来指向的就是不同的对象,因此,b应该还是300。对于代码4,或许有人认为b应该400,因为“a is b”是True,而且刚才也看到了list的例子。其实b还是等于300。
这里涉及到Python数据类型的另一个性质。Python中,整数对象是immutable的,也就是不可变的,一旦生成,其值是不可更改的。a = a + 100这一句的实际执行过程是,取出a当前指向对象的值300,加上100后为400,则新建一个值为400的整数对象,并令a指向该对象。也就是说,无论代码3还是代码4,a都不是原来的a了,只是在代码3中,这一点表现的并不明显。而在代码4中,由于b仍指向原来的300那个对象,因此,300不会被收回(每个对象有个计数器,自动记录有多少变量指向该对象,只有当计数器减为0时,Python才会自动回收该对象),b的值也不会改变。而刚才list的例子中,由于list是可变类型的,因此改变a,就是改变b。
Python越学越有趣了。
python

Spyder: Python的科学计算IDE

Spyder(之前叫Pydee)是一个面向Python科学计算的IDE。跨平台,轻量级,提供了类似Matlab集成环境的功能。对于Windows平台的用户,可以考虑直接安装Python(x,y)这个发行版,集成了众多常用的与科学计算有关的Python包。

python

基于Python的针对科学家和工程师的软件工程

Software Engineering with Python for Scientist and EngineersPSF2005年资助的一项计划,项目主页在Software Carpentry,作者是Greg Wilson。该项目由一系列的讲座组成,帮助科技工作者使用Python快捷的任务。目前作者正在完善第4版。更详细的信息查阅项目主页作者的Blog

Lectures

  1. Introduction
  2. Python Basics
  3. Python Strings, Lists, and Files
  4. Python Functions and Modules
  5. Debugging
  6. Version Control
  7. Python Sets and Dictionaries
  8. Image Processing
  9. Basic Unix Shell
  10. More Unix Shell
  11. Automated Builds
  12. Computational Complexity
  13. Python Basic Object-Oriented Programming
  14. Python Advanced Object-Oriented Programming
  15. Quality Assurance
  16. Unit Testing
  17. Databases
  18. Regular Expressions
  19. Binary Data
  20. XML
  21. GUI Programming
  22. Web Client Programming
  23. How Web Servers Work
  24. Web Application Programming
  25. Empirical Software Engineering
  26. Software Development Lifecycles
  27. Summary
  28. License
  29. Glossary
  30. Acknowledgments
  31. Bibliography
linux python sage

Sage Tutorial中文版

Sage Tutorial是一份快速了解Sage的入门文档,花了两周多的时间将其翻译为中文。但是“Some more advanced mathematics”一节没有翻译,因为完全不熟悉这一节所涉及到的内容。

第一次翻译开源软件的技术文档,水平有限,希望各位多提意见,任何方面的都可以。如果没有大的问题,大概一周后会向Sage开发组提交。

源文件使用Sphinx管理,PDF文件是由自动转换而来的LaTeX文件编译的,因此其中很多格式不符合中文的习惯。所以请大家先以HTML文件为准,最后发布前,我会手工调整LaTeX文件后再编译。

Email: amao@ai7.org

相关内容:翻译Sage文档的准备工作

Sage Tutorial 中文版rst源文件

Sage Tutorial 中文版(HTML)

Sage Tutorial 中文版(PDF)

linux python

Ubuntu 9.10下unzip的乱码问题

Ubuntu 9.10中unzip升级为6.0,结果原来的-O参数没有了,解压缩Win平台来的带中文文件名的文件时,会有乱码。Google,Baidu无果后,自行使用Python解决。

01 #!/usr/bin/python
02 #coding=utf8
03
04 import zipfile
05 import sys
06
07 if len(sys.argv)<2:
08     print u’punzip zipfilename’
09 else:
10     f=zipfile.ZipFile(sys.argv[1])
11     nlist=f.namelist()
12     for n in nlist:
13         m=unicode(n,’gb2312′).encode(‘utf8′)
14         file(m,’wb’).write(f.read(n))
15     f.close()

只有基本功能,解压缩到当前目录下,不能新建目录……
请自行修改。
python 软件

翻译Sage文档的准备工作

打算翻译一下Sage的文档。Sage的文档完全是用reStructuredTEXT写成的,由Sphinx管理,对应的翻译就行了,但是为了与原文档保持相同的风格,还是折腾了好久。这里记录一下。

环境是:Ubuntu+Sage 4.2.1+CTeXLive 2008。以翻译Sage Tutorial为例,需要做以下准备工作。(下面用$SAGE代替sage的主目录)

  1. 转到$SAGE/devel/sage-main/doc/目录;
  2. 在common目录中的builder.py文件中,找到
    LANGUAGES = ['en', 'fr']

    修改为:

    LANGUAGES = ['en', 'fr', 'zh']
  3. 新建zh子目录,并将en子目录下的tutorial目录复制到刚才新建的zh目录中 (如果是翻译其他文档,复制相应的目录);
  4. 修改zh目录下的conf.py文件:
    • import sys, os

      这一行后 添加 两行:

      reload(sys)
      sys.setdefaultencoding('utf8')
    • 在conf.py文件最后添加:
      latex_preamble='\usepackage{ctex}'
      latex_premble+='\usepackage{ctex}\n\punctstyle{CCT}'
  5. 修改$SAGE/local/lib/python2.6/site-packages/Sphinx-0.6.3-py2.6.egg/sphinx/texinputs/Makefile文件,将其中的“pdflatex”全部替换为“xelatex”(共有5处);
  6. 将$SAGE/local/lib/python2.6/site-packages/Sphinx-0.6.3-py2.6.egg/sphinx/writers/latex.py中的“\\usepackage[utf8]{inputenc}”中的“utf8”修改为“latin1”,即“\\usepackage[latin1]{inputenc}”。

如果上述操作正常的话,就可以开始翻译了。将zh/tutorial下的所有.rst 文件翻译为中文后,即可进行编译。编译的方法如下:

  1. 转到$SAGE目录;
  2. 查看所有文档列表:
    ./sage -docbuild -D

    此时应该可以看到“zh/tutorial”选项;

  3. 编译:
    ./sage -docbuild zh/tutorial html
    
    ./sage -docbuild zh/tutorial pdf

    编译结果会在编译信息最后一行提示。

2010年6月21日更新:
以上是基于Sage 4.3所做的修改,今天下载了4.4.3,情况有些变化:

  • 以上的第4、6步完全不需要了,因为相关的配置转移到其他文件中去了
  • 修改$SAGE/devel/sage-main/doc/common/conf.py文件中两个地方:
    1. latex_elements['inputenc'] = ‘\\usepackage[utf8x]{inputenc}’
      改为
      latex_elements['inputenc'] = ‘\\usepackage[latin1]{inputenc}’
    2. latex_elements['preamble']那一行下面再添加一行:
      latex_elements['preamble'] += ‘\usepackage{ctex}\n\punctstyle{CCT}\n’

2011年6月7日更新:
以下修改针对sage 4.7

  • 原第2步改为修改相同目录下的build_options.py文件中的对应选项。
python 免费软件推荐

Zoundry Raven开源了

Zoundry Raven以及原来的Zoundry是我在Windows平台下最喜欢的Blog客户端程序。但是因为只有Windows平台的版本,所以后来还是ScribeFire用的多。刚刚知道Zoundry Raven开源了(消息来源:python编写的博客编写客户端Zoundry Raven开源)。过去看了一下,两个没想到,没想到今年1月份就已经开源了,我还以为是最近的事情;另一个没想到是,开源了大半年,居然还没有人移植到其他平台上。

python

SimPy

想用Python写一个仿真程序,网上的中文资料很少,比较完整的是IBM的这篇技术文章:

英文原版:Charming Python: SimPy simplifies complex models
中文版:可爱的 Python: SimPy 简化了复杂模型

本来是不错的文章,但是由于写的比较早(2002年12月26日),很多语句的用法在新版中发生了很大的变化。搞了一个晚上,程序勉强调通,但是那个记录最大最小时间的问题一直解决不了。实在搞不下去了,就到SimPy自带的doc中扒扒,没想到这个例子已经被收入正式的发行包中。具体位置在:/usr/share/doc/python-simpy-doc/SimPyModels/Market.py,如果是windows用户,请自己查找Market.py文件,应该是有的。

教训啊教训。

附Market.py原文:

from SimPy.Simulation import *
import random
from math import sqrt

AISLES = 6         # Number of open aisles
ITEMTIME = 0.1     # Time to ring up one item
AVGITEMS = 20      # Average number of items purchased
CLOSING = 60*12    # Minutes from store open to store close
AVGCUST = 1500     # Average number of daily customers
RUNS = 8           # Number of times to run the simulation
SEED = 111333555   # seed value for random numbers

class Customer(Process):
    def __init__(self):
        Process.__init__(self)
        # Randomly pick how many items this customer is buying
        self.items = 1 + int(random.expovariate(1.0/AVGITEMS))
    def checkout(self):
        start = now()           # Customer decides to check out
        yield request, self, checkout_aisle
        at_checkout = now()     # Customer gets to front of line
        waittime.tally(at_checkout-start)
        yield hold, self, self.items*ITEMTIME
        leaving = now()         # Customer completes purchase
        checkouttime.tally(leaving-at_checkout)
        yield release, self, checkout_aisle

class Customer_Factory(Process):
    def run(self):
        while 1:
            c = Customer()
            activate(c, c.checkout())
            arrival = random.expovariate(float(AVGCUST)/CLOSING)
            yield hold, self, arrival

class Monitor2(Monitor):
    def __init__(self):
        Monitor.__init__(self)
        self.min, self.max = (int(2**31-1),0)
    def tally(self, x):
        self.observe(x)
        self.min = min(self.min, x)
        self.max = max(self.max, x)

random.seed(SEED)
print ‘Market’
for run in range(RUNS):
    waittime = Monitor2()
    checkouttime = Monitor2()
    checkout_aisle = Resource(AISLES)
    initialize()
    cf = Customer_Factory()
    activate(cf, cf.run(), 0.0)
    simulate(until=CLOSING)

    print “Waiting time average: %.1f % waittime.mean(), \
          “(std dev %.1f, maximum %.1f)” % (sqrt(waittime.var()),waittime.max)

print ‘AISLES:’, AISLES, ‘  ITEM TIME:’, ITEMTIME

python

Project Euler第6题

Python语言: Project Euler-6

a=range(101)
print sum([x*y for x in a for y in a if x!=y])
python

筛法求素数表

第一个版本:

P=range(2,20001)
i=0
l=len(P)
t1=datetime.datetime.now()
while i
    for item in P[(i+1):]:
        if item % P[i]==0:
            P.remove(item)
            l-=1
    i+=1
t2=datetime.datetime.now()
print t2-t1
print P

第二个版本:

P=range(2,20001)
i=0
l=len(P)
t1=datetime.datetime.now()
while i
    temp=[item for item in P[(i+1):] if item % P[i] != 0]
    P=P[:(i+1)]+temp
    l=len(P)
    i+=1
t2=datetime.datetime.now()
print t2-t1
print P

第三个版本:

temp=range(2,20001)
P=[]
t1=datetime.datetime.now()
while temp!=[]:
    P.append(temp[0])
    temp=[item for item in temp if item % P[-1] != 0]
t2=datetime.datetime.now()
print t2-t1
print P

第一个版本需要7秒多,第二个版本只需要2秒多,第三个版本就只需要1.8秒左右了。

注1:刚开始学Python,正在慢慢体会Python的精神,希望能尽快写出Python风格的程序,而不是用Python语言写Pascal程序。
注2:正是因为刚开始学,所以实际上不止三个版本,但是从7秒多优化到2秒以内,还是很有成就感的。
注3:还是太慢了。

无觅相关文章插件,快速提升流量