python大型项目经验_经验丰富程序员才知道的8种高级Python技巧
全文共2330字,预计学习时长11分钟
图源:unsplash
本文将介绍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.属性包
图源:unsplash
你可以使用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+)
从Python 3.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个小技巧足够你好好消化一阵儿啦!
留言点赞关注
我们一起分享AI学习与发展的干货
如转载,请后台留言,遵守转载规范
python大型项目经验_经验丰富程序员才知道的8种高级Python技巧相关推荐
- 经验丰富程序员才知道的15种高级Python小技巧
本文将介绍15个简洁的Python技巧,向着简洁更高效,学习易懂出发. 目录 1.通过多个键值将对象进行排序 2.数据类别 3.列表推导 4.检查对象的内存使用情况 5.查找最频繁出现的值 6.属性包 ...
- 资深程序员才知道的30个Python技巧
Python中的省略号 Python省略号是三点序列,通常在自然语言中使用.但是您可能不知道的是,这也是Python中的有效对象: - Ellipsis 它主要用于NumPy中的矩阵切片操作.但是,您 ...
- Java程序员应该知道的10个Eclipse调试技巧
为什么80%的码农都做不了架构师?>>> Eclipse是众多Java程序员实用的开发工具,其中开发技巧也是繁多,但作为优秀的Java程序员,需要掌握最起码的调试技巧. 1 条 ...
- python怎么开发工具_为程序员和新手准备的8大Python开发工具
Python 是一种开源编程语言,用于 Web 编程.数据科学.人工智能和许多科学应用.学习 Python 使程序员能够专注于解决问题,而不是专注于语法,其丰富的库赋予它完成伟大任务所需的力量. 1) ...
- 老鸟程序员才知道的40个小技巧
1.重构是程序员的主力技能. 2.工作日志能提升脑容量. 3.先用profiler调查,才有脸谈优化. 4.注释贵精不贵多.杜绝大姨妈般的"例注".漫山遍野的碎碎念注释,实际就是背 ...
- 有什么事是你当了程序员才知道的? | 每日趣闻
戳一戳小程序查看更多! 往 期 趣 闻 ☞人间真实!如果我有这套装备,我也能码到凌晨...... | 每日趣闻 ☞我酸了~腾讯员工平均月薪 7.6 万 | 每日趣闻 ☞光棍节刚过,你脱单了吗?| 每日 ...
- python大型项目经验_图像分类:13个Kaggle项目的经验总结
来源:数据派THU 任何领域的成功都可以归结为一套小规则和基本原则,当它们结合在一起时会产生伟大的结果. 机器学习和图像分类也不例外,工程师们可以通过参加像Kaggle这样的竞赛来展示最佳实践. 在这 ...
- word文档打印 自动编码_职场老油条才知道的3个Word打印技巧,一年能节省几百张打印纸!...
在我们平时工作中经常需要打印一些Word文档,如果你的文档并不是要提交给老板和客户,仅是私人查阅或内部的交流.那么,下面的这几个打印小技巧,能为你节省很多纸张,甚至省不少钱. 例如,当Word文档最后 ...
- Python 程序员需要知道的 30 个技巧(转载)
Python 程序员需要知道的 30 个技巧 原创2017-04-14 伯乐专栏/阿喵 Python开发者 Python开发者 Python开发者 微信号 PythonCoder 功能介绍 人生苦短, ...
最新文章
- Python:机器视觉与Tesseract介绍
- eclipse从数据库逆向生成Hibernate实体类
- 快速搭建一个restful风格的springboot项目
- ML之NN:利用神经网络的BP算法解决XOR类(异或非)问题(BP solve XOR Problem)
- blob转file对象_JavaScript Blob 对象解析
- matlab 高斯模糊_摸鱼 | 茴香豆的“茴”有四种写法,模糊有几种糊法?
- jquery通过attr取html里自定义属性原来这么方便啊
- c++如何判断两个字符串是否相同?_链表 | 如何判断两个单链表(无环)是否交叉...
- 把你的火狐浏览器改成Chrome样式
- HTML简介及常用标签介绍
- C语言计算星历位置,GPS广播星历计算卫星位置和速度
- Vue--改变鼠标指针的图片
- 【搞定Go语言】第3天22:常用的HTTP服务压测工具介绍
- 淘宝签名分析之一(反编译和利用frida快速找点)
- Dragonfly 修改数据像素点大小
- Ant Design Vue+vue2.x图片上传数量限制(亲测有效)
- php户型图识别,5分钟教你马上看懂户型图
- 怎样黑进Microsoft:循序渐进指南 (转)
- C#Mysql学生信息管理系统
- 网络入侵防御系统全解
热门文章
- 使用url参数传递SAP Analytics Cloud filter的一个例子
- SAP CRM的WITH_INDOBJECTS搜索参数问题
- Betty's Sales team BP SQL
- CRM attachment read old API debug
- engagement center tile的配置
- SAP Fiori element框架smart control运行时的生成原理
- ButtonRenderer
- Postman里如何把某个HTTP的请求和响应作为example保存
- CRM订单状态的Open, In process和Completed这些条目是从哪里来的
- OpenFOAM并行计算方法