当前位置: 首页 > 后端技术 > Python

Python的30个最佳实践、提示和技巧

时间:2023-03-25 23:22:00 Python

Erik-JanvanBaaren译者|半月板来源|CSDN原文:https://towardsdatascience.com/30-python-best-practices-tips-and-tricks-caefb9f8c5f5以下为译文:我想用这篇文章来呈现30个最佳实践、技巧和技巧适合你的Python语言。希望能对所有努力的程序员有所帮助,也希望大家工作顺利!1.Python版本提醒大家:2020年1月1日起,Python正式不再支持Python2,本文中的很多例子只能在Python3下运行,如果你还在使用Python2.7,请立即升级.2.检查Python的最低版本您可以检查代码中Python的版本,以确保您的用户没有在不兼容的版本中运行脚本。像这样检查:ifnotsys.version_info>(2,7):#斥责你的用户运行了10年#pythonversionelifnotsys.version_info>=(3,5):#请告诉你的用户他需要升级#因为你使用的是3.5features3,IPythonIPython本质上是shell的增强版本。光是自动补全就值得一试,它的功能还不止于此。它还有很多让我爱不释手的命令,比如:%cd:改变当前工作目录%edit:打开编辑器和关闭编辑器%env:显示当前环境变量%pipinstall[pkgs]:安装无需离开交互式shell%time和%timeit:测量执行Python代码的时间要获得完整的命令列表,请单击此处查看(https://ipython.readthedocs.i...)。还有一个非常有用的功能:引用上一条命令的输出。In和Out是实际对象。您可以将第三个命令的输出用作Out[3]。IPython的安装命令如下:pip3installipython4,listcomprehension你可以使用listcomprehension来避免用循环填充列表的繁琐。列表理解的基本语法如下:[expressionforiteminlistifconditional]举一个基本的例子:用一组有序的数字填充一个列表:mylist=[iforiinrange(10)]print(mylist)#[0,1,2,3,4,5,6,7,8,9]因为表达式可用,你也可以做一些算术:squares=[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,3,3,4,4,5,5,6,6,7]最后,您还可以使用“if”来过滤列表。在下面的示例中,我们只保留可被2整除的数字:filtered=[iforiinrange(20)ifi%2==0]print(filtered)#[0,2,4,6,8,10,12,14,16,18]5.查看对象的内存使用情况您可以使用sys.getsizeof查看对象的内存使用情况:importsysmylist=range(0,10000)print(sys.getsizeof(mylist))#48等等,为什么这个巨大的列表只包含48个字节?因为这里的range函数返回一个类,除了它的行为像一个列表。在内存使用方面,范围比实际的数字列表更有效。您可以尝试使用列表理解来创建具有相同范围的数字列表:importsysmyreallist=[xforxinrange(0,10000)]print(sys.getsizeof(myreallist))#876326,返回多个值在Python中,函数可以在不使用字典、列表或类的情况下返回多个变量。看起来像这样:defget_user(id):#fetchuserfromdatabase#....returnname,birthdatename,birthdate=get_user(4)当然如果返回值的个数有限也没关系。但是,如果返回值的个数超过了3个,那么就应该把返回值放到一个(数据)类中。7.使用数据类Python从3.7版本开始就提供了数据类。数据类与常规类或其他方法(例如返回多个值或字典)相比有几个明显的优势:类,因为数据类也提供了repr方法。数据类需要类型提示,因此可以减少出现错误的机会。一个数据类的例子如下:fromdataclassesimportdataclass@dataclassclassCard:rank:strsuit:strcard=Card("Q","hearts")print(card==card)#Trueprint(card.rank)#'Q'print(card)Card(rank='Q',suit='hearts')详细使用指南请点击这里(https://realpython.com/python...)。8.下面这个交换变量的技巧非常巧妙,可以为你节省很多行代码:a=1b=2a,b=b,aprint(a)#2print(b)#19.合并字典(Python3.5及以上)从Python3.5开始,合并字典的操作更加简单:dict1={'a':1,'b':2}dict2={'b':3,'c':4}merged={**dict1,**dict2}print(merged)#{'a':1,'b':3,'c':4}如果key重复,第一个字典的key会被覆盖。10.下面这个把字符串首字母大写的技巧真可爱:mystring="10awesomepythontricks"print(mystring.title)'10AwesomePythonTricks'11.把字符串拆分成一个列表你可以拆分字符串into一个字符串列表。在下面的示例中,我们用空格分隔单词:mystring="Thequickbrownfox"mylist=mystring.split('')print(mylist)#['The','quick','brown','fox']12.从字符串列表创建字符串与上述技术相反,我们可以从字符串列表创建字符串,然后在每个单词之间添加空格:mylist=['The','quick','brown','fox']mystring="".join(mylist)print(mystring)#'Thequickbrownfox'你可能会问为什么不使用mylist.join(""),这是个好问题!根本原因是函数String.join不仅可以连接列表,还可以连接任何可迭代对象。放在String中是为了避免在多个地方重复同一个函数。13.表情符号有些人喜欢表情符号,而有些人讨厌它们。让我声明一下:在分析社交媒体数据时,表情符号可以派上用场。首先我们来安装emoji模块:pip3installemoji安装完成后可以使用如下:importemojiresult=emoji.emojize('Pythonis:thumbs_up:')print(result)#'Pythonis'#You也可以反转:result=emoji.demojize('Pythonis')print(result)#'Pythonis:thumbs_up:'有关表情符号的更多示例和文档,请单击此处(https://pypi.org/project/emoji/)。14.列表切片列表切片的基本语法如下:a[start:stop:step]start、stop、step可选。如果不指定,将使用以下默认值:start:0end:字符串结束step:1示例如下:#我们可以很容易地从一个列表的前两个元素创建一个新列表:first_two=[1,2,3,4,5][0:2]print(first_two)#[1,2]#如果我们使用步长值2,#我们可以跳过每隔一个数字#就像this:steps=[1,2,3,4,5][0:5:2]print(steps)#[1,3,5]#这也适用于字符串。在Python中,#你可以把一个字符串当作一个包含#字母的列表:mystring="abcdefdnnimt"[::2]print(mystring)#'acedit'15.反转字符串和列表你可以使用上面的切片方法来反转字符串或列表。只需将步骤指定为-1即可反转元素:revstring="abcdefg"[::-1]print(revstring)#'gfedcba'revarray=[1,2,3,4,5][::-1]print(revarray)#[5,4,3,2,1]16.秀猫终于找到好借口在文章里秀猫了,哈哈!当然,你也可以用它来展示图片。首先你需要安装Pillow,它是Python图像库的一个分支:pip3installPillow接下来,你可以将下面的图像下载到一个名为kittens.jpg的文件中:然后,你可以使用以下Python代码显示上面的图像Image:fromPILimportImageim=Image.open("kittens.jpg")im.showprint(im.format,im.size,im.mode)#JPEG(1920,1357)RGBPillow要显示的功能远不止这个图像。它可以分析、调整大小、过滤、增强、扭曲等。如需完整文档,请单击此处(https://pillow.readthedocs.io...)。17.mapPython有一个内建的函数叫做map,语法如下:map(function,something_iterable)所以,你需要指定一个函数来执行,或者一些东西来执行。任何可迭代对象都可以。在下面的示例中,我指定了一个列表:defupper(s):returns.uppermylist=list(map(upper,['sentence','fragment']))print(mylist)#['SENTENCE','FRAGMENT']#将数字的字符串表示形式转换为整数列表。list_of_ints=list(map(int,"1234567")))print(list_of_ints)#[1,2,3,4,5,6,7]你可以仔细看看你的代码,看看你是否可以用地图替换某处的循环。18.获取列表或字符串中的唯一元素如果使用函数set创建集合,可以获取列表或类列表对象的唯一元素:mylist=[1,1,2,3,4,5,5,5,6,6]print(set(mylist))#{1,2,3,4,5,6}#因为一个字符串可以被视为一个#字母列表,你也可以得到#字符串中的唯一字母这样:print(set("aaabbbcccdddeeefff"))#{'a','b','c','d','e','f'}19.找到频率最高的一个您可以通过执行以下操作找到最频繁的值:test=[1,2,3,4,2,2,3,1,4,4,4]print(max(set(test),key=test.count))#4你能看懂上面的代码吗?思路是理解上面的代码,然后继续往下读。不明白?让我告诉你:max将返回列表的最大值。参数键将接受一个参数函数来自定义排序,在本例中为test.count。此函数将应用于迭代对象的每个项目。test.count是列表的内置函数。它接受一个参数并计算该参数的出现次数。所以test.count(1)会返回2,test.count(4)会返回4。set(test)会返回test中所有唯一的值,即{1,2,3,4}。因此,这行代码的作用是:首先获取test所有的唯一值,即{1,2,3,4};然后,max将对每个值执行list.count并返回最大值。这行代码不是我发明的。20.创建进度条你可以创建自己的进度条,听起来很有趣。但是,更简单的方法是使用进度包:pip3installprogress接下来,您可以轻松创建进度条:fromprogress.barimportBarbar=Bar('Processing',max=20)foriinrange(20):#做一些workbar.nextbar.finish21.在交互式shell中使用_(下划线运算符)。您可以通过下划线运算符获得前一个表达式的结果。例如,在IPython中,您可以这样做:In[1]:3*3Out[1]:9In[2]:_+3Out[2]:12这也可以在PythonShell中使用。另外,在IPythonshell中,还可以通过Out[n]获取表达式In[n]的值。例如,在上面的例子中,Out[1]将返回数字9。22.快速创建一个web服务器你可以快速启动一个web服务并提供当前目录的内容:python3-mhttp.server当你想要的时候与同事共享一些文件,或者在测试一个简单的HTML网站时,请考虑这种方法。23.多行字符串尽管您可以在代码中使用三重引号将多行字符串括起来,但这种方法并不理想。放在三引号之间的所有内容都变成一个字符串,包括代码的格式,如下所示。我更喜欢另一种方法,它不仅可以将多行字符串连接在一起,还可以保持代码整洁。唯一的缺点是您需要明确指定换行符。s1="""多行字符串可以放在三重引号之间。虽然格式化代码时并不理想"""print(s1)#多行字符串可以放在#三重引号之间。这并不理想#在格式化代码时though2=("Youcanalsoconcatenatemultiple\n"+"stringsthisway,butyou'llhaveto\n""explicitlyputinthenewlines")print(s2)#你可以也可以用这种方式连接多个#字符串,但你必须#明确地放入换行符24。条件赋值中的三元运算符可以让代码更加简洁,同时保证代码的可读性:[on_true]if[expression]else[on_false]示例如下:x="Success!"如果(y==2)否则“失败!”25.统计元素出现的次数可以使用集合库中的Counter获取列表中所有唯一元素出现的次数,Counter会返回一个Dictionary:fromcollectionsimportCountermylist=[1,1,2,3,4,5,5,5,6,6]c=Counter(mylist)print(c)#Counter({1:2,2:1,3:1,4:1,5:3,6:2})#它也适用于字符串:print(Counter("aaaaabbbbbccccc"))#Counter({'a':5,'b':5,'c':5})26.比较链运算符您可以在Python中将多个比较运算符链接在一起,以创建更具可读性和简洁性的代码:x=10#Insteadof:ifx>5andx<15:print("Yes")#yes#也可以这样写:if5