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

Archive for the ‘python’ Category

python

2010/03/11

Python 的 Google搜索并保存结果

Tags: ,

#!/usr/bin/env python
#-*- encoding:utf-8 -*-

import sys
import re
import httplib

def request_and_save(conn, query_str, f):
conn.request(”GET”, query_str)
r1 = conn.getresponse()
line = r1.read()

p1 = re.compile(”<a href=”)
p2 = re.compile(”</a>”)
match_start = 0
match_end = 0

while line:
m = p1.search(line)
if m is None:
break
match_start = m.start()
line = line[match_start:]
m = p2.search(line)
if m is None:
break
match_end = m.end()
item = line[:match_end]
if item.find(”class=l”) == -1:
line = line[match_end:]
continue
f.write(item)
f.write(”<br>\n”);
line = line[match_end:]
# end function

if len(sys.argv) < 2:
print “Usage: google.py words”
sys.exit(0)

query_str = “/search?aq=f\&complete=1\&hl=zh-CN\&newwindow=1\&q=” + sys.argv[1]
query_str2 = “/search?q=” + sys.argv[1] + “\&complete=1\&hl=zh-CN\&newwindow=1\&start=10\&sa=N”
query_str3 = “/search?q=” + sys.argv[1] + “\&complete=1\&hl=zh-CN\&newwindow=1\&start=20\&sa=N”
query_str4 = “/search?q=” + sys.argv[1] + “\&complete=1\&hl=zh-CN\&newwindow=1\&start=30\&sa=N”
query_str5 = “/search?q=” + sys.argv[1] + “\&complete=1\&hl=zh-CN\&newwindow=1\&start=40\&sa=N”
query_str6 = “/search?q=” + sys.argv[1] + “\&complete=1\&hl=zh-CN\&newwindow=1\&start=50\&sa=N”
query_str7 = “/search?q=” + sys.argv[1] + “\&complete=1\&hl=zh-CN\&newwindow=1\&start=60\&sa=N”

html_header = “<html><head><meta http-equiv=\”content-type\” content=\”text/html;charset=gb2312\”><title>kf701 python search tool</title></head><body>\n”
html_header += “<p align=center><font size=3>kf701 python search tool</font></p>”
html_end = “</body></html>”

conn = httplib.HTTPConnection(”www.google.cn“)

print ‘Search ‘ + sys.argv[1] + ‘, Save result in ‘ +  sys.argv[1] + ‘-search.html’
f = file( sys.argv[1] + “-search.html”, “w”)
f.write(html_header);

request_and_save(conn, query_str, f)
request_and_save(conn, query_str2, f)
request_and_save(conn, query_str3, f)
request_and_save(conn, query_str4, f)
request_and_save(conn, query_str5, f)
request_and_save(conn, query_str6, f)
request_and_save(conn, query_str7, f)

f.write(html_end)
f.close()
conn.close()

python

Python读取纯真IP数据库

Tags:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# filename: QQWry.py
”’QQWry 模块, 提供读取纯真IP数据库的数据的功能.

纯真数据库格式参考 http://lumaqq.linuxsir.org/article/qqwry_format_detail.html
作者 AutumnCat. 最后修改在 2008年 04月 29日
本程序遵循 GNU GENERAL PUBLIC LICENSE Version 2 (http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt)
”’
from struct import unpack, pack
import sys, _socket, mmap

def _ip2ulong(ip):
”’点分十进制 -> unsigned long
”’
return unpack(’>L’, _socket.inet_aton(ip))[0]

def _ulong2ip(ip):
”’unsigned long -> 点分十进制
”’
return _socket.inet_ntoa(pack(’>L’, ip))

class QQWryBase:
”’QQWryBase 类, 提供基本查找功能.

注意返回的国家和地区信息都是未解码的字符串, 对于简体版数据库应为GB编码, 对于繁体版则应为BIG5编码.
”’
class ipInfo(tuple):
”’方便输出 ip 信息的类.

ipInfo((sip, eip, country, area)) -> ipInfo object
”’
def __str__(self):
”’str(x)
”’
return str(self[0]).ljust(16) + ‘ – ‘ + str(self[1]).rjust(16) + ‘    ‘ + self[2] + self[3]

