Python由于语言的简单性,让我们用人的思维方式来写代码。新手更容易上手,老手爱不释手。要编写Pythonic(优雅、真实、整洁)代码,您还需要更频繁地观察那些伟大的代码。在这里,明哥收集了一些常见的Pythonic写法,帮助大家养成写出优秀代码的习惯。1.变量交换当交换两个变量的值时,想用一个中间临时变量进行transition是很正常的。tmp=aa=bb=tmp一行代码就可以解决(而且不影响可读性),千万不要三行代码。a,bb=b,a2。ListComprehensions下面是一个非常简单的for循环。my_list=[]foriinrange(10):my_list.append(i*2)在一个for循环中,如果逻辑比较简单,不如试试list的list推导。虽然只有一行代码,但是逻辑清晰。my_list=[i*2foriinrange(10)]3。单行表达式以上两种情况,都是将多行代码用另一种方式写成一行代码。这并不意味着越少的代码行越Pythonic。例如,不建议编写以下内容。print('hello');print('world')ifx==1:print('hello,world')ifand:#dosomethingsuggeststoprint('hello')如下print('world')ifx==1:print('hello,world')cond1=<复杂比较>cond2=<其他复杂比较>ifcond1andcond2:#dosomething4。使用带索引遍历的for循环时如何获取对应的索引,初学者习惯使用range+len函数foriinrange(len(my_list)):print(i,"-->",my_list[i])更好的方法就是使用枚举内置函数fori,iteminenumerate(my_list):print(i,"-->",item)5。序列拆包使用*来拆包列表a,*rest=[1,2,3]#a=1,rest=[2,3]a,*middle,c=[1,2,3,4]#a=1,中间=[2,3],c=46。字符串连接如果一个列表(或可迭代对象)中的所有元素都是字符串对象,连接它们,通常的方式是letters=['s','p','a','m']s=""forletinletters:s+=let更推荐使用join函数letters=['s','p','a','m']word=''.join(letters)7.真假判断判断一个变量是否是真(假),新手习惯直接用==和True、False、None进行比较ifattr==True:print('True!')ifattr==None:print('attrisNone!')其实容器不带""、[]、{}等元素的都是假值,可以直接使用ifnotxx来判断。ifattr:print('attristruthy!')ifnotattr:print('attrisfalsey!')8.访问字典元素当直接使用[]访问字典中的元素时,如果key不存在,会抛出异常,所以新人可能会先判断是否有这样的钥匙,然后拿走。d={'hello':'world'}ifd.has_key('hello'):print(d['hello'])#prints'world'else:print('default_value')更推荐使用get来如果没有key,则默认返回None(当然你也可以设置默认返回值)d={'hello':'world'}print(d.get('hello','default_value'))#prints'world'print(d.get('thingy','default_value'))#prints'default_value'9。操作列表下面的代码会根据条件过滤列表中的元素a=[3,4,5]b=[]foriina:ifi>4:b.append(i)其实可以用listcomprehension或者更高-命令函数filter实现a=[3,4,5]b=[iforiinaifi>4]#或者:b=filter(lambdax:x>4,a)除了filter,还有map和reduce这两个函数也非常有用a=[3,4,5]b=map(lambdai:i+3,a)#b:[6,7,8]10。文件读取文件读取是一个很常见的操作。使用句柄后,需要手动调用close函数关闭句柄fp=open('file.txt')print(fp.read())fp.close()如果代码太长,即使你知道你需要手动关闭手柄,你会经常错过它。所以建议养成使用withopen读写文件的习惯,上下文管理器会自动执行关闭句柄withopen('file.txt')asfp:forlineinfp.readlines():print(线)11。代码续一个长度把一个长字符串放在一行中会大大影响代码的可读性(下面的代码可以向左滑动)而关注代码可读性的人,会使用三引号\继续写long_string='ForalongtimeIusedtogotobedearly.'\'Sometimes,whenIhadputoutmycandle,'\'myeyeswouldclosesoquicklythatIhadnoteventimetosay“I'mgoingtosleep.”但是,对我来说,我更喜欢使用括号,例如thisPackage()long_string=("ForalongtimeIusedtogotobedearly.Sometimes,""whenIhadputoutmycandle,myeyeswouldclosesoquickly""thatIhadnoteventimetosay"I'mgoingtosleep."")从some.deep.module.inside.a.moduleimport(a_nice_function,功能,anoc_yet_another_nice_function)12。显式代码有时候迫于需要,我们会使用一些特殊的魔法让代码适应更多的场景不确定性。defmake_complex(*args):x,y=argsreturndict(**locals())但除非必要,否则不要这样做。无缘无故增加代码的不确定性,会让原来的动态语言写出更加动态的代码。defmake_complex(x,y):return{'x':x,'y':y}13.使用占位符对于不需要但必须接受的变量,请使用占位符filename='foobar.txt'basename,_,ext=filename.rpartition('.')14.链式比较对于下面这种写法score=85ifscore>80andscore<90:print("good"),其实还有更好的写法score=85if80>>False==False==TrueFalse15。三目运算简单的判断赋值age=20ifage>18:type="adult"else:type="teenager",其实可以用三目运算,一行就搞定。age=20b="adult"如果年龄>18否则"teenager"