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

Archive for 2月 9th, 2010

python

2010/02/09

Python isinstance判断对象类型

Tags:

Python中判度对象类型方法非常简单,不需要像别的语言一样使用如下的判断方法

复制代码 代码如下:
if (typeof(objA) == typeof(String))
{
//TODO
}

在Python中只需要使用内置的函数isinstance,使用起来非常简单,比如 下面的例子:

复制代码 代码如下:
class objA:
pass
A = objA()
B = ‘a’,'v’
C = ‘a string’
print isinstance(A, objA)
print isinstance(B, tuple)
print isinstance(C, basestring)

输出结果:
True
True
True

网站建设公司

python

Python linecache.getline()读取文件中特定一行的脚本

Tags:

Python中使用标准库中的linecache中的getline方法可以从某个文件中读取出特定的一行。

比如:

import linecache
print linecache.getline(2.1_open.py, 4)

将返回我上一 节事例代码文件2.1_open.py的第4行文字,输出结果:
f = open(’/home/evergreen/桌面/test’)
查 看linecache中的实现(我用的是Ulipad,所以直接将光标停留在linecache处,按F6键

python

Python 深入理解yield

Tags:

yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。

只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子:

def addlist(alist):
for i in alist:
yield i + 1

取出alist的每一项,然后把i + 1塞进去。然后通过调用取出每一项:

alist = [1, 2, 3, 4]
for x in addlist(alist):
print x,

这的确是yield应用的一个例子,但是,看过limodou的文章《2.5版yield之学习心得》,并自己反复体验后,对yield有了一个全新的理解。

1. 包含yield的函数

假如你看到某个函数包含了yield,这意味着这个函数已经是一个Generator,它的执行会和其他普 通的函数有很多不同。比如下面的简单的函数:

def h():
print To be brave
yield 5
h()

可以看到,调用h()之后,print 语句并没有执行!这就是yield,那么,如何让print 语句执行呢?这就是后面要讨论的问题,通过后面的讨论和学习,就会明白yield的工作原理了。

2. yield是一个表达式

Python2.5以前,yield是一个语句,但现在2.5中,yield是一个表达式 (Expression),比如:

m = yield 5

表达式(yield 5)的返回值将赋值给m,所以,认为 m = 5 是错误的。那么如何获取(yield 5)的返回值呢?需要用到后面要介绍的send(msg)方法。

3. 透过next()语句看原理

现在,我们来揭晓yield的工作原理。我们知道,我们上面的h()被调用后并没有执行,因为它有 yield表达式,因此,我们通过next()语句让它执行。next()语句将恢复Generator执行,并直到下一个yield表达式处。比如:

def h():
print Wen Chuan
yield 5
print Fighting!
c
= h()
c.next()

c.next() 调用后,h()开始执行,直到遇到yield 5,因此输出结果:
Wen Chuan
当我们再次调用c.next()时,会继续执行,直 到找到下一个yield表达式。由于后面没有yield了,因此会拋出异常:

Wen Chuan
Fighting!
Traceback (most recent call last):
File
/home/evergreen/Codes/yidld.py, line 11, in <module>
c.next()
StopIteration

4. send(msg) 与 next()

了解了next()如何让包含yield的函数执行后,我们再来看另外一个非常重要的函数 send(msg)。其实next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式的值进去,而next()不 能传递特定的值,只能传递None进去。因此,我们可以看做
c.next() 和 c.send(None) 作用是一样的。
来看这个例 子:

def h():
print Wen Chuan,
m
= yield 5 # Fighting!
print m
d
= yield 12
print We are together!
c
= h()
c.next()
#相当于c.send(None)
c.send(Fighting!) #(yield 5)表达式被赋予了’Fighting!’

输 出的结果为:
Wen Chuan Fighting!
需要提醒的是,第一次调用时,请使用next()语句或是send(None),不 能使用send发送一个非None的值,否则会出错的,因为没有yield语句来接收这个值。

5. send(msg) 与 next()的返回值

send(msg) 和 next()是有返回值的,它们的返回值很特殊,返回的是下一个yield表达式的参数。比如yield 5,则返回 5 。到这里,是不是明白了一些什么东西?本文第一个例子中,通过for i in alist 遍历 Generator,其实是每次都调用了alist.Next(),而每次alist.Next()的返回值正是yield的参数,即我们开始认为被压进 去的东东。我们再延续上面的例子:

def h():
print Wen Chuan,
m
= yield 5 # Fighting!
print m
d
= yield 12
print We are together!
c
= h()
m
= c.next() #m 获取了yield 5 的参数值 5
d = c.send(Fighting!) #d 获取了yield 12 的参数值12
print We will never forget the date, m, ., d

输出结果:
Wen Chuan Fighting!
We will never forget the date 5 . 12

6. throw() 与 close()中断 Generator

中断Generator是一个非常灵活的技巧,可以通过throw 抛出一个GeneratorExit异常来终止Generator。Close()方法作用是一样的,其实内部它是调用了 throw(GeneratorExit)的。我们看:

def close(self):
try:
self.throw(GeneratorExit)
except (GeneratorExit, StopIteration):
pass
else:
raise RuntimeError(generator ignored GeneratorExit)
# Other exceptions are not caught

因 此,当我们调用了close()方法后,再调用next()或是send(msg)的话会抛出一个异常:

Traceback (most recent call last):
File
/home/evergreen/Codes/yidld.py, line 14, in <module>
d
= c.send(Fighting!) #d 获取了yield 12 的参数值12
StopIteration

注:以上观点属于本人的个人理解,如有偏差请批评指正。谢谢!

<br>
北京网站建设公司

网站建设

Python __getattr__与__setattr__使用方法

Tags:

__getattr__和__setattr__可以用来对属性的设置和取值进行处理

比如下面的例子:

class Book(object):
def __setattr__(self, name, value):
if name == ‘value’:
object.__setattr__(self, name, value - 100)
else:
object.__setattr__(self, name, value)
def __getattr__(self, name):
try:
return object.__getattribute__(name)
except:
return name + ‘ is not found!’
def __str__(self):
return self.name + ‘ cost : ‘ + str(self.value)
c = Book()
c.name = ‘Python’
c.value = 100
print c.name
print c.value
print c
print c.Type

上面的例子中,在赋值书的value属性时,偷偷的将value减去了100,呵。输出结果:

Python
0
Python cost : 0
Type is not found!

北京网站建设公司

python

Python 网络编程起步(Socket发送消息)

Tags:

北京网站建设公司

一、服务端(Server.py)
服务端要做的事情是:
1. 创建一个Socket对象

import socket
s
= socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

2. 绑定一个端口

s.bind((“”, 8081))

3. 接受来自客户端的消息

while True:
# Receive up to 1,024 bytes in a datagram
data, addr = s.recvfrom(1024)
print Received:, data, from, addr

二、 客户端(Client.py)
客户端要做的事情是:
1. 创建一个Socket对象。

import socket
s
= socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

2. 向某个服务器的指定的端口发送消息。由于使用UDP,如果服务器端未接收到将会丢弃数据包。

port = 8081
host
= localhost
while True:
msg
= raw_input()
s.sendto(msg, (host, port))

三、运行试试

python

Python urlopen 使用小示例

Tags:

打开一个网页获取所有的内容、获取Http头、使用代理等小结

一、打开一个网页获取所有的内容

from urllib import urlopen
doc = urlopen(“http://www.baidu.com”).read()
print doc

二、获取Http头

from urllib import urlopen
doc = urlopen(“http://www.baidu.com”)
print doc.info()
print doc.info().getheader(‘Content-Type’)

三、使用代理

1. 查看环境变量

print “n.join(["%s=%s" % (k, v) for k, v in os.environ.items()])
print os.getenv(“http_proxy”)

2. 设置环境变量

import os
os.putenv(“http_proxy”, “http://proxyaddr:<port>”)

3. 使用代理

# Use http://www.someproxy.com:3128 for http proxying
proxies = {‘http’: ‘http://www.someproxy.com:3128′}
filehandle = urllib.urlopen(some_url, proxies=proxies)
# Don’t use any proxies
filehandle = urllib.urlopen(some_url, proxies={})
# Use proxies from environment – both versions are equivalent
filehandle = urllib.urlopen(some_url, proxies=None)
filehandle = urllib.urlopen(some_url)
北京网站建设公司

python

Python 初始化多维数组代码

Tags:

python多维数组方法示例代码

Python中初始化一个5 x 3每项为0的数组,最好方法是:

multilist = [[0 for col in range(5)] for row in range(3)]

我 们知道,为了初始化一个一维数组,我们可以这样做:

alist = [0] * 5

没错,那我们初始化一个 二维数组时,是否可以这样做呢:

multi = [[0] * 5] * 3

其 实,这样做是不对的,因为[0] * 5是一个一维数组的对象,* 3的话只是把对象的引用复制了3次,比如,我修改multi[0][0]:

multi = [[0] * 5] * 3
multi[0][0]
= Love China
print multi

输 出的结果将是:
[['Love China', 0, 0, 0, 0], ['Love China', 0, 0, 0, 0], ['Love China', 0, 0, 0, 0]]
我们修改了multi[0][0],却把我们的multi[1] [0],multi[2][0]也修改了。这不是我们想要的结果。
如果我们这样写呢:

multilist = [[0] * 5 for row in range(3)]
multilist[0][0]
= Love China
print multilist

我们看输出结果:
[['Love China', 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
恩,没问题。但是,由于使用 * 的方法比较容易引起混淆导致Bug,所以还是推荐使用上面第一种方法,即:

multilist = [[0 for col in range(5)] for row in range(3)]
北京网站建设公司

python

Python urlopen 使用小示例

Tags:

打开一个网页获取所有的内容、获取Http头、使用代理等小结

一、打开一个网页获取所有的内容

from urllib import urlopen
doc = urlopen(“http://www.baidu.com”).read()
print doc

二、获取Http头

from urllib import urlopen
doc = urlopen(“http://www.baidu.com”)
print doc.info()
print doc.info().getheader(‘Content-Type’)

三、使用代理

1. 查看环境变量

print “n.join(["%s=%s" % (k, v) for k, v in os.environ.items()])
print os.getenv(“http_proxy”)

2. 设置环境变量

import os
os.putenv(“http_proxy”, “http://proxyaddr:<port>”)

3. 使用代理

# Use http://www.someproxy.com:3128 for http proxying
proxies = {‘http’: ‘http://www.someproxy.com:3128′}
filehandle = urllib.urlopen(some_url, proxies=proxies)
# Don’t use any proxies
filehandle = urllib.urlopen(some_url, proxies={})
# Use proxies from environment – both versions are equivalent
filehandle = urllib.urlopen(some_url, proxies=None)
filehandle = urllib.urlopen(some_url)
北京网站建设公司

python, 网站建设

Python open读写文件实现脚本

Tags:

Python中文件操作可以通过open函数,这的确很像C语言中的fopen。通过open函数获取一个 file object,然后调用read(),write()等方法对文件进行读写操作。

1.open

使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能 关闭文件。

file_object = open(thefile.txt)
try:
all_the_text
= file_object.read( )
finally:
file_object.close( )

注:不能把open语句放在try块里, 因为当打开文件出现异常时,文件对象file_object无法执行close()方法。

2.读文件

读文本文件

input = open(data, r)
#第二个参数默认为r
input = open(data)

读二进制文件

input = open(data, rb)

读取所有内容

file_object = open(thefile.txt)
try:
all_the_text
= file_object.read( )
finally:
file_object.close( )

读固定字节

file_object = open(abinfile, rb)
try:
while True:
chunk
= file_object.read(100)
if not chunk:
break
do_something_with(chunk)
finally:
file_object.close( )

读每行

list_of_all_the_lines = file_object.readlines( )

如果文件是文本文件,还可以直接遍历文件对象获取每行:

for line in file_object:
process line

3.写文件

写文本文件

output = open(data, w)

写二进制文件

output = open(data, wb)

追加写文件

output = open(data, w+)

写数据

file_object = open(thefile.txt, w)
file_object.write(all_the_text)
file_object.close( )

写入多行

file_object.writelines(list_of_text_strings)

注 意,调用writelines写入多行在性能上会比使用write一次性写入要高。

北京网站建设公司

网站建设

Python 连接字符串(join %)

Tags:

join 方法用于连接字符串数组,使用 % 连接多个变量下面看例子

join 方法用于连接字符串数组

复制代码 代码如下:
s = ['a', 'b', 'c', 'd']
print ”.join(s)
print ‘-’.join(s)

输出结果:
abcd
a-b-c-d
使用 % 连接多个变量

复制代码 代码如下:
a = ‘hello’
b = ‘python’
c = 1
print ‘%s %s %s %s’ % (a, b, c, s)

输出结果:
hello python 1 ['a', 'b', 'c', 'd']

北京网站建设公司