首页
关于
Search
1
怎么快速从GitHub上下载代码
48 阅读
2
GitHub下载加速的有效方法
39 阅读
3
Python中的center()是怎么用的
35 阅读
4
如何在GitHub上下载旧版本
34 阅读
5
怎样删除GitHub存储库
32 阅读
Python
Github
IDC推荐
登录
Search
Xbe
累计撰写
242
篇文章
累计收到
1
条评论
首页
栏目
Python
Github
IDC推荐
页面
关于
搜索到
81
篇与
的结果
2025-03-04
举例详解Python中的内建模块collections
collections是Python内建的一个集合模块,提供了许多有用的集合类。这里举几个例子:namedtuple我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:>>> p = (1, 2)但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。定义一个class又小题大做了,这时,namedtuple就派上了用场:>>> from collections import namedtuple >>> Point = namedtuple('Point', ['x', 'y']) >>> p = Point(1, 2) >>> p.x 1 >>> p.y 2namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。可以验证创建的Point对象是tuple的一种子类:>>> isinstance(p, Point) True >>> isinstance(p, tuple) True类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:# namedtuple('名称', [属性list]): Circle = namedtuple('Circle', ['x', 'y', 'r'])deque使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:>>> from collections import deque >>> q = deque(['a', 'b', 'c']) >>> q.append('x') >>> q.appendleft('y') >>> q deque(['y', 'a', 'b', 'c', 'x'])deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。defaultdict使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:>>> from collections import defaultdict >>> dd = defaultdict(lambda: 'N/A') >>> dd['key1'] = 'abc' >>> dd['key1'] # key1存在 'abc' >>> dd['key2'] # key2不存在,返回默认值 'N/A'注意默认值是调用函数返回的,而函数在创建defaultdict对象时传入。除了在Key不存在时返回默认值,defaultdict的其他行为跟dict是完全一样的。OrderedDict使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。如果要保持Key的顺序,可以用OrderedDict:>>> from collections import OrderedDict >>> d = dict([('a', 1), ('b', 2), ('c', 3)]) >>> d # dict的Key是无序的 {'a': 1, 'c': 3, 'b': 2} >>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) >>> od # OrderedDict的Key是有序的 OrderedDict([('a', 1), ('b', 2), ('c', 3)])注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:>>> od = OrderedDict() >>> od['z'] = 1 >>> od['y'] = 2 >>> od['x'] = 3 >>> od.keys() # 按照插入的Key的顺序返回 ['z', 'y', 'x']OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key:from collections import OrderedDict class LastUpdatedOrderedDict(OrderedDict): def __init__(self, capacity): super(LastUpdatedOrderedDict, self).__init__() self._capacity = capacity def __setitem__(self, key, value): containsKey = 1 if key in self else 0 if len(self) - containsKey >= self._capacity: last = self.popitem(last=False) print 'remove:', last if containsKey: del self[key] print 'set:', (key, value) else: print 'add:', (key, value) OrderedDict.__setitem__(self, key, value)CounterCounter是一个简单的计数器,例如,统计字符出现的个数:>>> from collections import Counter >>> c = Counter() >>> for ch in 'programming': ... c[ch] = c[ch] + 1 ... >>> c Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})Counter实际上也是dict的一个子类,上面的结果可以看出,字符'g'、'm'、'r'各出现了两次,其他字符各出现了一次。小结collections模块提供了一些有用的集合类,可以根据需要选用。
2025年03月04日
10 阅读
0 评论
0 点赞
2025-03-04
Python中实现URL的解析
在Python中的urlparse模块主要是用于解析url中的参数 对url按照一定格式进行 拆分或拼接 1.urlparse.urlparse将url分为6个部分,返回一个包含6个字符串项目的元组:协议、位置、路径、参数、查询、片段。import urlparse url_change = urlparse.urlparse('https://i.cnblogs.com/EditPosts.aspx?opt=1') print url_change 输出结果为:ParseResult(scheme='https', netloc='i.cnblogs.com', path='/EditPosts.aspx', params='', query='opt=1', fragment='')其中 scheme 是协议 netloc 是域名服务器 path 相对路径 params是参数,query是查询的条件 urlparse.parse_qs(urlparse.urlparse(url).query)这个是获取urlparse分割后元祖中的某一项 urlparse.urlparse(url).query 获取查询条件parse_qs 有几种实现urlparse.parse_qs 返回字典 urlparse.parse_qsl 返回列表 2. urlparse.urlsplit和urlparse差不多,将url分为5部分,返回一个包含5个字符串项目的元组:协议、位置、路径、查询、片段。import urlparse url_change = urlparse.urlsplit('https://i.cnblogs.com/EditPosts.aspx?opt=1') print url_change SplitResult(scheme='https', netloc='i.cnblogs.com', path='/EditPosts.aspx', query='opt=1', fragment='')其中 scheme 是协议 netloc 是域名服务器 path 相对路径 query是查询的条件 3.urlparse.urljoin将相对的地址组合成一个url,对于输入没有限制,开头必须是http://,否则将不组合前面。import urlparse new_url = urlparse.urljoin('https://baidu.com/ssss/','88888') print new_url 输出 https://baidu.com/ssss/88888如果输入错误信息 如 new_url = urlparse.urljoin('122','88888') 并不会将两者合并 输出‘88888’
2025年03月04日
2 阅读
0 评论
0 点赞
2025-03-04
Python中怎么像PS一样处理图像
Python中怎么像PS一样处理图像?在Python中有着丰富的第三方模块可以使用,PIL:Python Imaging Library是Python平台上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。安装PIL在Debian/Ubuntu Linux下直接通过apt安装:$ sudo apt-get install python-imagingMac和其他版本的Linux可以直接使用easy_install或pip安装,安装前需要把编译环境装好:$ sudo easy_install PIL如果安装失败,根据提示先把缺失的包(比如openjpeg)装上。Windows平台就去PIL官方网站下载exe安装包。操作图像来看看最常见的图像缩放操作,只需三四行代码:import Image # 打开一个jpg图像文件,注意路径要改成你自己的: im = Image.open('/Users/michael/test.jpg') # 获得图像尺寸: w, h = im.size # 缩放到50%: im.thumbnail((w//2, h//2)) # 把缩放后的图像用jpeg格式保存: im.save('/Users/michael/thumbnail.jpg', 'jpeg')其他功能如切片、旋转、滤镜、输出文字、调色板等一应俱全。比如,模糊效果也只需几行代码:import Image, ImageFilter im = Image.open('/Users/michael/test.jpg') im2 = im.filter(ImageFilter.BLUR) im2.save('/Users/michael/blur.jpg', 'jpeg')PIL的ImageDraw提供了一系列绘图方法,让我们可以直接绘图。比如要生成字母验证码图片:import Image, ImageDraw, ImageFont, ImageFilter import random # 随机字母: def rndChar(): return chr(random.randint(65, 90)) # 随机颜色1: def rndColor(): return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255)) # 随机颜色2: def rndColor2(): return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127)) # 240 x 60: width = 60 * 4 height = 60 image = Image.new('RGB', (width, height), (255, 255, 255)) # 创建Font对象: font = ImageFont.truetype('Arial.ttf', 36) # 创建Draw对象: draw = ImageDraw.Draw(image) # 填充每个像素: for x in range(width): for y in range(height): draw.point((x, y), fill=rndColor()) # 输出文字: for t in range(4): draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2()) # 模糊: image = image.filter(ImageFilter.BLUR) image.save('code.jpg', 'jpeg');我们用随机颜色填充背景,再画上文字,最后对图像进行模糊,得到验证码图片如果运行的时候报错:IOError: cannot open resource这是因为PIL无法定位到字体文件的位置,可以根据操作系统提供绝对路径,比如:'/Library/Fonts/Arial.ttf'要详细了解PIL的强大功能,请请参考PIL官方文档:http://effbot.org/imagingbook/
2025年03月04日
2 阅读
0 评论
0 点赞
2025-03-04
Python是动态强类型的吗
Python是动态强类型的,我们可以根据Python的变量定义和使用来进行判断。Python变量声明和定义与C#不同,Python在使用变量之前无须定义它的类型,试着运行下面的例子:i = 12 print i从上边我们可以看到,变量 i 在使用前并不需要定义,但是必须声明以及初始化该变量。试着运行下面的例子:i = 1 print i + j上面的代码会产生一个异常:“NameError: name 'j' is not defined”,Python提示变量 j 没有定义。这点和BASIC等弱类型的语言不一样。在BASIC中,执行上述代码的时候不会产生异常,你可以在EXCEL的VBA开发环境里试一下,把 print改为MsgBox就可以,结果会输出 1 。这说明Python并不是一种类似BASIC的弱类型语言。另一方面,Python与C#有一个很大的差异就是在程序运行过程中,同一变量名可以(在不同阶段)代表不同类型的数据,看看下边的例子:i = 1 print i,type(i),id(i) i = 10000000000 print i,type(i),id(i) i = 1.1 print i,type(i),id(i)变量 i 的类型在程序执行过程中分别经历了int、long和float的变化,这和静态类型语言(如C等)有很大不同。静态语言只要一个变量获得了一个数据类 型,它就会一直是这个类型,变量名代表的是用来存放数据的内存位置。而Python中使用的变量名只是各种数据及对象的引用,用id()获取的才是存放数 据的内存位置,我们输入的1、10000000000和1.1三个数据均会保存在id()所指示的这些内存位置中,直到垃圾回收车把它拉走(在系统确定你 不再使用它的时候)。这是动态语言的典型特征,它确定一个变量的类型是在给它赋值的时候。另一方面,Python又是强类型的,试着运行下边的例子:# -*- coding: utf-8 -*- i = 10; j = 'ss' print i+j #正确的写法是print str(i)+j,输出10ss会产生一个异常:“TypeError: unsupported operand type(s) for +: 'int' and 'str'”。在BASIC等弱类型的语言中,上边的例子会正常运行并返回(虽然有时候是不可预期的)结果。所以,我们说Python既是一种动态类型语言,同时也是一种强类型的语言,这点是和C#不同的地方。对于Python的这种变量的声明、定义和使 用方式,C#程序员可能要花一段时间去适应,不过相信你会很快就喜欢上它,因为它让事情变得更加简单(而且不会不安全)。而且,C# 4.0 已经开始用类似的方式定义和使用变量(通过在变量名前加关键字dynamic),如果你先学了Python变量,将能够更快的适应C# 4.0的动态编程特征。
2025年03月04日
1 阅读
0 评论
0 点赞
2025-03-04
用Python怎么实现邮件功能
用Python的smtplib就可以简单的实现邮件功能。什么是SMTP?邮件功能怎么实现?SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。Python创建 SMTP 对象语法如下:import smtplib smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )参数说明:host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: runoob.com,这个是可选参数。port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])参数说明:from_addr: 邮件发送者地址。to_addrs: 字符串列表,邮件发送地址。msg: 发送消息这里要注意一下第三个参数,msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。分享给大家供大家参考。具体实现方法如下:import smtplib, socket fromaddr =
[email protected]
toaddrs = ["
[email protected]
", "
[email protected]
"] msg = open("multimsg.eml", "r").read() try: server = smtplib.SMTP('10.0.0.1') result = server.sendmail(fromaddr, toaddrs, msg) server.quit() if result: for r in result.keys(): print "Error sending to", r rt = result[r] print "Code", rt[0], ":", rt[1] except (smtplib.SMTPException, socket.error), arg: print "SMTP Server could not send mail", arg
2025年03月04日
5 阅读
0 评论
0 点赞
1
...
10
11
12
...
17