13-9 __sort_seed函数的使用不加括号不传参数
来源:13-10 sorted 排序
慕UI3420017
2019-05-27
先贴源码,熊猫tv凉了,我选择斗鱼,而且问题和直播平台没有关系
from urllib import request
import gzip
import re
class Spider():
url = 'https://www.douyu.com/g_LOL'
root_pattern = '<div class="DyListCover-info">[\s\S]*?</div>'
root_detailNum = '<span class="DyListCover-hot is-template">[\s\S]*?</span>'
root_detailName = '<h2 class="DyListCover-user is-template">[\s\S]*?</h2>'
real_num = '</svg>([\s\S]*?)</span>'
real_name = '</svg>([\s\S]*?)</h2>'
real_num_seed = '([\s\S]*?)[\u4e00-\u9fa5]'
def __fetch_content(self):
r = request.urlopen(Spider.url)
htmls = r.read()
htmls = gzip.decompress(htmls)
print(type(htmls))
encoded_htmls = htmls.decode("utf-8")
return encoded_htmls
def go(self):
htmls = self.__fetch_content()
anchors = self.__analysis(htmls)
anchors = self.__sort(anchors)
self.show(anchors)
def show(self,anchors):
for anchor in anchors:
print(anchor['name']+'---------------'+anchor['number'])
def __sort(self,anchors):
anchors = sorted(anchors,key = self.__sort_seed,reverse = True)
return anchors
def __sort_seed(self,anchor):
number = re.findall(Spider.real_num_seed,anchor['number'])[0]
number = float(number)*10000
return number
def __analysis(self, htmls):
root_html = re.findall(Spider.root_pattern,htmls)
anchors = []
for a in root_html:
anchor = self.__distribute(a)
if anchor:
anchors.append(anchor)
return anchors
def __distribute(self, root_html):
num_Inside = re.findall(Spider.root_detailNum,root_html)
if num_Inside:
name_Inside = re.findall(Spider.root_detailName,root_html)
if name_Inside:
real_num = re.findall(Spider.real_num,num_Inside[0])[0]
real_name = re.findall(Spider.real_name,name_Inside[0])[0]
return {'name':real_name,'number':real_num}
spider = Spider()
spider.go()
问题有两个,
第一个问题是 __sort 方法中调用的 sorted 函数的参数:key=self.__sort_seed, 为什么这个函数后面没有括号以及括号内的参数?__sort_seed方法是自定义的含一个参数(第二个问题与这个参数有关)的方法,返回的是浮点型的number人数
第二个问题是,我们的anchors数据一个list,他的结构是这样的,我希望形象一些来说:
anchors = [anchor1,anchor2,anchor3……],而这里每一个anchor1,2,3都是一个dict,比如说anchor1 = {‘name’:name,‘number’:number} 。__sort_seed方法传入的参数应该是一个anchor,因为我们可以通过anchor[‘number’]来访问key(number)的value。我们在__sort方法中传入的参数是anchors,我们可以对anchors[0]使用__sort_seed方法但是不能对anchors使用,那么,在sorted函数中我们是如何区分的?这里的self到底是啥啊?
2回答
-
慕粉2242067667
2019-06-19
我理解的是,__sorted 第二个参数应该传个函数,如果把括号和参数写进去就等于调用__sort_seed函数了,那传进去的就是一个具体的anchor的value值了,第二个问题 :传进去是 anchors ,具体anchors怎么拿出每个anchor怎么用__sort_seed 拿到 anchor的value,怎么来比较这些Values来排序,这都是python封装好的,我们并不需要知道,我们只需要知道key要传个函数进去,这个函数接受一个参数返回一个排序用的键,这里key用一个lambda函数表示的话看着更清楚些。
00 -
乱弹琴的web
2019-06-02
你的问题可以在https://docs.python.org/3.7/library/functions.html?highlight=sorted#sorted 找到答案,传入列表,返回一个新的列表。
self到底是啥?可以在https://coding.imooc.com/lesson/136.html#mid=7604 这里找到答案,self指的是类实例对象本身,规范和标准建议我们使用它,并且最好是self
00
相似问题