python定位函数,python 定位

python有多少内置函数

Python内置函数有很多,为大家推荐5个神仙级的内置函数:

创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站制作、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的天心网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

(1)Lambda函数

用于创建匿名函数,即没有名称的函数。它只是一个表达式,函数体比def简单很多。当我们需要创建一个函数来执行单个操作并且可以在一行中编写时,就可以用到匿名函数了。

Lamdba的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

利用Lamdba函数,往往可以将代码简化许多。

(2)Map函数

会将一个函数映射到一个输入列表的所有元素上,比如我们先创建了一个函数来返回一个大写的输入单词,然后将此函数应有到列表colors中的所有元素。

我们还可以使用匿名函数lamdba来配合map函数,这样可以更加精简。

(3)Reduce函数

当需要对一个列表进行一些计算并返回结果时,reduce()是个非常有用的函数。举个例子,当需要计算一个整数列表所有元素的乘积时,即可使用reduce函数实现。

它与函数的最大的区别就是,reduce()里的映射函数(function)接收两个参数,而map接收一个参数。

(4)enumerate函数

用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。

它的两个参数,一个是序列、迭代器或其他支持迭代对象;另一个是下标起始位置,默认情况从0开始,也可以自定义计数器的起始编号。

(5)Zip函数

用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表

当我们使用zip()函数时,如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。

python 函数参数类型

python 的函数参数类型分为4种:

1.位置参数:调用函数时根据函数定义的参数位置来传递参数,位置参数也可以叫做必要参数,函数调用时必须要传的参数。

当参数满足函数必要参数传参的条件,函数能够正常执行:

add(1,2) #两个参数的顺序必须一一对应,且少一个参数都不可以

当我们运行上面的程序,输出:

当函数需要两个必要参数,但是调用函数只给了一个参数时,程序会抛出异常

add(1)

当我们运行上面的程序,输出:

当函数需要两个必要参数,但是调用函数只给了三个参数时,程序会抛出异常

add(1,2,3)

当我们运行上面的程序,输出

2.关键字参数:用于函数调用,通过“键-值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。

add(1,2) # 这种方式传参,必须按顺序传参:x对应1,y对应:2

add(y=2,x=1) #以关健字方式传入参数(可以不按顺序)

正确的调用方式

add(x=1, y=2)

add(y=2, x=1)

add(1, y=2)

以上调用方式都是允许的,能够正常执行

错误的调用方式

add(x=1, 2)

add(y=2, 1)

以上调用都会抛出SyntaxError 异常

上面例子可以看出:有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序的

3.默认参数:用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值,所有位置参数必须出现在默认参数前,包括函数定义和调用,有多个默认参数时,调用的时候,既可以按顺序提供默认参数,也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上

默认参数的函数定义

上面示例第一个是正确的定义位置参数的方式,第二个是错误的,因为位置参数在前,默认参数在后

def add1(x=1,y) 的定义会抛出如下异常

默认参数的函数调用

注意:定义默认参数默认参数最好不要定义为可变对象,容易掉坑

不可变对象:该对象所指向的内存中的值不能被改变,int,string,float,tuple

可变对象,该对象所指向的内存中的值可以被改变,dict,list

这里只要理解一下这个概念就行或者自行百度,后续会写相关的专题文章讲解

举一个简单示例

4.可变参数区别:定义函数时,有时候我们不确定调用的时候会多少个参数,j就可以使用可变参数

可变参数主要有两类:

*args: (positional argument) 允许任意数量的可选位置参数(参数),将被分配给一个元组, 参数名前带*,args只是约定俗成的变量名,可以替换其他名称

**kwargs:(keyword argument) 允许任意数量的可选关键字参数,,将被分配给一个字典,参数名前带**,kwargs只是约定俗成的变量名,可以替换其他名称

*args 的用法

args 是用来传递一个非键值对的可变数量的参数列表给函数

语法是使用 符号的数量可变的参数; 按照惯例,通常是使用arg这个单词,args相当于一个变量名,可以自己定义的

在上面的程序中,我们使用* args作为一个可变长度参数列表传递给add()函数。 在函数中,我们有一个循环实现传递的参数计算和输出结果。

还可以直接传递列表或者数组的方式传递参数,以数组或者列表方式传递参数名前面加(*) 号

理解* * kwargs

**kwargs 允许你将不定长度的键值对, 作为参数传递给函数,这些关键字参数在函数内部自动组装为一个dict

下篇详细讲解 *args, **kwargs 的参数传递和使用敬请关注

python怎么快速定位函数位置

使用pycharm然后直接使用F12就可以直接转到函数定位位置

也可以使用Structure查看函数,直接就可以定位到函数位置

Python的函数和参数

parameter 是函数定义的参数形式

