燕之庐网站建设 - 优质网站设计公司

Archive for 2月 1st, 2010

python, 网站建设

2010/02/01

谈Python的模块化 – Module

Tags:

Python虽然简单易用,如果要写出功能强大的东东,也不是十几二十行代码搞定的。模块化肯定是必要的。Python引 如Module进行模块化管理。

可以把函数或者类定义在一个以py为后最的文件里面。用到的时候只要import一下就好了。
一 个模块里既可以放函数的定义,同时也可以放可执行语句。这些语句也知道模块第一次被import的时候执行一次,通常做一些初始化工作,就像 javascript。每个模块都有自己的符号表,当import别的模块时,就可以在本模块通过别的模块的名字,调用别的模块的方法。如果想直接调用而 不用利用模块名,可以用 from fibo import fib, fib2。这样就等于将fib, fib2引入了当前符号表中,就可以向调用自己的函数一样直接调用了。
可以用dir()来查看一个模块定义的 所有名字。

Java 代码 复制代码
  1. >>> dir(fibo)
  2. ['__name__', 'fib', 'fib2']

网站建设

网站建设

python语言中socket操作的异常处理

Tags:

最近使用python研发一个基于socket通讯的小程式,为了检测调用socket的函数时可能出现的异常,需要对函数调用进行异常保护处理。于是 写了类似如下的代码:
try:
sock.connect((’192.168.1.1’, 1024))
except:
(ErrorType, ErrorValue, ErrorTB) = sys.exc_info()
print “Connect server failed: “, ErrorValue
如果出现connect调用失败,则打印出连接失败的原因,如下所 示:
Connect server failed:  (10061, ’Connection refused’)
看到这,可能熟悉C 语言研发的人对10061都对这条错误消息感到眼熟,10061就是经常用到的errno,而后面的消息则是对应的错误消息。因此,我们能对异常消息做一 下处理:

try:
sock.connect((’192.168.1.1’, 1024))
except:
(ErrorType, ErrorValue, ErrorTB) = sys.exc_info()
(errno, err_msg) = ErrorValue
print “Connect server failed: %s, errno=%d” % (err_msg, errno)
此时,输出结果如下所示:
Connect server failed: Connection refused, errno=10061
进一步分析一下,打印出此时的sys.exc_info():
(class ’socket.error’>, error(10061, ’Connection refused’), traceback object at 0×00D37CB0>)
能发现此处的异常是class socket.error,对程式作如下的修改:
try:
sock.connect((’192.168.1.1’, 1024))
except socket.error, arg:
(errno, err_msg) = arg
print “Connect server failed: %s, errno=%d” % (err_msg, errno)
根据上面的示例,我们能针对所有的socket函数调用处理异常 socket.error,以确保程式的运行正常。

网站建设

python

Python异常处理

Tags:

Python的异常处理能力是很强大的,可向用户准确 反馈出错信息。在Python中,异常也是对象,可对它进行操作。所有异常都是基类Exception的成员。所有异常都从基类Exception继承, 而且都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。 一旦引发而且没有捕捉SystemExit异常,程序执行就会终止。如果交互式会话遇到一个未被捕捉的SystemExit异常,会话就会终止。

方 式一:try语句:

1使用try和except语句来捕获异常

try:
block
except [exception,[data…]]:
block

try:
block
except [exception,[data...]]:
block
else:
block

该种异常处理语法的规则是:

·   执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。

·   如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。

·   如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。

·   如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。

·   如果没有发生异常,则执行else块代码。

例:

try:

f = open(“file.txt”,”r”)
except IOError, e:
print e

捕 获到的IOError错误的详细原因会被放置在对象e中,然后运行该异常的except代码块

捕 获所有的异常

try:
a=b
b=c
except Exception,ex:
print Exception,”:”,ex

使用except子句 需要注意的事情,就是多个except子句截获异常时,如果各个异常类之间具有继承关系,则子类应该写在前面,否则父类将会直接截获子类异常。放在后面的 子类异常也就不会执行到了。

2 使用try跟finally:

语法如 下:

try:
block
finally:
block

该语句的执行规则是:

·   执行try下的代码。

·   如果发生异常,在该异常传递到下一级try时,执行finally中的代码。

·   如果没有发生异常,则执行finally中的代码。

第二种try语法在无论有没有 发生异常都要执行代码的情况下是很有用的。例如我们在python中打开一个文件进行读写操作,我在操作过程中不管是否出现异常,最终都是要把该文件关闭 的。

这两种形式相互冲突,使用了一种就不允许使用另一种,而功能又各异

2.  用 raise语句手工引发一个异常:

raise [exception[,data]]

在Python中,要想引发异常,最简单的形式就是输入关键字 raise,后跟要引发的异常的名称。异常名称标识出具体的类:Python异常是那些类的对象。执行raise语句时,Python会创建指定的异常类 的一个对象。raise语句还可指定对异常对象进行初始化的参数。为此,请在异常类的名称后添加一个逗号以及指定的参数(或者由参数构成的一个元组)。

例:

try:
raise MyError #自己抛出一个异常
except MyError:
print ‘a error’

raise ValueError,’invalid argument’
捕捉到的内容为:

type  = VauleError
message = invalid argument

3.   采用traceback(跟踪)模块查看异常

发生异常时,Python能“记住”引发的异常以及程序的当前状态。Python还维护着traceback(跟踪)对象,其中含有异常发生时与函数调用 堆栈有关的信息。记住,异常可能在一系列嵌套较深的函数调用中引发。程序调用每个函数时,Python会在“函数调用堆栈”的起始处插入函数名。一旦异常 被引发,Python会搜索一个相应的异常处理程序。如果当前函数中没有异常处理程序,当前函数会终止执行,Python会搜索当前函数的调用函数,并以 此类推,直到发现匹配的异常处理程序,或者Python抵达主程序为止。这一查找合适的异常处理程序的过程就称为“堆栈辗转开解”(Stack Unwinding)。解释器一方面维护着与放置堆栈中的函数有关的信息,另一方面也维护着与已从堆栈中“辗转开解”的函数有关的信息。

格式:

try:
block
except:
traceback.print_exc()

示例:…excpetion/traceback.py

4.  采 用sys模块回溯最后的异常

import sys
try:
block
except:
info=sys.exc_info()
print info[0],”:”,info[1]

或 者以如下的形式:

import sys
tp,val,td = sys.exc_info()

sys.exc_info() 的返回值是一个tuple, (type, value/message, traceback)

这里的 type —- 异常的类型

value/message —- 异常的信息或者参数

traceback —- 包含调用栈信息的对象。

从这点上可以看出此方法涵盖了traceback.

5. 异 常处理的一些其它用途

除了处理实际的错误条件之外,对于异常还有许多其它的用处。在标准 Python 库中一个普通的用法就是试着导入一个模块,然后检查是否它能使用。导入一个并不存在的模块将引发一个 ImportError 异常。你可以使用这种方法来定义多级别的功能――依靠在运行时哪个模块是有效的,或支持多种平台 (即平台特定代码被分离到不同的模块中)。

你也能通过创建一个从内置的 Exception 类继承的类定义你自己的异常,然后使用 raise 命令引发你的异常。如果你对此感兴趣,请看进一步阅读的部分。

下面的例子演示了如何使用异常支持特定平台功能。代码来自 getpass 模块,一个从用户获得口令的封装模块。获得口令在 UNIX、Windows 和 Mac OS 平台上的实现是不同的,但是这个代码封装了所有的不同之处。

例 支持特定平台功能

# Bind the name getpass to the appropriate function

try:
import termios, TERMIOS

except ImportError:
try:
import msvcrt

except ImportError:
try:
from EasyDialogs import AskPassword

except ImportError:
getpass = default_getpass

else:
getpass = AskPassword
else:
getpass = win_getpass
else:
getpass = unix_getpass

termios 是 UNIX 独有的一个模块,它提供了对于输入终端的底层控制。如果这个模块无效 (因为它不在你的系统上,或你的系统不支持它),则导入失败,Python 引发我们捕捉的 ImportError 异常。

OK,我们没有 termios,所以让我们试试 msvcrt,它是 Windows 独有的一个模块,可以提供在 Microsoft Visual C++ 运行服务中的许多有用的函数的一个API。如果导入失败,Python 会引发我们捕捉的 ImportError 异常。

如果前两个不能工作,我们试着从 EasyDialogs 导入一个函数,它是 Mac OS 独有的一个模块,提供了各种各样类型的弹出对话框。再一次,如果导入失败,Python 会引发一个我们捕捉的 ImportError 异常。

这些平台特定的模块没有一个有效 (有可能,因为 Python 已经移植到了许多不同的平台上了),所以我们需要回头使用一个缺省口令输入函数 (这个函数定义在 getpass 模块中的别的地方)。注意我们在这里所做的:我们将函数 default_getpass 赋给变量 getpass。如果你读了官方 getpass 文档,它会告诉你 getpass 模块定义了一个 getpass 函数。它是这样做的:通过绑定 getpass 到正确的函数来适应你的平台。然后当你调用 getpass 函数时,你实际上调用了平台特定的函数,是这段代码已经为你设置好的。你不需要知道或关心你的代码正运行在何种平台上;只要调用 getpass,则它总能正确处理。

一个 try…except 块可以有一条 else 子句,就像 if 语句。如果在 try 块中没有异常引发,然后 else 子句被执行。在本例中,那就意味着如果 from EasyDialogs import AskPassword 导入可工作,所以我们应该绑定 getpass 到 AskPassword 函数。其它每个 try…except 块有着相似的 else 子句,当我们发现一个 import 可用时,就绑定 getpass 到适合的函数。

网站建设

python, 网站建设

列表遍历删除

Tags:

python的列表list可以用for循环进行遍历,实际开 发中发现一个问题,就是遍历的时候删除会出错,例如

l = [1,2,3,4]
for i in l:
if i != 4:
l.remove(i)
print l
这几句话本来意图是想 清空列表l,只留元素4,但是实际跑起来并不是那个结果。再看下面,利用index来遍历删除列表l

