开发者社区> dasein58> 正文

20年资深程序员的Python“秘籍”,教你成为其中的“武林高手”

简介:   我列出的这些有用的Python代码片段,为我节省了大量的时间,并且我希望他们也能为你节省一些时间。大多数的这些片段出自寻找解决方案,查找博客和StackOverflow解决类似问题的答案。下面所有的代码片段已经在Python 3中测试。   在Python中调用一个外部命令   有时你需要通过shell或命令提示符调用一个外部命令,这在Python中通过使用subprocess模块很容易实现。
+关注继续查看

  我列出的这些有用的Python代码片段,为我节省了大量的时间,并且我希望他们也能为你节省一些时间。大多数的这些片段出自寻找解决方案,查找博客和StackOverflow解决类似问题的答案。下面所有的代码片段已经在Python 3中测试。

  在Python中调用一个外部命令

  有时你需要通过shell或命令提示符调用一个外部命令,这在Python中通过使用subprocess模块很容易实现。

  只需要运行一条命令:

  import subprocesssubprocess.call(['mkdir', 'empty_folder'])

  如果想运行一条命令并输出得到的结果:

  import subprocessoutput=subprocess.check_output(['ls', '-l'])

  要说明的是上面的调用是阻塞的。

  如果运行shell中内置的命令,如cd或者dir,需要指定标记shell=True:

  import subprocessoutput=subprocess.call(['cd', '/'], shell=True)

  对于更高级的用例,可以使用 Popen constructor。

  Python 3.5引进了一个新的run函数,它的行为与call和check_output很相似。如果你使用的是3.5版本或更高版本,看一看run的文档,里面有一些有用的例子。否则,如果你使用的是Python 3.5以前的版本或者你想保持向后兼容性,上面的call和check_output代码片段是你最安全和最简单的选择。

  美观打印

  开发时使用pprint模块替代标准的print 函数,可以让shell输出的信息更具可读性。这使得输出到shell上的字典和嵌套对象更易读。

  import pprint as ppanimals=[{'animal': 'dog', 'legs': 4, 'breeds': ['Border Collie', 'Pit Bull', 'Huskie']}, {'animal': 'cat', 'legs': 4, 'breeds': ['Siamese', 'Persian', 'Sphynx']}]pp.pprint(animals, width=1)

  width参数指定一行上最大的字符数。设置width为1确保字典打印在单独的行。

  按属性进行数据分组

  假设你查询一个数据库,并得到如下数据:

  data=[{'animal': 'dog', 'name': 'Roxie', 'age': 5},{'animal': 'dog', 'name': 'Zeus', 'age': 6},{'animal': 'dog', 'name': 'Spike', 'age': 9},{'animal': 'dog', 'name': 'Scooby', 'age': 7},{'animal': 'cat', 'name': 'Fluffy', 'age': 3},{'animal': 'cat', 'name': 'Oreo', 'age': 5},{'animal': 'cat', 'name': 'Bella', 'age': 4}]

  通过动物类型分组得到一个狗的列表和一个猫的列表。幸好,Python的itertools有一个groupby函数可以让你很轻松的完成这些。

  from itertools import groupbydata=[{'animal': 'dog', 'name': 'Roxie', 'age': 5},{'animal': 'dog', 'name': 'Zeus', 'age': 6},{'animal': 'dog', 'name': 'Spike', 'age': 9},{'animal': 'dog', 'name': 'Scooby', 'age': 7},{'animal': 'cat', 'name': 'Fluffy', 'age': 3},{'animal': 'cat', 'name': 'Oreo', 'age': 5},{'animal': 'cat', 'name': 'Bella', 'age': 4}]for key, group in groupby(data, lambda x: x['animal']):for thing in group:print(thing['name'] + " is a " + key)

  得到的输出是:

  Roxie is a dogZeus is a dogSpike is a dogScooby is a dogFluffy is a catOreo is a catBella is a cat

  groupby()有2个参数:1、我们想要分组的数据,它在本例中是一个字典。2、分组函数:lambda x: x['animal']告诉groupby函数每个字典按动物的类型分组

  现在通过列表推导式可以很容易地构建一个狗的列表和一个猫的列表:

  from itertools import groupbyimport pprint as ppdata=[{'animal': 'dog', 'name': 'Roxie', 'age': 5},{'animal': 'dog', 'name': 'Zeus', 'age': 6},{'animal': 'dog', 'name': 'Spike', 'age': 9},{'animal': 'dog', 'name': 'Scooby', 'age': 7},{'animal': 'cat', 'name': 'Fluffy', 'age': 3},{'animal': 'cat', 'name': 'Oreo', 'age': 5},{'animal': 'cat', 'name': 'Bella', 'age': 4}]grouped_data={}for key, group in groupby(data, lambda x: x['animal']):grouped_data[key]=[thing['name'] for thing in group]pp.pprint(grouped_data)

  最后得到一个按动物类型分组的输出:

  {'cat': ['Fluffy','Oreo','Bella'],'dog': ['Roxie','Zeus','Spike','Scooby']}

  StackOverflow上这个问题的答案非常有帮助,当我试图找出如何以最Pythonic的方式分组数据时,这篇文章节省了我很多时间。

  删除列表中的重复元素

  Python中用一行代码快速简单的删除一个列表中的重复元素(不维持顺序):

  x=[1, 8, 4, 5, 5, 5, 8, 1, 8]list(set(x))

  这个方法利用了set是一个不同的对象的文凭集合这一事实。然而,set不维持顺序,

  因此如果你在乎对象的顺序,使用下面的技术:

  from collections import OrderedDictx=[1, 8, 4, 5, 5, 5, 8, 1, 8]list(OrderedDict.fromkeys(x))

  访问Python的For循环的索引

  对于许多人来说这可能是常识,但这也是经常问的。Python的内置enumerate 函数提供索引和值的访问如下:

  x=[1, 8, 4, 5, 5, 5, 8, 1, 8]for index, value in enumerate(x):print(index, value)

  通过指定enumerate函数的start参数改变起始索引:

  x=[1, 8, 4, 5, 5, 5, 8, 1, 8]for index, value in enumerate(x, start=1):print(index, value)

  现在该索引从1到9而不是0到8

  并行遍历2个集合

  使用内置zip函数同时遍历2个列表,字典,等。下面是使用zip函数同时遍历2个列表的例子:

  a=[1, 2, 3]b=[4, 5, 6]for (a_val, b_val) in zip(a, b):print(a_val, b_val)

  将输出:

  1 42 53 6

  创建对象的Copy

  Python中可以使用通用的copy函数复制一个对象。浅拷贝是通过使用copy.copy调用的:

  import copynew_list=copy.copy(old_list)

  深拷贝:

  import copynew_list=copy.deepcopy(old_list)

  这个StackOverflow问题对于复制一个列表的各种方法给出了很好的解释。如果你不熟悉浅拷贝和深拷贝之间的差异看一看这个解释。

  浮点除法

  通过将分子或分母转换为float类型,可以确保浮点除法:

  answer=a/float(b)

  字符串和日期相互转换

  一个常见的任务是将一个字符串转换为一个datetime对象。使用strptime 函数这将很容易做到:

  from datetime import datetimedate_obj=datetime.strptime('May 29 2022 2:45PM', '%B %d %Y %I:%M%p')

  它的逆操作是转换一个datetime对象为一个格式化的字符串,对datetime对象使用strftime函数:

  from datetime import datetimedate_obj=datetime.now()date_string=date_obj.strftime('%B %d %Y %I:%M%p')

  有关格式化代码的列表和他们的用途,查看官方文档

  解析JSON文件并写一个对象到JSON文件中

  使用load函数可以解析JSON文件并构建一个Python对象。假定有一个叫做data.json的文件包括以下数据:

  {"dog": {"lives": 1,"breeds": ["Border Collie","Pit Bull","Huskie"]},"cat": {"lives": 9,"breeds": ["Siamese","Persian","Sphynx"]}}import jsonwith open('data.json') as input_file:data=json.load(input_file)

  现在data是一个对象,你可以操作它像任何Python对象一样:

  print(data'cat')output: 9

  可以使用dump函数,将Python中的字典写入JSON文件中:

  import jsondata={'dog': {'legs': 4, 'breeds': ['Border Collie', 'Pit Bull', 'Huskie']}, 'cat': {'legs': 4, 'breeds': ['Siamese', 'Persian', 'Sphynx']}}with open('data.json', 'w') as output_file:json.dump(data, output_file, indent=4)

  缩进参数美观打印JSON字符串以便输出更容易阅读。在这种情况下,我们指定缩进4个空格。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python程序员的30个常见错误
在这篇文章中,我将总结新老Python程序员常犯的一些错误,以帮助你们在自己的工作避免犯同样或类似错误。
1947 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
20361 0
为什么 Python 对程序员重要?
为什么 Python 对程序员重要?
2871 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
13817 0
程序员的我是如何抢票的(Python)
马上就要回家过年了,你的票买好了吗。 虽然我不用抢票,但是还是研究了一下怎么抢票。 程序员嘛,就是要对一切问题进行解构,探索原理本质,寻找规律,将其自动化。
1732 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18643 0
程序员学Python算法编程中常见的问题和算法
  一些著名问题与算法   如果您的飞船破了一个洞,我只能深表同情,因为我所解决的99个问题里唯独没有这个问题。   ——匿名者1   本文提到的所有问题与算法,因为有一些算法仅仅是为了试图说明某个原理,而有一些问题仅仅是为了某个算法而创造的。然而,作为索引,这里会列举出学习中最重要的那些问题与算法。   在本文大多数描述中,n代表的是问题规模,如一个序列中的元素数量。而在图论问题中,n表示的是节点的数量,m则表示边的数量。
30 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
25056 0
+关注
919
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载