您的位置:首页 > 编程语言 > Python开发

个人随手自学笔记--python3入门及基础知识点(5)—— 枚举、闭包、表达式、函数、装饰器、小爬虫

2018-08-03 17:47 603 查看

枚举

用法:

1. 定义枚举要导入enum模块

2.枚举定义用class关键字,继承Enum类

3.定义枚举时,成员名称不允许重复

4.如果枚举中存在相同值得成员是,在通过值获取枚举成员时,只能获取到第一个成员

5.取值用value,取名用name

[code]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

闭包

在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。

[code]def f1():
a = 10
def f2(x):
return a*x
return f2

f = f1()
print(f(2))# 20
[code]
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

[code]f = lambda x,y : x+y
print(f(1, 2))

三元表达式

条件为真时返回的结果  if   条件判断   else   条件为假时的返回结果

[code]x = 2
y = 3
r = x if x > y else y
print(r)

map

[code]
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

连续计算

[code]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(过滤)

[code]list_x = [1,0,1,0,0,1]
res = filter(lambda x: True if x==1 else False, list_x)
print(list(res))

装饰器

[code]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

用正则表达式提取我们要的数据

[code]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   爬虫框架

 

 

 

 

 

 

 

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: