作者|Avi_Chawla翻译|王德真编程(不仅仅是Python,其他编程语言也一样)最棒的事情之一就是有多种方法可以实现同一个解决方案。使用不同的方法实现相同的结果(作者图片)有些方法比其他方法更好,原因如下:消耗更少的内存运行效率更低的代码更容易理解逻辑简单在这篇文章中,我将向您介绍20个场景,这将使开发人员在不知不觉中陷入臃肿、丑陋、复杂的Python编码的陷阱,从而限制了Python的潜力。除此之外,我将为每个错误提供替代解决方案。点击此处查看本文代码让我们开始吧!1打印语句的多次使用新手写如果要打印多个变量,简单的方法是对每个变量使用打印语句。a,b,c=10,5,3print(a)print(b)print(c)优雅的写法根据经验,使用多个print语句通常是程序员(尤其是新手)在使用Python编码时最常见的错误是因为他们不知道使用print语句,可以在一行代码中打印多个变量,代码如下:a,b,c=10,5,3print(a,b,c,sep="\n")上面的sep参数用来指定print语句输出的变量值(a,b,c)之间的分隔符。注意:end参数用于设置打印语句输出的结束字符。上面的a,b,c=10,5,3print(a,end="\n---\n")print(b,end="\n---\n")print(c)code,参数end="\n---\n"用于在输出一行后输出---,再输出新的一行字符。2使用FOR循环打印同一个变量Newhandwriting顾名思义,你的目标是多次打印同一个变量,所以你会创建一个FOR循环并迭代预期的打印次数,对吧?我的意思是,这有什么问题?repeat=10a="ABC"for_inrange(repeat):print(a,end="")优雅的写法虽然写一个FOR循环没有坏处,而且一切正常,但没有必要写一个FOR循环多次打印相同的变量。repeat=10a="ABC"print(a*repeat)3创建一个单独的变量来跟踪循环中的索引初学者的写法方法一:要实现这个,一般需要定义一个新的变量(idx)来跟踪索引值,并在迭代时自增,代码如下:idx=0char_list=["a","b","c","d","e","f"]foriinchar_list:print("index=",idx,"value=",i,sep="")idx+=1方法2:除了使用上述方法,还创建一个范围迭代器来跟踪索引,代码如下:char_list=["a","b","c","d","e","f"]foridxinrange(len(char_list)):print("index=",idx,"value=",char_list[idx],sep="")idx+=1优雅的写法感谢设计enumerate()函数的开发人员,使用此方法您可以跟踪索引(idx)和值(i)如下。char_list=["a","b","c","d","e","f"]foridx,iinenumerate(char_list):print("index=",idx,"value=",i,sep="")4使用FOR循环将list转换为字符串列表(作者画的图)新手写如下,使用FOR循环一次收集一个元素char_list=["A","B","C","D","E"]final_str=""foriinchar_list:final_str+=iprint(final_str)将列表转换为字符串的优雅方法是使用join()方法,如下图:char_list=["A","B","C","D","E"]final_str="".join(char_list)print(final_str)上面的代码不仅可以避免写一些不必要的长代码,并且与FOR循环方法一样直观。5使用FOR循环从列表中删除重复项NewHandwriting从列表中删除重复项(作者绘制的图像)再次使用FOR循环,这是通过遍历列表并将唯一元素存储在新列表中来完成的。char_list=["A","B","A","D","C","B","E"]final_list=[]foriinchar_list:ifinotinfinal_list:final_list.append(i)print(final_list)的优雅写法只需要一行Python代码就可以去除列表中的重复项,如下:char_list=["A","B","A","D","C","B","E"]set(list(char_list))上面的代码返回一个集合,你可以把它转换成一个列表:char_list=["A","B","A","D","C","B","E"]list(set(list(char_list)))6使用FOR循环获取列表中的元素新手写如果你想知道一个元素是否存在于列表(或集合),并返回一个布尔值(如果存在则为True,否则为False),新手实现如下所示:char_list=["A","B","A","D","C","B","E"]search_char="D"found=Falseforiinchar_list:ifi==search_char:found=Truebreakprint(found)代码有点多,对吧?优雅的写法可以通过关键字in一行代码实现。char_list=["A","B","A","D","C","B","E"]search_char="D"char_list7中的search_char在两次相同大小的迭代中使用一个迭代变量IteratingoverobjectsNewhandwriting这种形式与3-4节中所做的相同,即为索引定义一个特定的变量。这个实现比较简单,如下:list1=[1,3,6,2,5]list2=[0,4,1,9,7]foridxinrange(len(list1)):print("value1=",list1[idx],"value2=",list2[idx],sep="")优雅的写法经验丰富的方法是使用zip()函数,可以匹配中对应位置的值两个可迭代对象。list1=[1,3,6,2,5]list2=[0,4,1,9,7]fori,jinzip(list1,list2):print("value1=",i,"value2=",j,sep="")8使用FOR循环反转列表如下:input_list=[1,2,3,4,5]output_list=[]foridxinrange(len(input_list),0,-1):output_list.append(input_list[idx-1])print(output_list)写得优雅如果你知道Python中的切片,那么优秀的解决方案只需要一行代码。input_list=[1,2,3,4,5]output_list=input_list[::-1]print(output_list)不需要FOR循环!9CheckingPalindromicStructuresNewHandwritingUsingFORLoop在扩展上述案例(#9--ReversingLists)的思路后,我们可以检查回文列表结构。input_list=[1,2,3,2,1]output_list=[]foridxinrange(len(input_list),0,-1):output_list。append(input_list[idx-1])print(output_list==input_list)写得很优雅。如上所述,经验方法是使用切片并将结果与??原始列表进行比较。input_list=[1,2,3,2,1]output_list=input_list[::-1]print(output_list==input_list)10使用FOR循环统计迭代对象中某个元素出现的次数新手写一个简单的查找元素频率的方法是使用FOR循环遍历列表并计算元素出现的次数。char_list=["A","B","A","D","C","B","E"]search_char="B"char_count=0foriinchar_list:如果search_char==i:char_count+=1print(char_count)优雅的写法在这种情况下,避免编写FOR循环的经验法则是使用count()方法。char_list=["A","B","A","D","C","B","E"]char_list.count("A")也可以对字符串变量使用count()方法.string="ABADCBE"string.count("A")11使用FOR循环获取字符串的子串新手写目标是从start_index位置开始,返回一个长度为n_chars的字符串子串。这个问题的新手解决方案是使用这样的FOR循环:input_str="ABCDEFGHIJKL"start_index=4n_chars=5output_str=""foriinrange(n_chars):output_str+=input_str[i+start_index]print(output_str)使用切片优雅地编写以避免FOR循环。input_str="ABCDEFGHIJKL"start_index=4n_chars=5output_str=input_str[start_index:start_index+n_chars]print(output_str)12定义长整型常量假设你想声明一个值为1021的整型变量。新手写x=100000000000000000000000理想情况下人们会连续写0,边打边数,但是如果有人想引用这段代码,他们数0不是很麻烦吗?优雅的写法为了可读性,一组0可以用_(下划线)隔开,像这样:x=1_000_000_000_000_000_000_000但是还是麻烦,为什么要算0呢?如果数字可以表示为a^b,则应使用pow()方法。x=pow(10,21)使用IF转换字符串大小写给定一个字符串,目标将大写字母变为小写,反之亦然。新手的简单方法是检查每个元素的大小写并转换每个字符。input_str="AbCDeFGhIjkl"output_str=""foriininput_str:ifi.islower():output_str+=i.upper()elifi.isupper():output_str+=i.lower()else:output_str+=iprint(output_str)输出没有问题,但是为什么要这样呢?编写它的优雅方式是使用swapcase()方法。input_str="AbCDeFGhIjkl"output_str=input_str.swapcase()print(output_str)14获取两个集合的并集合并两个集合(图片是作者画的)新手写遍历两个集合,添加元素到一个新的集合中间。set_a={1,2,4,8}set_b={3,8,7,1,9}union_set=set()foriinset_a:union_set.add(i)foriinset_b:union_set.add(i)print(union_set)代码太多了,不是吗?让我们把它缩小到一行。在Python中编写集合的优雅方式提供了一个union()方法来合并两个集合。set_a={1,2,4,8}set_b={3,8,7,1,9}union_set=set_a.union(set_b)print(union_set)此外,您可以将其扩展到任意数量的Input集合。set_a={1,2,4,8}set_b={3,8,7,1,9}set_c={5,9,10,3,2}set_d={7,2,13,15,0}union_set=set_a.union(set_b,set_c,set_d)print(union_set)很酷吗?想象一下您需要编写多少个FOR循环来合并4个集合?15获取两组新手写的交集与上面讨论的合并案例类似,我们可以如下查找两组之间的共同元素:set_a={1,2,4,8}set_b={3,8,7,1,9}intersection_set=set()foriinset_a:ifiinset_b:intersection_set.add(i)print(intersection_set)优雅的写法你可以使用intersection()方法来实现相同的功能:set_a={1,2,4,8}set_b={3,8,7,1,9}intersection_set=set_a.intersection(set_b)print(intersection_set)16在IF语句中写入多个条件对此进行详细说明,假设你要实现以下逻辑。该函数将输入映射到输出(图像是作者绘制的)。新手写可以使用多个OR分隔条件来实现上述逻辑。a=1ifa==1ora==2ora==3:a+=1elifa==4ora==5ora==6:a+=5else:a*=2print(a)避免使用多个条件语句的优雅方法是使用关键字in,代码如下:a=1ifain(1,2,3):a+=1elifain(4,5,6):a+=5else:a*=2print(a)17更改列表中所有元素的数据类型给定一个表示整数的字符串列表,目标修改数据类型以将其转换为列表整数。新手写使用FOR循环和类型转换来改变单个元素。优雅地编写它的聪明方法是使用map()函数,如下所示:input_list=["7","2","13","15","0"]output_list=list(map(int,input_list))print(output_list)map()函数接收的第一个参数是function(int),第二个参数是一个可迭代对象(input_list)。18SwapVariables给定两个变量,目标是交换变量的值。新手大多数C/C++程序员在这里采用的方法是定义一个新变量(temp),他们通常也在Python中扩展这种方法。a="123"b="abc"temp=aa=bb=tempprint(a,b)优雅的写法幸运的是,Python允许在一个语句中进行多次赋值,从而避免了对临时变量的需要。a="123"b="abc"a,b=b,aprint(a,b)19使用嵌套循环生成两个列表的所有组合给定两个列表(a长度为n,b长度为m),生成(n*m)组合。新手编写两个嵌套的FOR循环并将所有组合附加到列表中。list1=["A","B","C"]list2=[1,2]组合=[]foriinlist1:forjinlist2:组合。append([i,j])print(combinations)优雅的写法优雅的写法是使用itertools库中的product()方法,如下:fromitertoolsimportproductlist1=["A","B","C"]list2=[1,2]combinations=list(product(list1,list2))print(combinations)20结论在这篇文章中,我展示了20种不同的场景,我相信大多数Python程序员都经历过并且可能也有对Solution采取错误的编码方案,如果你注意到,在大多数情况下,优雅的写法主要集中在避免使用FOR循环进行编码。作为这篇文章的一个要点,你应该永远记住,在大多数情况下,你想到的第一个解决方案并不是最优的,所以谷歌搜索总是有帮助的,这也是为什么它不完美主义的思维方式是一个很重要的原因一个挑剔的程序员(不仅是Python,还有其他语言)。原文链接:https://towardsdatascience.com/20-newbie-mistakes-that-even-skilled-python-programmers-make-6879048731a4译者简介王德真,社区编辑,10年互联网产研经验,6年在IT教育和培训行业的经验。