def normalize(self):
”’转化ip地址成点分十进制.
”’
return QQWryBase.ipInfo((_ulong2ip(self[0]), _ulong2ip(self[1]), self[2], self[3]))

def __init__(self, dbfile):
”’QQWryBase(dbfile) -> QQWryBase object

dbfile 是数据库文件的 file 对象.
”’
self.f = dbfile
self.f.seek(0)
self.indexBaseOffset = unpack(’<L’, self.f.read(4))[0] #索引区基址
self.Count = (unpack(’<L’, self.f.read(4))[0] – self.indexBaseOffset) / 7 # 索引数-1

def Lookup(self, ip):
”’x.Lookup(ip) -> (sip, eip, country, area) 查找 ip 所对应的位置.

ip, sip, eip 是点分十进制记录的 ip 字符串.
sip, eip 分别是 ip 所在 ip 段的起始 ip 与结束 ip.
”’
return self.nLookup(_ip2ulong(ip))

def nLookup(self, ip):
”’x.nLookup(ip) -> (sip, eip, country, area) 查找 ip 所对应的位置.

ip 是 unsigned long 型 ip 地址.
其它同 x.Lookup(ip).
”’
si = 0
ei = self.Count
if ip < self._readIndex(si)[0]:
raise StandardError(’IP NOT Found.’)
elif ip >= self._readIndex(ei)[0]:
si = ei
else: # keep si <= ip < ei
while (si + 1) < ei:
mi = (si + ei) // 2
if self._readIndex(mi)[0] <= ip:
si = mi
else:
ei = mi
ipinfo = self[si]
if ip > ipinfo[1]:
raise StandardError(’IP NOT Found.’)
else:
return ipinfo

def __str__(self):
”’str(x)
”’
tmp = []
tmp.append(’RecCount:’)
tmp.append(str(len(self)))
tmp.append(’\nVersion:’)
tmp.extend(self[self.Count].normalize()[2:])
return ”.join(tmp)

def __len__(self):
”’len(x)
”’
return self.Count + 1

def __getitem__(self, key):
”’x[key]

若 key 为整数, 则返回第key条记录(从0算起, 注意与 x.nLookup(ip) 不一样).
若 key 为点分十进制的 ip 描述串, 同 x.Lookup(key).
”’
if type(key) == type(0):
if (key >=0) and (key <= self.Count):
index = self._readIndex(key)
sip = index[0]
self.f.seek(index[1])
eip = unpack(’<L’, self.f.read(4))[0]
(country,area) = self._readRec()
return QQWryBase.ipInfo((sip, eip, country, area))
else:
raise KeyError(’INDEX OUT OF RANGE.’)
elif type(key) == type(”):
try:
return self.Lookup(key).normalize()
except StandardError, e:
if e.message == ‘IP NOT Found.’:
raise KeyError(’IP NOT Found.’)
else:
raise e
else:
raise TypeError(’WRONG KEY TYPE.’)

def __iter__(self):
”’返回迭代器(生成器).
”’
for i in range(0, len(self)):
yield self[i]

def _read3ByteOffset(self):
”’_read3ByteOffset() -> unsigned long 从文件 f 读入长度为3字节的偏移.
”’
return unpack(’<L’, self.f.read(3) + ‘\x00′)[0]

def _readCStr(self):
”’x._readCStr() -> string 读 ‘\0′ 结尾的字符串.
”’
if self.f.tell() == 0:
return ‘Unknown’
tmp = []
ch = self.f.read(1)
while ch != ‘\x00′:
tmp.append(ch)
ch = self.f.read(1)
return ”.join(tmp)

def _readIndex(self, n):
”’x._readIndex(n) -> (ip ,offset) 读取第n条索引.
”’
self.f.seek(self.indexBaseOffset + 7 * n)
return unpack(’<LL’, self.f.read(7) + ‘\x00′)

