枚举
用法:
1. 定义枚举要导入enum模块
2.枚举定义用class关键字,继承Enum类
3.定义枚举时,成员名称不允许重复
4.如果枚举中存在相同值得成员是,在通过值获取枚举成员时,只能获取到第一个成员
5.取值用value,取名用name
from enum import Enum
class VIP(Enum):
one = 1
two = 2
three = 3
four = 4
print(VIP.one.value) #输出1
print(VIP.one.name) #输出one
闭包
在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。
def f1():
a = 10
def f2(x):
return a*x
return f2
f = f1()
print(f(2))# 20
def f1(c):
def f2(x):
nonlocal c
c = c + x
return c
return f2
f = f1(0)
print(f(3)) //输出3
print(f(5)) //输出8
print(f(8)) //输出16
匿名函数 lambda
f = lambda x,y : x+y
print(f(1, 2))
三元表达式
条件为真时返回的结果 if 条件判断 else 条件为假时的返回结果
x = 2
y = 3
r = x if x > y else y
print(r)
map
list_x = [1,2,3,4,5,6,7,8]
list_y = [1,2,3,4,5,6,7,8]
r = map(lambda x,y:x*x+x,list_x,list_y)//循环执行square方法对list_x列表
print(list(r))#[2,6,12,20,30,42,56,72]
reduce
连续计算
from functools import reduce
#连续计算,连续调用lambda
list_x = ['1','2','3','4','5']
r = reduce(lambda x,y:x+y, list_x, 'aa')
print(r) #输出aa12345
filter(过滤)
list_x = [1,0,1,0,0,1]
res = filter(lambda x: True if x==1 else False, list_x)
print(list(res))
装饰器
import time
def decorator(func):
def wrapper(*args,**kw):
print(time.time())
func(*args,**kw)
return wrapper
@decorator
def f1(func_name1,func_name2):
print('this is a function'+ func_name1 + 'sss' + func_name2)
f1('aaa','bbb')
#输出1533288851.9578314 this is a functionaaasssbbb
小爬虫
明确目标
找到数据对应的网页
分析网页的结构找打数据所在的标签位置
模拟HTTP请求,想服务器发送这个请求,获取到服务器返回给我们的HTML
用正则表达式提取我们要的数据
import re
from urllib import request
class Spider():
url = 'https://www.panda.tv/cate/kingglory?pdt=1.24.s1.55.40pcvf1piqr'
root_pattern = r'<div class="video-info">([\s\S]*?)</div>'
num_pattern = r'<span class="video-number">([\s\S]*?)</span>'
name_pattern = r'</i>([\s\S]*?)</span>'
'''
利用模块爬取指定url的内容
'''
def __fetch_content(self):
r = request.urlopen(Spider.url)
htmls = r.read()
return htmls
'''
利用正则提取内容
'''
def __analysis(self,htmls):
new_htmls = re.findall(Spider.root_pattern, htmls)
authors = []
for x in new_htmls:
name = re.findall(Spider.name_pattern,x)
num = re.findall(Spider.num_pattern,x)
author = {'name':name,'num':num}
authors.append(author)
return authors
'''
精简内容
'''
def __refine(self,authors):
l = lambda author:{
'name':author['name'][0].strip(),
'num':author['num'][0]
}
return list(map(l,authors))
'''
排序
'''
def __sort(self,authors):
authors = sorted(authors,key=self.__sort_number,reverse=True)
return authors
def __sort_number(self,authors):
r = re.findall('\d*',authors['num'])
num = float(r[0])
if "万" in authors['num']:
num *= 10000
return num
'''
展示
'''
def __show(self,info):
for x in range(0,len(info)):
print('NO.'+ str(x) + info[x]['name'] + '-----------' + info[x]['num'])
'''
入口
'''
def go(self):
htmls = self.__fetch_content()
htmls = str(htmls,encoding='utf-8')
authors = self.__analysis(htmls)
authors = self.__refine(authors)
ret = self.__sort(authors)
self.__show(ret)
Spider = Spider()
Spider.go()
Beautiful Soup Scrapy 爬虫框架