個人隨手自學筆記--python3入門及基礎知識點(5)—— 枚舉、閉包、表達式、函數、裝飾器、小爬蟲

枚舉

用法:

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   爬蟲框架

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章