当前位置: 首页 > 科技观察

只有经验丰富的程序员才知道的8个Python高级技能

时间:2023-03-15 09:43:11 科技观察

有些是你从未见过的。为了更简洁高效,走吧!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*FROMpeopleORDERbyname,age事实上,这个问题的解决方案可以非常简单。Python保证sort函数提供稳定的排序顺序,这也意味着更相似的项目将保留其原始顺序。要按姓名和年龄排序,您可以这样做:importoperatorpeople.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}]名字是主要的排序项,如果名字相同,则按年龄排序。因此,所有约翰都按年龄分组。2、数据类从3.7版本开始,Python可以提供数据类。它比常规类或其他替代方案(例如返回多个值或字典)具有更多优势:数据类需要非常少的代码来比较数据类,因为__eq__可以实现此功能数据类需要类型提示,减少数据类可以很容易为调试而打印,因为__repr__这样做不会出错。这是一个工作数据类示例:fromdataclassesimportdataclass@dataclassclassCard:rank:strsuit:strcard=Card("Q","hearts")print(card==card)#Trueprint(card.rank)#'Q'print(card)Card(rank='Q',suit='hearts')3.列表推导列表推导可以在列表中填充而不是讨厌的循环,基本语法是[expressionforiteminlistifconditional]让我们看一个非常基本的例子,用序列填充列表数字:mylist=[iforiinrange(10)]print(mylist)#[0,1,2,3,4,5,6,7,8,9]您还可以做一些数学运算,因为您可以使用表达式:正方形=[x**2forxinrange(10)]print(squares)#[0,1,4,9,16,25,36,49,64,81]甚至可以调用外部函数:defsome_function(a):return(a+5)/2my_formula=[some_function(i)foriinrange(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=[iforiinrange(20)ifi%2==0]print(filtered)#[0,2,4,6,8,10,12,14,16,18]4.查看对象的内存使用情况使用sys.getsizeof()查看对象的内存使用情况:importsysmylist=range(0,10000)print(sys.getsizeof(mylist))#48为什么这么大列表只有48个字节?这是因为range函数返回的类表现为一个列表。存储数字序列比使用实际的数字列表更有效。我们可以使用列表理解来创建相同范围内的实际数字列表:importsysmyreallist=[xforxinrange(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))#4max()将返回列表中的最大值。key参数采用单个参数函数来自定义排序顺序,在本例中为test.count,它应用于迭代器上的每个项目。test.count是列表的内置函数。它接受一个参数并计算该参数出现的次数。所以test.count(1)会返回2,test.count(4)会返回4。set(test)返回test中的所有唯一值,所以{1,2,3,4}then在这行代码中会接受test的所有唯一值,也就是{1,2,3,4}。接下来,max将对其应用list.count函数并返回最大值。还有一个更高效的方法:fromcollectionsimportCounterCounter(test).most_common(1)#[4:4]6.属性包可以使用attrs代替dataclass。选择attrs的原因有两个:使用的Python版本高于3.7。有关更多功能,Theattrs包支持所有主要的Python版本,包括CPython2.7和PyPy。一些attr可以提供验证器和转换器,例如超普通数据类。让我们看一些示例代码:@attrsclassPerson(object):name=attrib(default='John')surname=attrib(default='Doe')age=attrib(init=False)p=Person()print(p)p=Person('Bill','Gates')p.age=60print(p)#Output:#Person(name='John',surname='Doe',age=NOTHING)#Person(name='Bill',surname='Gates',age=60)其实attrs的作者已经在使用引入数据类的PEP了。数据类有意保持更简单和更容易理解,而attr提供了人们可能需要的所有功能。7.合并字典(Python3.5+)dict1={'a':1,'b':2}dict2={'b':3,'c':4}merged={**dict1,**dict2}print(merged)#{'a':1,'b':3,'c':4}如果有重叠键,第一个字典中的键将被覆盖。在Python3.9中,合并字典变得更加简洁。上面的合并在Python3.9中可以改写为:merged=dict1|dict28。返回多个值Python中的函数可以返回多个变量,不需要字典、列表和类,它的工作原理是这样的:defget_user(id):#fetchuserfromdatabase#....returnname,birthdatename,birthdate=get_user(4)这个是有限制的返回值,但是超过3个值的任何东西都应该放在一个(数据)类中。这8个tips够你消化一阵子!