Python Tips

From:znn


0x01.星号的用法

星号在很多地方用来表示通配符,除此之外在python还有一些其他的用处。
1、用在函数中表示多个参数
如下:

>>> def fun(*a):
... print a
... print type(a)
...
>>>
>>> fun(1,2,3,4,5)
(1, 2, 3, 4, 5)
<type 'tuple'>

我们发现两个问题,
1、这个函数可以传多个参数
2、传进去的多个参数变成了tuple(元组)
也就是说当我们用*arg的形式定义一个函数的时候,那么这时候函数会把传进去的所有参数变成元组的形式,然后我们可以在函数内通过arg[0]这种形式调用,解决了任意参数个数传参的问题。
我们再看一个例子:

>>> def fun1(a,b,*c):
... print a
... print b
... print c
...
>>> fun1(1,2,3,4,5)
1
2
(3, 4, 5)
>>> def fun2(a,*b,c):
 File "<stdin>", line 1
 def fun2(a,*b,c):
 ^
SyntaxError: invalid syntax

可以看到在fun1()中前两个参数正常传进去,剩下的其他参数(3,4,5)被以*arg的形式传给了c。
而在fun2中定义函数的时候直接报错了。可以看到python2函数中传参的时候*arg形只能放到最后面。
在Python3中优化了这一问题,如下示例:

>>> def fun3(a,*b,c):
... print(a)
... print(b)
... print(c)
...
>>> fun3(1,2,3,4,c=5)
1
(2, 3, 4)
5

但是当*arg的位置不是最末的时候,后面的参数(c)必须用c=vule这种形式来传参,不然python3会将后面所有的参数传递给b,这样c参数就没发传进去,导致报错如:

>>> fun3(1,2,3,4,5)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: fun3() missing 1 required keyword-only argument: 'c'

2、用在函数中表示多个参数2
同样先以一个例子说明:

>>> def fun(**a):
... print a
... print type(a)
...
>>> fun(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3}
<type 'dict'>
>>> fun(1,2,3)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: fun() takes exactly 0 arguments (3 given)

对比前面*arg和**arg的特点:
1、函数同样可以传多个参数,但是必须要以var=value这种形式传递,不然会出错
2、传进去的多个参数变成了dict(字典)

>>> def fun1(a,**b):
... print a
... print b
...
>>> fun1(0,x=1,y=2)
0
{'y': 2, 'x': 1}
>>> def fun2(a,**b,c):
 File "<stdin>", line 1
 def fun2(a,**b,c):
 ^
SyntaxError: invalid syntax

和前面的很相似,在python2中**arg这种形式传参同样需要放到最后面。当然在python3中也同样解决了这一问题,不再举例了。
3、在list中好玩的用法
在Python2中,我们知道可以通过下面这种方法很方便的传递参数

>>> a=(1,2)
>>> x,y=a
>>> x,y
(1, 2)

但其实在Python3中还能和上面提到的两种星号传参的方法类似,姿势如下:

>>> a = (1,2,3,4,5)
>>> x,*y,z = a
>>> x,y,z
(1, [2, 3, 4], 5)

甚至

>>> a = '1234567890'
>>> x,*y,z = a
>>> x,y,z
('1', ['2', '3', '4', '5', '6', '7', '8', '9'], '0')

其实这种用法用的比较多的一个场景是当我们需要提取list或者string的首、尾,而不想要其他中间的内容的时候,如下:

>>> a='root:*:0:0:System Administrator:/var/root:/bin/sh'
>>> x,*_,y=a.split(":")
>>> x,y
('root', '/bin/sh')

0x02.Python Regular expression

reference:
https://deerchao.net/tutorials/regex/regex.htm
文章写的很有层次感,由浅入深很适合入门。而且基本的正则语法都有提到,不是很苛刻的话基本工作完全没问题了,我就不搬过来了,如果忘了随时去看看就行了。这边整理几个文中给的例子。基本这几个例子能记住,那平时写正则就很方便了。

\(?0\d{2}\)?[- ]?\d{8}|0\d{2}[- ]?\d{8}
#注意匹配电话号码这个还是有问题的,比如能匹配012)-12345678
\b(\w+)\b\s+\1\b
(?<=<(\w+)>).*(?=<\/\1>)
<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>

另外python的官方文档写的也很详细,就是全英文得慢慢看。

https://docs.python.org/2/library/re.html
点赞

发表评论