<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on 庞玉栋个人博客</title><link>https://pangyd.com/categories/python/</link><description>Recent content in Python on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 11 Dec 2019 10:22:50 +0800</lastBuildDate><atom:link href="https://pangyd.com/categories/python/index.xml" rel="self" type="application/rss+xml"/><item><title>Matplotlib 雷达图详解</title><link>https://pangyd.com/post/230-matplotlib/</link><pubDate>Sun, 01 Dec 2019 10:07:16 +0800</pubDate><guid>https://pangyd.com/post/230-matplotlib/</guid><description>&lt;p>创建figure对象&amp;nbsp; 设置画布大小&amp;nbsp; 背景颜色&lt;/p>&lt;p>fig = plt.figure(figsize=(10,8))&lt;/p>&lt;p>创建图形图像&amp;nbsp; 设置以极坐标的方式显示&lt;/p>&lt;p>ax = fig.add_subplot(111,polar=True)&lt;/p>&lt;p>生成角度列表&amp;nbsp;&amp;nbsp;&lt;/p>&lt;p>angle = np.linspace(0,2*np.pi,10，endpoint=False)&lt;/p>&lt;p>首尾相连&amp;nbsp; 形成闭合多边形&lt;/p>&lt;p>&lt;span>theta = np.append(theta, theta[&lt;/span>&lt;span class="hljs-number">0&lt;/span>&lt;span>])&lt;/span>&lt;/p>&lt;p>angle =&amp;nbsp; np.append(angle, angle[&lt;span class="hljs-number">0&lt;/span>])&lt;/p>&lt;p>作图 第一个 角度&amp;nbsp; 第二个 数据&amp;nbsp; 第三个 线条样式&amp;nbsp; 第四个 线段宽度&amp;nbsp; 第五个 标签文本&lt;/p>&lt;p>ax.plot(angle, centers], 'o-', linewidth=2, label=kinds[i])&lt;/p>&lt;p>填充颜色&amp;nbsp;&lt;/p>&lt;p>ax.fill(angle,centers,alpha=0.5)&lt;/p>&lt;p>设置显示标签&amp;nbsp; 设置标签所在位置 透明度&lt;/p>&lt;p>plt.legend(loc='best',bbox_to_anchor=(1.2,0.3,0.,0.8),framealpha=0.1,edgecolor='blue')&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>极坐标柱形图使用bar生成图形&lt;/p>&lt;p>theta = np.linspace(0,2*np.pi,20,endpoint=False)&lt;/p>&lt;p>radii = 10*np.random.rand(20)&lt;/p>&lt;p>width = np.pi/4*np.random.rand(20)&lt;/p>&lt;p>bar = ax.bar(theta,radii,widrth,bottom=0.0)&lt;/p>&lt;p>for a,b in zip(radii,bar):&lt;/p>&lt;p>&amp;nbsp; &amp;nbsp;b.set_facecolor=plt.cm.hot(a/10)&lt;/p>&lt;p>&amp;nbsp; &amp;nbsp;b.set_alpha=0.1&lt;/p></description></item><item><title>python操作mongo</title><link>https://pangyd.com/post/228-pythonmongo/</link><pubDate>Mon, 18 Nov 2019 18:01:43 +0800</pubDate><guid>https://pangyd.com/post/228-pythonmongo/</guid><description>&lt;p>&lt;span>连接mongodb&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">#!/usr/bin/env python
# -*- coding:utf-8 -*-
&lt;p>from pymongo import MongoClient&lt;/p>
&lt;p>conn = MongoClient(&amp;lsquo;192.168.0.113&amp;rsquo;, 27017)
db = conn.mydb #连接mydb数据库，没有则自动创建
my_set = db.test_set　　#使用test_set集合，没有则自动创建&lt;/pre>&lt;p>&lt;span>插入数据（insert插入一个列表多条数据不用遍历，效率高， save需要遍历列表，一个个插入）&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">my_set.insert({&amp;ldquo;name&amp;rdquo;:&amp;ldquo;zhangsan&amp;rdquo;,&amp;ldquo;age&amp;rdquo;:18})
#或
my_set.save({&amp;ldquo;name&amp;rdquo;:&amp;ldquo;zhangsan&amp;rdquo;,&amp;ldquo;age&amp;rdquo;:18})&lt;/pre>&lt;p>&lt;span>插入多条&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">#添加多条数据到集合中
users=[{&amp;ldquo;name&amp;rdquo;:&amp;ldquo;zhangsan&amp;rdquo;,&amp;ldquo;age&amp;rdquo;:18},{&amp;ldquo;name&amp;rdquo;:&amp;ldquo;lisi&amp;rdquo;,&amp;ldquo;age&amp;rdquo;:20}]&lt;br>
my_set.insert(users)
#或
my_set.save(users) &lt;/pre>&lt;p>&lt;span>查询数据（查询不到则返回None）&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">#查询全部
for i in my_set.find():
print(i)
#查询name=zhangsan的
for i in my_set.find({&amp;ldquo;name&amp;rdquo;:&amp;ldquo;zhangsan&amp;rdquo;}):
print(i)
print(my_set.find_one({&amp;ldquo;name&amp;rdquo;:&amp;ldquo;zhangsan&amp;rdquo;}))&lt;/pre>&lt;p>&lt;span>更新数据&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">my_set.update(
&lt;query>, #查询条件
&lt;update>, #update的对象和一些更新的操作符
{
upsert: &lt;boolean>, #如果不存在update的记录，是否插入
multi: &lt;boolean>, #可选，mongodb 默认是false,只更新找到的第一条记录
writeConcern: &lt;document> #可选，抛出异常的级别。&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">#删除name=lisi的全部记录
my_set.remove({&amp;rsquo;name&amp;rsquo;: &amp;lsquo;zhangsan&amp;rsquo;})&lt;/p></description></item><item><title>Matplotlib模块整理</title><link>https://pangyd.com/post/226-matplotlib/</link><pubDate>Fri, 08 Nov 2019 11:53:24 +0800</pubDate><guid>https://pangyd.com/post/226-matplotlib/</guid><description>&lt;img src="https://pangyd.com/uploads/2019/05/c209f3e0a8b3557e.png" alt="FireShot Capture 004 - Untitled - localhost_gaitubao_1304x21192.png"></description></item><item><title>猎聘网站爬虫（代理池+邮件提醒+写入flume服务端）</title><link>https://pangyd.com/post/225-flume/</link><pubDate>Thu, 31 Oct 2019 11:44:38 +0800</pubDate><guid>https://pangyd.com/post/225-flume/</guid><description>&lt;pre lay-lang="Python" class="layui-code" skin="notepad"># coding=utf-8
import requests
import re
import time
import json
from demo2 import soct
import pymysql
import random
import smtplib
import email.mime.multipart
import email.mime.text
&lt;p>import socket&lt;/p>class Spider():

 def __init__(self):
 self.ls = []
 self.count = 0
 self.USER_AGENTS = [
 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
 "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
 "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
 "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
 "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
 "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
 "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
 "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
 "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
 "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
 "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
 "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
 ]

 def emial(self):
 try:
 subject = 'python执行日志'
 content = "可用{}个代理ip，所有url已经爬取完毕".format(len(self.ls))
 msg = email.mime.multipart.MIMEMultipart()
&lt;p> msg['from'] = '******@qq.com'&lt;/p></description></item><item><title>Matplotlib可视化库的简单使用</title><link>https://pangyd.com/post/224-matplotlib/</link><pubDate>Thu, 24 Oct 2019 15:24:00 +0800</pubDate><guid>https://pangyd.com/post/224-matplotlib/</guid><description>&lt;p>常见的图表类型&lt;/p>&lt;p>直方图：适用比较数据之间的多少；折线图：反映一组数据的变化趋势；条形图：显示各个项目之间的比较情况&amp;nbsp; 和直方图有类似的作用；饼图；散点图：显示若干数据系列中各数值之间的关系 类似X，Y轴，判读两变量之间是否存在某种关联；箱型图：识别异常值方面有一定的优越性&lt;/p>&lt;p>直方图与条形图的具体区别如下：&lt;/p>&lt;p>首先，条形图用条形的长度表示各类别频率快的多少&amp;nbsp; 其宽度是固定的&amp;nbsp; 直方图是用面积表示各组频数的多少&amp;nbsp; 矩形的高度表示每一组的频数和频率，，宽度则表示各组的组距，因此其高度与宽度均有意义。其次，由于分组数据具有连续性 所以直方图的各矩形通常都是连续排列的&amp;nbsp; 而条形图则是分开排列的&amp;nbsp; 最后 条形图主要用于展示分类数据&amp;nbsp; 而直方图则主要用于展示数据型数据。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>1通过subplot创建单个子图&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">#分成2*2的矩阵区域 
plt.subplot(221)
plt.plot(nums,nums)
plt.subplot(222)
plt.plot(nums,-nums)
plt.subplot(212)
plt.plot(nums,nums**2)
plt.show()&lt;/pre>&lt;p>2通过subplots创建多个子图&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">#生成包含1～100之间所有整数数组
nums = np.arange(1,101)
#分成2*2的矩阵区域 返回子图数组axes
fig,axes = plt.subplots(2,2)
axes[0,0].plot(nums,nums)
&lt;p>plt.show()&lt;img src="https://pangyd.com/uploads/2019/10/ef0d7566a3745997.png">&lt;/p>&lt;/pre>&lt;p>3通过add_subplot添加和选中子图&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">fig = plt.figure()
#添加子图
fig.add_subplot(2,2,1)
fig.add_subplot(2,2,2)
fig.add_subplot(2,2,4)
fig.add_subplot(2,2,3)
#在子图上作图
random_arr = np.random.randn(100)
#默认是在最后一次使用subplot的位置上作图 即编号为3的位置
plt.plot(random_arr)
&lt;p>plt.show()&lt;img src="https://pangyd.com/uploads/2019/10/d818a87fb38a28b7.png">&lt;/p>&lt;/pre>&lt;p>4添加各类标签&lt;/p>&lt;p>图表添加标签和图例的常用函数&lt;/p>&lt;p>title():设置当前轴的标题&lt;/p>&lt;p>xlabel():设置当前图形X轴的标签名称&lt;/p>&lt;p>ylabel():设置当前图形Y轴的标签名称&lt;/p>&lt;p>xticks():指定X轴刻度的数目与取值&lt;/p>&lt;p>yticks():指定Y轴刻度的数目与取值&lt;/p>&lt;p>xlim():设置或获取当前图形X轴的范围&lt;/p>&lt;p>ylim():设置或获取的当前图形Y轴的范围&lt;/p>&lt;p>legend():在轴上放置一个图例&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">import numpy as np
data = np.arange(0,1.1,0.01)
plt.title('Title')
plt.xlabel('x')
plt.ylabel('y')
#设置x和y轴的刻度
plt.xticks([0,0.5,1])
plt.yticks([0,0.5,1.0])
plt.plot(data,data**2,lineStyle='-.')
plt.plot(data,data**3)
plt.legend(['y=x^2','y=x^3'])
&lt;p>plt.show(&lt;img src="https://pangyd.com/uploads/2019/10/3e3685c1adefb804.png">&lt;/p></description></item><item><title>智联招聘爬虫+email邮件发送</title><link>https://pangyd.com/post/217-email/</link><pubDate>Mon, 15 Jul 2019 09:04:11 +0800</pubDate><guid>https://pangyd.com/post/217-email/</guid><description>&lt;pre lay-lang="Python" class="layui-code" skin="notepad"># -*- coding: utf-8 -*-
import requests
import re
import time
import json
import pymysql
import random
import smtplib
import email.mime.multipart
import email.mime.text

class Spider():

 def __init__(self):
 self.ls = []
 self.count = 0
 self.USER_AGENTS = [
 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
 "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
 "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
 "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
 "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
 "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
 "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
 "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
 "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
 "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
 "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
 "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
 ]

	#程序执行完毕后发送邮件函数
 def emial(self):
 try:
 subject = 'python执行日志'
 content = "可用{}个代理ip，所有url已经爬取完毕".format(len(self.ls))
 msg = email.mime.multipart.MIMEMultipart()
 msg['from'] = 'xxxxx@qq.com'
 msg['to'] = 'xxxx@qq.com'
 msg['subject'] = subject
 content = content
 txt = email.mime.text.MIMEText(content, 'plain', 'utf-8')
 msg.attach(txt)
 smtpHost = 'smtp.qq.com'
 smtpPort = '25'
 sslPort = '465'

 smtp = smtplib.SMTP_SSL(smtpHost, sslPort)
 smtp.ehlo()
 smtp.login('xxxxx@qq.com', 'xxxxx')
 smtp.sendmail('xxxx@qq.com', 'xxxxx@qq.com', str(msg))
 print("发送成功！")
 smtp.quit()
 except Exception as e:
 print(e)

	#从数据库中查询代理函数
 def sql(self):
 try:
 db = pymysql.connect(host="xxxxxxxxxx", user="xxxxxx", password="xxxxxx", db="xxxxx", port=3306,
 charset="utf8")
 cur = db.cursor()
 sql = "SELECT * FROM proxy WHERE type=0"
 cur.execute(sql) # 执行sql语句
 results = cur.fetchall() # 获取查询的所有记录
 for row in results:
 head = row[0]
 ip = row[1]
 poxy = row[2]
 if str(head) == 'HTTP':
 self.ls.append(ip + ':' + poxy)
 print('可用{}个代理ip，爬虫开始'.format(len(self.ls)))
 self.crawler_data()
 except Exception as e:
 print(e)

	#爬虫入口，负责构建url
 def crawler_data(self):
 i = 0
 for n in ['投资经理', '土建工程师', '采购', '销售', '运营', 'java', '产品经理', '人力资源', '总经理', 'Python', 'iOS', 'PHP', 'Android',
 'UI设计师', '测试工程师', '自动化测试', '功能测试', '性能测试', '测试开发', '硬件测试', '运维工程师', '系统工程师', '网络工程师', '运维开发', 'DBA',
 '技术经理', '架构师', '技术总监', 'CTO', '技术合伙人', '运维总监', '安全专家', '项目总监',
 'Html5', '产品经理', '网页产品经理', '移动产品经理', '产品助理', '数据产品经理', '游戏策划', '电商产品经理']:
 try:
 while True:
 url = 'https://www.liepin.com/zhaopin/?industryType=&amp;amp;jobKind=&amp;amp;sortFlag=15°radeFlag=0&amp;amp;industries=&amp;amp;salary=&amp;amp;compscale=&amp;amp;key={}&amp;amp;clean_condition=&amp;amp;headckid=4a4adb68b22970bd&amp;amp;d_pageSize=40&amp;amp;siTag=p_XzVCa5J0EfySMbVjghcw~fA9rXquZc5IkJpXC-Ycixw&amp;amp;d_headId=62ac45351cdd7a103ac7d50e1142b2a0&amp;amp;d_ckId=62ac45351cdd7a103ac7d50e1142b2a0&amp;amp;d_sfrom=search_fp&amp;amp;d_curPage=0&amp;amp;curPage={}'.format(
 n, random.randint(1, 20))
 self.request_job_list(url)
 print(url)
 i = i + 1
 if i == 10:
 i = 0
 break
 except Exception as e:
 print(e)
 self.emial()

	#接受传递来的url 进行解析页面数据，传递数据给下一个函数
 def request_job_list(self, url):
 try:
 print(url)
 headers = {
 'Referer': 'https://www.liepin.com/',
 'User-Agent': random.choice(self.USER_AGENTS)
 }
 reponse = requests.get(url, proxies={'http': random.choice(self.ls)}, headers=headers, timeout=5)
 ret = random.uniform(0, 2)
 time.sleep(ret)
 pattern = re.compile('&lt;div class="job-info">'
 '.*?&lt;h3.*?title="(.*?)">.*?&lt;a href="(.*?)" .*?title="(.*?)">.*?&lt;/a>&lt;p class="company-name">&lt;a href="(.*?)" .*?title="(.*?)">.*?&amp;gt;(.*?)&lt;/a>.*?&lt;/p></description></item><item><title>Socket向服务端发送数据（Python）</title><link>https://pangyd.com/post/216-socket-python/</link><pubDate>Sat, 13 Jul 2019 08:58:19 +0800</pubDate><guid>https://pangyd.com/post/216-socket-python/</guid><description>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">import socket
def soct(str_r):
 try:
 address = ('ip', 端口)
 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 client.connect(address) 
 client.sendall(kk.encode()) #发送数据
 client.settimeout(10) #设置超时时间
 client.close()
 except Exception as e:
 return "失败 "+str(e)
&lt;/pre></description></item><item><title>利用Python和Selenium使酒店Wifi免费</title><link>https://pangyd.com/post/212-pythonseleniumwifi/</link><pubDate>Fri, 22 Mar 2019 13:08:55 +0800</pubDate><guid>https://pangyd.com/post/212-pythonseleniumwifi/</guid><description>&lt;p align="left">最近我休年假了，并决定在假期去拜访朋友。我在一家旅馆住了几天，令我惊讶的是，酒店的wifi收费。这在2018年，你能想象吗？&lt;/p>&lt;p align="left">他们也不是那么冷酷。你看，这些慷慨的人让你用wifi20分钟。整整20分钟。这几乎是Minecraft视频的一半。&lt;/p>&lt;p align="left">如果他们让每个设备在有限的时间内使用互联网，必须有识别每个设备的方法。路由器通过设备的MAC地址来区分设备。幸运的是，我们可以很容易地改变我们的MAC地址。&lt;/p>&lt;p align="left">使用macchanger&lt;/p>&lt;p align="left">有一个非常有用的命令行工具，叫做macchanger。它允许你手动更改、随机化和恢复设备的MAC地址。这里是想定期随机化我们的MAC（每20分钟），以便无限期地使用免费Wifi。&lt;/p>&lt;p align="left">需要运行3个小命令。这是必需的，因为当网络接口连接到路由器时，macchanger无法工作。&lt;/p>&lt;p align="left">&lt;img src="https://pangyd.com/uploads/2019/03/7440792922ad4819.png" alt="">&lt;/p>&lt;p align="left">在上面的命令中，wlp3s0是我的网络接口的名称。你可以通过运行&lt;span>ip a&lt;/span>找到你的网络接口的名称。如果你运行这些命令，可以启动浏览器，然后你会看到要求你付费或试用20分钟的页面。时间结束后，你可以再次运行命令并继续执行。&lt;/p>&lt;p align="left">但这是体力劳动，每小时做3次太重复了。嗯。自动化重复内容的好工具是什么？&lt;/p>&lt;p align="left">使用Selenium&lt;/p>&lt;p align="left">首先，不使用这些命令。使用os模块，我们可以从脚本运行macchanger。&lt;/p>&lt;p align="left">&lt;/p></description></item><item><title>Python 中的单例模式</title><link>https://pangyd.com/post/209-python/</link><pubDate>Sun, 11 Nov 2018 08:35:05 +0800</pubDate><guid>https://pangyd.com/post/209-python/</guid><description>&lt;pre>&lt;code class="language-python hljs">&lt;ol class="hljs-ln">&lt;li>&lt;h2 id="单例模式">单例模式&lt;/h2>

&lt;p>&lt;b>单例模式（Singleton Pattern）&lt;/b>是一种常用的软件设计模式，该模式的主要目的是&lt;b>确保某一个类只有一个实例存在&lt;/b>。当你希望在整个系统中，某个类只能出现一个实例时，单例对象就能派上用场。&lt;/p>

&lt;p>比如，某个服务器程序的配置信息存放在一个文件中，客户端通过一个 AppConfig 
的类来读取配置文件的信息。如果在程序运行期间，有很多地方都需要使用配置文件的内容，也就是说，很多地方都需要创建 AppConfig 
对象的实例，这就导致系统中存在多个 AppConfig 的实例对象，而这样会严重浪费内存资源，尤其是在配置文件内容很多的情况下。事实上，类似 
AppConfig 这样的类，我们希望在程序运行期间只存在一个实例对象。&lt;/p>

&lt;p>在 Python 中，我们可以用多种方法来实现单例模式：&lt;/p>

&lt;ul>
&lt;li>使用模块&lt;/li>
&lt;li>使用 __new__&lt;/li>
&lt;li>使用装饰器（decorator）&lt;/li>
&lt;/ul>

&lt;h2 id="使用模块">&lt;a name="t1">&lt;/a>使用模块&lt;/h2>

&lt;p>其实，Python 的模块就是天然的单例模式，因为模块在第一次导入时，会生成 .pyc 文件，当第二次导入时，就会直接加载 .pyc 
文件，而不会再次执行模块代码。因此，我们只需把相关的函数和数据定义在一个模块中，就可以获得一个单例对象了。如果我们真的想要一个单例类，可以考虑这样做：&lt;/p>

&lt;pre class="prettyprint" name="code">&lt;code class="hljs python has-numbering">&lt;span class="hljs-comment"># mysingleton.py&lt;/span>
&lt;span class="hljs-class">&lt;span class="hljs-keyword">class&lt;/span> &lt;span class="hljs-title">My_Singleton&lt;/span>&lt;span class="hljs-params">(object)&lt;/span>:&lt;/span>
 &lt;span class="hljs-function">&lt;span class="hljs-keyword">def&lt;/span> &lt;span class="hljs-title">foo&lt;/span>&lt;span class="hljs-params">(self)&lt;/span>:&lt;/span>
 &lt;span class="hljs-keyword">pass&lt;/span>

my_singleton = My_Singleton()&lt;/code>&lt;/pre>
&lt;p>将上面的代码保存在文件 mysingleton.py 中，然后这样使用：&lt;/p>
&lt;pre class="prettyprint" name="code">&lt;code class="hljs python has-numbering">&lt;span class="hljs-keyword">from&lt;/span> mysingleton &lt;span class="hljs-keyword">import&lt;/span> my_singleton

my_singleton.foo()&lt;/code>&lt;/pre>
&lt;h2 id="使用-new">&lt;a name="t2">&lt;/a>使用 __new__&lt;/h2>
&lt;p>为了使类只能出现一个实例，我们可以使用 __new__ 来控制实例的创建过程，代码如下：&lt;/p>
&lt;pre class="prettyprint" name="code">&lt;code class="hljs python has-numbering">&lt;span class="hljs-class">&lt;span class="hljs-keyword">class&lt;/span> &lt;span class="hljs-title">Singleton&lt;/span>&lt;span class="hljs-params">(object)&lt;/span>:&lt;/span>
 _instance = &lt;span class="hljs-keyword">None&lt;/span>
 &lt;span class="hljs-function">&lt;span class="hljs-keyword">def&lt;/span> &lt;span class="hljs-title">__new__&lt;/span>&lt;span class="hljs-params">(cls, *args, **kw)&lt;/span>:&lt;/span>
 &lt;span class="hljs-keyword">if&lt;/span> &lt;span class="hljs-keyword">not&lt;/span> cls._instance:
 cls._instance = super(Singleton, cls).__new__(cls, *args, **kw) 
 &lt;span class="hljs-keyword">return&lt;/span> cls._instance 

&lt;span class="hljs-class">&lt;span class="hljs-keyword">class&lt;/span> &lt;span class="hljs-title">MyClass&lt;/span>&lt;span class="hljs-params">(Singleton)&lt;/span>:&lt;/span> 
 a = &lt;span class="hljs-number">1&lt;/span>&lt;/code>&lt;/pre>
&lt;p>在上面的代码中，我们将类的实例和一个类变量 _instance 关联起来，如果 cls._instance 为 None 则创建实例，否则直接返回 cls._instance。&lt;/p></description></item><item><title>人生苦短,我用python “Life is short. You need Python.”</title><link>https://pangyd.com/post/207-python-life-is-short-you-need-python/</link><pubDate>Fri, 09 Nov 2018 08:22:51 +0800</pubDate><guid>https://pangyd.com/post/207-python-life-is-short-you-need-python/</guid><description>&lt;p>&lt;img src="https://pangyd.com/uploads/2018/09/f0c1d12340235ebb.jpg" alt="index.jpg">&lt;/p>&lt;p>&lt;span>&lt;span>Python 在约 40 年前出现，现在已经有数以千计基于这项技术的网站和软件项目。Python 因其独有的特点从众多开发语言中脱颖而出，深受世界各地的开发者喜爱。&lt;/span>&lt;/span>&lt;/p>&lt;p style="text-align: center">&lt;span>正文共：4565 字&amp;nbsp;&lt;/span>&lt;/p>&lt;p style="text-align: center">&lt;span>预计阅读时间：12 分钟&lt;/span>&lt;/p>&lt;p>人生苦短， 我用 Python ，不知道从什么时候开始，这句话开始流行。&lt;/p>&lt;p>&lt;img title="" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" alt="640?wx_fmt=jpeg&amp;wxfrom=5&amp;wx_lazy=1" border="0">&lt;/p>&lt;p>人们可能会说， 2017 年是 Python 辉煌的一年。毕竟在这一年中，Python 的增长速度令人惊艳。&lt;/p>&lt;p>&lt;img title="" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" alt="640?wx_fmt=jpeg&amp;wxfrom=5&amp;wx_lazy=1" border="0">&lt;/p>&lt;p style="text-align: center">&lt;span>主要编程语言的增长趋势，图片来自 Stack Overflow&lt;/span>&lt;/p>&lt;p>在GitHub 2017年度报告中，Python 超越 Java 成第二受欢迎语言。在 ranked.com 的排名中，Python 是 2017 年最受欢迎人工智能编程语言（第二是 C++，R 并未上榜）。&lt;/p>&lt;p>根据 Stack Overflow 流量统计，2017 年 6 月，Python 第一次成为高收入国家 Stack Overflow 访问量最大的标签。&lt;/p>&lt;p>&lt;img class="img_loading" title="" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" alt="640?wx_fmt=jpeg" border="0">&lt;/p>&lt;p>在 TIOBE 2018 年 4 月编程语言排行榜前 20 名中，Python 已跃居到第四位，前三分别为为 Java ，C、C++。&lt;/p></description></item><item><title>python的redis简单使用</title><link>https://pangyd.com/post/203-pythonredis/</link><pubDate>Mon, 05 Nov 2018 06:54:40 +0800</pubDate><guid>https://pangyd.com/post/203-pythonredis/</guid><description>&lt;p>安装的Python版本&amp;nbsp;3.6.1&lt;/p>
&lt;p>redis安装的2.8&lt;/p>
&lt;p>安装redis模块&lt;/p>
&lt;div class="cnblogs_code">
&lt;pre>pip install redis&lt;/pre>
&lt;/div>
&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" alt="">&lt;/p>
&lt;p>简单使用&lt;/p>
&lt;p>redis-test.py&lt;/p>
&lt;div class="cnblogs_code">
&lt;pre>&lt;span>import&lt;/span>&lt;span> redis
r&lt;/span>=redis.Redis(host=&lt;span>'&lt;/span>&lt;span>127.0.0.1&lt;/span>&lt;span>'&lt;/span>,port=6609,db=&lt;span>0)
r.set(&lt;/span>&lt;span>'&lt;/span>&lt;span>name&lt;/span>&lt;span>'&lt;/span>,&lt;span>'&lt;/span>&lt;span>baby&lt;/span>&lt;span>'&lt;/span>&lt;span>)
&lt;/span>&lt;span>print&lt;/span>(r.get(&lt;span>'&lt;/span>&lt;span>name&lt;/span>&lt;span>'&lt;/span>&lt;span>))
&lt;/span>&lt;span>print&lt;/span>(r.dbsize())&lt;/pre>
&lt;/div>
&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" alt="">&lt;/p>
&lt;p>使用connection pool来管理对一个redis server的所有连接，避免每次建立、释放连接的开销。&lt;/p>
&lt;p>默认，每个Redis实例都会维护一个自己的连接池。&lt;/p>
&lt;p>可以直接建立一个连接池，然后作为参数 Redis，这样就可以实现多个Redis实例共享一个连接池&lt;/p>
&lt;p>使用连接池&lt;/p>
&lt;div class="cnblogs_code">
&lt;pre> &lt;span>import&lt;/span>&lt;span> redis
 pool &lt;/span>= redis.ConnectionPool(host=&lt;span>'&lt;/span>&lt;span>127.0.0.1&lt;/span>&lt;span>'&lt;/span>,port=6609&lt;span>)
 r &lt;/span>= redis.Redis(connection_pool=&lt;span>pool)
 r.set(&lt;/span>&lt;span>'&lt;/span>&lt;span>name1&lt;/span>&lt;span>'&lt;/span>,&lt;span>'&lt;/span>&lt;span>lili&lt;/span>&lt;span>'&lt;/span>&lt;span>)
 &lt;/span>&lt;span>print&lt;/span>(r.get(&lt;span>'&lt;/span>&lt;span>name1&lt;/span>&lt;span>'&lt;/span>))&lt;/pre>
&lt;/div>
&lt;p>&amp;nbsp;&lt;/p>
&lt;p>应用：页面点击数&lt;/p>
&lt;p>　　需要对一系列页面记录点击次数，如果使用关系数据库来存储点击，可能存在大量的行级锁争用&lt;/p>
&lt;p>　　(1)当redis服务器启动时，可以从关系数据库读入点击数的初始值&lt;/p>
&lt;div class="cnblogs_code">
&lt;pre>&lt;span>import&lt;/span>&lt;span> redis
r&lt;/span>=redis.Redis(host=&lt;span>'&lt;/span>&lt;span>127.0.0.1&lt;/span>&lt;span>'&lt;/span>,port=6609,db=&lt;span>0)
r.set(&lt;/span>&lt;span>'&lt;/span>&lt;span>visits:100&lt;/span>&lt;span>'&lt;/span>,999)&lt;/pre>
&lt;/div>
&lt;p>　　(2)有人访问页面时&lt;/p>
&lt;div class="cnblogs_code">
&lt;pre>r.incr(&lt;span>'&lt;/span>&lt;span>visits:100&lt;/span>&lt;span>'&lt;/span>)&lt;/pre>
&lt;/div>
&lt;p>　　(3)获取页面点击数&lt;/p>
&lt;div class="cnblogs_code">
&lt;pre>r.get(&lt;span>'&lt;/span>&lt;span>visits:100&lt;/span>&lt;span>'&lt;/span>)&lt;/pre>
&lt;/div>
&lt;p>Pipeline 是 StrictRedis 类的子类，支持在一个请求里发送缓冲的多个命令。通过减少客户端和服务器之间往来的数据包，可以大大提高命令组的性能&lt;/p>
&lt;p>简单使用&lt;/p>
&lt;div class="cnblogs_code">
&lt;pre>&amp;gt;&amp;gt;&amp;gt;&lt;span>import&lt;/span>&lt;span> redis 
&lt;/span>&amp;gt;&amp;gt;&amp;gt;r=redis.Redis(host=&lt;span>'&lt;/span>&lt;span>127.0.0.1&lt;/span>&lt;span>'&lt;/span>,port=6609,db=&lt;span>0)
&lt;/span>&amp;gt;&amp;gt;&amp;gt; r.set(&lt;span>'&lt;/span>&lt;span>name&lt;/span>&lt;span>'&lt;/span>, &lt;span>'&lt;/span>&lt;span>baby&lt;/span>&lt;span>'&lt;/span>&lt;span>)
&lt;/span>&amp;gt;&amp;gt;&amp;gt; pipe =&lt;span> r.pipeline()
&lt;/span>&amp;gt;&amp;gt;&amp;gt; pipe.set(&lt;span>'&lt;/span>&lt;span>birthday&lt;/span>&lt;span>'&lt;/span>, &lt;span>'&lt;/span>&lt;span>2010&lt;/span>&lt;span>'&lt;/span>&lt;span>)
&lt;/span>&amp;gt;&amp;gt;&amp;gt; pipe.get(&lt;span>'&lt;/span>&lt;span>name&lt;/span>&lt;span>'&lt;/span>&lt;span>)
&lt;/span>&amp;gt;&amp;gt;&amp;gt; pipe.execute()&lt;/pre>
&lt;/div>
&lt;p>为了方便使用，所有缓冲到 pipeline 的命令返回 pipeline 对象本身&lt;/p></description></item><item><title>Python---命名空间与作用域</title><link>https://pangyd.com/post/202-python/</link><pubDate>Tue, 30 Oct 2018 17:03:10 +0800</pubDate><guid>https://pangyd.com/post/202-python/</guid><description>&lt;h4 id="1-命名空间">1. 命名空间&lt;/h4>
&lt;h5 id="11-什么是命名空间">1.1 什么是命名空间&lt;/h5>
&lt;p>&lt;code>Namespace&lt;/code>命名空间，也称名字空间，是从名字到对象的映射。&lt;code>Python&lt;/code>中，大部分的命名空间都是由字典来实现的，但是本文的不会涉及命名空间的实现。&lt;/p>
&lt;p>命名空间的一大作用是避免名字冲突：&lt;/p>
&lt;pre class="prettyprint" name="code">&lt;code class="language-python hljs has-numbering">&lt;span class="hljs-function">&lt;span class="hljs-keyword">def&lt;/span> &lt;span class="hljs-title">fun1&lt;/span>&lt;span class="hljs-params">()&lt;/span>:&lt;/span>
 i = &lt;span class="hljs-number">1&lt;/span>

&lt;span class="hljs-function">&lt;span class="hljs-keyword">def&lt;/span> &lt;span class="hljs-title">fun2&lt;/span>&lt;span class="hljs-params">()&lt;/span>:&lt;/span>
 i = &lt;span class="hljs-number">2&lt;/span>&lt;/code>&lt;/pre>
&lt;p>同一个模块中的两个函数中，两个同名名字&lt;code>i&lt;/code>之间绝没有任何关系，因为它们分属于不同明明空间。&lt;/p>
&lt;h5 id="12-命名空间的种类">1.2 命名空间的种类&lt;/h5>
&lt;p>常见的命名空间有：&lt;/p>
&lt;ul>&lt;li>&lt;p>&lt;code>built-in&lt;/code>名字集合，包括像&lt;code>abs()&lt;/code>这样的函数，以及内置的异常名字等。通常，使用&lt;strong>内置&lt;/strong>这个词表示这个命名空间-&lt;strong>内置命名空间&lt;/strong>&lt;/p>&lt;/li>&lt;li>&lt;p>模块全局名字集合，直接定义在模块中的名字，如类，函数，导入的其他模块等。通常，使用&lt;strong>全局命名空间&lt;/strong>表示。&lt;/p>&lt;/li>&lt;li>&lt;p>函数调用过程中的名字集合，函数中的参数，函数体定义的名字等，在函数调用时被“激活”，构成了一个命名空间。通常，使用&lt;strong>局部命名空间&lt;/strong>表示。&lt;/p>&lt;/li>&lt;li>&lt;p>一个对象的属性集合，也构成了一个命名空间。但通常使用&lt;code>objname.attrname&lt;/code>的间接方式访问属性，而不是直接访问，故不将其列入命名空间讨论。&lt;/p>&lt;/li>&lt;li>&lt;p>类定义的命名空间，通常解释器进入类定义时，即执行到&lt;code>class ClassName:&lt;/code>语句，会新建一个命名空间。(见官方对类定义的&lt;a href="https://docs.python.org/3/tutorial/classes.html#class-definition-syntax" rel="nofollow" target="_blank">说明&lt;/a>)&lt;/p>&lt;/li>&lt;/ul>
&lt;h5 id="13-命名空间的生命周期">1.3 命名空间的生命周期&lt;/h5>
&lt;p>不同类型的命名空间有不同的生命周期：&lt;/p>
&lt;ul>&lt;li>&lt;p>内置命名空间，在&lt;code>Python&lt;/code>解释器启动时创建，解释器退出时销毁；&lt;/p>&lt;/li>&lt;li>&lt;p>全局命名空间，模块的全局命名空间在模块定义被解释器读入时创建，解释器退出时销毁；&lt;/p>&lt;/li>&lt;li>&lt;p>局部命名空间，这里要区分函数以及类定义。函数的局部命名空间，在函数调用时创建，函数返回或者由未捕获的异常时销毁；类定义的命名空间，在解释器读到类定义创建，类定义结束后销毁。(关于类定义的命名空间，在类定义结束后销毁，但其实类对象就是这个命名空间内容的包装，见官方对类定义的&lt;a href="https://docs.python.org/3/tutorial/classes.html#class-definition-syntax" rel="nofollow" target="_blank">说明&lt;/a>)&lt;/p>&lt;/li>&lt;/ul>
&lt;h4 id="2-作用域">2. 作用域&lt;/h4>
&lt;h5 id="21-什么是作用域">2.1 什么是作用域&lt;/h5>
&lt;p>作用域是&lt;code>Python&lt;/code>的一块文本区域，这个区域中，命名空间可以被“直接访问”。这里的直接访问指的是试图在命名空间中找到名字的绝对引用(非限定引用)。这里有必要解释下&lt;strong>直接引用&lt;/strong>和&lt;strong>间接引用&lt;/strong>：&lt;/p>
&lt;ul>&lt;li>&lt;p>直接引用；直接使用名字访问的方式，如&lt;code>name&lt;/code>，这种方式尝试在名字空间中搜索名字&lt;code>name&lt;/code>。&lt;/p>&lt;/li>&lt;li>&lt;p>间接引用；使用形如&lt;code>objname.attrname&lt;/code>的方式，即属性引用，这种方式不会在命名空间中搜索名字&lt;code>attrname&lt;/code>，而是搜索名字&lt;code>objname&lt;/code>，再访问其属性。&lt;/p>&lt;/li>&lt;/ul>
&lt;h5 id="22-与命名空间的关系">2.2 与命名空间的关系&lt;/h5>
&lt;p>现在，命名空间持有了名字。作用域是&lt;code>Python&lt;/code>的一块文本区域，即一块代码区域，需要代码区域引用名字(访问变量)，那么必然作用域与命名空间之间就有了联系。&lt;/p>
&lt;p>顾名思义，名字作用域就是名字可以影响到的代码文本区域，命名空间的作用域就是这个命名空间可以影响到的代码文本区域。那么也存在这样一个代码文本区域，多个命名空间可以影响到它。 &lt;br>
作用域只是文本区域，其定义是静态的；而名字空间却是动态的，只有随着解释器的执行，命名空间才会产生。那么，在静态的作用域中访问动态命名空间中的名字，造成了作用域使用的动态性。&lt;/p>
&lt;p>那么，可以这样认为：&lt;/p>
&lt;blockquote>
 &lt;p>静态的作用域，是一个或多个命名空间按照一定规则叠加影响代码区域；运行时动态的作用域，是按照特定层次组合起来的命名空间。&lt;/p>
&lt;/blockquote>
&lt;p>在一定程度上，可以认为&lt;strong>动态的作用域就是命名空间&lt;/strong>。在后面的表述中，我会把动态的作用域与其对应命名空间等同起来。&lt;/p>
&lt;h5 id="23-名字搜索规则">2.3 名字搜索规则&lt;/h5>
&lt;p>在程序中引用了一个名字，&lt;code>Python&lt;/code>是怎样搜索到这个名字呢？&lt;/p>
&lt;p>在程序运行时，至少存在三个命名空间可以被直接访问的作用域：&lt;/p>
&lt;ul>&lt;li>&lt;p>Local &lt;br>
首先搜索，包含局部名字的最内层（innermost）作用域，如函数/方法/类的内部局部作用域；&lt;/p>&lt;/li>&lt;li>&lt;p>Enclosing &lt;br>
根据嵌套层次从内到外搜索，包含非局部（nonlocal）非全局（nonglobal）名字的任意封闭函数的作用域。如两个嵌套的函数，内层函数的作用域是局部作用域，外层函数作用域就是内层函数的 Enclosing作用域；&lt;/p>&lt;/li>&lt;li>&lt;p>Global &lt;br>
倒数第二次被搜索，包含当前模块全局名字的作用域；&lt;/p>&lt;/li>&lt;li>&lt;p>Built-in &lt;br>
最后被搜索，包含内建名字的最外层作用域。&lt;/p>&lt;/li>&lt;/ul>
&lt;p>程序运行时，&lt;code>LGB&lt;/code>三个作用域是一定存在的，&lt;code>E&lt;/code>作用域不一定存在；若程序是这样的：&lt;/p>
&lt;pre class="prettyprint" name="code">&lt;code class="language-python hljs has-numbering">i = &lt;span class="hljs-number">1&lt;/span>
print(i)&lt;/code>&lt;/pre>
&lt;p>局部作用域在哪里呢？我们认为(&lt;a href="https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces" rel="nofollow" target="_blank">Python Scopes And Namespaces&lt;/a>)：&lt;/p>
&lt;blockquote>
 &lt;p>Usually, the local scope references the local names of the 
(textually) current function. Outside functions, the local scope 
references the same namespace as the global scope: the module’s 
namespace. Class definitions place yet another namespace in the local 
scope.&lt;/p></description></item><item><title>Python中操作mysql的pymysql模块详解</title><link>https://pangyd.com/post/197-pythonmysqlpymysql/</link><pubDate>Mon, 06 Aug 2018 18:06:31 +0800</pubDate><guid>https://pangyd.com/post/197-pythonmysqlpymysql/</guid><description>&lt;div>&lt;div>&lt;div class="article">&lt;div data-note-content="" class="show-content">&lt;div class="show-content-free">&lt;p>&lt;a href="https://link.jianshu.com?t=https://github.com/PyMySQL/PyMySQL" target="_blank" rel="nofollow">PyMySQL&lt;/a>是一个Python编写的MySQL驱动程序，让我们可以用Python语言操作MySQL数据库。&lt;/p>
&lt;p>首先，使用pip安装PyMySQL。&lt;/p>
&lt;pre class="hljs undefined">&lt;code>pip install PyMySQL
&lt;/code>&lt;/pre>
&lt;h2>使用PyMySQL&lt;/h2>
&lt;h3>简单使用&lt;/h3>
&lt;p>如果有JDBC等其他语言的数据库学习经验的话，使用PyMySQL非常简单。下面是一个完整的MySQL增删查（没有改）的例子。&lt;/p>
&lt;pre class="hljs python">&lt;code class="python">&lt;span class="hljs-keyword">import&lt;/span> pymysql
&lt;span class="hljs-keyword">import&lt;/span> datetime
&lt;p>host = &lt;span class="hljs-string">&amp;lsquo;localhost&amp;rsquo;&lt;/span>
username = &lt;span class="hljs-string">&amp;lsquo;root&amp;rsquo;&lt;/span>
password = &lt;span class="hljs-string">&amp;lsquo;12345678&amp;rsquo;&lt;/span>
db_name = &lt;span class="hljs-string">&amp;lsquo;test&amp;rsquo;&lt;/span>&lt;/p>
&lt;p>create_table_sql = &lt;span class="hljs-string">&amp;quot;&amp;quot;&amp;quot;&lt;br>
CREATE TABLE fuck(
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) UNIQUE ,
nickname VARCHAR(255) NOT NULL ,
birthday DATE
)
&amp;ldquo;&amp;rdquo;&amp;quot;&lt;/span>&lt;/p>
&lt;p>insert_table_sql = &lt;span class="hljs-string">&amp;quot;&amp;quot;&amp;quot;&lt;br>
INSERT INTO fuck(username,nickname,birthday)
VALUES(&amp;rsquo;{username}&amp;rsquo;,&amp;rsquo;{nickname}&amp;rsquo;,&amp;rsquo;{birthday}&amp;rsquo;)
&amp;ldquo;&amp;rdquo;&amp;quot;&lt;/span>&lt;/p>
&lt;p>query_table_sql = &lt;span class="hljs-string">&amp;quot;&amp;quot;&amp;quot;&lt;br>
SELECT id,username,nickname,birthday
FROM fuck
&amp;ldquo;&amp;rdquo;&amp;quot;&lt;/span>&lt;/p>
&lt;p>delete_table_sql = &lt;span class="hljs-string">&amp;quot;&amp;quot;&amp;quot;&lt;br>
DELETE FROM fuck
&amp;ldquo;&amp;rdquo;&amp;quot;&lt;/span>&lt;/p>
&lt;p>drop_table_sql = &lt;span class="hljs-string">&amp;quot;&amp;quot;&amp;quot;&lt;br>
DROP TABLE fuck
&amp;ldquo;&amp;rdquo;&amp;quot;&lt;/span>&lt;/p></description></item><item><title>爬虫分享【1】</title><link>https://pangyd.com/post/196-1/</link><pubDate>Sat, 04 Aug 2018 20:34:47 +0800</pubDate><guid>https://pangyd.com/post/196-1/</guid><description>&lt;p>&lt;/p>&lt;p>
&lt;/p>&lt;p>&lt;span>&lt;span lang="EN-US">Python&lt;/span>&lt;/span>&lt;span>&lt;span>环境：&lt;span lang="EN-US">3.6&lt;/span>&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p>&lt;span>&lt;span>需要的库：&lt;span lang="EN-US">requests &lt;/span>基于&lt;span lang="EN-US">urllib &lt;/span>比&lt;span lang="EN-US">urllib&lt;/span>更加的简洁，&lt;/span>&lt;/span>&lt;span lang="EN-US">BeautifulSoup &lt;/span>&lt;span>：网页解析库&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p>&lt;span>&lt;span lang="EN-US">&lt;span>1，&lt;span>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span>&lt;/span>&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">headers &lt;/span>&lt;/span>&lt;span>&lt;span>头部分 用于向服务器发送信息 伪装成浏览器访问&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p>&lt;span>&lt;span lang="EN-US">&lt;span>2，&lt;span>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span>&lt;/span>&lt;/span>&lt;/span>&lt;b>&lt;span lang="EN-US">def
&lt;/span>&lt;/b>&lt;span lang="EN-US">save_artist(group_id, initial):&lt;br>
&lt;/span>&lt;span>&lt;span lang="EN-US">params&lt;/span>&lt;/span>&lt;span>&lt;span>：字典，用于组合传递过来的参数&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p>&lt;span lang="EN-US">&lt;span>3，&lt;span>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span>&lt;/span>&lt;/span>&lt;span lang="EN-US">r&lt;/span>&lt;span>：接收爬虫向服务器发送的参数返回的数据&lt;/span>&lt;span lang="EN-US">&lt;/span>&lt;/p>
&lt;p>&lt;span>&lt;span lang="EN-US">&lt;span>4，&lt;span>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span>&lt;/span>&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">soup&lt;/span>&lt;/span>&lt;span>&lt;span>：参数有&lt;span lang="EN-US">html&lt;/span>的文档以及设置字符串的编码格式，&lt;span lang="EN-US">htnl&lt;/span>解析器&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p>&lt;span>&lt;span lang="EN-US">&lt;span>5，&lt;span>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span>&lt;/span>&lt;/span>&lt;/span>&lt;span>&lt;span>获取&lt;span lang="EN-US">soup&lt;/span>的&lt;span lang="EN-US">body&lt;/span>标签，也就是返回的&lt;span lang="EN-US">html&lt;/span>文档的&lt;span lang="EN-US">body &lt;/span>，&lt;span lang="EN-US">attrs&lt;/span>字典参数，如果标签字符中带有&lt;span lang="EN-US">-&lt;/span>以及&lt;span lang="EN-US"> class&lt;/span>不能看作标签属性的时候 用字典参数进行传旨，&lt;span lang="EN-US">artists&lt;/span>和上部分类似&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p>&lt;span>&lt;span lang="EN-US">&lt;span>6，&lt;span>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span>&lt;/span>&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">For&lt;/span>&lt;/span>&lt;span>&lt;span>循环 将查询到的列表通过遍历进行更深层的数据提取并且转换成格式相对的数据&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p>&lt;span>&lt;span lang="EN-US">&lt;span>7，&lt;span>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span>&lt;/span>&lt;/span>&lt;/span>&lt;span>&lt;span>然后调用&lt;span lang="EN-US">sql&lt;/span>命令插入到数据库&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p>&lt;span>&lt;span lang="EN-US">&lt;span>8，&lt;span>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span>&lt;/span>&lt;/span>&lt;/span>&lt;span>&lt;span>函数外面定义爬取网页的参数 &lt;span>&amp;nbsp;&lt;/span>并且定义&lt;span lang="EN-US">for&lt;/span>循环以及&lt;span lang="EN-US">range&lt;/span>函数进行有规律的调用&lt;span lang="EN-US"> sava_artist&lt;/span>进行爬取&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">"""
获取所有的歌手信息
"""
import requests
from bs4 import BeautifulSoup
from sql import *
&lt;p>headers = {
&amp;lsquo;Accept&amp;rsquo;: &amp;rsquo;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,&lt;em>/&lt;/em>;q=0.8&amp;rsquo;,
&amp;lsquo;Accept-Encoding&amp;rsquo;: &amp;lsquo;gzip, deflate, sdch&amp;rsquo;,
&amp;lsquo;Accept-Language&amp;rsquo;: &amp;lsquo;zh-CN,zh;q=0.8,en;q=0.6&amp;rsquo;,
&amp;lsquo;Cache-Control&amp;rsquo;: &amp;rsquo;no-cache&amp;rsquo;,
&amp;lsquo;Connection&amp;rsquo;: &amp;lsquo;keep-alive&amp;rsquo;,
&amp;lsquo;Cookie&amp;rsquo;: &amp;lsquo;_ntes_nnid=7eced19b27ffae35dad3f8f2bf5885cd,1476521011210; _ntes_nuid=7eced19b27ffae35dad3f8f2bf5885cd; usertrack=c+5+hlgB7TgnsAmACnXtAg==; Province=025; City=025; NTES_PASSPORT=6n9ihXhbWKPi8yAqG.i2kETSCRa.ug06Txh8EMrrRsliVQXFV_orx5HffqhQjuGHkNQrLOIRLLotGohL9s10wcYSPiQfI2wiPacKlJ3nYAXgM; &lt;a href="mailto:P_INFO=hourui93@163.com">P_INFO=hourui93@163.com&lt;/a>|1476523293|1|study|11&amp;amp;12|jis&amp;amp;1476511733&amp;amp;mail163#jis&amp;amp;320100#10#0#0|151889&amp;amp;0|g37_client_check&amp;amp;mailsettings&amp;amp;mail163&amp;amp;study&amp;amp;blog|hourui93@163.com; NTES_SESS=Fa2uk.YZsGoj59AgD6tRjTXGaJ8_1_4YvGfXUkS7C1NwtMe.tG1Vzr255TXM6yj2mKqTZzqFtoEKQrgewi9ZK60ylIqq5puaG6QIaNQ7EK5MTcRgHLOhqttDHfaI_vsBzB4bibfamzx1.fhlpqZh_FcnXUYQFw5F5KIBUmGJg7xdasvGf_EgfICWV; S_INFO=1476597594|1|0&amp;amp;80##|hourui93; NETEASE_AUTH_SOURCE=space; NETEASE_AUTH_USERNAME=hourui93; _ga=GA1.2.1405085820.1476521280; JSESSIONID-WYYY=cbd082d2ce2cffbcd5c085d8bf565a95aee3173ddbbb00bfa270950f93f1d8bb4cb55a56a4049fa8c828373f630c78f4a43d6c3d252c4c44f44b098a9434a7d8fc110670a6e1e9af992c78092936b1e19351435ecff76a181993780035547fa5241a5afb96e8c665182d0d5b911663281967d675ff2658015887a94b3ee1575fa1956a5a%3A1476607977016; &lt;em>iuqxldmzr&lt;/em>=25; __utma=94650624.1038096298.1476521011.1476595468.1476606177.8; __utmb=94650624.20.10.1476606177; __utmc=94650624; __utmz=94650624.1476521011.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)&amp;rsquo;,
&amp;lsquo;DNT&amp;rsquo;: &amp;lsquo;1&amp;rsquo;,
&amp;lsquo;Host&amp;rsquo;: &amp;lsquo;music.163.com&amp;rsquo;,
&amp;lsquo;Pragma&amp;rsquo;: &amp;rsquo;no-cache&amp;rsquo;,
&amp;lsquo;Referer&amp;rsquo;: &amp;lsquo;&lt;a href="https://music.163.com/'">https://music.163.com/'&lt;/a>,
&amp;lsquo;Upgrade-Insecure-Requests&amp;rsquo;: &amp;lsquo;1&amp;rsquo;,
&amp;lsquo;User-Agent&amp;rsquo;: &amp;lsquo;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36&amp;rsquo;
}&lt;/p></description></item><item><title>Python基础</title><link>https://pangyd.com/post/195-python/</link><pubDate>Tue, 31 Jul 2018 20:32:54 +0800</pubDate><guid>https://pangyd.com/post/195-python/</guid><description>&lt;p>&lt;/p>&lt;p>&lt;span>&lt;span lang="EN-US">Try&lt;/span>&lt;/span>&lt;span>&lt;span>：&lt;span lang="EN-US">except&lt;/span>：&lt;span lang="EN-US">exception&lt;/span>&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>
&lt;/p>&lt;p style="text-align: left" align="left">&lt;span>&lt;span lang="EN-US">Split&lt;/span>&lt;/span>&lt;span>&lt;span>（）切片函数的使用：&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;span lang="EN-US">str.split(str="", num=string.count(str)).&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;span>&lt;span lang="EN-US">Split()&lt;/span>&lt;/span>&lt;span>&lt;span>函数内有两个参数 一个是分割符，默认为换行符，制表位，空格，空字符，另一个是分割的次数返回分割后的字符串列表&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;span lang="EN-US">a='Beautiful, is; better*than\nugly'&lt;/span>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;span lang="EN-US"># &lt;/span>&lt;span>四个分隔符为：&lt;span lang="EN-US">,&lt;span>&amp;nbsp; &lt;/span>;&lt;span>&amp;nbsp;
&lt;/span>*&lt;span>&amp;nbsp; &lt;/span>\n&lt;/span>&lt;/span>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;span lang="EN-US">x= re.split(',|; |\*|\n',a)&lt;/span>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;span lang="EN-US">print(x)&lt;/span>&lt;/p>
&lt;p style="text-align: left" align="left">&lt;span>&lt;span>利用&lt;span lang="EN-US">re&lt;/span>切割含有多种分割符的字符串&lt;/span>&lt;/span>&lt;span>&lt;span lang="EN-US">&lt;/span>&lt;/span>&lt;/p>
&lt;p>&lt;/p></description></item><item><title>15张脑图看懂 Python 编程核心知识体系</title><link>https://pangyd.com/post/154-15-python/</link><pubDate>Sat, 04 Nov 2017 22:27:14 +0800</pubDate><guid>https://pangyd.com/post/154-15-python/</guid><description>&lt;p>首先，按顺序依次展示了以下内容的一系列思维导图：基础知识，数据类型（数字，字符串，列表，元组，字典，集合），条件&amp;amp;循环，文件对象，错误&amp;amp;异常，函数，模块，面向对象编程；&lt;/p>&lt;p>接着，结合这些思维导图主要参考的资料，分享一下我的学习体验，一方面可供初学者参考，另一方面，也便于大家结合思维导图深入学习、理解、思考；&lt;/p>&lt;p>最后，提供几篇文章链接，方便希望从 Python 2.x 迁移到 3.x 的朋友理解。&lt;/p>&lt;p>编程是这样一件美妙的事情，如果你没有开始，你不知道会错过一种多么棒的体验。Just try it~和大家共勉！&lt;/p>&lt;p>注意事项：&lt;/p>&lt;p>思维导图：&lt;/p>&lt;p>默认阅读顺序：从右左，顺时针方向。&lt;/p>&lt;p>思维导图软件：XMind&lt;/p>&lt;p>总览：&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-size="1000|896">&lt;/p>&lt;p>14 张思维导图基础知识&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-size="1000|603">&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-size="1000|695">&lt;/p>&lt;p>数据类型&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-size="640|421">&lt;/p>&lt;p>&lt;/p>&lt;p>序列&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-size="640|856">&lt;/p>&lt;p>字符串&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-size="1000|734">&lt;/p>&lt;p>列表 &amp;amp; 元组&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-size="640|286">&lt;/p>&lt;p>字典 &amp;amp; 集合&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-size="640|376">&lt;/p>&lt;p>条件 &amp;amp; 循环&lt;/p></description></item><item><title>python爬虫——写出最简单的网页爬虫</title><link>https://pangyd.com/post/97-python/</link><pubDate>Sat, 09 Sep 2017 17:08:42 +0800</pubDate><guid>https://pangyd.com/post/97-python/</guid><description>&lt;section data-tools="135编辑器" data-id="89974" style="text-align: justify">&lt;section data-id="us538844">&lt;section>&lt;p>&lt;span class="bannerfix-wrapper" style="text-align: center">&lt;img data-s="300,640" data-type="jpeg" data-src="//qqpublic.qpic.cn/qq_public/0/0-2599578271-A1CD3C3D44AED332B9085FFD7BA070AD/0?fmt=jpg&amp;size=31&amp;rs=23-21&amp;h=427&amp;w=640&amp;ppv=1" data-ratio="0.66640625" data-w="1280" src="https://pangyd.com/uploads/2017/09/1b8214ac44494614.jpg" data-fail="0" data-ueid="20895" width="640" height="auto" data-width="640" data-height="427" data-org="https://mmbiz.qpic.cn/mmbiz_jpg/Mzws9oBx0P7kQpiaL4oQG7TZxbZ6hwFdlbmh5WVswicJbvugib0w0ujibUqXjvUgFuUSme9lNFeDeiaVoric6jSpvmGA/640?wx_fmt=jpeg&amp;wxfrom=5&amp;wx_lazy=1" data-lazy="0">&lt;/span>&lt;/p>&lt;/section>&lt;/section>&lt;/section>&lt;section data-id="us538844" style="text-align: justify">&lt;section>&lt;section>&lt;p>&lt;span>在我们日常上网浏览网页的时候，经常会看到一些好看的图片，我们就希望把这些图片保存下载，或者用户用来做桌面壁纸，或者用来做设计的素材。&lt;/span>&lt;span>我们可以通过&lt;/span>&lt;span>python&amp;nbsp;&lt;/span>&lt;span>来实现这样一个简单的爬虫功能，把我们想要的代码爬取到本地。下面就看看如何使用&lt;/span>&lt;span>python&lt;/span>&lt;span>来实现这样一个功能。&lt;/span>&lt;/p>&lt;/section>&lt;section data-width="100%">&lt;section>&lt;img data-src="//qqpublic.qpic.cn/qq_public/0/0-2516127415-94DD69FAB0632899CD9E62C400ADDFE6/0?fmt=png&amp;size=1&amp;rs=1-0&amp;h=37&amp;w=43&amp;ppv=1" data-ratio="0.8604651162790697" data-w="43" data-type="png" src="https://pangyd.com/uploads/2017/09/1b8214ac44494614.jpg" data-fail="0" data-ueid="592180" width="43" height="auto" data-width="43" data-height="37" data-org="https://mmbiz.qpic.cn/mmbiz_png/Mzws9oBx0P7kQpiaL4oQG7TZxbZ6hwFdlSWdbiaWc3zB05Dc3TN73GB0wFsJZ2xN6V1BlNytSzCqpkOSErJWEKRQ/0.png?wxfrom=5&amp;wx_lazy=1" data-lazy="0">&lt;/section>&lt;/section>&lt;/section>&lt;/section>&lt;section data-id="us538906" style="text-align: justify">&lt;section>&lt;section data-width="100%">&lt;section data-brushtype="text">&lt;span>&lt;strong>开发工具&lt;/strong>&lt;/span>&lt;/section>&lt;/section>&lt;/section>&lt;/section>&lt;p style="text-align: justify">&lt;span>笔者使用的工具是sublimetext3，它的短小精悍（可能男人们都不喜欢这个词）使我十分着迷。推荐大家使用，当然如果你的电脑配置不错，pycharm可能更加适合你。&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>sublime text3搭建python开发环境推荐查看此博客：&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>[sublime搭建python开发环境]&lt;/span>&lt;span>[https://www.cnblogs.com/codefish/p/4806849.&lt;/span>&lt;/p>&lt;section data-id="us538906" style="text-align: justify">&lt;section>&lt;section data-width="100%">&lt;section data-brushtype="text">&lt;span>&lt;strong>爬虫介绍&lt;/strong>&lt;/span>&lt;/section>&lt;/section>&lt;/section>&lt;/section>&lt;p style="text-align: justify">&lt;span>&lt;span>爬虫顾名思义，就是像虫子一样，爬在&lt;/span>Internet&lt;span>这张大网上。如此，我们便可以获取自己想要的东西。&lt;/span>&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>&lt;span>既然要爬在&lt;/span>Internet&lt;span>上，那么我们就需要了解&lt;/span>URL&lt;span>，法号&lt;/span>“&lt;span>统一资源定位器&lt;/span>”&lt;span>，小名&lt;/span>“&lt;span>链接&lt;/span>”&lt;span>。其结构主要由三部分组成：&lt;/span>&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>&lt;span>（&lt;/span>1&lt;span>）协议：如我们在网址中常见的&lt;/span>HTTP&lt;span>协议。&lt;/span>&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>&lt;span>（&lt;/span>2&lt;span>）域名或者&lt;/span>IP&lt;span>地址：域名，如：&lt;/span>www.baidu.com&lt;span>，&lt;/span>IP&lt;span>地址，即将域名解析后对应的&lt;/span>IP&lt;span>。&lt;/span>&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>&lt;span>（&lt;/span>3&lt;span>）路径：即目录或者文件等。&lt;/span>&lt;/span>&lt;/p>&lt;section data-id="us538906" style="text-align: justify">&lt;section>&lt;section data-width="100%">&lt;section data-brushtype="text">&lt;strong>urllib开发最简单的爬虫&lt;/strong>&lt;/section>&lt;/section>&lt;/section>&lt;/section>&lt;h2 style="text-align: justify">&lt;strong>（1）urllib简介&lt;/strong>&lt;/h2>&lt;p style="text-align: justify">&lt;span class="bannerfix-wrapper" style="text-align: center">&lt;img data-s="300,640" data-type="png" data-src="//qqpublic.qpic.cn/qq_public/0/0-2934665086-C4DD3D1B4A848A0F5D9739358CE38612/0?fmt=png&amp;size=12&amp;rs=9-8&amp;h=202&amp;w=837&amp;ppv=1" data-ratio="0.24133811230585425" data-w="837" src="https://pangyd.com/uploads/2017/09/1b8214ac44494614.jpg" data-fail="0" data-ueid="266081" width="837" height="auto" data-width="837" data-height="202" data-org="https://mmbiz.qpic.cn/mmbiz_png/Mzws9oBx0P7kQpiaL4oQG7TZxbZ6hwFdlbAnCoicvLvF2aLKfpCqp6NaztGRzkTQvN6LRN0av2u6XVBjA2N1b7LA/0.png?wxfrom=5&amp;wx_lazy=1" data-lazy="0">&lt;/span>&lt;/p></description></item><item><title>怎么开始使用Java机器学习？</title><link>https://pangyd.com/post/83-java/</link><pubDate>Wed, 30 Aug 2017 20:36:01 +0800</pubDate><guid>https://pangyd.com/post/83-java/</guid><description>&lt;p>本文咱们会做一个&lt;a target="_blank" href="https://pangyd.com/">java&lt;/a>的机械进修的重要框架的疾速概述，并证实Java机械进修是何等轻易上手，不必要你重新努力别辟门户或许从头开端创立算法。&lt;div>&lt;br>&lt;/div>&lt;div>￼&lt;/div>&lt;div>开端Java机械进修的最佳工具是甚么?&lt;/div>&lt;div>这个成绩曾经有一段时间了，但近来这些日子险些每个人都在评论辩论人工智能和机械进修。这曾经再也不是一个保留给科学家和研究者的机密，而是险些完成于每一项新兴技巧中。&lt;/div>&lt;div>鄙人面的章节中，咱们会做一个java的机械进修的重要框架的疾速概述，并证实Java机械进修是何等轻易上手，不必要你重新努力别辟门户或许从头开端创立算法。&lt;/div>&lt;div>人类的人工智能&lt;/div>&lt;div>人工智能在一段时间以来是一个普遍而且炫酷的范畴，但老是感到有点难以涉及，是特别为科学家所做。假如你想发明一个人工智能体系，你必需完成你自己的焦点算法，而且练习它们能辨认形式，懂得图象而且处置自然说话。&lt;/div>&lt;div>近来对付这范畴的蜕变使得其对付非研究者能更轻易涉及。你如今能轻易涉及到相干算法和工具。你不必要晓得你正在做甚么，然则能很轻松的晋升你应用的机械进修才能。&lt;/div>&lt;div>让机械运行&lt;/div>&lt;div>为了更简单的论述，咱们决议选出3个名目赞助你开端：&lt;/div>&lt;div>1.Deeplearning4J (DL4J) –开源，分布式，JVM的贸易深度进修lib库&lt;/div>&lt;div>2. BID Data Project –可以或许运行疾速、大规模的机械进修和数据挖掘的形式聚集&lt;/div>&lt;div>3. Neuroph –面向工具的神经收集&lt;/div>&lt;div>趁便说一下, 咱们近来宣布了别的一些吸引咱们留意的风趣的开源&lt;a target="_self" href="https://github.com/As-before">GitHub&lt;/a>库. 下载.&lt;/div>&lt;div>DL4J – 深度进修&lt;/div>&lt;div>DL4J是一个能赞助你设置装备摆设多层神经收集的工具。它为JVM供给了深度进修且随同疾速原型计划和大规模定制，同时重视比设置装备摆设更多的商定。&lt;/div>&lt;div>这个工具是为了赞助曾经领有创立和应用神经收集的实践，但不想亲身完成算法的那些人。你可以或许在海量数据上办理特定成绩和自定义神经收集属性。&lt;/div>&lt;div>DL4J 是由Java说话编写的，可以或许兼容任何JVM说话好比 Clojure, Scala, ,Kotlin，而且可以或许与Hadoop和Spark集成。&lt;/div>&lt;div>能够的应用案例包括评估或保举体系如(CRM，adtech， churn prevention)，猜测阐发乃至讹诈检测。假如你要探求实在的案例，你可以或许下载 Rapidminer. 这是应用DL4J的开源平台，用来为用户简化猜测阐发进程。&lt;/div>&lt;div>创立一个新的神经收集犹如创立一个新名目同样轻易。&lt;/div>&lt;div>BID Data Project (大数据名目)&lt;/div>&lt;div>大数据名目是由那些必要处置大批数据而且对机能敏感的人创立的。 UC Berkeley名目是由很多硬件、软件和计划形式聚集而成，能在上应用疾速、大规模的数据挖掘。&lt;/div>&lt;div>第一个库是 BIDMach，在单节点或集群上的惯例机械进修成绩都有记载。你可以或许应用这个库治理数据源，在CPU或许GPU上优化、分派数据。&lt;/div>&lt;div>BidMach 外面包括很多流行的机械进修算法，他们团队正致力于开辟分布式神经收集、图形算法和其余模子&lt;/div>&lt;div>其余两个库分别是BIDMat和 BIDParse。BIDMat是存眷与数据挖掘的疾速数学矩阵库，BIDParse是GPU加快的自然说话剖析。大数据名目标其余类库还包括可视化工具，可以或许支撑在Spark乃至在安卓运行的类库。&lt;/div>&lt;div>BIDMach基准比其余办理计划持续表现出更好的成果。乃至将其在繁多机械上的运行与其余计划在大集群上的运行比拟也是如斯。在这里可以或许找到一个完备的基准列表。&lt;/div>&lt;div>Neuroph&lt;/div>&lt;div>neuroph是用来开辟常用的神经收集构架的轻量级java框架。该框架供给了一个java库和一个GUI工具(称为easyNeurons)，你可以或许用它来在java名目中创立和练习自己的神经收集。&lt;/div>&lt;div>Neuroph包括一个开源的java类库和大批对应根本神经收集观点的基类。对付刚开端应用神经收集，或许想晓得它们若何事情的人来讲，Neuroph是个异常好的垫脚石。&lt;/div>&lt;div>你可以或许测验考试Neuroph的在线演示，看看它是怎样运行的。提醒：界面看起来很旧且过期，但你可以或许用它来创立美好的器械。它还得过2013的 Duke’s Choice的奖项。&lt;/div>&lt;div>￼&lt;/div>&lt;div>收集视图&lt;/div>&lt;div>其余名目若何呢?&lt;/div>&lt;div>万一以上三个名目不是你所必要的，你想为你的名目探求一些分歧的，也不要紧。假如你在&lt;a target="_self" href="https://github.com/As-before">GitHub&lt;/a>上搜刮“机械进修”，将有1506个Java资本让你找到适合的工具。&lt;/div>&lt;div>举个例子， Airbnb中有个风趣的名目是aerosolve,一个计划成具备人类友爱性的机械进修库。&lt;/div>&lt;div>开端进修一项新的技巧很费事，假如您希冀获得一些赞助，确保你曾经下载了Takipi的差错阐发工具。&lt;/div>&lt;div>最后的思虑&lt;/div>&lt;div>每隔几年就会有些对付人工智能的新声响。这一次，它伴跟着机械进修，数据挖掘，神经收集等等的强化来了，咱们都很支撑。这些类库开源的现实意味着这些信息和才能正奇货可居，而你一切所做的是思虑领有这个才能可以或许做成甚么。&lt;/div>&lt;div>假如你晓得其余风趣的名目或许你觉得咱们遗漏点甚么，咱们等待鄙人面的批评里见到它们。&lt;/div>&lt;div>￼&lt;/div>&lt;/p></description></item><item><title>干货 | 机器学习算法大总结(ML岗面试常考)</title><link>https://pangyd.com/post/35-ml/</link><pubDate>Sat, 05 Aug 2017 17:16:10 +0800</pubDate><guid>https://pangyd.com/post/35-ml/</guid><description>&lt;p style="text-align: justify">&amp;nbsp;找工作时（IT行业），除了常见的软件开发以外，机器学习岗位也可以当作是一个选择，不少计算机方向的研究生都会接触这个，如果你的研究方向是机器学习/数据挖掘之类，且又对其非常感兴趣的话，可以考虑考虑该岗位，毕竟在机器智能没达到人类水平之前，机器学习可以作为一种重要手段，而随着科技的不断发展，相信这方面的人才需求也会越来越大。&lt;/p>&lt;p>&lt;span style="text-align: justify">　　&lt;/span>&lt;br>&lt;/p>&lt;p style="text-align: justify">下面是在找机器学习岗位工作时，总结的常见机器学习算法（主要是一些常规分类器）大概流程和主要思想，希望对大家找机器学习岗位时有点帮助。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p style="text-align: justify">实际上在面试过程中，懂这些算法的基本思想和大概流程是远远不够的，那些面试官往往问的都是一些公司内部业务中的课题，往往要求你不仅要懂得这些算法的理论过程，而且要非常熟悉怎样使用它，什么场合用它，算法的优缺点，以及调参经验等等。说白了，就是既要会点理论，也要会点应用，既要有点深度，也要有点广度，否则运气不好的话很容易就被刷掉，因为每个面试官爱好不同。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;strong style="text-align: justify">&lt;span>朴素贝叶斯：&lt;/span>&lt;/strong>&lt;br>&lt;/p>&lt;p style="text-align: justify">　　有以下几个地方需要注意：&lt;/p>&lt;p style="text-align: justify">　　1. 如果给出的特征向量长度可能不同，这是需要归一化为通长度的向量（这里以文本分类为例），比如说是句子单词的话，则长度为整个词汇量的长度，对应位置是该单词出现的次数。&lt;/p>&lt;p style="text-align: justify">　　2. 计算公式如下：&lt;/p>&lt;p style="text-align: justify">　　&lt;img class="" data-ratio="0.3229571984435798" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-type="png" data-w="257" height="69" width="214" _width="auto" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">&lt;/p>&lt;p style="text-align: justify">　　其中一项条件概率可以通过朴素贝叶斯条件独立展开。要注意一点就是&amp;nbsp;&lt;img class="" data-ratio="0.3764705882352941" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-type="png" data-w="85" _width="auto" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">的计算方法，而由朴素贝叶斯的前提假设可知，&lt;img class="" data-ratio="0.13725490196078433" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-type="png" data-w="204" _width="auto" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">&amp;nbsp;=&lt;img class="" data-ratio="0.0812807881773399" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-type="png" data-w="406" _width="auto" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">&amp;nbsp;，因此一般有两种，一种是在类别为ci的那些样本集中，找到wj出现次数的总和，然后除以该样本的总和；第二种方法是类别为ci的那些样本集中，找到wj出现次数的总和，然后除以该样本中所有特征出现次数的总和。&lt;/p>&lt;p style="text-align: justify">　　3. 如果&amp;nbsp;&lt;img class="" data-ratio="0.3764705882352941" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-type="png" data-w="85" _width="auto" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">中的某一项为0，则其联合概率的乘积也可能为0，即2中公式的分子为0，为了避免这种现象出现，一般情况下会将这一项初始化为1，当然为了保证概率相等，分母应对应初始化为2（这里因为是2类，所以加2，如果是k类就需要加k，术语上叫做laplace光滑, 分母加k的原因是使之满足全概率公式）。&lt;/p>&lt;p style="text-align: justify">　　&lt;span>&lt;em>&lt;strong>朴素贝叶斯的优点：&lt;/strong>&lt;/em>&lt;/span>&lt;/p>&lt;p style="text-align: justify">　　对小规模的数据表现很好，适合多分类任务，适合增量式训练。&lt;/p>&lt;p style="text-align: justify">&lt;span>　　&lt;strong>&lt;em>缺点&lt;/em>：&lt;/strong>&lt;/span>&lt;/p></description></item><item><title>正确学习Python的姿势</title><link>https://pangyd.com/post/33-python/</link><pubDate>Sat, 05 Aug 2017 17:07:32 +0800</pubDate><guid>https://pangyd.com/post/33-python/</guid><description>&lt;section data-role="outer" label="Powered by 135editor.com">&lt;p>&lt;span>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 想学Python，刚开始有没有觉得无从下手呢？其实Python的基础知识点，并不多，但是一定要吃透，因为这是为后续核心的学习打下一个良好的基础。俗话说：万丈高楼平地起！&lt;/span>&lt;br>&lt;/p>&lt;/section>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;p>&lt;img data-s="300,640" data-type="png" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" class="" data-ratio="2.010178117048346" data-w="393" _width="100%" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">&lt;/p>&lt;p>&lt;span>&lt;strong>1、初识庐山真面目-初识Python&lt;/strong>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;img data-s="300,640" data-type="png" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" class="" data-ratio="0.2401263823064771" data-w="633" _width="100%" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;strong>学习重点：&lt;/strong>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Python的安装及配置：到官网上下载Python，然后安装。安装后还要进行PATH变量的配置。同时安装2和3的环境变量配置，在cmd命令行中输入Python对安装的结果进行检验。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;strong>2、再识庐山真面目-简单Python程序（注重对Python的理解）&lt;/strong>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;img data-s="300,640" data-type="png" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" class="" data-ratio="0.6308411214953271" data-w="642" _width="100%" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;strong>学习重点：&lt;/strong>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Python基础中的基础，都是重点！&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>不可不知的数据类型（注重编程能力）&lt;/p>&lt;h1>3、不可不知的数据类型（注重编程能力）&lt;/h1>&lt;p>&lt;img data-s="300,640" data-type="png" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" class="" data-ratio="0.7706237424547284" data-w="497" _width="100%" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;strong>学习重点：&lt;/strong>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>1、基本数据类型、数据类型的转换&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>2、控制流程、if、if elif、for循环、while循环&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>3、函数&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>面向对象面向君，不负代码不负卿（设计思想）&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;h1>面向对象面向君，不负代码不负卿（设计思想）&lt;/h1>&lt;p>&lt;img data-s="300,640" data-type="png" data-src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" class="" data-ratio="0.7706237424547284" data-w="497" _width="100%" src="https://pangyd.com/uploads/2017/08/74c10f869f038762.jpg" data-fail="0">&lt;/p></description></item></channel></rss>