def _readRec(self, onlyOne=False):
”’x._readRec() -> (country, area) 读取记录的信息.
”’
mode = unpack(’B', self.f.read(1))[0]
if mode == 0×01:
rp = self._read3ByteOffset()
bp = self.f.tell()
self.f.seek(rp)
result = self._readRec(onlyOne)
self.f.seek(bp)
return result
elif mode == 0×02:
rp = self._read3ByteOffset()
bp = self.f.tell()
self.f.seek(rp)
result = self._readRec(True)
self.f.seek(bp)
if not onlyOne:
result.append(self._readRec(True)[0])
return result
else: # string
self.f.seek(-1,1)
result = [self._readCStr()]
if not onlyOne:
result.append(self._readRec(True)[0])
return result
pass # End of class QQWryBase

class QQWry(QQWryBase):
”’QQWry 类.
”’
def __init__(self, filename=’QQWry.Dat’):
”’QQWry(filename) -> QQWry object

filename 是数据库文件名.
”’
f = open(filename, ‘rb’)
QQWryBase.__init__(self, f)

class MQQWry(QQWryBase):
”’MQQWry 类.

将数据库放到内存的 QQWry 类.
查询速度大约快两倍.
”’
def __init__(self, filename=’QQWry.Dat’, dbfile=None):
”’MQQWry(filename[,dbfile]) -> MQQWry object

filename 是数据库文件名.
也可以直接提供 dbfile 文件对象. 此时 filename 被忽略.
”’
if dbfile == None:
dbf = open(filename, ‘rb’)
else:
dbf = dbfile
bp = dbf.tell()
dbf.seek(0)
QQWryBase.__init__(self, mmap.mmap(dbf.fileno(), 0, access = 1))
dbf.seek(bp)

def _readCStr(self):
”’x._readCStr() -> string 读 ‘\0′ 结尾的字符串.
”’
pstart = self.f.tell()
if pstart == 0:
return ‘Unknown’
else:
pend = self.f.find(’\x00′, pstart)
if pend < 0:
raise StandardError(’Fail To Read CStr.’)
else:
self.f.seek(pend + 1)
return self.f[pstart:pend]

def _readIndex(self, n):
”’x._readIndex(n) -> (ip ,offset) 读取第n条索引.
”’
startp = self.indexBaseOffset + 7 * n
return unpack(’<LL’, self.f[startp:startp + 7] + ‘\x00′)

if __name__ == ‘__main__’:
try:
Q = MQQWry() # 数据库文件名为 ./QQWry.Dat
print Q
for i in sys.argv[1:]:
print Q[i]
#遍历示例代码
# for i in Q:
#     print i
except StandardError, e:
if e.message != ”:
print e.message
else:
raise e
finally:
pass

python

PYTHON学习帮助好手help,dir

Tags:

首先你得导入这模块

就拿sys来说好了,在python下import sys

然后你可以dir这个模块 dir(sys),会示如下内容
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdout__', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'exitfunc', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'hexversion', 'last_traceback', 'last_type', 'last_value', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'pydebug', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions']
接着,你可以help具体的 内容,打个比方,sys,path,则可以用help(sys.path)来显示具体帮助列表,不过是鸟文的。

你也可以直接 help(sys),上面会显示模块名,MODULE DOCS,等信息,还提供网址供大家阅读。等等

北京网站建设公司

python

2010/03/06

用python爬虫抓站的一些技巧总结

Tags:

1.最基本的抓站

import urllib2

content = urllib2.urlopen('http://XXXX').read()

2.使用代理服务器

这在某些情况下比较有用,比如IP被封了,或者比如IP访问的次数受到限制等等。
import urllib2

proxy_support = urllib2.ProxyHandler({'http':'http://XX.XX.XX.XX:XXXX'})

opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)


urllib2.install_opener(opener)

content = urllib2.urlopen('http://XXXX').read()

3.需要登录的情况

登录的情况比较麻烦我把问题拆分一下:

-

3.1 cookie的处理
import urllib2, cookielib

cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())

opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)

urllib2.install_opener(opener)

content = urllib2.urlopen('http://XXXX').read()

是的没错,如果想同时用代理和cookie,那就加入proxy_support然后operner改为

opener = urllib2.build_opener(proxy_support, cookie_support, urllib2.HTTPHandler)

3.2 表单的处理

登录必要填表,表单怎么填?首先利用工具截取所要填表的内容

