一句话搞定python六剑客
六剑客
一行搞定六剑客:三个函数:map filter reduce + lambda 切片 推导列表
python最有特点的一行代码,所有代码均可以借用一行代码(目标)
1.map(函数,列表或者字符串)#字符串或者列表中每个字符或每个元素都带入函数运算
1.map函数:
输出结果为列表
1)列表元素的map运算,
>>> map(s,[1,2,3])
[2, 3, 4]
2)字符串元素的map运算,函数用lambda实现
>>> map(lambda x:x.upper(),"abc")
['A', 'B', 'C']
3)函数自定义,应用自定义函数套用将列表或字符串中每个元素输出,
实例:自定义函数map
>>> def uppercase(s):
... if s>='A' and s<='Z':
... return s
... else:
... return ""
...
>>> print "".join(map(uppercase,"AABBabAN"))
AABBAN
实例:使用map函数,将一个字符串中的小写字母删除掉,例如:“AABBaabb”,
结果返回"AABB"
def delete_lowercase(s):
if s>='a' and s<="z":
return ""
else:
return s
print "".join(map(delete_lowercase,"AABBaabb"))
>>> "".join([i for i in map(lambda x:(re.match(r"[ACDEFGHIJKLMNOPQRSTUVWXYZ]*",x).group()),"asdASD") if i!=""])
'ASD'、
2.filter 两个参数(自定义函数名,列表)对列表中的元素过滤后输出
filter实例:
>>> def uppercase(s):
... if s>='A' and s<='Z':
... return s
... else:
... return ""
...
>>> print "".join(map(uppercase,"AABBabAN"))
AABBAN
>>> print "".join(filter(uppercase,"AABBabFN"))
AABBFN
>>>
实例:
filter(lambda x:x in string.uppercase,"AAaaSSBB")
reduce(lambda x,y:x+y,range(1,101))
3、reduce (函数名,列表)将列表中的元素逐一累计
累加
>>> print reduce(lambda x,y:x+y,range(1,101))
5050
阶乘
>>> print reduce(lambda x,y:x*y,range(1,5))
24
>>> print reduce(lambda x,y:x*y,range(1,7))
720
实例:
list_a=[1,1,1,3,5,6,8]
func=lambda x,y:x if y in x else x + [y]
print reduce(func,[[],]+list_a)
4.lambda函数,变量:运算表达式:将变量按运算表达式运算后输出
语法:变量:运算表达式 如 x:x+1
引用: 函数名(变量赋值) a(1)
>>> a=lambda x:x+1
>>> a(4)
5
>>> a=lambda x,y,z:(x+y)*z
>>> a(1,1,4)
8
>>> a=lambda x:s*x
>>> s=1
>>> a(5)
两个参数lambda函数
import string
fp = open("e:\\1.txt","w")
content=map(lambda x,y:x+","+str(y)+"\n",list(string.lowercase),range(1,27))
fp.writelines(content)
list_a=[1,1,1,3,5,6,8]
func=lambda x,y:x if y in x else x + [y]
print reduce(func,[[],]+list_a)
5.推导列表 结果表达式+范围+条件
[str(a)*i for i in range(1,times+1)]
实例:将列表中的每个元素变为重复字符串,如1 变为 a 2变为 aa 3变为aaa
a=int(raw_input("input a value:"))
times=int(raw_input("input count times:"))
print u"总和为:",eval("+".join([str(a)*i for i in range(1,times+1)]))
字符串转换后 用+合并 并用eval 转为求和
列表推导式是Python基础,好用,而又非常重要的功能,也是最受欢迎的Python特性之一,可以说掌握它是成为合格Python程序员的基本标准。本质上可以把列表推导式理解成一种集合了变换和筛选功能的函数,通过这个函数把一个列表转换成另一个列表。注意是另一个新列表,原列表保持不变。
看示例:
(1)对列表中的每项元素进行立方运算(变换功能)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [x ** 3 for x in a]
print(a)
print(b)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
(2)对列表中为偶数的元素进行立方运算(带筛选条件的变换功能)
a= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [x ** 3 for x in a if x % 2 == 0]
print(b)
[8, 64, 216, 512, 1000]
从结果上可以看出有筛选条件的话是先筛选再变换,即先筛掉不满足条件的元素,再进行变换运算。可以同时加多个筛选条件,如对大于5的且是偶数的元素进行立方运算,示例如下:
a= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [x ** 3 for x in a if x % 2 == 0 if x > 5]
print(b)
[216, 512, 1000]
(3)与zip结合
将a,b两个列表中相对应得值组合起来,形成一个新列表。例如包含x坐标的列表与y坐标的列表形成相对应的点坐标[x, y]列表。
a= [-1, -2, -3, -4, -5, -6, -7, -8, -9, -10]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
xy = [[x, y] for x, y in zip(a, b)]
print(xy)
[[-1, 1], [-2, 2], [-3, 3], [-4, 4], [-5, 5], [-6, 6], [-7, 7], [-8, 8], [-9, 9], [-10, 10]]
(4)支持多层for循环
将一个嵌套列表转换成一个一维列表。
a= [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [j for i in a for j in i]
print(b)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Python中还有字典推导式、集合推导式等,与列表推导式使用方式大致相同。
列表推导式的使用非常广泛,从实际使用经验来看,列表推导式使用的频率是非常高的,也是相当好用的。而对于列表推导式的多层for循环,尤其是3层以上的或带复杂筛选条件的,牺牲了较多的可读性,直接用多个普通for循环方式实现就可以了,毕竟方便的实现功能是第一位的,多几行代码就多几行吧。
实例:杨辉三角:
#coding=utf-8
def yhtriangle(n):
l=[1]
print l
while n>0:
l=[1]+[x+y for x,y in zip(l[:],l[1:])]+[1]
n-=1
print l
yhtriangle(10)
6、切片
切片语法如下:
s[begin : end : stride]
与简单切片语法相比,扩展切片只是增加了第3个参数,即步长参数(英文资料中通常称为"stride"或"step")。
扩展切片语法引入的"stride"参数是个需要特别注意的参数,因为它的正/负取值将会影响切片操作对源序列s的访问方向,而这正是本文开始那几个示例可能引起Python新手困惑的原因。
其实规则很简单,说穿不值一文钱:
1) 当stride参数为正值(positive)时,表明切片操作从左至右(即正向)访问源序列s的元素,此时,若begin和end参数有缺省,则Python解释器默认将其设置为None。如s[0 : : 1]会被解释器当作s[0 : None : 1],此时,end实际取值要大于其有效索引范围的上限值,以保证切片操作能访问到源序列s从begin开始的所有元素(从左向右)。
2) 当stride参数为负值(negative)时,表明切片操作从右至左(即逆向)访问源序列s的元素,此时,若begin和end参数有缺省,则Python解释器默认将其设置为None。如s[-1 : : -1]会被解释器当作s[-1 : None : -1],此时,end实际取值要小于其有效索引范围的下限值,已保证切片操作能访问到源序列s从begin开始的所有元素(逆向,从右向左)。
3) 无论stride参数取正值还是负值,切片表达式的begin和end索引值需要保证在切片操作的访问方向上,从begin到end之间有元素,这样切片操作才能保证返回非空集。
s[4,8,1]
切片实例:
import os
os.system("ls -al > a.txt")
with open("a.txt") as fp:
for i in fp:
if "1.py" in i:
print i.split()[-2]#倒数第二位
break
>>> l=[1,2,3,4,5,6]
>>> l[:]
[1, 2, 3, 4, 5, 6]
>>> l[1:]
[2, 3, 4, 5, 6]
l[:]
l[1:]
一句话搞定python六剑客的更多相关文章
- AFNetworking3.0+MBProgressHUD二次封装,一句话搞定网络提示
对AFNetworking3.0+MBProgressHUD的二次封装,使用更方便,适用性非常强: 一句话搞定网络提示: 再也不用担心网络库更新后,工程要修改很多地方了!网络库更新了只需要更新这个封装 ...
- 【高德地图API】一句话搞定webmap(一)——轻地图组件
原文:[高德地图API]一句话搞定webmap(一)——轻地图组件 摘要: 遥想当年,在APP中加入LBS元素相当困难:要刻苦学习java,要刻苦学习iOS开发,要刻苦学习javascript…… 而 ...
- 一句话搞定webmap(一)——轻地图组件
摘要: 遥想当年.在APP中增加LBS元素相当困难:要刻苦学习java,要刻苦学习iOS开发,要刻苦学习javascript-- 而现在.要制作一张地图真是越来越easy了!居然仅仅须要一句话.就能够 ...
- 转载 12步轻松搞定python装饰器
作者: TypingQuietly 原文链接: https://www.jianshu.com/p/d68c6da1587a 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定pyt ...
- Python高级特性: 12步轻松搞定Python装饰器
12步轻松搞定Python装饰器 通过 Python 装饰器实现DRY(不重复代码)原则: http://python.jobbole.com/84151/ 基本上一开始很难搞定python的装 ...
- 12步轻松搞定Python装饰器
译者:寒寻 译文:http://www.cnblogs.com/imshome/p/8327438.html 原文:https://dzone.com/articles/understanding-p ...
- (转载)Android快速开发偷懒必备,一句话搞定所有ViewGroup的Adapter . 支持自定义ViewGroup
[置顶] [Android]快速开发偷懒必备,一句话搞定所有ViewGroup的Adapter . 支持自定义ViewGroup 标签: androidAdapter快速开发0耦合 2016-12-1 ...
- 第4天 | 12天搞定Python,基础语法(下)
为了方便你的学习,减轻负重,我特意将基础语法分成上下两部分.希望你喜欢这种方式,如果不喜欢,你可以跟我说,反正我是不会改的,哈哈~~. 如果上部分,你还没看的话,先去看<第4天 | 12天搞定P ...
- 第10天 | 12天搞定Python,文件操作(超详细)
在开发系统的过程中,经常会用到XML存储和传输数据,XML是一种用于标记电子文件使其具有结构性的标记语言,在博客中经常会见到. JSON是一种轻量级的数据交换格式,常被用在后端和前端的数据交互上,如你 ...
随机推荐
- 网络架构,七层协议,三次握手四次挥手,socket套接字简单编程
一.单机架构 应用领域: 植物大战僵尸 office 二.CS架构 应用领域: QQ 大型网络游戏 计算机发展初期用户去取数据,直接就去主机拿,从这里开始就分出了客户端和服务端. 客户端:用户安装的软 ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- bind函数作用、应用场景以及模拟实现
bind函数 bind 函数挂在 Function 的原型上 Function.prototype.bind 创建的函数都可以直接调用 bind,使用: function func(){ consol ...
- java复习(2)
1.函数的重载:在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不相同就可以. 重载与返回值类型无关,只看参数列表.重载方便阅读,优化了程序的设计 eg://返回两个 整数值的 ...
- Host xxx is not allowed to connect to this MariaDb server
直接复制代码,无需修改 第一:// %:表示从任何主机连接到mysql服务器 GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'pass ...
- kbd_mode - 显示或者设置键盘模式
总览 (SYNOPSIS) kbd_mode [ -auks ] 描述 (DESCRIPTION) 如果 没有 参数 kbd_mode 会 显示 当前 键盘 的 模式, 如果 有 参数, 它会把 键盘 ...
- 通过三层交换机实现不同VLAN间的通信(案例+Cisco模拟器配置)
如图,其中PC1和4位于销售部VLAN10,PC2和PC5位于市场部VLAN20,PC3和PC5位于财务部VLAN30,各主机的IP地址以及子网掩码已列出,下面将讲解如何配置利用三层交换机来实现不同V ...
- ansible 的file 模块
创建.修改.删除文件或者目录: file模块 file模块常用的几个参数:state.path.src.dest.mode.owner.group.name.recurse state后面跟的参数: ...
- 接口开发中 遇到的坑——Java byte与C# byte 数据转换问题
前提: 公司与其他公司进行接口对接 需要使用Byte[]数据流传输数据 原本想法如下:直接IO生成就ok了 using System; using System.IO; using System.Te ...
- Android 静态代码分析工具
简评: 作者在文中提到的三个静态代码分析工具不是互相替代的关系,各有各的侧重点,如果有需要完全可以同时使用. 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程 ...