l = [1, 2, 3, 4]
for i in range(len(l)):
if l[i] == 4:
del l[i]

print l

这样没问题,可以遍历删 除,但是列表l如果变为 l = [1,2,3,4,5]
如果还是按照上面的方法, 设想一下,range开始的范围是0-4,中间遍历的时候删除了一个元素4,这个时候列表变成了= [1,2,3,5],这时候就会报错了,提示下标超出了数组的表示,原因就是上面说的遍历的时候删除了元素

所以python的 list在遍历的时候删除元素一定要小心

可以使用filter过滤 返回新的list

l = [1,2,3,4]
l = filter(lambda x:x !=4,l)
print l

这样可以安全删除l中值为 4的元素了,filter要求两个参数,第一个是规则函数,第二个参数要求输入序列,而lambda这个函数的作用就是产生一个函数,是一种紧凑小函数的 写法,一般简单的函数可以这么些

或者可以这样
l = [1,2,3,4]
l = [ i for i in l if i !=4]//同样产生一个新序列,复值给l
print l

或者干脆建立新的list 存放要删除的元素
l = [1,2,3,4]
dellist = []
for i in l:
if i == 4:
dellist.append(i)
for i in dellist:
l.remove(i)
这样也能安全删除元素
所以要遍历的时候删除元素 一定要小心,特别是有些操作并不报错,但却没有达到预期的效果

上面说到产生新序列,赋值 等等,用python的id()这个内置函数来看对象的id,可以理解为内存中的地址,所以有个简要说明
如果
l = [1,2,3,4]
ll = l
l.remove(1)
print l//肯定是[2,3,4]
print ll//这里会是什么?
如果用id函数查看的话就 发现
print id(l),id(ll)
打印出相同的号码,说明他 们其实是一个值,也就是说上面的print ll将和l打印的一样,所以python有这种性质,用的时候注意一下就行了
网站建设

python

Python类的专用方法

Tags:

Python 类可以定义专用方法,专用方法是在特殊情况下或当使用特别语法时由 Python 替你调用的,而不是在代码中直接调用(象普通的方法那样)。
.1    __init__
类似于构造函数
#!/usr/local/bin/python
class Study:
def __init__(self,name=None):
self.name = name
def say(self):
print self.name
study = Study(”Badboy”)
study.say()

.2    __del__
类 似于析构函数
#!/usr/local/bin/python
class Study:
def __init__(self,name=None):
self.name = name
def __del__(self):
print “Iamaway,baby!”
def say(self):
print self.name
study = Study(”zhuzhengjun”)
study.say()

.3__repr__
使用repr(obj)的时候, 会自动调用__repr__函数,该函数返回对象字符串表达式,
用于重建对象,如果eval(repr(obj))会得到一个对象的拷贝。
#!/usr/local/bin/python
class Study:
def __init__(self,name=None):
self.name = name
def __del__(self):
print “Iamaway,baby!”
def say(self):
print self.name
def __repr__(self):
return “Study(’jacky’)”
study = Study(”zhuzhengjun”)
study.say()
print type(repr(Study(”zhuzhengjun”))) # str
print type(eval(repr(Study(”zhuzhengjun”)))) # instance

study = eval(repr(Study(”zhuzhengjun”)))

study.say()

.4__str__
Python 能用print语句输出内建数据类型。有时,程序员希望定义一个类,要求它的对象也能用print语句输出。Python类可定义特殊方法 __str__,为类的对象提供一个不正式的字符串表示。如果类的客户程序包含以下语句:

print objectOfClass
那 么Python会调用对象的__str__方法,并输出那个方法所返回的字符串。

#!/usr/local/bin/python

class PhoneNumber:
def __init__(self,number):
self.areaCode=number[1:4]
self.exchange=number[6:9]
self.line=number[10:14]

def __str__(self):
return “(%s) %s-%s”%(self.areaCode,self.exchange,self.line)

def test():
newNumber=raw_input(”Enter phone number in the form. (123) 456-7890: \n”)
phone=PhoneNumber(newNumber)
print “The phone number is:”
print phone

if__name__==”__main__”:
test()

方法__init__接收一个形如”(xxx) xxx-xxxx”的字符串。字符串中的每个x都是电话号码的一个位数。方法对字符串进行分解,并将电话号码的不同部分作为属性存储。

方 法__str__是一个特殊方法,它构造并返回PhoneNumber类的一个对象的字符串表示。解析器一旦遇到如下语句:
print phone

就会执行以下语句:

print phone.__str__()

程序如果将 PhoneNumber对象传给内建函数str(如str(phone)),或者为PhoneNumber对象使用字符串格式化运算符%(例如”%s” %phone),Python也会调用__str__方法。

.5__cmp __
比较运算符,0:等于 1:大于 -1:小于
class Study:
def __cmp__(self, other):
if other > 0 :
return 1
elif other < 0:
return – 1
else:
return 0

study = Study()
if study > -10:print ‘ok1′
if study < -10:print ‘ok2′
if study == 0:print ‘ok3′