比如我一般用firefox+httpfox插件来看看自己到底发送了些什么包

这个我就举个例子好了,以verycd为例,先找到自己发的POST请求,以及POST表单项:

post1

post2

-

可以看到verycd的话需要填username,password,continueURI,fk,login_submit这几项,其中fk是随机生
成的(其实不太随机,看上去像是把epoch时间经过简单的编码生成的),需要从网页获取,也就是说得先访问一次网页,用正则表达式等工具截取返回数据中
的fk项。continueURI顾名思义可以随便写,login_submit是固定的,这从源码可以看出。还有username,password那
就很显然了。

-

好的,有了要填写的数据,我们就要生成postdata
import urllib

postdata=urllib.urlencode({
    

    'username':'XXXXX',
    

    'password':'XXXXX',

    'continueURI':'http://www.verycd.com/',

    'fk':fk,

    'login_submit':'登录'

})

-
然后生成http请求,再发送请求:

req = urllib2.Request(

    url = 'http://secure.verycd.com/signinhttp://www.verycd.com/',

    data = postdata,

    headers = headers


)

#...

-
3.4 反”反盗链”
某些站点有所谓的反盗链设置,其实说穿了很简单,就是检查你发送请求的header里面,referer站点是不是他自己,所以我们只需要像3.3一样, 把headers的referer改成该网站即可,以黑幕著称地cnbeta为例:

#...
headers = {
    'Referer':'http://www.cnbeta.com/articles'
}
#...

headers是一个dict数据结构,你可以放入任何想要的header,来做一些伪装。例如,有些自作聪明的网站总喜欢窥人隐私,别人通过代理 访问,他偏偏要读取header中的X-Forwarded-For来看看人家的真实IP,没话说,那就直接把X-Forwarde-For改了吧,可以 改成随便什么好玩的东东来欺负欺负他,呵呵。
-

3.5 终极绝招
有时候即使做了3.1-3.4,访问还是会被据,那么没办法,老老实实把httpfox中看到的headers全都写上,那一般也就行了。
再不行,那就只能用终极绝招了,selenium直 接控制浏览器来进行访问,只要浏览器可以做到的,那么它也可以做到。类似的还有pamie,watir,等等等等。
-

4.多线程并发抓取
单线程太慢的话,就需要多线程了,这里给个简单的线程池模板
这个程序只是简单地打印了1-10,但是可以看出是并发地。

from threading import Thread


from Queue import Queue


from time import sleep

#q是任务队列


#NUM是并发线程总数


#JOBS是有多少任务

q = Queue()

NUM = 2

JOBS = 10


#具体的处理函数,负责处理单个任务

def do_somthing_using(arguments):
    

    print arguments


#这个是工作进程,负责不断从队列取数据并处理


def working():

    while True:

        arguments = q.get()

        do_somthing_using(arguments)

        sleep(1)

        q.task_done()

#fork NUM个线程等待队列


for i in range(NUM):

    t = Thread(target=working)

    t.setDaemon(True)

    t.start()

#把JOBS排入队列


for i in range(JOBS):

    q.put(i)

#等待所有JOBS完成

q.join()

5.验证码的处理
碰到验证码咋办?这里分两种情况处理:
-
1.google那种验证码,凉拌
-
2.简单的验证码:字符个数有限,只使用了简单的平移或旋转加噪音而没有扭曲的,这种还是有可能可以处理的,一般思路是旋转的转回来,噪音去掉,然后划分 单个字符,划分好了以后再通过特征提取的方法(例如PCA) 降维并生成特征库,然后把验证码和特征库进行比较。这个比较复杂,一篇博文是说不完的,这里就不展开了,具体做法请弄本相关教科书好好研究一下。
-
3.事实上有些验证码还是很弱的,这里就不点名了,反正我通过2的方法提取过准确度非常高的验证码,所以2事实上是可行的。
-
6.总结
基本上我遇到过的所有情况,用以上方法都顺利解决了,不太清楚还有没有其他漏掉的情况,所以本文到这里就完成了,以后要是碰上其他情况,再补充相关方法好 了:)

用python爬虫抓站的一些技巧总结

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

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)]
北京网站建设公司