当前位置: 首页 > 编程日记 > 正文

你不知道的18个Python高效编程技巧

来源 | Python编程时光

初识Python语言,觉得python满足了我上学时候对编程语言的所有要求。python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的不行不行的,终于解脱了。高级语言,如果做不到这样,还扯啥高级呢?

交换变量

>>>a=3>>>b=6

这个情况如果要交换变量在c++中,肯定需要一个空变量。但是python不需要,只需一行,大家看清楚了

>>>a,b=b,a>>>print(a)
>>>6>>>ptint(b)
>>>5


字典推导(Dictionary comprehensions)和集合推导(Set comprehensions)

大多数的Python程序员都知道且使用过列表推导(list comprehensions)。如果你对list comprehensions概念不是很熟悉——一个list comprehension就是一个更简短、简洁的创建一个list的方法。

>>> some_list = [1, 2, 3, 4, 5]>>> another_list = [ x + 1 for x in some_list ]>>> another_list
[2, 3, 4, 5, 6]

自从python 3.1 起,我们可以用同样的语法来创建集合和字典表:

>>> # Set Comprehensions
>>> some_list = [1, 2, 3, 4, 5, 2, 5, 1, 4, 8]>>> even_set = { x for x in some_list if x % 2 == 0 }>>> even_set
set([8, 2, 4])>>> # Dict Comprehensions>>> d = { x: x % 2 == 0 for x in range(1, 11) }>>> d
{1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False, 10: True}

在第一个例子里,我们以some_list为基础,创建了一个具有不重复元素的集合,而且集合里只包含偶数。而在字典表的例子里,我们创建了一个key是不重复的1到10之间的整数,value是布尔型,用来指示key是否是偶数。

这里另外一个值得注意的事情是集合的字面量表示法。我们可以简单的用这种方法创建一个集合:

>>> my_set = {1, 2, 1, 2, 3, 4}>>> my_set
set([1, 2, 3, 4])

而不需要使用内置函数set()。

计数时使用Counter计数对象

这听起来显而易见,但经常被人忘记。对于大多数程序员来说,数一个东西是一项很常见的任务,而且在大多数情况下并不是很有挑战性的事情——这里有几种方法能更简单的完成这种任务。

Python的collections类库里有个内置的dict类的子类,是专门来干这种事情的:

>>> from collections import Counter
>>> c = Counter('hello world')>>> c
Counter({'l': 3, 'o': 2, ' ': 1, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1})>>> c.most_common(2)
[('l', 3), ('o', 2)]

漂亮的打印出JSON

JSON是一种非常好的数据序列化的形式,被如今的各种API和web service大量的使用。使用python内置的json处理,可以使JSON串具有一定的可读性,但当遇到大型数据时,它表现成一个很长的、连续的一行时,人的肉眼就很难观看了。

为了能让JSON数据表现的更友好,我们可以使用indent参数来输出漂亮的JSON。当在控制台交互式编程或做日志时,这尤其有用:

>>> import json>>> print(json.dumps(data))  # No indention
{"status": "OK", "count": 2, "results": [{"age": 27, "name": "Oz", "lactose_intolerant": true}, {"age": 29, "name": "Joe", "lactose_intolerant": false}]}>>> print(json.dumps(data, indent=2))  # With indention{"status": "OK","count": 2,"results": [{"age": 27,"name": "Oz","lactose_intolerant": true},{"age": 29,"name": "Joe","lactose_intolerant": false}]}

同样,使用内置的pprint模块,也可以让其它任何东西打印输出的更漂亮。

解决FizzBuzz

前段时间Jeff Atwood 推广了一个简单的编程练习叫FizzBuzz,问题引用如下:

写一个程序,打印数字1到100,3的倍数打印“Fizz”来替换这个数,5的倍数打印“Buzz”,对于既是3的倍数又是5的倍数的数字打印“FizzBuzz”。

这里就是一个简短的,有意思的方法解决这个问题:

for x in range(1,101):print"fizz"[x%3*len('fizz')::]+"buzz"[x%5*len('buzz')::] or x

