枚舉
用法:
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 爬蟲框架