当前位置 博文首页 > 庆述倾述:python爬虫学习笔记(一)-- Python函数五种参数类型+

    庆述倾述:python爬虫学习笔记(一)-- Python函数五种参数类型+

    作者:[db:作者] 时间:2021-08-15 22:10

    ?上篇中我们已经可以简单的下载网页中的图片到本地了,这里做一个补充:

    soup.find和soup.find_all中的参数是一样的。不相信可以在pycharm中,按住ctrl单击我们的soup.find函数,然后我们会看到这样一个定义:

        def find(self, name=None, attrs={}, recursive=True, text=None,
                 **kwargs):
            """Return only the first child of this Tag matching the given
            criteria."""
            r = None
            l = self.find_all(name, attrs, recursive, text, 1, **kwargs)
            if l:
                r = l[0]
            return r

    其实内部调用的就是find_all,然后取的是第一个元素。

    另对于<div class='content'></div>此类型的标签元素,我们不能使用soup.find('div', class='content'),因为class是定义一个类的关键字,而此关键字是不能作为参数的。

    如:中国研招网

    我们需要在页面中找到对应的<ul class='news-list'></ul>

    import requests
    from bs4 import BeautifulSoup
    
    response = requests.get(url = "https://yz.chsi.com.cn/kyzx/tjxx/")
    page = response.text
    
    soup = BeautifulSoup(page, 'html.parser')
    ul = soup.find('ul','news-list')
    print(ul)

    运行截图:

    ?注释:Python函数参数的五种类型

    ul = soup.find('ul','news-list')的等价写法:
    ul = soup.find(name='ul', attrs={"class":'news-list'})

    Python的参数类型一共有5种:POSITIONAL_OR_KEYWORD、VAR_POSITIONAL(位置参数)、VAR_KEYWORD(关键字参数)、KEYWORD_ONLY、POSITIONAL_ONLY

    其中 POSITIONAL_OR_KEYWORD、VAR_POSITIONAL、VAR_KEYWORD、KEYWORD_ONLY 比较常用

    1、可变长位置参数,接收一个元组:参数类型为VAR_POSITIONAL时,即*args参数,只能通过位置传值,如

    #位置参数
    def aaa(*args):
        print("参数是:{0}".format(args))
    
    aaa("weizu", "tiantian")
    aaa(args="wang")#这种写法就是错误的

    因为只是代表位置而不是说这个位置有为args的名字,运行截图:

    def aaa(*args, name):
        print("参数是:{0}".format(args))
    aaa("weizu", "tiantian")#这种写法也是错误的

    错误的原因其实类似,因为aaa方法,首个是位置参数,而代表了一个位置,所以在调用的时候,默认所有的不带指定(即关键字)的传参方式都是在这个位置之内,所以也是错误的,运行截图:

    正确的调用方式是:

    aaa("weizu", name = "tiantian")

    2、可变长关键字参数,接收一个字典:参数类型为VAR_KEYWORD,即 **kwargs参数,只能通过关键字传值,如

    def aaa(**kwargs):
        print("参数是:{0}".format(kwargs))
    aaa("weizu")#错误的写法

    运行截图:

    正确的书写方式是:字典,使用的时候传入键值对

    def aaa(**kwargs):
        print("参数是:{0}".format(kwargs))
    aaa(name = "weizu", wo = 'wang')

    截图:

    不难发现关键字参数无论是几个参数,传入的形式是以字典的方式传入。而且,关键字参数要放在最后面。

    3、位置或关键字参数,参数的类型为POSITIONAL_OR_KEYWORD时,说明此参数前面没有VAR_POSITIONAL类型的参数,可以通过位置或关键字传值,如

    def aaa(name):
        print("参数是:{0}".format(name))
    aaa(name = "weizu")
    #或者
    aaa("hello")

    截图:

    这种参数也是最常用的参数。

    4、关键字参数,参数类型为KEYWORD_ONLY时,说明此参数前面存在VAR_POSITIONAL类型的参数,只能通过关键字传值,如

    其实前面介绍过:

    def aaa(*args, name):
        print("参数是:{0}".format(name))
    aaa("haohao",name = "weizu")  #这里只能使用关键字name

    5、默认参数

    def aaa(*args, name='weizu'):
        print("参数是:{0}".format(name))
    aaa("haohao")

    也即是使用name='value',定义个一初始值,在不传入的时候,值就是默认的设置。

    使用:

    def fun(a, b, c=0, *args, **kw):
        print(a, b, c, args, kw)
    
    fun("12", "wizu", 3, "alfjalfj","weizu")
    fun("12", "wizu", 3, "alfjalfj","weizu", bb = 'test')

    运行截图:

    因为我们不指定bb='test'的键值对形式,那么编译器会默认解析成前面变长位置参数,即一个元组。

    使用的时候,也通常遵循:位置或关键字参数、默认参数、可变长位置参数、可变长关键字参数的顺序使用。

    当然了看编译的结果自己也就可以改改就出来了。

    ?

    作者:无涯明月

    cs