-
直播已结束 直播地址》》点击查看回放《《 直播简介老谭作为昇腾布道师男团的技术担当、颜值担当、气氛担当,将在本次狂欢节为大家献上昇腾全栈产品及昇腾社区介绍,并在直播间现场演示“How TO Get Start”手把手教你从0-1上手昇腾应用开发!专家介绍参与方式1、 报名预约直播即有机会抽取华为手表GT2。(已结束)2、 参与专家坐堂互动。在本帖下方任意回复以下一项内容,即有机会获得华为智能音箱和无线鼠标。有效参与必得500码豆。1) 观看直播后发表您的个人观点2) 观看直播后向专家提出问题3) 参与微话题互动(任选其一):讨论话题:Atlas系列产品为人工智能提供了澎湃的算力,让我们得以实现以前无法实现的想法。在你的心目中,一款人工智能加速计算硬件还应该具备什么样的功能,请说出你的想法注:发布的内容必须与本次直播话题或微话题相关,且必须包含个人思考的内容。抄袭内容一经发现将取消评选资格。回复时间截至10月28日。活动规则1、本活动结束后将从报名本场直播的用户中随机抽取一名幸运用户获得华为手表GT2,同时其邀请人也可同样中取华为手表GT2一块。如中奖的幸运用户没有邀请人,则不发放邀请人奖励。本场直播的抽奖过程和中奖的幸运用户将在10月28日公布。2、如本帖的有效回复人数大于等于20人,则由专家和华为云工作人员共同评选出3个优质回复,发布者可获得无线鼠标一个。如有效回复人数大于等于30人,则额外评选出一个最优回复,发布者可获得华为智能音箱一个。如有效回复人数小于20人,则只发放500码豆参与奖励。获奖用户将于10月28日公布,并公示至10月30日截止。3、参加专家坐堂互动的有效参与者均可获得500码豆,请您提前登录DevCloud会员中心(https://devcloud.huaweicloud.com/bonususer/home),以免无法接收码豆。4、以上实物奖励将于11月30日前完成发放,码豆奖励将于11月25日前完成发放,请您耐心等待。5、如您参与1024相关活动,为保证您顺利领取活动奖品,请您提前填写下方奖品收货信息链接,如您没有填写,视为放弃奖励填写地址请戳我>>6、本次活动抽奖将采用巨公摇号平台(https://www.jugong.wang/random-portal/),奖项评比将由专家和华为云工作人员共同完成。如您对评奖方式有异议,请勿参加本次活动。7、活动结束后三个工作日内将公布本活动获奖名单,获奖用户需在公示后的三天内填写获奖信息。更多活动:【华为云1024程序员节 · 向云而生】干货课程+云端实验齐打卡,华为GT2/华为耳机/京东卡多重好礼等你来拿!【1024程序员节】“向云而生”直播盛典【1024程序员节】集卡牌 拿盲盒 赢码神锦鲤礼包
-
直播已结束 直播地址》》观看回放《《 直播简介1. Python技术发展热点,干货内容分享;2.华为云使用Python抓取图片实践3.华为云微认证直播间限时优惠购专家介绍参与方式1、 报名预约直播即有机会抽取华为手表GT2。(已结束)如您邀请的好友中奖,作为邀请人的您也同样享受奖励!2、 参与专家坐堂互动。在本帖下方任意回复以下一项内容,即有机会获得华为智能音箱和无线鼠标。有效参与必得500码豆。1) 观看直播后发表您的个人观点2) 观看直播后向专家提出问题3) 参与微话题互动(任选其一):讨论话题:1、你在学习爬虫的过程中遇到过哪些有意思的反爬措施,并加以描述。2、参与《使用Python爬虫抓取图片和文字实验》实验,针对该实验提出您的建议注:发布的内容必须与本次直播话题或微话题相关,且必须包含个人思考的内容。抄袭内容一经发现将取消评选资格。回复时间截至10月26日。活动规则1、本活动结束后将从报名本场直播的用户中随机抽取一名幸运用户获得华为手表GT2,同时其邀请人也可同样中取华为手表GT2一块。如中奖的幸运用户没有邀请人,则不发放邀请人奖励。本场直播的抽奖过程和中奖的幸运用户将在10月27日公布。2、如本帖的有效回复人数大于等于20人,则由专家和华为云工作人员共同评选出3个优质回复,发布者可获得无线鼠标一个。如有效回复人数大于等于30人,则额外评选出一个最优回复,发布者可获得华为智能音箱一个。如有效回复人数小于20人,则只发放500码豆参与奖励。获奖用户将于10月27日公布,并公示至10月30日截止。3、参加专家坐堂互动的有效参与者均可获得500码豆,请您提前登录DevCloud会员中心(https://devcloud.huaweicloud.com/bonususer/home),以免无法接收码豆。4、以上实物奖励将于11月30日前完成发放,码豆奖励将于11月25日前完成发放,请您耐心等待。5、如您参与1024相关活动,为保证您顺利领取活动奖品,请您提前填写下方奖品收货信息链接,如您没有填写,视为放弃奖励填写地址请戳我>>6、本次活动抽奖将采用巨公摇号平台(https://www.jugong.wang/random-portal/),奖项评比将由专家和华为云工作人员共同完成。如您对评奖方式有异议,请勿参加本次活动。7、活动结束后三个工作日内将公布本活动获奖名单,获奖用户需在公示后的三天内填写获奖信息。更多活动:【华为云1024程序员节 · 向云而生】华为云学院欢乐特训班开班啦!【1024程序员节】“向云而生”直播盛典【1024程序员节】集卡牌 拿盲盒 赢码神锦鲤礼包
-
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。1.namedtuple: 生成可以使用名字来访问元素内容的tuple2.deque: 双端队列,可以快速的从另外一侧追加和推出对象3.Counter: 计数器,主要用来计数4.OrderedDict: 有序字典5.defaultdict: 带有默认值的字典1、namedtuple我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:>>> p=(2,6)但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。这时,namedtuple就派上了用场:from collections import namedtuple point = namedtuple("point", ['x', 'y']) print(point) p_obj = point(6, 8) print(p_obj.x) print(p_obj.y)结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py <class '__main__.point'>68Process finished with exit code 0类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:# namedtuple('名称', [属性list]):Circle = namedtuple("Circle", ['x', 'y', 'r']) cir = Circle(8, 6, 10) print(cir.x) print(cir.y) print(cir.r)结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py8610Process finished with exit code 02、deque使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:from collections import deque q = deque(['a', 'b', 'c']) q.append('d') print(q) q.appendleft('e') print(q) q.pop() print(q) q.popleft() print(q)结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py deque(['a', 'b', 'c', 'd']) deque(['e', 'a', 'b', 'c', 'd']) deque(['e', 'a', 'b', 'c']) deque(['a', 'b', 'c']) Process finished with exit code 0deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。3、OrderedDict使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。如果要保持Key的顺序,可以用OrderedDict:from collections import OrderedDict lis = [('a', 21), ('b', 55), ('c', 86)] dic = dict(lis) # dict的Key是无序的print(dic) ord_dic = OrderedDict(lis) # OrderedDict的Key是有序的print(ord_dic)结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py {'a': 21, 'b': 55, 'c': 86}OrderedDict([('a', 21), ('b', 55), ('c', 86)])Process finished with exit code 0注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:ord_dic = OrderedDict() ord_dic['z'] = 99ord_dic['y'] = 110ord_dic['z'] = 666print(ord_dic.keys()) # 按照插入的Key的顺序返回结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py odict_keys(['z', 'y']) Process finished with exit code 04、defaultdict 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。即: {'k1': 大于66 , 'k2': 小于66}lis = [11, 22, 33, 55, 77, 66, 88, 99] dic = {}for value in lis: if value > 66: if dic.has_key('k1'): dic['k1'].append(value) else: dic['k1'] = [value] else: if dic.has_key('k2'): dic['k2'].append(value) else: dic['k2'] = [value]from collections import defaultdictlis = [11, 22, 33, 55, 77, 66, 88, 99]my_dic = defaultdict(lis)for value in lis: if value > 66: my_dic['k1'].append(value) else: my_dic['k2'].append(value)print(my_dic)使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:from collections import defaultdict dd = defaultdict(lambda: 'N/A') dd['key1'] = 'abc' # key1存在print(dd['key1']) print(dd['key2']) # key2不存在,返回默认值print(dd['key3'])结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py abc N/A N/A Process finished with exit code 05、CounterCounter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。from collections import Counter coun = Counter("absdsdsdadsdsa") print(coun)结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py Counter({'s': 5, 'd': 5, 'a': 3, 'b': 1}) Process finished with exit code 0创建下面的代码说明了Counter类创建的四种方法:from collections import Counterc = Counter() # 创建一个空的Counter类print(c)c = Counter('g***d') # 从一个可iterable对象(list、tuple、dict、字符串等)创建print(c)c = Counter({'a': 4, 'b': 2}) # 从一个字典对象创建print(c)c = Counter(a=4, b=2) # 从一组键值对创建print(c)结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter() Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1}) Counter({'a': 4, 'b': 2}) Counter({'a': 4, 'b': 2}) Process finished with exit code 0计数值的访问与缺失的键当所访问的键不存在时,返回0,而不是KeyError;否则返回它的计数。计数值的访问from collections import Counter cou = Counter("hello world") print(cou["l"]) print(cou["o"]) print(cou["a"])结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py320Process finished with exit code 0计数器的更新(update和subtract)可以使用一个iterable对象或者另一个Counter对象来更新键值。计数器的更新包括增加和减少两种。其中,增加使用update()方法:计数器的更新(update)from collections import Counter cou = Counter("hello world") cou.update("which") # 使用另一个iterable对象更新print(cou["h"]) c = Counter("watch") cou.update(c) # 使用另一个Counter对象更新print(cou["h"])结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py34Process finished with exit code 0减少则使用subtract()方法:计数器的更新(subtract)from collections import Counter c = Counter('which') print(c["h"]) c.subtract('witch') # 使用另一个iterable对象更新print(c['h']) d = Counter('watch') c.subtract(d) # 使用另一个Counter对象更新print(c['a'])结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py21-1Process finished with exit code 0键的修改和删除当计数值为0时,并不意味着元素被删除,删除元素应当使用del。 键的删除from collections import Counterc = Counter("abcdcba")print(c)c["b"] = 0print(c) del c["a"]print(c)结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter({'a': 2, 'b': 2, 'c': 2, 'd': 1}) Counter({'a': 2, 'c': 2, 'd': 1, 'b': 0}) Counter({'c': 2, 'd': 1, 'b': 0}) Process finished with exit code 0elements()返回一个迭代器。元素被重复了多少次,在该迭代器中就包含多少个该元素。元素排列无确定顺序,个数小于1的元素不被包含。elements()方法 from collections import Counterc = Counter(a=4, b=2, c=0, d=-2)print(list(c.elements()))结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py ['a', 'a', 'a', 'a', 'b', 'b'] Process finished with exit code 0most_common([n])返回一个TopN列表。如果n没有被指定,则返回所有元素。当多个元素计数值相同时,排列是无确定顺序的。most_common()方法from collections import Counterc = Counter('abracadabra')print(c)print(c.most_common())print(c.most_common(3))结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}) [('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)] [('a', 5), ('b', 2), ('r', 2)] Process finished with exit code 0浅拷贝copy浅拷贝copyfrom collections import Counterc = Counter("abcdcba")print(c) d = c.copy()print(d)结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter({'a': 2, 'b': 2, 'c': 2, 'd': 1}) Counter({'a': 2, 'b': 2, 'c': 2, 'd': 1}) Process finished with exit code 0算术和集合操作+、-、&、|操作也可以用于Counter。其中&和|操作分别返回两个Counter对象各元素的最小值和最大值。需要注意的是,得到的Counter对象将删除小于1的元素。Counter对象的算术和集合操作from collections import Counterc = Counter(a=3, b=1) d = Counter(a=1, b=2)print(c + d) # c[x] + d[x]print(c - d) # subtract(只保留正数计数的元素)print(c & d) # 交集: min(c[x], d[x])print(c | d) # 并集: max(c[x], d[x])结果:D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter({'a': 4, 'b': 3}) Counter({'a': 2}) Counter({'a': 1, 'b': 1}) Counter({'a': 3, 'b': 2}) Process finished with exit code 0其他常用操作下面是一些Counter类的常用操作,来源于Python官方文档Counter类常用操作sum(c.values()) # 所有计数的总数c.clear() # 重置Counter对象,注意不是删除list(c) # 将c中的键转为列表set(c) # 将c中的键转为setdict(c) # 将c中的键值对转为字典c.items() # 转为(elem, cnt)格式的列表Counter(dict(list_of_pairs)) # 从(elem, cnt)格式的列表转换为Counter类对象c.most_common()[:-n:-1] # 取出计数最少的n个元素c += Counter() # 移除0和负值
-
1. HTML格式邮件的发送以下实例为发送HTML格式的邮件,我们只需要变更调用函数时候的参数,即可完成邮件的发送;#!/usr/bin/env python# -*- coding: utf-8 -*-# author:Zhang Kai time:2020/10/12# 使用其他邮件服务商的 SMTP 访问import smtplibfrom email.mime.text import MIMETextfrom email.header import Headerdef sendMail(sender, mail_pass, receivers, mail_msg, mail_host='smtp.163.com'): # 定义发送邮件的函数; ''' :param mail_user: 字符串格式:kai.zhang@unisemicon.com 发件人的邮箱 :param mail_pass: 字符串格式:发件人邮箱密码 :param receivers: 收件人列表;格式:['123@qq.com','234@qq.com','678@qq.com'] :param mail_msg: 邮件的内容,HTML 的字符串格式 :param mail_host: 设置服务器; 默认163邮箱; 举例:qq:smtp.qq.com; 163:smtp.163.com; 等 :return: 返回值如下: 1:代表邮件发送成功; 2:代表邮件发送失败; ''' # 第三方 SMTP 服务 mail_host = "smtp.qq.com" # 设置服务器,qq:smtp.qq.com; 163:smtp.163.com; 等 sender = sender # 用户名 mail_pass = mail_pass # 密码 # 设置发件人 & 收件人 sender = sender # 发件人,这里设置成与用户名一致 receivers = receivers # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 # 邮件的内容,HTML 格式 mail_msg = mail_msg message = MIMEText(mail_msg, 'HTML', 'utf-8') # 三个参数:第一个为邮件内容;第二个 设置文本格式 plain为纯文本,HTML为HTML格式;第三个 utf-8 设置编码 message['From'] = sender message['To'] = ','.join(receivers) subject = 'Python SMTP 邮件测试' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtpObj.login(sender, mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) return 1 # 邮件发送成功 except Exception: print(e.__class__.__name__) # 打印异常的名字 print(e) # 打印异常的详细信息 return 0 # "Error: 其他异常"# 定义邮件内容,HTML格式mail_msg = """ <p>Python 邮件发送测试...</p> <p><a href="http://172.21.21.8:8000/">这是一个内部查询系统的链接</a></p> """# 调用函数res = sendMail(sender="794532995@qq.com", mail_pass="12345678", receivers=['794532995@qq.com'], mail_msg=mail_msg, mail_host="smtp.unisemicon.com")# 打印返回值print(res)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364652. 文本格式邮件的发送只需要将上述代码中的 message = MIMEText(mail_msg, 'HTML', 'utf-8') 中的HTML 变为plain ,则邮件内容变为纯文本;即修改为:message = MIMEText(mail_msg, 'plain', 'utf-8')3. 包含附件邮件的发送发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送;只有mail_msg这个参数需要重新构造,其余无变化;代码参考如下:#!/usr/bin/env python# -*- coding: utf-8 -*-# author:Zhang Kai time:2020/10/12import smtplibfrom email.mime.text import MIMETextfrom email.header import Headerfrom email.mime.multipart import MIMEMultipart mail_msg = """ <p>Python 邮件发送测试...</p> <p><a href="http://172.21.21.8:8000/">这是一个内部查询系统的链接</a></p> """sender="794532995@qq.com"mail_pass="pyelx****lkbfhj"receivers=['kai.zhang@unisemicon.com']mail_msg=mail_msg attach_file = 'test.txt'mail_host="smtp.qq.com"# 第三方 SMTP 服务mail_host = "smtp.qq.com" # 设置服务器,qq:smtp.qq.com; 163:smtp.163.com; 等sender = sender # 用户名mail_pass = mail_pass # 密码# 设置发件人 & 收件人sender = sender # 发件人,这里设置成与用户名一致receivers = receivers # 接收邮件,可设置为你的QQ邮箱或者其他邮箱# 创建一个带附件的邮件内容实例;message=MIMEMultipart()message['From'] = sender message['To'] = ','.join(receivers)subject = 'Python SMTP 邮件测试'message['Subject'] = Header(subject, 'utf-8')# 增加邮件正文的内容,HTML 格式mail_msg = mail_msg message.attach(MIMEText(mail_msg, 'HTML', 'utf-8')) # 三个参数:第一个为邮件内容;第二个 设置文本格式 plain为纯文本,HTML为HTML格式;第三个 utf-8 设置编码# 构造附件1,传入当前目录下的test.txt 文件,当前目录下必须要有test.txt文件;attach_file =attach_file att1 = MIMEText(open(attach_file, 'rb').read(), 'base64', 'utf-8')att1["Content-Type"] = 'application/octet-stream'# 这里的filename可以任意写,写什么名字,邮件中显示什么名字att1["Content-Disposition"] = 'attachment; filename="test.txt"'message.attach(att1)# 构造附件2,按照附件1 的方式,可以添加很多个附件;try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtpObj.login(sender, mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print('邮件发送成功')except Exception as e: print(e.__class__.__name__) # print(e) # print('邮件发送失败')123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566备注:邮件一般在垃圾邮箱;4. 包含附件邮件的发送#!/usr/bin/env python# -*- coding: utf-8 -*-# author:Zhang Kai time:2020/10/13import smtplibfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.header import Header sender="794532995@qq.com"mail_pass="pyelxrvvgclkbfhj" # 密码receivers=['kai.zhang@unisemicon.com'] # 设置收件人attach_file = 'test.txt'mail_host="smtp.qq.com"# 创建一个带图片的邮件内容实例:message;message=MIMEMultipart() # msgRoot = MIMEMultipart('related')message['From'] = sender # 给实例添加发件人message['To'] = ','.join(receivers) # 给实例添加收件人subject = 'Python SMTP 邮件测试'message['Subject'] = Header(subject, 'utf-8') # 给实例添加标题msgAlternative = MIMEMultipart('alternative') # 创建带图片的内容message.attach(msgAlternative) # 将内容添加到实例mail_msg = """ <p>Python 邮件发送测试...</p> <p><a href="http://172.21.21.8:8000/">这是一个内部查询系统的链接</a></p> <p>图片如下:</p> <p><img src="cid:image1"></p> <p><img src="cid:image2"></p> """msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8')) # 给内容增加邮件内容# 指定图片为当前目录fp = open('test.jpg', 'rb')msgImage = MIMEImage(fp.read()) # 将图片赋值给msgImage;fp.close()fp = open('test2.jpg', 'rb')msgImage2 = MIMEImage(fp.read()) # 将图片2赋值给msgImage;fp.close()# 定义图片 ID,在 HTML 文本中引用msgImage.add_header('Content-ID', '<image1>') # 给图片添加标题message.attach(msgImage) # 给实例添加图片msgImage2.add_header('Content-ID', '<image2>') # 给图片添加标题message.attach(msgImage2) # 给实例添加图片try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtpObj.login(sender, mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print('邮件发送成功')except Exception as e: print(e.__class__.__name__) # print(e) # print('邮件发送失败')5. 发生邮件的步骤总结5.1 导入对应的包;一般以下几个就完全够用了;import smtplibfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.header import Header123455.2 建立smtplib.SMTP()对象;smtpObj = smtplib.SMTP() # 创建邮件对象15.3 连接服务器 & 登陆邮箱; QQ邮箱密码参考本章的 ‘3. QQ邮箱异常解决’mail_host = "smtp.qq.com" # 取决于发送邮件的邮箱是什么;smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号smtpObj.login(sender, mail_pass) # sender:发件人的邮箱; mail_pass:邮箱对应的密码;QQ邮箱密码参考本章的 3. QQ邮箱异常解决5.4 发送邮件;发送邮件的语句如下,包括三个参数:sender, receivers, message.as_string();构建完成message参数后,使用以下语句就可以实现发送邮件的功能;smtpObj.sendmail(sender, receivers, message.as_string())1参数解释:sender: 就是发件人,直接定义即可,例如:sender="794532995@qq.com"receivers: 就是收件人,列表直接定义即可,例如:receivers=['kai.zhang@unisemicon.com','794532995@qq.com']message: 就是邮件内容;邮件内容稍微复杂,需要先创建邮件对象实例,然后向实例中添加:发件人,收件人,主题,正文,附件;5.4.0 创建邮件对象实例:message=MIMEMultipart() # 创建邮件对象实例,然后向实例中添加发件人,收件人,主题,正文,附件;15.4.1 邮件对象中的发件人:message['From'] = '794532995@qq.com'15.4.2 邮件对象中的收件人:message['To'] = ','.join(receivers)# 其中:receivers=['kai.zhang@unisemicon.com','794532995@qq.com'] 是一个收件人列表;125.4.3 邮件对象中的主题:subject = 'Python SMTP 邮件测试'message['Subject'] = Header(subject, 'utf-8') # 给实例添加标题125.4.4 邮件对象中的正文:# 生成一个只有文本(或者HTML)的正文对象,然后添加到message中;mail_msg = """ <p>Python 邮件发送测试...</p> <p><a href="http://172.21.21.8:8000/">这是一个内部查询系统的链接</a></p> """message.attach(MIMEText(mail_msg, 'HTML', 'utf-8'))1234565.4.5 邮件对象中的包含图片的正文:# 创建一个带图片的邮件内容,然后添加到message中;msgAlternative = MIMEMultipart('alternative') # 创建带图片的内容message.attach(msgAlternative) # 将内容添加到实例mail_msg = """ <p>Python 邮件发送测试...</p> <p><a href="http://172.21.21.8:8000/">这是一个内部查询系统的链接</a></p> <p>图片如下:</p> <p><img src="cid:image1"></p> <p><img src="cid:image2"></p> """msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8')) # 给内容增加邮件HTML文本# 指定图片为当前目录,然后打开图片文件,赋值给 msgImage;fp = open('test.jpg', 'rb')msgImage = MIMEImage(fp.read()) # 将图片1 赋值给msgImage;fp.close()msgImage.add_header('Content-ID', '<image1>') # 给图片1添加标题message.attach(msgImage) # 给实例添加图片123456789101112131415161718195.4.6 邮件对象中的附件:构造附件对象,然后添加到message中;# 构造附件1,传入当前目录下的test.txt 文件attach_file = 'test.txt'att1 = MIMEText(open(attach_file, 'rb').read(), 'base64', 'utf-8')att1["Content-Type"] = 'application/octet-stream'# 下面的filename可以任意写,写什么名字,邮件中显示什么名字att1["Content-Disposition"] = 'attachment; filename="test.txt"'message.attach(att1)
-
在Python运行遇到异常时,程序会终止;而在我们编程过程中,错误是不可避免的,这时我们需要捕捉到异常,还需要程序继续运行;这时我们就需要根据异常Traceback到出错点,进行分析改正;1. 异常捕获当发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。python的异常捕获常用try…except…结构,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。1.1 捕获所有异常捕获所有异常的语句如下:# 捕获所有异常try: <语句> # 需要被判断的语言块except: <异常处理语句> # 出现异常后的处理语句12345例子:import systry: sys.exit()except: print('异常被捕捉到啦~~')# 输出:# '异常被捕捉到啦~~'12345678以上语句中,由于没有指定异常,所有的异常都将被捕捉,甚至包括键盘中断和程序退出请求;(try后的语句中如果使用sys.exit(),无法退出python程序,因为sys.exit()作为异常被捕获了;)try: <语句> except Exception: <异常处理语句> # 出现异常后的处理语句1234例子:import systry: sys.exit()except Exception: print('异常被捕捉到啦~~')# 程序退出了,说明没有捕捉到异常;1234567在except后增加Exception,可以捕捉全部异常,但是不会捕捉键盘中断和程序退出请求;1.2 捕捉指定异常捕捉指定异常,只需要在except后增加异常的名称即可;这里的异常名称可以使用报错的异常名称;# 捕捉指定异常try: <语句>except <异常名>: <异常处理语句> # 出现异常后的处理语句123451.3 捕捉多个异常1.3.1 不区分优先级把需要捕捉的异常名称全部列在except后,这时异常没有优先级,全部捕捉;# 捕捉多个异常,不区分优先级try: <语句>except (<异常名1>, <异常名2>, ...): <异常处理语句> # 出现异常后的处理语句123451.3.2 区分优先级如果需要区分异常的优先级,则将except按照优先级分开处理,举例如下:# 捕捉多个异常,区分优先级try: <语句>except <异常名1>: print('异常说明1') except <异常名2>: print('异常说明2') except <异常名3>: print('异常说明3')123456789101112处理顺序:当异常发生时,先执行异常名1的语句,如果匹配则执行:print(‘异常说明1’),若不匹配,则执行异常名2,以此类推;备注:1. 这种方式可以支持的except语句的数量没有限制; 2. 如果都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。1.4 异常中的else当try语句中没有某些异常时,我们可以添加else语句,来执行其他语句;即:若有异常发生则执行异常处理语句,若无异常发生,则执行else语句;# 异常中的elsetry: <语句>except <异常名1>: <异常处理语句> # 有异常发生时,执行该语句 else: <语句> # 无异常发生时,则执行该语句1234567891.5 异常中的finally有些时候,无论try语句中是否有异常,我们都希望执行一些语句,这时候需要使用finally语句;即:无论异常是否发生,都会执行finally语句;# 异常中的finally语句try: <语句> finally: <语句>1234562. 用户自定义异常_raise 主动触发异常在python编程中,我们可以主动触发异常,即:我们可以规定何种情况下生成何种异常;def not_zero(num): try: if num == 0: raise ValueError('参数为0,参数错误') return num except Exception as e: print('错误类型为:',e.__class__.__name__) print('错误详情为:',e)not_zero(0)1234567891011输出:错误类型为: ValueError 错误详情为: 参数为0,参数错误123. 查看异常位置_traceback模块有时我们需要打印出发生异常的位置,就需要使用traceback模块;举例如下:import tracebacktry: 1/0except Exception as e: print(e) print('---------------------') traceback.print_exc() print('---------------------') a = traceback.format_exc() print(a) print('---------------------')1234567891011输出:# print(e)的输出结果division by zero------------------------------------------# print(a) 的输出结果Traceback (most recent call last): File "D:/PY_useful/3_python 基础/11.异常处理.py", line 21, in <module> 1/0ZeroDivisionError: division by zero---------------------# traceback.print_exc()的输出结果,默认的位置是输出结果的最后位置,如本例中,输出在最后Traceback (most recent call last): File "D:/PY_useful/3_python 基础/11.异常处理.py", line 21, in <module> 1/0ZeroDivisionError: division by zero123456789101112131415164. 常见异常名 & 描述异常名称描述BaseException所有异常的基类SystemExit解释器请求退出KeyboardInterrupt用户中断执行(通常是输入^C)Exception常规错误的基类StopIteration迭代器没有更多的值GeneratorExit生成器(generator)发生异常来通知退出SystemExitPython 解释器请求退出StandardError所有的内建标准异常的基类ArithmeticError所有数值计算错误的基类FloatingPointError浮点计算错误OverflowError数值运算超出最大限制ZeroDivisionError除(或取模)零 (所有数据类型)AssertionError断言语句失败AttributeError对象没有这个属性EOFError没有内建输入,到达EOF 标记EnvironmentError操作系统错误的基类IOError输入/输出操作失败OSError操作系统错误WindowsError系统调用失败ImportError导入模块/对象失败KeyboardInterrupt用户中断执行(通常是输入^C)LookupError无效数据查询的基类IndexError序列中没有没有此索引(index)KeyError映射中没有这个键MemoryError内存溢出错误(对于Python 解释器不是致命的)NameError未声明/初始化对象 (没有属性)UnboundLocalError访问未初始化的本地变量ReferenceError弱引用(Weak reference)试图访问已经垃圾回收了的对象RuntimeError一般的运行时错误NotImplementedError尚未实现的方法SyntaxErrorPython 语法错误IndentationError缩进错误TabErrorTab 和空格混用SystemError一般的解释器系统错误TypeError对类型无效的操作ValueError传入无效的参数UnicodeErrorUnicode 相关的错误UnicodeDecodeErrorUnicode 解码时的错误UnicodeEncodeErrorUnicode 编码时错误UnicodeTranslateErrorUnicode 转换时错误Warning警告的基类DeprecationWarning关于被弃用的特征的警告FutureWarning关于构造将来语义会有改变的警告OverflowWarning旧的关于自动提升为长整型(long)的警告PendingDeprecationWarning关于特性将会被废弃的警告RuntimeWarning可疑的运行时行为(runtime behavior)的警告SyntaxWarning可疑的语法的警告UserWarning用户代码生成的警告
-
三遍,使用Python爬虫抓取图片和文字实验这个实验通关用了三遍。第一遍是折在pycharm字体太小,没找着调整的地方,加重了俺的老眼昏花,一气之下结束了实验。第二遍做是弄混淆了RDS和ECS,把爬虫的脚本传到RDS上去了,怎么跑不起来,哎,好像就这一个错误没啥问题啊,后面的设置也是混淆了两个IP,才是问题的核心。第三遍就一路通关了,连原来RDS上增加数据库后看不见数据库的“BUG"也找到了解决的办法了这里命名显示有个数据库,可是却看不到,一开始以为是mysql portal的bug,三刷后偶然发现,是自己太菜了~将实验手册暂时关闭,然后实验桌面窗口全屏,新建的数据库就安静地在这里了。如果不从首页进数据库创建表,也可以从库管理这里进去创建表,但是交互的信息缺少对int的自增加选项,后面还需要自己改sql语句实现。额,这个应该是portal实现的bug了吧~[捂脸]已经不敢说了~下面是从创建完的数据库直接点进去完成的建表流程,这里面就有int主键的自增选项。整个实验还是挺好玩的,体验了华为云的ECS,RDS,OBS服务,爬取的是华为商城的商品信息,改改脚本也可以用来爬爬别的。
-
关于基础项目打算招聘一个自动化运维,主要需求是python、Linux与shell脚本能力。但面试几天发现一些问题:简历虚假这个不管哪行,简历含水量大都是普遍存在的,看简历犀利的一比,一面是能力弱的一腿。谁都希望自己80分的能力写成120,但有时候假的有些离谱,问一两个问题就漏气了…年龄与薪酬目前的IT行业,最敢坐地起薪的就是27—33这年龄段的,低于范围的往往因为能力或者说跳槽经验少,而不敢要高价,高于这个年龄的感觉失去了针对年轻人的干劲与学习能力,所以起薪不算太高或者浮动好商量。当然这里说的是普遍情况,而不包含那些能力较强的精英人才。重高端轻基础经常你会发现,接受面试的人,上来就跟你说做过什么类似高端的、前沿的技术。你挑着问你个问题,回答的还行。反而你问一些较为基础的东西时,却回答的不尽人意。但有时候,BUG往往都发生在那些细小的基础环节。举几个这几天的例子:list tuple dict set 是可迭代对象,那么字符串是否为可迭代对象?头脑一热的,马上回答不是,但其实…在面试中问到Python集合定义时,A说可以使用花括号包裹多种类型的数据生成集合。那创建空集合呢?A顺口就回复了一句,添加一对空的花括号…假设一个list A为[1,2,3,4],如何获取A的最后一个数据A[-1],如何向A的末尾插入数字5?A.append(5) OK,貌似他觉得我说的是插入,又补充了一个A.insert(-1,5)。index使用-1貌似是跟我之前问到的获取最后一个元素有关,但这样真的对么?append()方法是指在列表的末尾增加一个数据项,insert()方法是指在某个特定位置前填加一个数据项。关于Python练习这几天一些朋友问,python基础的知识和书看了一些了,但总觉得学完了就完了,感觉学了一堆知识,没有什么深入的理解与运用。其实这些都是因为练习的太少了。针对算法可以去https://leetcode.com/中文网站https://leetcode-cn.com/去刷一些算法题,或者说是经典笔试题。菜鸟教程上也有一套python100例的练习集合:当然如果觉得网上刷题麻烦,也可以看看这份Python100经典练习题的PDF进行学习:PDF下载地址:https://pan.baidu.com/s/1rVTqBBUJGBQwlQlHheFvlA 提取码:fl2kThe End本文来自“清风Python”欢迎关注
-
一、Requests基础1.安装Requests库pip install requests12.使用Requests库import requests1二、发送请求与接收响应(基本GET请求)response = requests.get(url)121.传送 parmas参数参数包含在url中response = requests.get("http://httpbin.org/get?name=zhangsan&age=22")print(response.text)通过get方法传送参数data = { "name": "zhangsan", "age": 30 }response = requests.get("http://httpbin.org/get", params=data)print(response.text)12345672.模拟发送请求头(传送headers参数)headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}response = requests.get("http://httpbin.org/get", headers=headers)print(response.text)123456三、发送请求与接收响应(基本POST请求)response = requests.post(url, data = data, headers=headers)四、response属性属性描述response.text获取str类型(Unicode编码)的响应response.content获取bytes类型的响应response.status_code获取响应状态码response.headers获取响应头response.request获取响应对应的请求五、代理proxies = { "http": "https://175.44.148.176:9000", "https": "https://183.129.207.86:14002"}response = requests.get("https://www.baidu.com/", proxies=proxies)123456六、cookie和session使用的cookie和session好处:很多网站必须登录之后(或者获取某种权限之后)才能能够请求到相关数据。使用的cookie和session的弊端:一套cookie和session往往和一个用户对应.请求太快,请求次数太多,容易被服务器识别为爬虫,从而使账号收到损害。1.不需要cookie的时候尽量不去使用cookie。2.为了获取登录之后的页面,我们必须发送带有cookies的请求,此时为了确保账号安全应该尽量降低数据采集速度。1.cookie(1)获取cookie信息response.cookies122.session(1)构造session回话对象session = requests.session()12示例:def login_renren(): login_url = 'http://www.renren.com/SysHome.do' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" } session = requests.session() login_data = { "email": "账号", "password": "密码" } response = session.post(login_url, data=login_data, headers=headers) response = session.get("http://www.renren.com/971909762/newsfeed/photo") print(response.text)login_renren()1234567891011121314151617181920七、案例案例1:百度贴吧页面爬取(GET请求)import requestsimport sysclass BaiduTieBa: def __init__(self, name, pn, ): self.name = name self.url = "http://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}".format(name, pn) self.headers = { # "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" # 使用较老版本的请求头,该浏览器不支持js "User-Agent": "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" } self.url_list = [self.url + str(pn*50) for pn in range(pn)] print(self.url_list) def get_data(self, url): """ 请求数据 :param url: :return: """ response = requests.get(url, headers=self.headers) return response.content def save_data(self, data, num): """ 保存数据 :param data: :param num: :return: """ file_name = "./pages/" + self.name + "_" + str(num) + ".html" with open(file_name, "wb") as f: f.write(data) def run(self): for url in self.url_list: data = self.get_data(url) num = self.url_list.index(url) self.save_data(data, num)if __name__ == "__main__": name = sys.argv[1] pn = int(sys.argv[2]) baidu = BaiduTieBa(name, pn) baidu.run()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748案例2:金山词霸翻译(POST请求)import requestsimport sysimport jsonclass JinshanCiBa: def __init__(self, words): self.url = "http://fy.iciba.com/ajax.php?a=fy" self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0", "X-Requested-With": "XMLHttpRequest" } self.post_data = { "f": "auto", "t": "auto", "w": words } def get_data(self): """ 请求数据 :param url: :return: """ response = requests.post(self.url, data=self.post_data, headers=self.headers) return response.text def show_translation(self): """ 显示翻译结果 :param data: :param num: :return: """ response = self.get_data() json_data = json.loads(response, encoding='utf-8') if json_data['status'] == 0: translation = json_data['content']['word_mean'] elif json_data['status'] == 1: translation = json_data['content']['out'] else: translation = None print(translation) def run(self): self.show_translation()if __name__ == "__main__": words = sys.argv[1] ciba = JinshanCiBa(words) ciba.run()案例3:百度贴吧图片爬取(1)普通版从已下载页面中提取url来爬取图片(页面下载方法见案例1)from lxml import etreeimport requestsclass DownloadPhoto: def __init__(self): pass def download_img(self, url): response = requests.get(url) index = url.rfind('/') file_name = url[index + 1:] print("下载图片:" + file_name) save_name = "./photo/" + file_name with open(save_name, "wb") as f: f.write(response.content) def parse_photo_url(self, page): html = etree.parse(page, etree.HTMLParser()) nodes = html.xpath("//a[contains(@class, 'thumbnail')]/img/@bpic") print(nodes) print(len(nodes)) for node in nodes: self.download_img(node)if __name__ == "__main__": download = DownloadPhoto() for i in range(6000): download.parse_photo_url("./pages/校花_{}.html".format(i))1234567891011121314151617181920212223242526272829(2)多线程版main.pyimport requestsfrom lxml import etreefrom file_download import DownLoadExecutioner, file_downloadclass XiaoHua: def __init__(self, init_url): self.init_url = init_url self.download_executioner = DownLoadExecutioner() def start(self): self.download_executioner.start() self.download_img(self.init_url) def download_img(self, url): html_text = file_download(url, type='text') html = etree.HTML(html_text) img_urls = html.xpath("//a[contains(@class,'thumbnail')]/img/@bpic") self.download_executioner.put_task(img_urls) # 获取下一页的连接 next_page = html.xpath("//div[@id='frs_list_pager']/a[contains(@class,'next')]/@href") next_page = "http:" + next_page[0] self.download_img(next_page)if __name__ == '__main__': x = XiaoHua("http://tieba.baidu.com/f?kw=校花&ie=utf-8") x.start()1234567891011121314151617181920212223242526272829file_download.pyimport requestsimport threadingfrom queue import Queuedef file_download(url, type='content'): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko' } r = requests.get(url, headers=headers) if type == 'text': return r.text return r.contentclass DownLoadExecutioner(threading.Thread): def __init__(self): super().__init__() self.q = Queue(maxsize=50) # 图片保存目录 self.save_dir = './img/' # 图片计数 self.index = 0 def put_task(self, urls): if isinstance(urls, list): for url in urls: self.q.put(url) else: self.q.put(urls) def run(self): while True: url = self.q.get() content = file_download(url) # 截取图片名称 index = url.rfind('/') file_name = url[index+1:] save_name = self.save_dir + file_name with open(save_name, 'wb+') as f: f.write(content) self.index += 1 print(save_name + "下载成功! 当前已下载图片总数:" + str(self.index))1234567891011121314151617181920212223242526272829303132333435363738394041424344(3)线程池版main.pyimport requestsfrom lxml import etreefrom file_download_pool import DownLoadExecutionerPool, file_downloadclass XiaoHua: def __init__(self, init_url): self.init_url = init_url self.download_executioner = DownLoadExecutionerPool() def start(self): self.download_img(self.init_url) def download_img(self, url): html_text = file_download(url, type='text') html = etree.HTML(html_text) img_urls = html.xpath("//a[contains(@class,'thumbnail')]/img/@bpic") self.download_executioner.put_task(img_urls) # 获取下一页的连接 next_page = html.xpath("//div[@id='frs_list_pager']/a[contains(@class,'next')]/@href") next_page = "http:" + next_page[0] self.download_img(next_page)if __name__ == '__main__': x = XiaoHua("http://tieba.baidu.com/f?kw=校花&ie=utf-8") x.start()12345678910111213141516171819202122232425262728file_download_pool.pyimport requestsimport concurrent.futures as futuresdef file_download(url, type='content'): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko' } r = requests.get(url, headers=headers) if type == 'text': return r.text return r.contentclass DownLoadExecutionerPool(): def __init__(self): super().__init__() # 图片保存目录 self.save_dir = './img_pool/' # 图片计数 self.index = 0 # 线程池 self.ex = futures.ThreadPoolExecutor(max_workers=30) def put_task(self, urls): if isinstance(urls, list): for url in urls: self.ex.submit(self.save_img, url) else: self.ex.submit(self.save_img, urls) def save_img(self, url): content = file_download(url) # 截取图片名称 index = url.rfind('/') file_name = url[index+1:] save_name = self.save_dir + file_name with open(save_name, 'wb+') as f: f.write(content) self.index += 1 print(save_name + "下载成功! 当前已下载图片总数:" + str(self.index))
-
本场直播的抽奖过程和中奖的幸运用户将在10月21日公布。直播已结束 直播地址》》点我观看回放《《 直播简介本场直播将介绍人工智能的发展史和目前面临的挑战,探讨人工智能能做什么和不能做什么,加深对人工智能的边界与应用场景的理解。通过经典案例《善于借助开源算法,将想法变成现实,手把手带你动手开发AI颜值评分模型》来并指导大家做AI开发需要学习哪些技能,教大家如何零基础轻松入门人工智能。专家介绍参与方式1、 报名预约直播即有机会抽取华为手表GT2。(活动已结束)如您邀请的好友中奖,作为邀请人的您也同样享受奖励!2、 参与专家坐堂互动。在本帖下方任意回复以下一项内容,即有机会获得华为智能音箱和无线鼠标。有效参与必得500码豆。1) 观看直播后发表您的个人观点2) 观看直播后向专家提出问题3) 参与微话题互动:讨论话题:入门学AI,你最希望得到的帮助是什么?注:发布的内容必须与本次直播话题或微话题相关,且必须包含个人思考的内容。抄袭内容一经发现将取消评选资格。回复时间截至10月20日。活动规则1、本活动结束后将从报名本场直播的用户中随机抽取一名幸运用户获得华为手表GT2,同时其邀请人也可同样中取华为手表GT2一块。如中奖的幸运用户没有邀请人,则不发放邀请人奖励。本场直播的抽奖过程和中奖的幸运用户将在10月21日公布。2、如本帖的有效回复人数大于等于20人,则由专家和华为云工作人员共同评选出3个优质回复,发布者可获得无线鼠标一个。如有效回复人数大于等于30人,则额外评选出一个最优回复,发布者可获得华为智能音箱一个。如有效回复人数小于20人,则只发放500码豆参与奖励。获奖用户将于10月21日公布,并公示至10月24日截止。3、参加专家坐堂互动的有效参与者均可获得500码豆,请您提前登录DevCloud会员中心(https://devcloud.huaweicloud.com/bonususer/home),以免无法接收码豆。4、以上实物奖励将于11月30日前完成发放,码豆奖励将于11月25日前完成发放,请您耐心等待。5、如您参与1024相关活动,为保证您顺利领取活动奖品,请您提前填写下方奖品收货信息链接,如您没有填写,视为放弃奖励填写地址请戳我>>6、本次活动抽奖将采用巨公摇号平台(https://www.jugong.wang/random-portal/),奖项评比将由专家和华为云工作人员共同完成。如您对评奖方式有异议,请勿参加本次活动。更多活动:【华为云1024程序员节 · 向云而生】呼朋唤友学AI,喜赢京东卡【1024程序员节】“向云而生”直播盛典【1024程序员节】集卡牌 拿盲盒 赢码神锦鲤礼包
-
本节收录了稍作剪辑的PEP 8摘要(Python Enhancement Proposal,Python增强提案)。PEP 8由Guido van Rossum和Barry Warsaw撰写,是Python的最接近编程风格手册的东西。这里省略了一些比较具体的部分,但主要内容都已包括。应该尽可能让代码遵守PEP 8规范,代码会由此更具Python风格。访问Python官方网站的文档部分并搜索PEP,就可以获得PEP 8全文及Python历史上发布的所有其他PEP。PEP既是Python历史和经验的绝佳来源,也是当前议题和将来计划的解释。A.3.1 简介本文档给出的Python编码约定,适用于由Python主发行版本中的标准库构成的代码。有关Python的C实现中的C代码风格指南,参见相应的PEP[1]。本文档改编自Guido最初的Python风格指南文章,并加入了Barry风格指南的一些内容。如果与Guido的风格规则存在冲突,应该遵从本PEP。本PEP可能尚未完结(其实可能永远不会完结)。盲目的一致性是头脑简单的表现Guido的一个重要观点是,代码被阅读的次数远多于被编写的次数。本指南旨在提高代码的可读性,使各种各样的Python代码能保持风格一致。正如PEP 20[2]所述,“Readability counts”(注重可读性)。风格指南是讨论一致性的。与风格指南保持一致很重要。维持同一个项目内部的一致性更加重要。而保证同一个模块和函数内部的一致性则最重要。然而最最重要的是,知道何时应打破一致性,有时风格指南并不适用。如果心存疑虑,请采用自己的最佳判断。请看看别人的例子并做出最佳决定。不要犹豫,尽管发出疑问。以下是两个打破规范的好理由。如果应用风格指南会让代码的可读性变差,甚至对于习惯阅读遵守本规范代码的人来说也是如此。需要与周边的代码保持一致,而这些代码并未遵守规范(可能是历史原因造成的),尽管这也可能是个收拾别人烂摊子的机会(真正的极限编程风格)。A.3.2 代码布局1.缩进每级缩进采用4个空格。为了对付那些确实陈旧的代码,又不愿做出清理,那么可以继续沿用8个空格长度的制表符。2.制表符还是空格绝对禁止制表符和空格的混用。最流行的Python缩进方式是只使用空格。第二流行的方式是只使用制表符。混合使用制表符和空格进行缩进的代码,应该转换为只使用空格的方式。如果调用Python命令行解释器时带上-t参数,它就会对非法混用制表符和空格的代码发出警告。如果用了-tt参数,这些警告就会上升为错误。强烈推荐使用这些参数!对全新的项目而言,强烈建议只用空格缩进,换掉所有的制表符。大部分编辑器都具备将制表符替换为空格的便捷功能。3.最大行长所有行都应限制在79个字符以内。将行长限制在80个字符的设备还有很多,而且将窗口限制为80个字符宽就可以并排放置多个窗口。这些设备上的默认换行会破坏代码的外观,增加理解的难度。因此,请将所有行都限制在79个字符以内。对于连续的大段文字(文档字符串或注释),建议将行长限制在72个字符以内。对长行进行换行的首选方案,是利用Python隐含的行连接特性,在圆括号、方括号和大括号内部进行断行。必要时可以在表达式外面多加一对圆括号,不过有时候用反斜杠会更好看些。请确保对后续行进行适当的缩进。打断二元运算符的首选位置是在运算符之后,而不是运算符之前。下面给出一些例子:4.空行顶级函数和类定义之间,请用两个空行分隔。类内部的各个方法定义之间,请用1个空行分隔。为了让有关联的函数成组,可以在各函数组之间有节制地添加空行。相互关联的一组单行函数之间,可以省略空行,如一组函数的伪实现(dummy implementation)。函数内部可以有节制地用空行来区分出各个逻辑部分。Python可将Ctrl+L(^L)换页符接受为空白符。很多工具都将其视为分页符,所以可以利用其进行分页,使得文件中的关联部分单独成页。5.导入导入语句通常应单独成行,例如:import osimport sys不要像下面这样写在一起:import sys, os不过下面的写法没有问题:from subprocess import Popen, PIPE导入语句通常位于文件的顶部,紧挨着模块注释和文档字符串后面,在模块全局变量和常量定义之前。导入语句应按照以下顺序进行分组。(1)标准库的导入。(2)相关第三方库的导入。(3)本地应用程序/库——特定库的导入。每组导入语句之间请加入1个空行。任何对应的__all__声明都应位于导入语句之后。非常不推荐对内部包的导入使用相对导入语法。请始终对所有导入都使用绝对包路径。即便Python 2.5现在已完全实现了PEP 328[3],它的显式相对导入语法也是强烈不推荐的。绝对导入的可移植性更好,通常可读性也会更好。{:—}如果是从包含类的模块中导入类,通常可以采用如下写法:from myclass import MyClassfrom foo.bar.yourclass import YourClass如果上述写法会导致本地命名冲突,就采用如下写法:import myclassimport foo.bar.yourclass然后用myclass.MyClass和foo.bar.yourclass.YourClass表示类。6.表达式和语句内的空白符讨厌之事——以下场合应避免使用多余的空白符。紧靠小括号、中括号或大括号内部。 正确:错误:紧挨着逗号、分号或冒号之前。 正确:错误:紧挨着函数参数列表的左括号之前。正确:错误:紧挨着索引或切片操作的左括号之前。正确:错误:为了与另一条赋值或其他语句对齐,在运算符两边使用多个空格。正确:错误:7.其他建议始终在以下二元操作符两侧各放1个空格:赋值(=)、增量赋值(+=,-=等)、比较(==、<、>、!=、<>、<=、>=、in、not、in、is、is not)、布尔(and、or、not)。在数学运算符两侧放置空格。 正确:错误:在用于指定关键字参数或默认参数值时,请勿在=两边使用空格。正确:错误:通常不鼓励使用复合语句,也就是在同一行放置多条语句。正确:最好不要:虽然有时候将小块代码和if/for/while放在同一行没什么问题,但多行语句绝对不能如此。同时还要避免过长代码行的折叠!最好不要:绝对不要:本文截选自最新上架的《Python 快速入门》第3版《Python 快速入门》第3版本书是Python专业人士Naomi Ceder编写的Python语言的综合指南。她是一位经验丰富的教学者,她既能让读者关注语言的细节,又能使其具备解决实际问题的能力。本书中配有大量贴切的示例和边做边学的习题,有助于读者掌握每一个重要概念。无论读者是要抓取网站内容还是想玩转嵌套元组,都会赞叹本书的清晰、专注和对细节的重视。本书主要内容● 明确涵盖Python 3。● 全面介绍核心库、包和工具。● 配备精深的习题。● 新增5章与数据科学相关的内容。本书专为熟悉编程概念的读者编写,但不要求读者具备Python的使用经验。本文转载自异步社区。原文链接:https://www.epubit.com/articleDetails?id=44deb149f0f94700b1b6ae4766e162d4
-
再看继承 回顾一下关于类的继承的知识: 我们先看上面的代码,这是一个简单的类继承,我们可以看到父类Base和子类Son,它们中各有一个Testfunc方法,当我们实例化子类的对象sonobj时,可以看到初始化方法中黄色框框调用了Testfunc,那么这个时候执行的是哪个类里面的代码呢?我会告诉你执行的是子类里面的方法,不信就自己试试吧,代码在下面~ 为什么呢?其实这里是绕了一个圈,所以把很多人绕晕了,包括我!后来想想其实很容易,我们看最右边的图: 如果这样看,我们是不是就明白了?其实这两段代码表示的是一个意思,尽管Son继承了Base类,父子类中都有同样的方法,但是由于我们实例化了子类的对象,所以这个在初始化方法里的self.Testfunc,self指的是子类的对象,当然也就先调用子类中的方法啦。所以尽管在第一个例子中,初始化方法在父类执行,但是还是改变不了它是子类对象的本质,当我们使用self去调用Testfunc方法时,始终是先调用子类的方法。我们可以这样理解,尽管儿子继承了父亲的财产,但是花钱的时候,还是要先花自己的~~~inherit Code:#_*_coding:utf-8_*___author__ = 'Eva_J'class Base(object): def __init__(self,name): self.name = name self.Testfunc() def Testfunc(self): print 'do Base Testfunc'class Son(Base): def Testfunc(self): print 'do Son Testfunc'sonobj = Son('sonobj')看完刚刚的代码,我们就知道了对象和self的真实意义,现在再来回忆一下关于继承的顺序问题:看上面的代码,我们猜测一下,执行之后,控制台会打印什么呢?先揭晓答案,会打印Base2方法中的内容,原因很简单:尽管这三个类中都有同样的Testfunc方法,但是,由于计算机在找方法的时候,遵循的顺序是:Base2,Son,Base,所以它会先找到Base2类,而这个类中刚好有它要找的方法,它也就欢欢喜喜的拿去执行啦!inherit2 Code:画个简易类图 刚刚我们只是写了一个小程序,来说明类之间的继承和对象调用方法之间的联系,但是如果我们想要hold住一个继承关系复杂的源码逻辑,就需要类图来帮忙!如果你觉得我要教你画类图那就大错特错了。。。懒人症重症患者是懒得画那种东西的。。。嘻,先看图!对照类图看源码 根据上面的图,我们就拿到了threadingTCPServer的相关类,并且搞清楚了它们之间的继承关系和方法,接下来我们对照这张简易类图来看看代码执行的过程: 初始化相关过程:执行serve_forever的相关代码:就是这样,我们一路按照调用轨迹去寻找,每次看到一个调用都先对照上面的简易类图,看看有没有重名方法,如果有,就要找到最近的方法并查看里面的内容,以此类推:按照这种方法,就会感觉所有代码都在一个文件一样。
-
1.冒泡排序def my_sort(array): flag=1 for i in range(len(array)): if(flag==1): flag=0 for j in range(len(array)-i-1): if(array[j]>array[j+1]): temp=array[j] array[j]=array[j+1] array[j+1]=temp flag=1 else: break return array2.选择排序 def quick_sort(low,high,array): solder=array[low] while(low<high): if(array[high]<solder): array[low]=array[high] low+=1 while(low<high): if(array[low]>solder): array[high]=array[low] high-=1 break else: low+=1 else: high-=1 array[high]=solder return array,highdef recursion(array,low,high): if low<high: array,middle=quick_sort(low,high,array) recursion(array,low,middle-1) recursion(array,middle+1,high) print(array) 3.选择排序#选择排序def chocice_sort(array): #由于array不支持index,将其转为list来做 array=list(array) for i in range(len(array)): try: data=None data=array[i:] print(type(data)) index=array.index(min(data)) temp=array[i] array[i]=array[index] array[index]=temp #print(array) except: pass continue print(array) 4.插入排序#直接插入排序def dir_sort(array): for i in range(1,len(array)): temp=array[i] for j in range(i-1,-1,-1): print(array) if (array[j]>temp)&(j==0): array[1]=array[0] array[0]=temp break if (array[j]>temp)&(j!=0): array[j+1]=array[j] continue if(array[j]<temp): array[j+1]=temp break #print(array)#调用data=np.array([0]*10)for i in range(10): data[i]=random.randint(1,100)#print(data)#print(len(data.shape))#data=recursion(data,0,9)#chocice_sort(data)dir_sort(data)
-
一、源头我们从任何一个正整数开始,比如说9246,求出它的各位数字的平方和(81+4+16+36=137),再对这个数做同样的事情(137给出1+9+49=59),并且对每次所得结果重复这一步骤,这样便得到一个整数序列。对于我们的例子,这个序列是:9246,137,59,106,37,58,89,145,42,20,…那么,不论开始时人们选取什么整数,所得到的序列,要么出现数1(而在1之后显然就永远重复这个数字),要么出现数4(而在4之后就一直循环出现4,16,37,58,89,145,42,20)。——源自《数学中的智巧》—R·亨斯贝尔格我们知道,一旦求和到1,接下来就是一直是1,循环。一旦求和到4,那就是“4,16,37,58,89,145,42,20,4”*的循环圈。二、python的简单验证1. 对任意一个正整数的试验操作a = input("请输入一个数:")sum = 0for i in range(10000): # 预设10000次循环(够用,即使数值各个位上都是最大的数字9,这个n位数在第一次操作后就会变为81n,位数骤降) for j in range(len(str(a))): m = str(a)[j] sum = int(m) *int(m) + sum print(sum) if sum == 1: print("到1开始循环了") break elif sum == 4: print("到4开始循环了") break else: a = sum sum = 012345678910111213141516任意输入一个数值:请输入一个数:26178292399497130101到1开始循环了12345678请输入一个数:3665372823217502529858914542204到4开始循环了123456789101112132. 对任意一个100以内的正整数的试验操作为了更清晰地看到数字的循环规律,我们不妨对100以内的数值进行分析,看看哪些数值能够循环到1,哪些数值循环到4.将循环到1的数值找出来,代码如下:sum = 0for k in range(1,101): sum = 0 a = k for i in range(10000): for j in range(len(str(a))): m = str(a)[j] sum = int(m) *int(m) + sum if sum == 4: break else: if sum == 1: print(k,"到1了") break else: a = sum sum = 01234567891011121314151617运行结果:1 到1了7 到1了10 到1了13 到1了19 到1了23 到1了28 到1了31 到1了32 到1了44 到1了49 到1了68 到1了70 到1了79 到1了82 到1了86 到1了91 到1了94 到1了97 到1了100 到1了1234567891011121314151617181920将循环到4的数值找出来,代码如下:sum = 0for k in range(1,101): sum = 0 a = k for i in range(10000): for j in range(len(str(a))): m = str(a)[j] sum = int(m) *int(m) + sum if sum == 4: print(k, "到4了") break else: if sum == 1: break else: a = sum sum = 01234567891011121314151617运行结果:2 到4了3 到4了4 到4了5 到4了6 到4了8 到4了9 到4了11 到4了12 到4了14 到4了15 到4了16 到4了17 到4了18 到4了20 到4了21 到4了22 到4了24 到4了25 到4了26 到4了27 到4了29 到4了30 到4了33 到4了34 到4了35 到4了36 到4了37 到4了38 到4了39 到4了40 到4了41 到4了42 到4了43 到4了45 到4了46 到4了47 到4了48 到4了50 到4了51 到4了52 到4了53 到4了54 到4了55 到4了56 到4了57 到4了58 到4了59 到4了60 到4了61 到4了62 到4了63 到4了64 到4了65 到4了66 到4了67 到4了69 到4了71 到4了72 到4了73 到4了74 到4了75 到4了76 到4了77 到4了78 到4了80 到4了81 到4了83 到4了84 到4了85 到4了87 到4了88 到4了89 到4了90 到4了92 到4了93 到4了95 到4了96 到4了98 到4了99 到4了1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980三、对进入1循环的数值进行分析:通过运行程序,我们知道[1,100]的正整数中,循环到1的有1,7,10,13,19,23,28,31,32,44,49,68,70,79,82,86,91,94,97,100,20个数。如何通过规律把这20个数有理有据地找出来呢?首先,① 对于正整数1,10,100,毫无疑问,一定是指向1循环的;② 若一个两位数最终指向1,那么这个两位数调换个位和十位的数值后,也会指向1.参照费马二平方定理的操作思路:5 = 1 2 + 2 2 5=1^{2}+2^{2}5=12+2213 = 2 2 + 3 2 13=2^{2}+3^{2}13=22+3217 = 1 2 + 4 2 17=1^{2}+4^{2}17=12+42* 当然,以上引例是基于费马二平方素数,也就是一个素数为两个整数的平方和且两个整数均为素数,即素数F=XX+YY,X,Y皆为素数时,F就是费马二平方素数。基于以上思路以及①②两个规律,我们分别从下面这几个路径入手,找寻这些数值的规律——逆向思考1,10,100,可以为哪两个数的平方和。1. 从“01”,“10”的路径考虑:①… 哪两个正整数的平方和等于10?10 = 1 2 + 3 2 . 10=1^{2}+3^{2}.10=12+32.于是13,31,是指向1的,再来思考13:②…哪两个正整数的平方和等于13?13 = 2 2 + 3 2 . 13=2^{2}+3^{2}.13=22+32.于是23,32,是指向1的,再来思考32:③… 哪两个正整数的平方和等于32?32 = 4 2 + 4 2 . 32=4^{2}+4^{2}.32=42+42.于是44,是指向1的.由此,从10(或者01)出发的路径,我们可以找到1,10,13,31,23,32,44,七个数值。2. 从“100”的路径考虑:①… 哪两个正整数的平方和等于100?100 = 6 2 + 8 2 . 100=6^{2}+8^{2}.100=62+82.于是68,86,是指向1的,再来思考68:②…哪两个正整数的平方和等于68?68 = 2 2 + 8 2 . 68=2^{2}+8^{2}.68=22+82.于是28,82,是指向1的,再来思考82:③… 哪两个正整数的平方和等于82?82 = 1 2 + 9 2 . 82=1^{2}+9^{2}.82=12+92.于是19,91,是指向1的.由此,从100出发的路径,我们可以找到68,86,28,82,19,91,100,七个数值。我们发现 ——从以上路径出发,我们已经找到了14个数值了,其实还有一个角度被我们忽略了,100以内的正整数,两个数值的平方和最大时,是个位数字与十位数字是9的时候,也就是99,此时平方和是162,也就是说我们还要思考当100<平方和<162的情况,从以上分析中,有“13”这个两位数,那么指向13和指向130的数值,最终都将指向1。为什么只考虑13后面加一个0呢?因为除了13和1以外,上面我们论证出的任何指向1的数值,在后面加一个0后,都不在100<平方和<162的范围内,也就是都不会是两位数的平方和。于是我们又有了第三个路径。3. 从“130”的路径考虑:①… 哪两个正整数的平方和等于130?130 = 7 2 + 9 2 . 130=7^{2}+9^{2}.130=72+92.于是79,97,是指向1的,再来思考97:②…哪两个正整数的平方和等于97?97 = 4 2 + 9 2 . 97=4^{2}+9^{2}.97=42+92.于是49,94,是指向1的,再来思考49:③… 哪两个整数的平方和等于49?49 = 0 2 + 7 2 . 49=0^{2}+7^{2}.49=02+72.于是7(可以理解为07),70,是指向1的.由此,从130出发的路径,我们可以找到79,97,49,94,7,70,六个数值。四、总结这样看,100以内的正整数中,最终落入1循环的20个数值,就让我们通过逆向思维都找出来了。是不是很神奇?其实理解这个问题不必要求读者具备很深的数学修养,而是重在培养其“找规律”、“做数学”的习惯和品质。虽不需要多少专门知识,但也极少有人一眼就能看出里面的各类关系,所以平凡如我们,就要备好纸和笔,动一番脑筋才成
-
我们先来看看这个代码class Computer: screen = True def start(self): print('电脑正在开机中……')my_computer = Computer()#实例化类print(my_computer.screen)#打印类中的属性值my_computer.start()#启动类中的方法12345678910想要调用他语法是实例名.属性和实例名.方法所以说最后我们打印出的内容是True电脑正在开机中……12来看看怎么才能使用类中的值:my_computer.screen实例名.属性这样就可以调用类中的属性了my_computer.start()实例名.方法这样就可以启动类中的函数看到这里很多人也明白怎么使用类了,可是发现类中函数有一个self参数这个参数有什么作用呢?接下来我们看class Chinese: name = '小张' # 类属性name def say(self, someone): # 带有两个参数的方法 print(someone + '是中国人')person = Chinese()print(person.name)person.say('小张') 12345678910输出的结果是:小张 小张是中国人12self调用时要忽略,'小张’传给参数someone为什么忽略self,因为self会接收实例化过程中传入的数据,当实例对象创建后,实例便会代替 self,self 是所有实例的替身,“替身”是什么意思呢?就如上面这个代码一样,传参直接给了someone没有给self,因为他被忽略了,但是他是存在的,因为没有他,函数就不是实例化中的函数,所以大家只要记得在类中函数添加上self就行了。self总结,self就是实例化类的意思,传参时可以忽略。我们接着走,细心的同学会发现,我们传的参数小张给someone,然后再打印出 小张是中国人,其实我们没必要这么麻烦,直接看类的属性中有小张的参数值,直接调用就好了然后你们就会想到class Chinese: name = '小张' # 类属性name def say(self): # 带有两个参数的方法 print(name + '是中国人')person = Chinese()print(person.name)person.say() 12345678910打印出来的结果Traceback (most recent call last): File "one.py", line 10, in <module> person.say() File "one.py", line 6, in say print(name + '是中国人')NameError: name 'name' is not defined123456报错找到不到name,为什么呢?我上面不是写了嘛?因为类里面调用属性需要先加实例化,那是不是写Chinese().name是的,这样写没有错,但是我们没必要这样写呢,我们上面说过self就是类的实例化,所以我们写成self.name 就可以调用属性了,小总结:类的属性调用前面加self.属性名就可以了。self在类中就是Chinese(),我们完全可以把全部的self写成Chinese(),有的人类的名字很长,写代码时很不有好所以出现了self,带代替的他的存在,传参时也不会传给他。有同学又问,如果类里面有两个方法(函数)这么办?我下一个方法(函数)要调用上一个方法(函数)这么调用,同理看下面的代码class Chinese: def greeting(self): print('很高兴遇见你') def say(self): self.greeting() print('我来自中国')person = Chinese()# 创建实例personperson.say()# 调用say()方法 12345678910111213我们只要在前面加上一个self(实例)就可以了。大家可以复制代码到编译器看看。综上,所以我们说self代表的是类的实例本身,方便数据的流转。对此,我们需要记住两点:第一点:只要在类中用def创建方法时,就必须把第一个参数位置留给 self,并在调用方法时忽略它(不用给self传参)。第二点:当在类的方法内部想调用类属性或其他方法时,就要采用self.属性名或self.方法名的格式。接下来我们说说类中的初始化定义初始化方法的格式是def init(self),是由init加左右两边的【双】下划线组成( initialize “初始化”的缩写)。初始化方法的作用在于:实例对象创建时,该方法内的代码无须调用就会自动运行。我们看下面的代码class Chinese: def __init__(self): print('很高兴遇见你,我是初始化方法')person = Chinese()123456运行出来的结果很高兴遇见你,我是初始化方法1少了一个调用的函数 person.__ init __()为什么呢?因为他时初始化,只要类的实例化创建出来就会自动运行,好比方说,你打开电脑,他会自动加载C盘上的系统文件,直到你打开电脑桌面为止,剩下的才是你操作的内容,前面打开电脑的过程都叫做类的初始化,自动运行了。这时候有同学问,那我再初始化写一些代码赋值给函数,能调用吗?在初始化中所有代码都是可以调用的,同理,在前面加一个self看下面的例子class Chinese: def __init__ (self): self.mouth = 1 # self.不能丢 self.eye = 2 def body(self): print('我有%s张嘴巴' % self.mouth) print('我有%s只眼睛' % self.eye)person = Chinese()person.body()1234567891011运行出来的结果就是我有1张嘴巴 我有2只眼睛
-
【Python算法】聚类分析算法——DBSCAN聚类算法1. DBSCAN聚类算法定义 DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。该算法将具有足够密度的区域划分为簇(即要求聚类空间中的一定区域内所包含对象的数目不小于某一给定阈值),并在具有噪声的空 间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。2. DBSCAN聚类算法步骤 DBSCAN 聚类算法需要两个参数:扫描半径(eps)和最小包含点数(min_samples)。 第一步为遍历所有点,寻找核心点;第二步为连通核心点,并在此过程中扩展某个分类集合中点的个数,DBSCAN 聚类算法的步骤过程图解如图 所示。 聚类算法步骤图解在图 中,第一步就是寻找红色的核心点,第二步就是用绿色的箭头连通红色点。图中以绿色的线条为中心被分成了两类,没在黑色圆中的点是噪声点。3. DBSCAN聚类算法优缺点 优点:DBSCAN 聚类算法可以发现任意形状的聚类。 缺点:随着数据量的增加,对 I/O、内存的要求也随之增加;如果密度分步不均匀,聚类效果会较差。4. DBSCAN聚类算法语法结构 DBSCAN 聚类算法主要使用以下语法结构:sklearn.cluster. DBSCAN 此函数中的主要参数有以下两个: (1) eps:两个样本之间的最大距离,即扫描半径; (2) min_samples:作为核心点的话邻域(即以其为圆心,eps 为半径的圆,含圆上的点) 中的最小样本数(包括点本身); (3) core_sampleindices:核心样本指数; (4) labels_:数据集中每个点的集合标签给,噪声点标签为-1。1.操作系统 操作机:Linux_Ubuntu 操作机默认用户:root2.实验工具1.python Python是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。Python已经成为最受欢迎的程序设计语言之一。自从2004年以后,python的使用率呈线性增长。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。 由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python语言讲授。 众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下3个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。2.Numpy NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。 NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。3.scikit-learnscikit-learn Python 中的机器学习,简单高效的数据挖掘和数据分析工具,可供大家使用,可在各种环境中重复使用,建立在 NumPy,SciPy 和 matplotlib 上,开放源码,可商业使用 - BSD license4.Matplotlib Matplotlib 是一个 Python 的 2D绘**,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。5.pandas Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。步骤1: 导入numpy,matploitlib,sklearn库代码如下:import numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets import make_circles,make_blobs,make_moonsfrom sklearn.cluster import KMeans,DBSCAN,AgglomerativeClustering n_samples=1000步骤2: 绘制不同形态散点图代码如下:#两层圆形circles=make_circles(n_samples=n_samples,factor=0.5,noise=0.05)#两个月牙形moons=make_moons(n_samples=n_samples,noise=0.05)#三个团形blobs=make_blobs(n_samples=n_samples,random_state=8,center_box=(-1,1),cluster_std=0.1)#全局随机random_data=np.random.rand(n_samples,2),None#指定聚类颜色colors="bgrcmyk"步骤3: 对散点图进行分别进行无处理和DBSCAN处理代码如下:data=[circles,moons,blobs,random_data]models=[("None",None), ("DBSCAN",DBSCAN(min_samples=3,eps=0.2)),]步骤4: 获取点的键值对并绘制在坐标图中代码如下:from sklearn.metrics import silhouette_score f=plt.figure()for inx,clt in enumerate(models): clt_name,clt_entity=clt for i,dataset in enumerate(data): X,Y=dataset if not clt_entity: clt_res=[0 for item in range(len(X))] else: clt_entity.fit(X) clt_res=clt_entity.labels_.astype(np.int) f.add_subplot(len(models),len(data),inx*len(data)+i+1) #plt.title(clt_name) try: print(clt_name,i,silhouette_score(X,clt_res)) except: pass [plt.scatter(X[p,0],X[p,1],color=colors[clt_res[p]]) for p in range(len(X))] plt.show()
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签