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函数表示的话看着更清楚些。

0
0

乱弹琴的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

0
0

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14447 学习 · 4438 问题

查看课程