argument 是函数调用时传入的参数实体。

对于函数调用的传参模式,一般有两种:

此外,

也是关键字传参

python的函数参数定义一般来说有五种: 位置和关键字参数混合 , 仅位置参数 , 仅关键字参数 , 可变位置参数 , 可变关键字参数 。其中仅位置参数的方式仅仅是一个概念,python语法中暂时没有这样的设计。

通常我们见到的函数是位置和关键字混合的方式。

既可以用关键字又可以用位置调用

这种方式的定义只能使用关键字传参的模式

f(*some_list) 与 f(arg1, arg2, ...) (其中some_list = [arg1, arg2, ...])是等价的

网络模块request的request方法的设计

多数的可选参数被设计成可变关键字参数

有多种方法能够为函数定义输出:

非常晦涩

如果使用可变对象作为函数的默认参数,会导致默认参数在所有的函数调用中被共享。

例子1:

addItem方法的data设计了一个默认参数,使用不当会造成默认参数被共享。

python里面,函数的默认参数被存在__default__属性中,这是一个元组类型

例子2:

在例子1中,默认参数是一个列表,它是mutable的数据类型,当它写进 __defauts__属性中时,函数addItem的操作并不会改变它的id,相当于 __defauts__只是保存了data的引用,对于它的内存数据并不关心,每次调用addItem,都可以修改 addItem.__defauts__中的数据,它是一个共享数据。

如果默认参数是一个imutable类型,情况将会不一样,你无法改变默认参数第一次存入的值。

例子1中,连续调用addItem('world') 的结果会是

而不是期望的

python使用xpath(超详细)

使用时先安装 lxml 包

开始使用 #

和beautifulsoup类似,首先我们需要得到一个文档树

把文本转换成一个文档树对象

from lxml import etreeif __name__ == '__main__':doc='''

把文件转换成一个文档树对象

fromlxmlimportetree# 读取外部文件 index.htmlhtml = etree.parse('./index.html')result = etree.tostring(html, pretty_print=True)#pretty_print=True 会格式化输出print(result)

均会打印出文档内容

节点、元素、属性、内容 #

xpath 的思想是通过 路径表达 去寻找节点。节点包括元素,属性,和内容

元素举例

html ---...div ---

这里我们可以看到,这里的元素和html中的标签一个意思。单独的元素是无法表达一个路径的,所以单独的元素不能独立使用

路径表达式 #

/  根节点,节点分隔符,//  任意位置.  当前节点..  父级节点@  属性

通配符 #

*  任意元素@*  任意属性node()  任意子节点(元素,属性,内容)

谓语 #

使用中括号来限定元素,称为谓语

//a[n] n为大于零的整数,代表子元素排在第n个位置的 元素//a[last()]  last()  代表子元素排在最后个位置的 元素//a[last()-]  和上面同理,代表倒数第二个//a[position()3] 位置序号小于3,也就是前两个,这里我们可以看出xpath中的序列是从1开始//a[@href]    拥有href的 元素//a[@href='']    href属性值为''的 元素//book[@price2]  price值大于2的元素

多个路径 #

用| 连接两个表达式,可以进行 或匹配

//book/title | //book/price

函数 #

xpath内置很多函数。更多函数查看

contains(string1,string2)

starts-with(string1,string2)

ends-with(string1,string2) #不支持

upper-case(string) #不支持

text()

last()

position()

node()

可以看到last()也是个函数,在前面我们在谓语中已经提到过了

案例 #

定位元素 #

匹配多个元素,返回列表

fromlxmlimportetreeif__name__ =='__main__':doc='''

【结果为】

[Element li at 0x2b41b749848, Element li at 0x2b41b749808, Element li at 0x2b41b749908, Element li at 0x2b41b749948, Element li at 0x2b41b749988][]  #没找到p元素

html = etree.HTML(doc)print(etree.tostring(html.xpath("//li[@class='item-inactive']")[0]))print(html.xpath("//li[@class='item-inactive']")[0].text)print(html.xpath("//li[@class='item-inactive']/a")[0].text)print(html.xpath("//li[@class='item-inactive']/a/text()"))print(html.xpath("//li[@class='item-inactive']/.."))print(html.xpath("//li[@class='item-inactive']/../li[@class='item-0']"))

【结果为】

b' third item \n                'None    #因为第三个li下面没有直接text,Nonethird item  #['third item'][Element ul at 0x19cd8c4c848][Element li at 0x15ea3c5b848, Element li at 0x15ea3c5b6c8]

使用函数 #

contains #

有的时候,class作为选择条件的时候不合适@class='....' 这个是完全匹配,当王爷样式发生变化时,class或许会增加或减少像active的class。用contains就能很方便