if 语句在行内

print "Hello" if True else "World"
>>> Hello


连接

下面的最后一种方式在绑定两个不同类型的对象时显得很cool。

nfc = ["Packers", "49ers"]
afc = ["Ravens", "Patriots"]
print nfc + afc
>>> ['Packers', '49ers', 'Ravens', 'Patriots']print str(1) + " world"
>>> 1 worldprint `1` + " world"
>>> 1 worldprint 1, "world"
>>> 1 world
print nfc, 1
>>> ['Packers', '49ers'] 1

数值比较

这是我见过诸多语言中很少有的如此棒的简便法

x = 2
if 3 > x > 1:print x
>>> 2
if 1 < x > 0:print x
>>> 2

同时迭代两个列表

nfc = ["Packers", "49ers"]
afc = ["Ravens", "Patriots"]
for teama, teamb in zip(nfc, afc):print teama + " vs. " + teamb
>>> Packers vs. Ravens
>>> 49ers vs. Patriots

带索引的列表迭代

teams = ["Packers", "49ers", "Ravens", "Patriots"]
for index, team in enumerate(teams):print index, team
>>> 0 Packers
>>> 1 49ers
>>> 2 Ravens
>>> 3 Patriots

列表推导式

已知一个列表,我们可以刷选出偶数列表方法:

numbers = [1,2,3,4,5,6]
even = []
for number in numbers:if number%2 == 0:even.append(number)

转变成如下:

numbers = [1,2,3,4,5,6]
even = [number for number in numbers if number%2 == 0]

字典推导

和列表推导类似,字典可以做同样的工作:

teams = ["Packers", "49ers", "Ravens", "Patriots"]
print {key: value for value, key in enumerate(teams)}
>>> {'49ers': 1, 'Ravens': 2, 'Patriots': 3, 'Packers': 0}

初始化列表的值

items = [0]*3
print items
>>> [0,0,0]

列表转换为字符串

teams = ["Packers", "49ers", "Ravens", "Patriots"]
print ", ".join(teams)
>>> 'Packers, 49ers, Ravens, Patriots'

从字典中获取元素

我承认try/except代码并不雅致,不过这里有一种简单方法,尝试在字典中查找key,如果没有找到对应的alue将用第二个参数设为其变量值。

data = {'user': 1, 'name': 'Max', 'three': 4}
try:is_admin = data['admin']
except KeyError:is_admin = False

替换成这样

data = {'user': 1, 'name': 'Max', 'three': 4}
is_admin = data.get('admin', False)

获取列表的子集

有时,你只需要列表中的部分元素,这里是一些获取列表子集的方法。

x = [1,2,3,4,5,6]
#前3个
print x[:3]
>>> [1,2,3]
#中间4个
print x[1:5]
>>> [2,3,4,5]
#最后3个
print x[3:]
>>> [4,5,6]
#奇数项
print x[::2]
>>> [1,3,5]
#偶数项
print x[1::2]
>>> [2,4,6]

除了python内置的数据类型外,在collection模块同样还包括一些特别的用例,在有些场合Counter非常实用。如果你参加过在这一年的Facebook HackerCup,你甚至也能找到他的实用之处。

from collections import Counter
print Counter("hello")
>>> Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})

迭代工具

和collections库一样,还有一个库叫itertools,对某些问题真能高效地解决。其中一个用例是查找所有组合,他能告诉你在一个组中元素的所有不能的组合方式

from itertools import combinations
teams = ["Packers", "49ers", "Ravens", "Patriots"]
for game in combinations(teams, 2):print game
>>> ('Packers', '49ers')
>>> ('Packers', 'Ravens')
>>> ('Packers', 'Patriots')
>>> ('49ers', 'Ravens')
>>> ('49ers', 'Patriots')
>>> ('Ravens', 'Patriots')

False == True

比起实用技术来说这是一个很有趣的事,在python中,True和False是全局变量,因此:

False = True
if False:print "Hello"
else:print "World"
>>> Hello

原文:Improving Your Python Productivity

推荐三个网站

1.Python进阶知识: http://python.iswbm.com

