python-一句话编程六剑客(基于python 3.x)

一:map():映射

map()有两个参数,一个函数,一个序列,序列中每一个元素都会做为参数传给前边的函数,然后生成新的列表,第二个参数必须用一个序列:元祖,列表,字符串
python2.x和python3.x在map和filter的使用上最大的区别是python3不会直接返回结果,需要list转换成列表。而python2.x则会根据第二个参数的类型直接返回对应的结果
如无特殊说明,均为python3下操作

>>> list(map(str,[1,2,3,4]))
['1', '2', '3', '4']

也可以自己定义函数,搭配lambda函数

>>> list(map(lambda x:x,'123456'))
['1', '2', '3', '4', '5', '6']

map()函数搭配lambda传多个参数,如:2个list,[1,2,3][4,5,6],合并为[(1, 4), (2, 5), (3, 6)]

>>> a=[1,2,3]
>>> b=[4,5,6]
>>> list(map(lambda x,y:(x,y),a,b))
[(1, 4), (2, 5), (3, 6)]

或者用zip()函数也可以

>>> list(zip(a,b))
[(1, 4), (2, 5), (3, 6)]

二:lambda匿名函数
lambda语句被用来创建新的函数对象,并且在运行时返回它们。
Python使用lambda关键字来创建匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
lambda只是一个表达式,函数体比def简单很多
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
#如下边例子,x,y,z相当于匿名函数中的参数,x+y+z是函数体,匿名函数的定义赋值给了a,a就是一个函数,可以用a()来调用这个函数

>>> a=lambda x,y,z:x+y+z
>>> a(1,2,3)
6

三:filter():过滤
filter和map的区别是,filter保留函数返回为true的值,不返回的不显示
map是保留返回的结果,无论返回的是啥,filter会把不满足true条件的结果忽略掉
例子:删除字符串中的小写字母

#encoding=utf-8
def delete_lowercase(s):
    if s>='a' and s<='z':
        return ""
    else:
        return s
print list(map(delete_lowercase,"AABBaabb"))
print "".join(list(map(delete_lowercase,"AABBaabb")))

结果:

D:\>python test.py
['A', 'A', 'B', 'B', '', '', '', '']
AABB

保留数字中大于5的位

def func(n):
        if int(n)>5:
            return n
    print(list(filter(func,"123467")))

#只要return的是True,就会保留
结果:

[6,7]

或者一行搞定

>>> list(filter(lambda x:int(x)>=5,"12345678"))
['5', '6', '7', '8']

python2.x
filter()根据参数中的序列,返回相同形式的序列,列表返回列表,字符串返回字符串

>>> filter(lambda x:int(x)>=5,"12345678")
'5678'

>>> filter(lambda x:int(x)>=5,list("12345678"))
['5', '6', '7', '8']

>>> filter(lambda x:int(x)>=5,tuple("12345678"))
('5', '6', '7', '8')

>>> tuple("12345678")
('1', '2', '3', '4', '5', '6', '7', '8')

四:推导列表

 >>> [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

相当于把for循环中每次循环得到的数作为一个列表的一个元素,知道所有循环执行结束

各个元素生成的过程相当于以下两句得到的:

>>> for i in range(10):
...     print(i)

例如打印5以外的数字

>>> [i for i in range(10) if i !=5]
[0, 1, 2, 3, 4, 6, 7, 8, 9]

练习:a=[[1,2,3],[4,5,6]]用推导列表生成[[1, 4], [2, 5], [3, 6]]

>>> a=[[1,2,3],[4,5,6]]
>>> [[j[i] for j in a] for i in range(3)]
[[1, 4], [2, 5], [3, 6]] 

以上推导列表过程转换成for循环:最外层的for也对应转换成for循环的最外层

>>> for i in range(3):
...     print "\n**************"
...     for j in a:
...         print j[i],
...

结果中有三个元素,每个元素又是包含2个元素的列表,这个元素是执行一次for循环得到的值
拆解过程:
每执行一次完整的循环,生成两个数,这个两个数会以列表的形式作为最后结果列表的一个元素,也就是说,推导列表的每一步生成的结果会以列表的形式存在,包括最终的结果

>>> for i in range(3):
...     print "\n**************"
...     for j in a:
...         print j[i],
...

**************
1 4
**************
2 5
**************
3 6

与 [[j[i] for j in a] for i in range(3)]返回值更贴近的写法是:
区别是:[[j[i] for j in a] for i in range(3)]返回类型为列表
以下返回类型为字符串

>>> a=[[1,2,3],[4,5,6]]
>>> for i in range(3):
...     if i==0:
...         print('[',end='')
...     for j in range(len(a)):
...         if j==0:
...             print('['+str(a[j][i]),end=',')
...         else:
...             if i!=2:
...                 print(str(a[j][i])+']',end=',')
...             else:
...                 print(str(a[j][i])+']]')
...
[[1,4],[2,5],[3,6]] #实质是字符串类型

五:reduce()累计操作
Reduce()累计操作,要搭配函数来执行

>>> from functools import reduce
>>> reduce(lambda x,y:x+y,[1,2,3,4])
10

第一次x=1,y=2, x+y=3,之后x+y的结果3赋值给x,y为3
第二次x=3,y=3,x+y=6,之后x+y的结果6赋值给x,y为4
第三次x=3,y=4,x+y=10

>>> reduce(lambda x,y:x+y,range(1,101))
5050
>>> reduce(lambda x,y:x+y,[1,2,3])
6

X=1,y=2
结果3传给x
y从第二次开始存结果

>>> reduce(lambda x,y:x+y+y,[1,2,3])
11

x=1,y=2,y=2
x=5,y=3,y=3
x+y+y=5+3+3=11

>>> reduce(lambda x,y:x+x+y,[1,2,3])
11

x=1,x=1,y=2
x+x+y=1+1+2=4
x=4,x=4,y=3
x+x+y=4+4+3=11

 >>> reduce(lambda x,y:x+x+y,['1','2','3'])
'1121123'

x=‘1’,x=‘1’,y=‘2’
x=’112’,x=’112’,y=’3’
x+x+y=‘1121123’

六:切片,就是数列的切片,比较基本也比较常用

>>> [1,2,3,4,5][3:5]
[4, 5]

练习:用map,lambda,推导列表,正则,join,去掉字符串中的小写字母

   >>> import re
   >>> ''.join(list(map(lambda x:(re.match(r'[A-Z]*',x).group()),'abcABC')))
    'ABC'

拆解过程:

 >>> list(map(lambda x:(re.match(r'[A-Z]*',x).group()),'abcABC')) #加了‘*’不报错
['', '', '', 'A', 'B', 'C']
>>> ''.join(['', '', '', 'A', 'B', 'C'])
'ABC'

练习:统计字符串中一共有几个数字

>>> s="sdfa45ads46723"
>>> list(filter(lambda x:x.isdigit(),list(s)))
['4', '5', '4', '6', '7', '2', '3']
>>> len(list(filter(lambda x:x.isdigit(),s)))
7
>>> list(map(lambda x:x.isdigit(),list("sdfa45ads46723")))
[False, False, False, False, True, True, False, False, False, True, True, True,
True, True]
>>> reduce(lambda x,y:x+y,(list(map(lambda x:x.isdigit(),list("sdfa45ads46723"))
)))
7
>>> reduce(lambda x,y:x+y,list(map(lambda x:len(x),filter(lambda x:x.isdigit(),[
i for i in s][::-1]))))
7
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值