from lxml import etreeif __name__ == '__main__':doc='''

【结果为】

[Element p at 0x23f4a9d12c8, Element li at 0x23f4a9d13c8, Element li at 0x23f4a9d1408, Element li at 0x23f4a9d1448, Element li at 0x23f4a9d1488]

starts-with #

from lxml import etreeif __name__ == '__main__':doc='''

【结果为】

[Element ul at 0x23384e51148, Element p at 0x23384e51248, Element li at 0x23384e51288, Element li at 0x23384e512c8, Element li at 0x23384e51308, Element li at 0x23384e51388][Element ul at 0x23384e51148]

ends-with #

print(html.xpath("//*[ends-with(@class,'ul')]"))

【结果为】

Traceback (most recent call last):File"F:/OneDrive/pprojects/shoes-show-spider/test/xp5_test.py",line18,inprint(html.xpath("//*[ends-with(@class,'ul')]"))File"src\lxml\etree.pyx",line1582,inlxml.etree._Element.xpathFile"src\lxml\xpath.pxi",line305,inlxml.etree.XPathElementEvaluator.__call__File"src\lxml\xpath.pxi",line225,inlxml.etree._XPathEvaluatorBase._handle_resultlxml.etree.XPathEvalError: Unregisteredfunction

看来python的lxml并不支持有的xpath函数列表

upper-case #

和ends-with函数一样,也不支持。同样报错lxml.etree.XPathEvalError: Unregistered function

print(html.xpath("//a[contains(upper-case(@class),'ITEM-INACTIVE')]"))

text、last #

#最后一个li被限定了print(html.xpath("//li[last()]/a/text()"))#会得到所有的`a`元素的内容,因为每个a标签都是各自父元素的最后一个元素。#本来每个li就只有一个a子元素,所以都是最后一个print(html.xpath("//li/a[last()]/text()"))print(html.xpath("//li/a[contains(text(),'third')]"))

【结果为】

['fifth item']['second item', 'third item', 'fourth item', 'fifth item'][Element a at 0x26ab7bd1308]

position #

print(html.xpath("//li[position()=2]/a/text()"))#结果为['third item']

上面这个例子我们之前以及讲解过了

* 这里有个疑问,就是position()函数能不能像text()那样用呢

print(html.xpath("//li[last()]/a/position()"))#结果  lxml.etree.XPathEvalError: Unregisteredfunction

这里我们得到一个结论,函数不是随意放在哪里都能得到自己想要的结果

node #

返回所有子节点,不管这个子节点是什么类型(熟悉,元素,内容)

print(html.xpath("//ul/li[@class='item-inactive']/node()"))print(html.xpath("//ul/node()"))

【结果为】

[]['\n                ', , '\n                ', , '\n                ', , '\n                ', , '\n                ', , ' 闭合标签\n            ']

获取内容 #

**刚刚已经提到过,可以使用.text和text()的方式来获取元素的内容

from lxml import etreeif __name__ == '__main__':doc='''

【结果为】

['first item','second item','third item','fourth item','fifth item']first item18['\n                ','\n                ','\n                ','\n                ','\n                ',' 闭合标签\n            ']

看到这里,我们观察到text()和.text的区别。自己总结吧。不太好表达,就不表达了

获取属性 #

print(html.xpath("//a/@href"))print(html.xpath("//li/@class"))

【结果为】

['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']['item-0active', 'item-1', 'item-inactive', 'item-1', 'item-0']

自定义函数 #

我们从使用函数的过程中得到结论,就是有的函数不支持,有的支持,那问题来了,到底那些方法支持呢。我们在lxml官网找到了答案。 。lxml 支持XPath 1.0 ,想使用其他扩展,使用libxml2,和libxslt的标准兼容的方式。 XPath 1.0官方文档  以及其他版本的XPath文档 

lxml supports XPath1.0, XSLT1.0andthe EXSLT extensions through libxml2andlibxsltina standards compliant way.

除此之外,lxml还提供了自定义函数的方式来扩展xpath的支持度 

from lxml import etree#定义函数def ends_with(context,s1,s2):return s1[0].endswith(s2)if __name__ == '__main__':doc='''

【结果为】

[Element li at 0x2816ed30548, Element li at 0x2816ed30508]['first item', 'third item']

形参s1会传入xpath中的第一个参数@class,但这里注意@class是个列表

形参s2会传入xpath中的第二个参数'active','active'是个字符串

官网例子

defhello(context, a):return"Hello %s"% afromlxmlimportetreens = etree.FunctionNamespace(None)ns['hello'] = helloroot = etree.XML('abHaegar/b/a')print(root.xpath("hello('Dr. Falken')"))# 结果为 Hello Dr. Falken


分享标题:python定位函数,python 定位
分享URL:http://azwzsj.com/article/dscecgs.html