2.Python魔法技巧: http://magic.iswbm.com

3.PyCharm 手册: http://pycharm.iswbm.com

更多精彩推荐
  • GitHub多次霸榜,两个月拿下10000+Star,他说基础软件不开源必死无疑

  • 达摩院NLP团队斩获六项世界冠军背后,让AI没有难懂的语言

  • 万字长文总结机器学习的模型评估与调参 | 附代码下载

  • “Talk is cheap, show me the code”你一行代码有多少漏洞?

  • 科普 | 定义 Eth2.0 中的验证者质量

相关文章:

Alisql源码编译安装(详细篇)

前言 AliSQL 在 2016 云栖大会宣布开放源代码之后&#xff0c;迅速就获得了广泛的关注&#xff0c;目前(2016-10-27) star 数目已达 1187&#xff0c;欢迎访问 AliSQL GitHub 项目关注。社区反应也非常活跃&#xff0c;在 Issue 中提了不少反馈建议&#xff0c;其中有一部分是和…

如何给DataGrid添加自动增长列

作者&#xff1a; cuike519的专栏 http://blog.csdn.net/cuike519/我想我们都知道在数据库中如何添加自增长列&#xff0c;我们可以将这个自增长列绑定到DataGrid上使得用户方便的知道现在是第几行&#xff0c;今天我介绍一种不用数据库就可以简单显示出自增长列的方法&…

达摩院NLP团队斩获六项世界冠军背后,让AI没有难懂的语言

2018年末&#xff0c;BERT横空出世&#xff0c;它采用自编码对句子进行表示&#xff0c;通过预测掩盖词和上下句之间的关系作为语言模型学习任务&#xff0c;使用更多的数据&#xff0c;更大的模型&#xff0c;在多个自然语言处理&#xff08;NLP&#xff09;任务中显著超越之前…

提权巧用RAR.EXE

rar.exe是什么&#xff1f;它就是大名鼎鼎的winrar自带的命令行解压程序。在提权中我们经常要下载各种敏感文件&#xff0c;比如:SU目录。你想一下&#xff0c;如果su目录文件这么多&#xff0c;难道你要一个个的下载&#xff1f;&#xff1f;这明显就很麻烦&#xff0c;有了ra…

OSGI企业应用开发(二)Eclipse中搭建Felix运行环境

上篇文章介绍了什么是OSGI以及使用OSGI构建应用的优点&#xff0c;接着介绍了两款常用的OSGI实现&#xff0c;分别为Apache Felix和Equinox&#xff0c;接下来开始介绍如何在Eclipse中使用Apache Felix和Equinox搭建OSGI运行环境。 一、搭建Apache Felix运行环境 上篇文章中介绍…

马斯克脑机接口、BrainOS相继发布,不努力也能有出路了

作者 | 马超责编 | Carol封图 | CSDN 下载自视觉中国在北京时间的8月29日凌晨&#xff0c;钢铁侠埃隆马斯克投资1亿多美元的脑机接口初创公司公司Neuralink&#xff08;http://www.neurolink.company/&#xff09;进行了一次现场发布会&#xff0c;展示新一代的脑机接口设备。这…

C语言单向链表的实现

一个简单结点的结构体表示为&#xff1a;struct note{int data&#xff1b; /*数据成员可以是多个不同类型的数据*/struct note *next&#xff1b; /*指针变量成员只能是-个*/}&#xff1b; 一个简单的单向链表的图示1&#xff0e;链表是结构、指针相结合…

Java开发常用Linux命令

1.查找文件 find / -name filename.txt根据名称查找/目录下的filename.txt文件。 find . -name "*.xml"递归查找所有的xml文件 find . -name "*.xml" |xargs grep "hello world"递归查找所有文件内容中包含hello world的xml文件 grep -H spring …

数据库开发基本操作-安装Sql Server 2005出现“性能监视器计数器要求”错误解决方法...

今天在安装SQL Server 2005时&#xff0c;出现“性能监视器计数器要求”错误&#xff0c;因为以前出现过这种错误&#xff0c;得到了解决。今天又又出现这种错误&#xff0c;但并不是很清楚当时的解决办法&#xff0c;所以这次把解决方法记录下来&#xff0c;供自己以后参考&am…

