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

编写更好的Python代码的11个技巧

时间:2023-03-21 13:04:02 科技观察

在本教程中,我们将向您展示编写更好的Python代码的11个技巧!python风格来改进代码。以下是所有技巧的概述:使用enumerate()而不是range(len())进行迭代使用列表理解而不是原语for循环使用内置的Sort()方法对复杂的迭代进行排序使用集合来存储唯一值使用生成器节省内存使用.get()和.setdefault()来定义字典中的默认值使用collections.Counter来计算可哈希对象使用f-string来格式化字符串(Python3.6+)使用.join()来连接字符串使用双星号语法合并字典**(Python3.5+)使用ifxinlist简化if语句,而不是单独检查每个项目1.如果我们需要迭代,请使用enumerate()而不是range(len())进行迭代在列表上并需要跟踪索引和当前项目,大多数人会使用range(len())语法。在这种情况下,我们要遍历一个列表,检查当前项是否为负数,在这种情况下将列表中的值设置为0。虽然range(len())语法可以工作,但最好使用内置枚举函数。这将返回当前索引和当前项目作为元组。所以,我们可以直接检查这里的值,也可以通过索引访问项目。数据=[1,2,-3,-4]#weak:foriinrange(len(data)):ifdata[i]<0:data[i]=0#better:data=[1,2,-3,-4]foridx,numinenumerate(data):ifnum<0:data[idx]=02。使用列表理解而不是原来的for循环假设我们要创建一个具有特定值的列表,在本例中是一个包含0到9之间所有平方数的列表。繁琐的方法是创建一个空列表,然后使用一个for循环,进行计算,并将其附加到列表中:squares=[]foriinrange(10):squares.append(i*i)一种更简单的方法是列表理解。这里我们只需要一行就可以实现同样的事情:#better:squares=[i*iforiinrange(10)]listcomprehension非常强大,甚至包括if语句。请注意,列表理解的使用有点争议。它不应该被过度使用,尤其是当它损害代码的可读性时。但我个人认为语法清晰简洁。3.使用内置的Sort()方法对复杂的迭代进行排序。如果我们需要对一些可迭代对象进行排序,比如列表、元组或字典,我们不需要自己实现排序算法。我们可以简单地使用内置的排序功能。这将自动按升序对数字进行排序并返回一个新列表。如果我们希望结果按降序排列,可以使用参数reverse=True。正如我所说,这适用于任何可迭代对象,因此我们也可以在这里使用元组。但是请注意,结果是一个列表!data=(3,5,1,10,9)sortedsorted_data=sorted(data,reverse=True)#[10,9,5,3,1]现在假设我们有一个复杂的迭代器。这是一个包含字典的列表,我们想根据字典中的年龄对列表进行排序。为此我们也可以使用sort函数,然后传入要用于排序的key参数。键必须是一个函数,所以在这里我们可以使用一个lambda表达式和一个返回年龄的单行函数。data=[{"name":"Max","age":6},{"name":"Lisa","age":20},{"name":"Ben","age":9}]sortedsorted_data=sorted(data,key=lambdax:x["age"])4.使用集合存储唯一值如果我们有一个包含多个值的列表并且只需要唯一值,一个不错的技巧是转换我们的名单来一套。集合是一种没有重复元素的无序集合数据类型,因此在这种情况下,它会删除所有重复元素。my_list=[1,2,3,4,5,6,7,7,7]my_set=set(my_list)#removesduplicates如果我们已经知道我们需要唯一的元素,比如这里的质数,我们可以马上使用curly大括号创建一个集合。这允许Python进行一些内部优化,并且它也有一些计算两个集合之间的交集和差集的便捷方法。5.生成器节省内存在技巧2中,我向您展示了列表理解。但是列表并不总是最好的选择。假设我们有一个包含10000个项目的非常大的列表,我们想要计算所有项目的总和。当然,我们可以使用列表来实现这一点,但我们可能会遇到内存问题。这是我们如何使用生成器的完美示例。与列表理解类似,我们可以使用生成器理解,它具有相同的语法但使用圆括号而不是方括号。生成器懒惰地计算我们的元素,即,一次只生成一个条目,并且仅在请求时生成。如果我们计算这个生成器的总和,我们会发现我们得到了相同的正确结果。#listcomprehensionmy_list=[iforiinrange(10000)]print(sum(my_list))#49995000#generatorcomprehensionmy_gen=(iforiinrange(10000))print(sum(my_gen))#499950006。在字典中使用.get()和.setdefault()定义默认值假设我们有一个字典,其中包含不同的键,例如项目和项目的价格。在代码中的某个时刻,我们想要获取条目的计数,并假设该键也包含在字典中。当我们简单地尝试访问密钥时,它会使我们的代码崩溃并引发KeyError。所以更好的方法是在字典上使用.get()方法。这也会返回键的值,但如果键不可用,它不会引发keyError。相反,它返回我们指定的默认值,如果我们没有指定它,则返回None。my_dict={'item':'football','price':10.00}price=my_dict['count']#KeyError!#better:price=my_dict.get('count',0)#optionaldefaultvalue7。使用collections.Counter计算可哈希对象如果我们需要计算列表中元素的数量,在collections模块中有一个非常方便的工具可以完成这项工作。我们只需要从集合中导入计数器,然后使用列表作为参数创建计数器对象。如果我们打印这个,那么对于列表中的每个项目,我们都可以看到该项目出现的次数,并且它按照最常用的项目排在第一位。分开计算会好很多。如果我们想得到一个item的数量,我们只需要访问这个item,它就会返回对应的count。如果不包含该项,则返回0。fromcollectionsimportCountermy_list=[10,10,10,5,5,2,9,9,9,9,9,9]counter=Counter(my_list)print(counter)#Counter({9:6,10:3,5:2,2:1})打印(计数器[10])#38。使用f字符串格式化字符串(Python3.6+)这是自Python3.6以来的新功能,对我来说看起来像是格式化字符串的最佳方式。我们只需要在字符串前面写一个f,然后在字符串内部我们就可以用大括号来访问变量了。这比旧的格式化规则更简单、更干净、更快。此外,我们可以在大括号内编写在运行时计算的表达式。比如我们要输出变量i的平方,我们可以简单的把这个操作写在f-string中。name="Alex"my_string=f"Hello{name}"print(my_string)#HelloAlexi=10print(f"{i}squaredis{i*i}")#10squaredis1009。使用.join()连接字符串假设我们有一个包含不同字符串的列表,我们想将所有元素组合成一个字符串,每个单词用空格分隔。不好的方法是这样:list_of_strings=["Hello","my","friend"]#BAD:my_string=""foriinlist_of_strings:my_string+=i+""我们定义一个空字符串,然后遍历列表,然后将单词和空格附加到此字符串。你应该知道,字符串是不可变的元素,所以这里我们每次都创建新的字符串。对于大型列表,此代码可能会非常慢,因此您应该立即忘记此方法!.join()方法更好、更快、更干净:.join()方法:#GOOD:list_of_strings=["Hello","my","friend"]my_string="".join(list_of_strings)10.使用双星号语法合并字典**(Python3.5+)此语法是自Python3.5以来的新语法。如果我们有两个词典并想合并它们,我们可以对两个词典都使用花括号和双星号。这里字典1有名字和年龄,字典2也有名字和城市。与这种简洁的语法合并后,我们在最终字典中拥有了所有3个键。d1={'name':'Alex','age':25}d2={'name':'Alex','city':'NewYork'}merged_dict={**d1,**d2}print(merged_dict)#{'name':'Alex','age':25,'city':'NewYork'}11.用ifxinlist简化if语句,而不是单独检查每个项目假设我们有A的主色红色、绿色和蓝色的列表。在代码的某处,我们有一个包含一些颜色的新变量,这里c=red。然后我们要检查这个颜色是否来自我们的主色。我们当然可以像这样检查列表中的每个项目:colors=["red","green","blue"]c="red"#cumbersomeanderror-proneifc="red"orc="green"orc=="blue":print("ismaincolor")但这会变得很麻烦,而且我们很容易弄错,例如,如果我们在这里有一个错误的红色。一种更简单更好的方法是使用ifxinlist语法。