打印:ok2 ok3
说明: 在对类进行比较时,python自动调用__cmp__方法,如-10 < 0 返回 -1,也就是说study 应该小与 -10,估打印ok2

.6__getitem__
__getitem__ 专用方法很简单。象普通的方法 clear,keys 和 values 一样,它只是重定向到字典,返回字典的值。
class Zoo:
def __getitem__(self, key):
if key == ‘dog’:return ‘dog’
elif key == ‘pig’:return  ‘pig’
elif key == ‘wolf’:return ‘wolf’
else:return ‘unknown’

zoo = Zoo()
print zoo['dog']
print zoo['pig']
print zoo['wolf']

打印 dog pig wolf

.7__setitem__
__setitem__ 简单地重定向到真正的字典 self.data ,让它来进行工作。
class Zoo:
def __setitem__(self, key, value):
print ‘key=%s,value=%s’ % (key, value)

zoo = Zoo()
zoo['a'] = ‘a’
zoo['b'] = ‘b’
zoo['c'] = ‘c’
打印:
key=a,value=a
key=b,value=b
key=c,value=c

.8 __delitem__
__delitem__ 在调用 del instance[key] 时调用 ,你可能记得它作为从字典中删除单个元素的方法。当你在类实例中使用 del 时,Python 替你调用 __delitem__ 专用方法。
class A:
def __delitem__(self, key):
print ‘delete item:%s’ %key

a = A()
del a['key']

本文出自 “坏 男孩” 博客,请务必保留此出处http://5ydycm.blog.51cto.com/115934/157548

网站建设

python

python优先级队列

Tags:

先写个python优先级队列,作为写爬虫的 基础类调用。PriorityQueue直接继承list结构,主要重写了list.count()函数,直接使用二分搜索查找元素,提高效率。而元素插 入的排序问题就使用标准bisect模块中的insort函数,代码比较简短,呵呵。

# -*- coding: utf-8 -*-

#PriorityQueue.py

import bisect

class PriorityQueue(list):

优先级队列。作者:Keengle”

def push(self, item):

按顺序插入,防止重复元素;若要按升序排列,可使用bisect.insort_left

if self.count(item) == 0:

bisect.insort(self, item)

def pop(self):

return list.pop(self)

def empty(self):

return len(self) == 0

def remove(self,item):

list.remove(self, item)

def count(self,item):

if len(self) == 0 :

return 0

#二分查找

left = 0

right = len(self)-1

mid = -1

while left <= right:

mid = (left+right)/2

if self[mid] < item :

left = mid + 1

elif self[mid] > item :

right = mid -1

else :

break

return self[mid] == item and 1 or 0

# try it

def main():

pq = PriorityQueue()

# add items out of order

pq.push(2)

pq.push(1)

pq.push(1)

pq.push(3)

print pq.count(1)

print pq.count(2)

print pq.count(3)

print pq.count(4)

print pq.count(0)

# print queue contents

while not pq.empty():

print pq.pop()

print pq.count(2)

if __name__ == ’__main__’:

main()

网站建设

python, 网站建设

Python语法小全

Tags:

以 #! 开头的称为组织行,这行告诉你的Linux/Unix系统当你 执行 你的程序的时候,它应该运行哪个解释器。例如:

#!/usr/bin/python

以 # 开头的称为注释行。

数的4种类型:整数、长整数、浮点数和复数。

