文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-11 18:10

关注

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

[[334980]]

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

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

 

  1. people = [ 
  2. 'name''John'"age": 64 }, 
  3. 'name''Janet'"age": 34 }, 
  4. 'name''Ed'"age": 24 }, 
  5. 'name''Sara'"age": 64 }, 
  6. 'name''John'"age": 32 }, 
  7. 'name''Jane'"age": 34 }, 
  8. 'name''John'"age": 99 }, 

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

 

  1. SELECT * FROM people ORDER by name, age 

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

 

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

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

 

  1. {'name''Ed''age': 24}, 
  2. {'name''Jane''age': 34}, 
  3. {'name''Janet','age': 34}, 
  4. {'name''John''age': 32}, 
  5. {'name''John''age': 64}, 
  6. {'name''John''age': 99}, 
  7. {'name''Sara''age': 64} 

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

2.数据类别

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

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

 

  1. from dataclasses import dataclass 
  2.                   @dataclass 
  3.                  classCard: 
  4.                      rank: str 
  5.                      suit: str 
  6.                        card=Card("Q""hearts"
  7.                   print(card == card) 
  8.                  # True 
  9.                   print(card.rank) 
  10.                  # 'Q' 
  11.                   print(card) 
  12.                  Card(rank='Q', suit='hearts'

3.列表推导

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

 

  1. [ expression for item in list if conditional ] 

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

 

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

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

 

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

甚至能调用外部函数:

 

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

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

 

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

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

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

 

  1. import sys 
  2.                   mylist =range(0, 10000) 
  3.           print(sys.getsizeof(mylist)) 
  4.           # 48 

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

 

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

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

5.查找最频繁出现的值

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

 

  1. test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4] 
  2.      print(max(set(test), key = test.count)) 
  3.      # 4 

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

还有一种更有效的方法:

 

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

6.属性包

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

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

 

  1. @attrs 
  2.           classPerson(object): 
  3.               name =attrib(default='John'
  4.               surname =attrib(default='Doe'
  5.               age =attrib(init=False
  6.               p =Person() 
  7.           print(p) 
  8.           p=Person('Bill''Gates'
  9.           p.age=60 
  10.           print(p) 
  11.                   # Output
  12.           #   Person(name='John', surname='Doe',age=NOTHING) 
  13.           #   Person(name='Bill', surname='Gates', age=60) 

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

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

 

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

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

 

  1. merged = dict1 | dict2 

8.返回多个值

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

 

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

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

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

 

来源:读芯术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