华为昇腾师资培训沙龙·南京场 |华为昇腾 ACL 语言开发实践全程干货来了!看完就实操系列...

自今年疫情以来&#xff0c;AI 技术加速进入了人们的视线&#xff0c;在抗疫过程中发挥了重要作用&#xff0c;产业发展明显提速&#xff0c;我国逐步走出了一条由需求导向引领商业模式创新、市场应用倒逼基础理论和关键技术创新的发展道路&#xff0c;AI 人才的争夺战也正式打…

设计模式之C#实现---Builder

作者&#xff1a;cuike519的专栏 http://blog.csdn.net/cuike519/我们将要介绍一个和它比较像的创建型模式 Builder &#xff08;至于关于 Builder 的详细内容您可以参考 GOF 的书&#xff0c;在这里不重复了。&#xff09;。在 GOF 的书里 Builder 的目的是这样的&#xff1…

微信小程序开发之不能使用eval函数的问题

2019独角兽企业重金招聘Python工程师标准>>> 一 eval函数问题 JavaScript中的eval函数是颇受开发者争议的问题之一&#xff0c;问题主要在于其可能导致的不安全性。有关此方面问题&#xff0c;在此不再赘述&#xff0c;读者可能很容易地浏览到许多介绍性文章。 但是…

设计模式之C#实现--FactoryMethod

作者&#xff1a;cuike519的专栏 http://blog.csdn.net/cuike519/工厂方法的目的很明确就是定义一个用来创建对象的接口&#xff0c;但是他不直接创建对象&#xff0c;而由他的子类来创建&#xff0c;这样一来就将创建对象的责任推迟到了该接口的子类中&#xff0c;创建什么类…

美国AI博士指出,自学Python到底能做什么

我见过市面上很多的 Python 讲解教程和书籍&#xff0c;他们大都这样讲 Python 的&#xff1a;先从 Python 的发展历史开始&#xff0c;介绍 Python 的基本语法规则&#xff0c;Python 的 list, dict, tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0…

关于微博溯源的后续问题

1、在进行关键词搜索的时候&#xff0c;如何分词&#xff0c;我们不可能用语料库进行匹配&#xff0c;已没有语料可以学习。 2、关于转折点的寻找。目前我们使用高级搜索&#xff0c;从当前时间往前推&#xff0c;根据搜索到微博的条数变化&#xff0c;确定时间发生具体时间&am…

python3的数据类型以及模块的含义

python3的数据类型以及模块的含义购物车转载于:https://blog.51cto.com/11834445/1884901

设计模式之C#实现---- ProtoType

作者&#xff1a; cuike519的专栏 http://blog.csdn.net/cuike519/该模式的意图是&#xff1a;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。那么首先我们应该已经有了一个对象&#xff0c;同时这个对象还支持自我复制&#xff08;科隆&…

快速排序(二)最后修改

1 //2012-07-162 void quickSort(element list[], int left, int right)//快速排序3 {4 int ileft;5 int jright;6 7 if(i > j) //判断需要i<j8 return;9 10 element templist[i]; 11 12 while(i<j) 13 { 14 while(i<j …

性能超越GPU、FPGA,华人学者提出软件算法架构加速AI实时化

作者 | 王言治&#xff0c;美国东北大学电子与计算机工程系助理教授出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近年来&#xff0c;机器学习(Machine Learning)领域的研究和发展可谓是与日俱新&#xff0c;各式各样与机器学习相关的研究成果与应用层出不穷&#…

PHP获取毫秒时间戳,利用microtime()函数

PHP获取毫秒时间戳&#xff0c;利用microtime()函数 php本身没有提供返回毫秒数的函数&#xff0c;但提供了一个microtime()函数&#xff0c;借助此函数&#xff0c;可以很容易定义一个返回毫秒数的函数。php的毫秒是没有默认函数的&#xff0c;但提供了一个microtime()函数&am…