字符串:单引号(‘)和 双引号(”)的作用相同,转义符是(\),以三引号(如:”’或者”"”)括起来的字符串中可以直接使用任意多个单引号(‘)和双引号(”)而无需转义 符(\)。

自然字符串:在字符串前加R(或r)指示某些不需要如转义符那样的特别 处理的字符串,如:print R“Hello\n World”,将直接输出“Hello\n World”而不会出现换行的情况。

Unicode字符串:在字符串前加U(或u)。

缩进:Python没有类似 Begin……End 的语句来标识语句块,它依靠缩进来标识语句块,因此错误的缩进将会导致解释程序报错。

运算符与表达式:基本上与其它语言相类似,只是有以下几点不同。

x*y: 乘法。2 * 3得到6。’la’ * 3得到’lalala’。

x**y:幂运 算,返回 x 的 y 次幂。

x/y:x 除以 y,4/3得到1(整数的除法得到整数结果)。4.0/3或4/3.0得到1.3333333333333333。

x//y:取整除。返回商的整数部分。4 // 3.0得到1.0。

控制流语句:

if- elif-else:(Python 没有 switch-case 语句,可以通过 if 语句配合字典完成同样的工作)

if something == 1:

doSomething1()

elif something == 2:

doSomething2()

else:

doSomething3()

while-else:

while something:

doSomething1()

else:

doSomething2()

for-else:

for

i

in

range

(

1

,

10, 2

):   # i 值从 1 到 10,步长为2

print

i

else

:

print

‘The for loop is over’

break 和 continue:用于中断和继续循环。

函数:

def

say

(message, times =

1

):  # time 的默认参数值是 1

print

message * times

return time               # 无返回值的函数可省掉 return,等同于return None

只有在形参表末尾的那些参数可以有默认参数值,即你不能在声明函数形参的时候,先声明有默认值的 形参而后声明没有默认值的形参。这是因为赋给形参的值是根据位置而赋值的。例如,

def func(a, b=5)

是有效的,但是

def func(a=5, b)

无效 的。

DocStrings:

说白了就是类似于JavaDoc的东西。

文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开 始是详细的描述。可以使用

__doc__

(注意双下划线)调用

函数 的文档字符串属性(属于函数的名称)。Python把 每一样东西 都作为对象,包括这个函数。

Python中的

help()

,它所做的只是抓取函数的

__doc__

属性,然后整洁地展示给你。

自动化工具也可以以同样的方式从你的程序中提取文档。随Python发行版附带的pydoc命令, 与

help()

类似地使用DocStrings。

def

printMax

(x, y):

”’Prints the maximum of two numbers.      # 这里是文档字符串

The two values must be integers.”’

print “DocStrings”                         # 这里是函数体

命令行参数:

# Filename: using_sys.py

import

sys

print

‘The command line arguments are:’

for

i

in

sys

.argv:         #

sys.argv

变量是一个字符串的列表,用于保存命令行参数。

print

i

执行 Python

using_sys.py we are argvs 的输出结果是:

The command line arguments are:

d:\My Documents\Python\using_sys.py   # sys.argv[0]

we

# sys.argv[1]

are

# sys.argv[2]

argvs

# sys.argv[3]

模块的__name__名称:

每个Python模块都有它的

__name__

, 如果它是

‘__main__’

,这说明这个模块被用户单独运行,我们可以进行相应的恰当操作。

网站建设公司

网站建设

Thinking In Python程序员的Python快速入门

Tags: ,

程 序员的Python快速入门
本书面向经验丰富的程序员,如你已经通过其他书记学习了python则更佳。 对于其他读者,这里提供了一个python语言快速指引。
Pythong综述

这是面向有经验的程序员(你阅读此书时应该达到的水平)做的Python的简要介绍。你可以参考[url]www.Python.org[/url]上的关于Python的全套 文档(尤其是极其有用的HTML文档 A Python Quick Reference),还有其他著作如Mark Lutz和David Ascher的《Learning Python》(O’Reilly,1999)。
Python通常被认为是一种脚本语言,但是脚本语言在功能上非常受限,从另一方面讲,Python是一种支持脚本的编程语言。它是一个神奇的脚本,以致 你可能会把你所有的批处理文件,脚本文件和其他简单程序都换成Python脚本。尽管如此,Python最非仅仅是一个脚本语言。
使用Python写程序非常优雅而且可读性好。你可以毫不费力的阅读你很久以前编写的python代码,或者他人的代码。这要归功于简单明了的语法,但为 代码的可读性做最大贡献的是代码缩进–Python代码的作用域是由缩进决定。
#: c01:if.py
response = “yes”
if response == “yes”:
print “affirmative”
val = 1
print “continuing…”
#:~
和C++/Jave中的’//’类似,Python使用’#'来注释代码。从’#'到行末都是注 释。
从if语句看Python的语法很像C。在C中你需要使用括号来包着if条件,Python无需这样做(如果你执意要 这样做也没问题)。
条件子句用:结束,后面跟着一组缩进了的语句,如果if条件成立就执行这组语句。在这个例子 中,print语句把结果送至标准输出,然后向变量val赋值。后面一个不带缩进的print语句就不是if子句的一部分了。缩进可以无限嵌套下去,类似 C++和Java中的花括号,但和这些语言不同的是再也不需要关心把花括号的位置,编译器强制代码必须使用缩进风格。这就是Pyhon代码的可读性好的主 要原因。
Pyhon通常一行一个语句(一行多个语句使用分号分开),所以结尾分号是多余的。从上面的简单例子看,作者力求把 Python设计得尽量简洁而又不失可读性。
内置的容器对象

C++和Java的容器对象通常是附加库而非语言本身的组成部分。Python非常重视容器对象,在语言中内置了容器对象:包括列表和关联数组 (maps,dictionaries, hash tables)都是基础数据类型。这些使的语言更加优雅。
特别地,for语句可以自动迭代一个list而不需使用顺序数字来访问。如果你只想用一个for循环遍历一次容器内的所有对象,这样所是很有意义的。 Python使用自动的迭代器来遍历整个列表。如下面例子:
#: c01:list.py
list = [ 1, 3, 5, 7, 9, 11 ]
print list
list.append(13)
for x in list:
print x
#:~
第一句创建一个list。输出该列表验证一下和你放入列表中的对象是否一致(作为对比,曾记得我在Think in Java第二版中特意为输出数组创建了Array2类)。list很像Java容器–可以添加对象(使用append()函数),容器大小会自动增长。 该for语句创建了一个可以遍历list迭代器x。
range()函数可以创建一个由数组组成的list。如果确实需要模仿c数组,你可以这样做。
你是否注意这里未曾看到类型定义?实际上Python根据变量的使用方式来确定它们的类型。似乎作者把Python设计成这样的一个语言:你在键盘的每个 敲打动作都是必须的。使用Python一段时间后会发现你以前把太多的脑细胞绞杀于解释分号、花括号以及各种零碎中去了,而这都是那些非Python式的 编程语言所要求的,尽管它们无助于解决你的实际问题。
函数
使用def关键字来定义函数,后面跟随函数名和参数列表。行尾使用’:’来分开函数体。
如下例声明函数:
#: c01:myFunction.py
def myFunction(response):
val = 0
if response == “yes”:
print “affirmative”
val = 1
print “continuing…”
return val
print myFunction(”no”)
print myFunction(”yes”)
#:~
值得注意的是函数没有任何函数签名–我们指示了函数名和参数,没有明示参数类型和返回值的类型。这又最大限度的节省了打字动作。例如,你可以使同一函 数,传递不同的类型参数,获得不同类型的返回值:
#: c01:differentReturns.py
def differentReturns(arg):
if arg == 1:
return “one”
if arg == “one”:
return 1
print differentReturns(1)
print differentReturns(”one”)
#:~
对参数的唯一要求是:该参数对象必须支持函数中对其进行的操作,其他问题就无关重要了。这里有一个函数对整数和字符串进行’+'运算。
#: c01:sum.py
def sum(arg1, arg2):
return arg1 + arg2
print sum(42, 47)
print sum(’spam ‘, “eggs”)
#:~
对于字符串,’+'表示串连接(Python很好地支持运算符重载)。
字 符串
上面例子显示了一点Python的字符串操作,这是我见过最好的编程语言。你可以使用单引号和双引 号来表示字符串,这是非常优雅的:你可以在单引号限定的字符串中包含双引号,反之亦然。
#: c01:strings.py
print “That isn’t a horse”
print ‘You are not a “Viking”‘
print “”"You’re just pounding two
coconut halves together.”"”
print ”’”Oh no!” He exclaimed.
“It’s the blemange!””’
print r’c:\python\lib\utils’
#:~
须知Python并不是得名于蟒蛇,而是得名于Monty Python马戏团。
用三个双引号(”"”)来限定的字符串可以包含一切东西,包括换行符。对于生成一个网页(Python非常适于CGI编程)这种需求很有用,你可以用三引 号来包住整个html页面而不需任何其他转义。
‘r’引导的字符串表示原始串,串内所有字符都不需转义。这样你无需把’\'表示为’\\’。
字符串模板替换很简单,Python基本沿用了C的printf语法。你可以简单地在字符串模板后使用’%'和对应的值来实现模板替换。
#: c01:stringFormatting.py
val = 47
print “The number is %d” % val
val2 = 63.4
s = “val: %d, val2: %f” % (val, val2)
print s
#:~
在第二个例子中,如果你有超过一个的参数要替换,请用括号把参数包起来(以tuple的形式表示,不可修改;也可以使用常规的list对象,但tuple 更常用)。
printf的所有格式控制方式都支持,包括小数点位置和对齐。Python也实现了非常精巧的正则表达式。
类 定义
以Python一贯的作风,类的定义也尽量使用了最精简的语法。使用class关键字,在类体内用def创建类方法。例如:
#: c01:SimpleClass.py
class Simple:
def __init__(self, str):
print “Inside the Simple constructor”
self.s = str
# Two methods:
def show(self):
print self.s
def showMsg(self, msg):
print msg + ‘:’,
self.show() # Calling another method
if __name__ == “__main__”:
# Create an object:
x = Simple(”constructor argument”)
x.show()
x.showMsg(”A message”)
#:~
所有的方法都有把self作为第一个参数。C++和Java类函数也有一个相应隐藏的参数this,该this参数指向调用该函数的对象。Python方 法也保存当前对象的引用,不过该引用在定义类函数的时候必须显式声明该引用为第一个参数。通常地,该参数命名为self,但你可以使用其他标识符(但不使 用self可能会令你的代码阅读者感到困惑)。如果你需要引用对象中的成员(field)或者方法(method),必须在表达式中使用self参数。当 然,调用一个对象的方法仍然是用x.show()形式,无需传入该对象的引用–这部分工作已经自动完成了。
此处,类的第一个方法是很特殊的,这种方法的名称以两个下划线开头。在这个例子中,它定义了构造函数。类似C++/Java,构造函数在对象创建时被调 用。在本例末尾,你可以看到创建一个对象就好像调用一个函数一样。Python的特别语法让人觉得C++/Java new关键字根本就是多余的。
例子末尾的代码由一个if子句开始。该if子句检查__name__变量是否为”__main__”。两个下划线开始的标识符表示特殊名字。使用if的原 因是:任何文件都可以作为其他程序的一个库模块(或简称模块)。在这个例子中,你只需要定义一个类,并不需要执行后面的代码。这个特别的if子句在直接运 行本文件的时候才会为True,即是你在命令行直接调用它:
Python SimpleClass.py
然而,如果这个文件被导入到其他程序中,__main__部分代码是不执行的。
令人觉得惊奇的是在方法的内部定义成员,而不像 C++/Java一样在方法的外部(如果你像C++/Java一样在外部声明成员,它们默认为 static成员)。为了创建一个成员,你需要用在任何方法(通常是构造函数,但不绝对)内使用self来引用它,当方法被调用时分配内存空间。对于 C++/Java来说这有点诡异,在C++/Java中你必须事先决定你的类对象需要使用多少存储空间,但Python的做法更有弹性。
继 承
Python是是弱类型检查的,它不关注接口,只关注把操作施加于对象(Java的interface关键字在Python中多余)。这意味着 Python的继承和C++/Java是不同的,它们的继承是为了确认一个公共接口。在Python中,你使用继承的唯一原因是你需要继承一个实现–为 了重用基类已有代码(而非定义统一接口,译者注)。
如果你要继承一个类,必须告诉Python把该类导入到你的新文件中。和Java类似,Python对它的命名空间控制得很强(尽管Python追求简 约)。当你新建一个文件,你需要隐式创建一个和文件名同名的模块(类似Java中的package)。所以,Python没有package关键字。当你 需要使用一个模块时,你只需要导入并命名模块。Python搜索PYTHONPATH系统变量指示的路径得到所需模块,如同Java对CLASSPATH 一样(但Python摆脱了这个机制的某些缺陷)。为了引用模块中的函数和类,使用模块名加一个点再加函数名或类名即可。如果觉得引用模块名很麻烦,你可 以写 from module import name(s)
“name(s)”可为逗号分割的一个列表
引用一个类(或多个类,Python支持多重继承)的方法是把类名写在你的类名后的括号里。使用import把文件SimpleClass中的类 Simple被导入到新命名空间:
#: c01:Simple2.py
from SimpleClass import Simple
class Simple2(Simple):
def __init__(self, str):
print “Inside Simple2 constructor”
# You must explicitly call
# the base-class constructor:
Simple.__init__(self, str)
def display(self):
self.showMsg(”Called from display()”)
# Overriding a base-class method
def show(self):
print “Overridden show() method”
# Calling a base-class method from inside
# the overridden method:
Simple.show(self)
class Different:
def show(self):
print “Not derived from Simple”
if __name__ == “__main__”:
x = Simple2(”Simple2 constructor argument”)
x.display()
x.show()
x.showMsg(”Inside main”)
def f(obj): obj.show() # .e-line definition
f(x)
f(Different())
#:~
Simple2 继承了Simple, 在构造函数中初始化基类。display( ), showMsg( ) 都成self的方法, 但如果你想调用基类版本的方法,必须加入类名并传入self参数。参见构造函数和show方法。
在__main__后,如同你所预期的一样,可以见到(运行该程序时)基类的构造函数被调用,showMsg函数在子类中可用。
类Differential也有一个showMsg方法,但不是从Simple继承来的。__main__中的f()演示了弱类型检查:它只关注 show()能否被施加于obj,而不管对象是何种类型。你可以看到f()可以不加区别用于Simple类对象或者其他对象,不论它们从何而来。如果你是 C++程序员,应该知道这就是C++ template的特性:在强类型的语言中加入弱化类型检查。这样,在Python中你可以自动得到模板的实现而不需拘泥于特别的语法语义。
网站建设公司

网站建设

SourceForge屏蔽来自5个国家的访问

Tags:

SourceForge已经屏蔽了所有来自美国“投资制裁国家名单”中的国家:包括伊朗,北韩,叙利亚,苏丹和古巴。此举无疑会引起开放 源代码阵营,以及GNU的十字军战士如Stallman先生的强烈不满。这并不是故事的开始,早在2008年在这些国家也只允许浏览 SourceForge,不能与代码库进行接触—不能下载,也不能贡献代码。现在终于圆满 了,如果你居住在伊朗,北韩,叙利亚,苏丹或者古巴,你压根就不能访问了。 按照OSI(开放源码协会)的定义:

5. 不能歧视任何人或者群体
许可证必须不能歧视任何人或者群体。
6. 不能歧视任何领域的贡献者
许可证必须不能限制任何人在特定领域对程序的使用,比如说,不能限制程序不能应用于商业,或者不能用于一般性的研究。

在今天,开源精神遭到了践踏,SourceForge会因为他们被要求屏蔽流氓国家而去美国国会抗议么?

这是个棘手的问题,难道仅仅因为这几个国家的极少数的一部分人的极端行为,就要整个国家遭到惩罚么?开源软件为这些受到压迫和发展中的国家提供了重要的基 础设施。希望美国政府能够看到对这些国家基础设施和羽翼未丰的产业带来的打击。

网站建设公司

网站建设

新十年的十大服务器技术趋势

Tags:

移动性和灵活性是计算机技 术创新的新的十年中的两个关键的概念。虚拟化及云计算将永远改变我们以技术为中心的生活。这些技术将使我们能够用更少 的资金、更少的硬件、更少的数据损失和更少的麻烦做更多的事情,更多的沟通、更多的学习、更加全球化的业务和更多的计算。在这十年里,你用技术方法做的一 切事情都将迁移到数据中心,无论它是在现场的数据中心还是距离数千英里以外的远程云计算架 构的数据中心。

1.移动计算

随着更多的工人从远程位置向自己的虚拟办公室报到,计算机厂商必须向这新一类移动工人提供能够连接和使用各种类型的互联网连接 的耐用的产品。移动用户寻求轻型的、耐用 的、容易使用的“刚好管用”的设备,没有延迟或者复杂的配置和设置。这种灵活性将来自于那些能够从基于云计算的应用程序中提取数据的智能设备。你的应用程序、你的数据、甚 至你的计算环境(以前叫做操作系统)都将舒适地生活在云计算中以实现最大限度的移动性。

2.虚拟化

到本十年末,虚拟化技术将普及到全球的每一个数据中心。 各种规模的企业或者把自己的物理基础设施转换为虚拟主 机和客户机,或者他们将全部迁移到托管的虚拟基础设施。随着更多的企业拥有者试图延长自己的产品更新换代周期,虚拟化诱人的省钱的许诺将给预算紧张的企业 带来新的希望,因为我们正在一起摆脱经济衰退。全球向虚拟化的方向发展还将给计算机厂商带来压力,让它们提供更加绿色的硬件取代不太绿色的硬件。

3.云计算

云计算与虚拟化和移动计 算密切相关。业内观察人士把云计算看作是“营销宣传”或者把老技术重新包装之后用于当前的消费。除了宣传和重新使用标签之外,懂技术的公司将以当前产品的 很少一部分成本利用云计算向全球用户提供自己的产品和服务。云计算还能够用“一直在线”的观点保护在线合资企业,保证它们的服务不会受到中断的影响。在这 个新的十年中,整个企业基础设施将迁移到云计算,使每一家公司都成为能够全球访问的公司。

4.基于Web的 应用程序

在本十年年末,频繁使用的、本地安装的应用程序将不再存在。这个行动将发生在向虚拟桌面迁移 之前。未来的客户机/服务器计算是基于服务器的应用程序和客户机。包括客户机软件在内的一切都将保留在远程服务器中。你的客户机设备(也 就是手机、计算机、电子书阅读器)将像去年的X终端设备一样调用应用程序。

5.图书馆

到本十年年末,印刷的材料将全部消失以支持数字材料。印 刷材料的数字化将是图书馆的最后的产品,因为所有的有价值的印刷的手稿都将送到全球的垃圾箱。我们所知道的图书馆将停止运营并且可能作为图书博物馆重新开 放。小学生可以在这个博物馆里看到我们在过去是如何使用物理图书的。

6. 向开源软件迁移

当你向开源软件迁移时能够收回损失的金钱的时候,为什么还有受到许可证费的压力呢?承受不起许可证费的企业将向包括LinuxApache、 Tomcat、PostgreSQL和MariaDB在内的开源软件迁移。本十年将证明开源软件模 式是好用的,专有软件模式是不好用的。

7.虚拟桌面

虚拟桌面基础设施最近受到了每一个人的关注并且在未来 几年里将继续受到关注,因为企业正在从本地桌面操作系统向在数据中心托管的虚拟桌面操作系统转移。这个概念与移动计算、虚拟化和云计算密切相关。桌面可能 会在所有的三个位置(PC、数据中心、云计算)多停留几年。但是,这种过渡到本十年年末将达到100%没有本地设备。脱离本地化的桌面计算将会降低维护成 本和减少与桌面操作系统错误有关的用户错误。

8.无处不在的互联网

你听说过互联网是不是?你还记得当时互联网被人们称作信息高速公路和关于互联网将如何永久性地改变我们的生活的讨论和预测吗?这个未来就要到了并且这个 预测已经成为现实。互联网发展的下一步是让它无处不在:超级市场、服务站、饭店、酒吧、商场和汽车中到处都有。到本十年年末,互联网将无处不在。每一台电 子设备(甚至你的烤面包机)都会由于向IPv6过渡而拥有某种类型的互联网连接。

9.在线存储

目前,在线存储还是一件古怪的事情,吸引力有限。我们 许多人都有便携式USB接口硬盘、优盘和DVD刻录机。因此,在线存储是不必要的奢侈品。然而,日益临近的移动计算海啸将要求你能够在你使用的任何设备上 访问数据。甚至最便携式的存储设备都将证明无法满足那些找不到外部硬盘和USB电缆的用户对于数据的需求。就像手机和每月使用时间的计划一样,新的设备将 捆绑一定数量的在线存储空间。

10.电话服务

随着对手机的依赖日益增加,厂商将创建使iPod像过时的产品那样的新手机。这种手机在外观和功 能方面与目前的手机不同。你将用一个设备替代你的手机、计算机、GPS和电子书阅读器。因此,云计算的神奇将带来另一 种样式的转变。电话服务将进入云计算,成为通讯即服务(CaaS)。使用Skype和其它VoIP等服务把通讯迁移到数据中心是当前的现实,大规模的迁移 将很快实施。

网站建设