经验丰富程序员才知道的8种高级Python技巧


Posted in Python onJuly 27, 2020

本文将介绍8个简洁的Python技巧,若非经验十足的程序员,你肯定有些从未见过。向着更简洁更高效,出发吧!

经验丰富程序员才知道的8种高级Python技巧

1.通过多个键值将对象进行排序

假设要对以下字典列表进行排序:

people = [ 
{ 'name': 'John', "age": 64 }, 
{ 'name': 'Janet', "age": 34 }, 
{ 'name': 'Ed', "age": 24 }, 
{ 'name': 'Sara', "age": 64 }, 
{ 'name': 'John', "age": 32 }, 
{ 'name': 'Jane', "age": 34 }, 
{ 'name': 'John', "age": 99 }, 
]

不仅要按名字或年龄对其进行排序,还要将两个字段同时进行排序。在SQL中,会是这样的查询:

SELECT * FROM people ORDER by name, age

实际上,这个问题的解决方法可以非常简单,Python保证sort函数提供了稳定的排序顺序,这也意味着比较相似的项将保留其原始顺序。要实现按名字和年龄排序,可以这样做:

import operator 
people.sort(key=operator.itemgetter('age')) 
people.sort(key=operator.itemgetter('name'))

要注意如何反转顺序。首先按年龄分类,然后按名字分类,使用operator.itemgetter()从列表中的每个字典中获取年龄和名字字段,这样你就会得到想要的结果:

[ 
{'name': 'Ed', 'age': 24}, 
{'name': 'Jane', 'age': 34}, 
{'name': 'Janet','age': 34}, 
{'name': 'John', 'age': 32}, 
{'name': 'John', 'age': 64}, 
{'name': 'John', 'age': 99}, 
{'name': 'Sara', 'age': 64} 
]

名字是主要排序项,如果姓名相同,则以年龄排序。因此,所有John都按年龄分组在一起。

2.数据类别

自3.7版之后,Python开始能提供数据类别。比起常规类或其他替代方法(如返回多个值或字典),它有着更多优点:

  • 数据类需要很少的代码
  • 可以比较数据类,因为 __eq__ 可以实现此功能
  • 数据类需要类型提示,减少了发生错误的可能性
  • 可以轻松打印数据类以进行调试,因为__repr__可以实现此功能

这是一个工作中的数据类示例:

from dataclasses import dataclass 
     @dataclass 
     classCard: 
      rank: str 
      suit: str 
      card=Card("Q", "hearts") 
     print(card == card) 
     # True 
     print(card.rank) 
     # 'Q' 
     print(card) 
     Card(rank='Q', suit='hearts')

3.列表推导

列表推导可以在列表填写里代替讨厌的循环,其基本语法为

[ expression for item in list if conditional ]

来看一个非常基本的示例,用数字序列填充列表:

mylist = [i for i inrange(10)] 
    print(mylist) 
    # [0, 1, 2, 3,4, 5, 6, 7, 8, 9]

因为可以使用表达式,所以你还可以进行一些数学运算:

squares = [x**2for x inrange(10)] 
    print(squares) 
    # [0, 1, 4, 9,16, 25, 36, 49, 64, 81]

甚至能调用外部函数:

defsome_function(a): 
        return (a +5) /2 
        
       my_formula= [some_function(i) for i inrange(10)] 
       print(my_formula) 
       # [2.5, 3.0,3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0]

最后,可以使用if函数来筛选列表。在这种情况下,只保留可被2除的值:

filtered = [i for i inrange(20) if i%2==0] 
    print(filtered) 
    # [0, 2, 4, 6,8, 10, 12, 14, 16, 18]

4.检查对象的内存使用情况

使用sys.getsizeof()可以检查对象的内存使用情况:

import sys 
     mylist =range(0, 10000) 
   print(sys.getsizeof(mylist)) 
   # 48

为什么这个庞大的列表只有48个字节?这是因为range函数返回的类表现为列表。与使用实际的数字列表相比,数序列的存储效率要高得多。我们可以通过列表推导来创建相同范围内的实际数字列表:

import sys 
     myreallist = [x for x inrange(0, 10000)] 
   print(sys.getsizeof(myreallist)) 
   # 87632

通过使用sys.getsizeof(),我们可以了解更多关于Python和内存使用情况的信息。

5.查找最频繁出现的值

要查找列表或字符串中最频繁出现的值:

test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4] 
  print(max(set(test), key = test.count)) 
  # 4
  • max()将返回列表中的最大值。key参数采用单个参数函数自定义排序顺序,在本例中为test.count,该函数适用于迭代器上的每个项目。
  • test.count是list的内置功能。它接受一个参数,并计算该参数的出现次数。因此test.count(1)将返回2,而test.count(4)将返回4。
  • set(test)返回test中的所有唯一值,所以{1、2、3、4}

那么在这一行代码将接受test的所有唯一值,即{1、2、3、4}。接下来,max将对其应用list.count 函数并返回最大值。

还有一种更有效的方法:

from collections import Counter 
Counter(test).most_common(1) 
# [4: 4]

6.属性包

你可以使用attrs代替数据类,选择attrs有两个原因:

  • 使用的Python版本高于3.7
  • 想要更多功能

Theattrs软件包支持所有主流Python版本,包括CPython 2.7和PyPy。一些attrs可以提供验证器和转换器这种超常规数据类。来看一些示例代码:

@attrs 
   classPerson(object): 
    name =attrib(default='John') 
    surname =attrib(default='Doe') 
    age =attrib(init=False) 
    p =Person() 
   print(p) 
   p=Person('Bill', 'Gates') 
   p.age=60 
   print(p) 
     # Output: 
   # Person(name='John', surname='Doe',age=NOTHING) 
   # Person(name='Bill', surname='Gates', age=60)

实际上,attrs的作者已经在使用引入数据类的PEP了。数据类被有意地保持得更简单、更容易理解,而attrs 提供了可能需要的所有特性。

7.合并字典(Python3.5+)

dict1 = { 'a': 1, 'b': 2 } 
  dict2= { 'b': 3, 'c': 4 } 
  merged= { **dict1, **dict2 } 
  print (merged) 
  # {'a': 1, 'b':3, 'c': 4}

如果有重叠的键,第一个字典中的键将被覆盖。在Python 3.9中,合并字典变得更加简洁。上面Python 3.9中的合并可以重写为:

merged = dict1 | dict2

 8.返回多个值

Python中的函数在没有字典,列表和类的情况下可以返回多个变量,它的工作方式如下:

defget_user(id): 
      # fetch user from database 
      # .... 
      return name, birthdate 
     name, birthdate =get_user(4)

这是有限的返回值,但任何超过3个值的内容都应放入一个(数据)类。

这8个小技巧足够你好好消化一阵儿啦!

到此这篇关于经验丰富程序员才知道的8种高级Python技巧的文章就介绍到这了,更多相关程序员必知Python技巧内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
5种Python单例模式的实现方式
Jan 14 Python
Python正则表达式使用范例分享
Dec 04 Python
5个很好的Python面试题问题答案及分析
Jan 19 Python
Python字符串内置函数功能与用法总结
Apr 16 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 Python
python selenium爬取斗鱼所有直播房间信息过程详解
Aug 09 Python
python点击鼠标获取坐标(Graphics)
Aug 10 Python
python 内置函数汇总详解
Sep 16 Python
Python编程快速上手——正则表达式查找功能案例分析
Feb 28 Python
Python 从attribute到property详解
Mar 05 Python
Python常用类型转换实现代码实例
Jul 28 Python
如何利用Python写个坦克大战
Nov 18 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
Jul 27 #Python
基于python实现MQTT发布订阅过程原理解析
Jul 27 #Python
Windows 平台做 Python 开发的最佳组合(推荐)
Jul 27 #Python
Python性能分析工具py-spy原理用法解析
Jul 27 #Python
python下载的库包存放路径
Jul 27 #Python
Python基础教程之输入输出和运算符
Jul 26 #Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 #Python
You might like
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
php面向对象重点知识分享
2019/09/27 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
2015/11/18 Javascript
详解javascript实现自定义事件
2016/01/19 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
java遇到微信小程序 "支付验证签名失败" 问题解决
2019/12/22 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
理解Python中函数的参数
2015/04/27 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
Python八皇后问题解答过程详解
2019/07/29 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
如何基于python操作excel并获取内容
2019/12/24 Python
Python如何存储数据到json文件
2020/03/09 Python
python集合的新增元素方法整理
2020/12/07 Python
Python读写Excel表格的方法
2021/03/02 Python
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
大众服装店创业计划书范文
2014/01/01 职场文书
课程设计的心得体会
2014/09/03 职场文书
美术教师求职信范文
2015/03/20 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
Python打包exe时各种异常处理方案总结
2021/05/18 Python
浅谈Redis的事件驱动模型
2022/05/30 Redis