.NET中添加控件数组

作者&#xff1a;cuike519的专栏 http://blog.csdn.net/cuike519/添加控件数组 在.NET里面我好像没有找到有关于控件数组的说明,但是前两天偶在网上看到了一篇关于如何在.NET里面实现控件数组的文章(该文章请参看MSDN).记得大学的时候在使用VB的时候使用过控件数组,可是到了…

如何在机器学习的框架里实现隐私保护?

编者按&#xff1a;数据时代&#xff0c;人们从技术中获取便利的同时&#xff0c;也面临着隐私泄露的风险。微软倡导负责任的人工智能&#xff0c;因此机器学习中的隐私保护问题至关重要。本文介绍了目前机器学习中隐私保护领域的最新研究进展&#xff0c;讨论了机密计算、模型…

函数图像轻松画:教你用永中图象

函数图像轻松画&#xff1a;教你用永中图象 函数图像轻松画&#xff1a;教你用永中图象转载于:https://blog.51cto.com/premium/933220

c语言语系的命名风格和java系命名风格

c语言系的命名风格&#xff1a;单词之间使用下划线分隔。如上图。 java语言是另外一个系&#xff0c;javascript属于java语系(当年就是想借助java的名气所以命名javascript)。java语系是驼峰式命名法&#xff0c;如getElementById()。如果使用c语系命名风格则使用下划线分隔 ge…

全国IP地址分配表

xa.sn.cn,西安公众网,西安,陕西,CN,202.100.0.* xa.sn.cn,西安公众网,西安,陕西,CN,202.100.1.* xa.sn.cn,西安公众网,西安,陕西,CN,202.100.2.* xa.sn.cn,西安公众网,西安,陕西,CN,202.100.3.* xa.sn.cn,西安公众网,西安,陕西,CN,202.100.4.* xa.sn.cn,西安公众网,西安,陕西,C…

神同步!美国三地 Tesla 车主,自动驾驶都撞了警车

来源 | HyperAI超神经&#xff08;ID&#xff1a;HyperAI&#xff09;内容概要&#xff1a;上周在美国北卡州发生了一起交通事故&#xff0c;一辆自动驾驶模式下的 Tesla 撞击了停靠在路边的警车&#xff0c;虽未造成人员伤亡&#xff0c;但车辆损毁严重。事故调查中发现&#…

Q币才是腾讯真正的世界级产品

本文受《虚拟货币将是下一个大平台》启发而来。何玺认为&#xff0c;腾讯Q币本身就具有全球化虚拟货币的基因。 日前&#xff0c;有媒体报道了Pocket Change获得了由Google Ventures领投的500万美元A轮融资&#xff0c;使其融资总额达到640万美元。 Pocket Change是一个为Andro…

解决Office互操作错误检索COML类工厂中 CLSID为 {xxx}的组件时失败,原因是出现以下错误: 80070005...

Excel为例&#xff08;其他如Word也适用&#xff09;文件数据导入时报出以下错误: 检索COML类工厂中 CLSID为 {00024500-0000-0000-C000-000000000046}的组件时失败&#xff0c;原因是出现以下错误: 80070005&#xff0c;如图所示: 可以看到报出的异常类型为:UnauthorizedAcces…

再论制硬盘逻辑锁

姜卓睿 雷必武 一、序言 由于教学工作需要&#xff0c;本人在参看了贵刊98年第4期《硬盘逻辑锁技术研究及应用》与99年第3期《解开硬盘逻辑死锁的一种有效方法》的文章之后&#xff0c;决定以同类方法尝试一下&#xff0c;结果未获得成功&#xff0c;又“苦于”没有KV300 L …

​我国科学家成功研制全球神经元规模最大的类脑计算机

来源 | 之江实验室&#xff08;ID&#xff1a;zhejianglab&#xff09;9月1日&#xff0c;浙江大学与之江实验室举办成果发布会&#xff0c;共同发布我国首台基于自主知识产权类脑芯片的类脑计算机&#xff08;Darwin Mouse&#xff09;。浙江大学校长吴朝晖院士出席并讲话。他…