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

《宅男女神》,储备自己——30个Python最佳实践与技巧,你值得拥有!

时间:2023-03-26 00:05:52 Python

作者|核心阅读来源|ID:AI_Discovery1。Python3使用提示:官方公告自2020年1月1日起不再支持Python2,本指南中的大部分示例也仅适用于Python3。如果您还在使用Python2.7,请立即更新。如果您使用的是Mac,则可以使用Homebrew轻松升级。2.查看最低要求的Python版本可以直接使用代码查看Python版本,保证以后不会出现脚本与Python版本不兼容的情况。参见示例:ifnotsys.version_info>(2,7):#斥责你的用户运行了10年#pythonversionelifnotsys.version_info>=(3,5):#请告诉你的用户他需要升级#因为您使用的是GitHub3由?托管的3.5featuresviewrawcheck_python_version.py。使用IPython实际上,IPython是一个增强的shell。Autocomplete已经足够了不起了,但它还有更多的功能可以提供。我真的很喜欢内置的魔术命令。下面是一些示例:%cd-用于更改当前工作目录edit-打开编辑器并在关闭编辑器后执行您键入的代码%env-显示当前环境变量%pipinstall[pkgs]-inInstallpackageforinteractiveenvironment·%time和%timeit——计算Python代码的执行时间另一个有用的功能是引用前面命令的输出。In和Out是实际对象。您可以使用Out[3]执行第三条命令的输出。下载用于安装Ipython的Python命令:pip3installipython4。列表推导式列表推导式可以替代用于填充列表的丑陋的for循环。列表理解的基本语法是:[expressionforiteminlistifconditional]下面是最基本的示例,用数字序列填充列表:mylist=[iforiinrange(10)]print(mylist)#[0,1,2,3,4,5,6,7,8,9]viewrawlist_comprehensions_1.py由GitHub以?托管您还可以使用此表达式进行数学运算:squares=[x**2forxinrange(10)]print(squares)#[0,1,4,9,16,25,36,49,64,81]viewrawlist_comprehensions_2.py由GitHub以?托管,甚至创建了一个额外的新函数: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]viewrawlist_comprehensions_3.py托管于?最后由GitHub提供,您可以使用“if”来过滤列表。本例中,只保留能被2整除的值filtered=[iforiinrange(20)ifi%2==0]print(filtered)#[0,2,4,6,8,10,12,14,16,18]viewrawlist_comprehensions_4.py由GitHub5以?托管。使用sys.getsizeof()查看对象的内存使用情况,可以查看对象的内存内存:importsysmylist=range(0,10000)print(sys.getsizeof(mylist))#48viewrawcheck_memory_usage_1.pyhostedwith?byGitHub为什么这么庞大的列表只占用48字节的内存呢?这是因为range函数返回的类仅表现为列表。范围比使用实际的数字列表更节省内存。您可以自己使用列表理解来创建相同范围内的实际数字列表:importsysmyreallist=[xforxinrange(0,10000)]print(sys.getsizeof(myreallist))#87632viewrawcheck_memory_usage_2.pyhostedwith?byGitHub6。Python中的函数可以在没有字典、列表或类的情况下返回多个变量。它是这样工作的:defget_user(id):#fetchuserfromdatabase#....returnname,birthdatename,birthdate=get_user(4)viewrawreturn_multiple_variables.pyhostedwith?byGitHub对于数量有限的返回值,这是好的。但是任何超过3个值的东西都应该进入一个(数据)类。7.使用数据类从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'viewrawdataclass.pyhostedwith?byGitHub点击查看高8.变量交换一个小技巧可以节省几行代码a=1b=2a,b=b,aprint(a)#2print(b)#1viewrawin_place_variable_swapping.pyhostedwith?byGitHub9.合并字典(Python3.5+)合并字典更容易,因为Python3.5dict1={'a':1,'b':2}dict2={'b':3,'c':4}merged={**dict1,**dict2}print(merged)#{'a':1,'b':3,'c':4}viewrawmerging_dicts.pyhostedwith?byGitHub如果有重叠的值,第一个字典中的值将被覆盖。10.Titlecase这只是其中一种有趣的玩法:mystring="10令人敬畏的python技巧"print(mystring.title())'10个令人敬畏的Python技巧'viewrawstring_to_titlecase.py由?托管GitHub11.cutStringtoList可以将一个字符串拆分成一个字符串列表。在下面的例子中,splitmystring="Thequickbrownfox"mylist=mystring.split('')print(mylist)#['The','quick','brown','fox']viewrawstring_to_list.pyhostedwith?来自GitHub12。从字符串列表创建字符串与之前的技巧相反,在本例中,从单词之间有空格的字符串列表创建字符串:mylist=['The','quick','brown','fox']mystring="".join(mylist)print(mystring)#'Thequickbrownfox'viewrawlist_to_string.pyhostedwith?byGitHub你可能在想为什么不使用mylist.join(""),问得好!最后,String.join()函数不仅可以加入列表,还可以加入任何可迭代的列表。将它放在一个字符串中可以防止在多个地方实现相同的功能13.表情符号表情符号要么高兴要么讨厌,这取决于表达方式。此外,这在分析社交媒体数据时特别有用。首先,下载表情模块pip3installemoji后,可以这样操作:importemojiresult=emoji.emojize('Pythonis:thumbs_up:')print(result)#'Pythonis?'br/>#你也可以反过来:br/>result=emoji.demojize('Pythonis?x27;)br/>print(result)br/>#'Pythonis:thumbs_up:'viewrawemoji.py由GitHub以?托管访问表情包页面了解更多信息说明和示例14.制作列表切片的语法列表切片:a[start:stop:step]Start、stop和step是可选的。如果未设置,默认值为·Start为0·End为字符串结尾·step值为1下面是一个示例:#我们可以很容易地从列表的前两个元素创建一个新列表:first_two=[1,2,3,4,5][0:2]print(first_two)#[1,2]#如果我们使用步长值2,#我们可以跳过每隔一个数字#像这样:steps=[1,2,3,4,5][0:5:2]print(steps)#[1,3,5]#这也适用于字符串。在Python中,#你可以将字符串视为#字母列表:mystring="abcdefdnnimt"[::2]print(mystring)#'acedit'viewrawlist_slicing.py由GitHub15以?托管。反转字符串和列表使用上面的切片符号来反转字符串或列表。使用负步长值-1反转元素:revstring="abcdefg"[::-1]print(revstring)#'gfedcba'revarray=[1,2,3,4,5][::-1]print(revarray)#[5,4,3,2,1]viewrawreversing_stuff.py由GitHub16以?托管。显示小猫首先,安装Pillow(Python图像库的一个分支):pip3installPillow下载此图像,并将其命名为kittens.jpg:图像来源TheDigitalArtistPixabay您可以使用以下代码在Python代码中显示图像:或直接使用IPython:fromPILimportImageim=Image.open("kittens.jpg")im.show()print(im.format,im.size,im.mode)#JPEG(1920,1357)RGBviewrawpillow.py托管于?byGitHub此外除了显示图像,Pillow还可以分析、调整大小、过滤、增强、变形等。请参阅文档了解其所有功能。17.使用map()Python的内置函数之一是map()。map()的语法是:map(function,something_iterable)给定一个要执行的函数和一些要运行的变量。它可以是任何可迭代的元素。在下面的示例中,我将使用一个列表。defupper(s):returns.upper()mylist=list(map(upper,['sentence','fragment']))print(mylist)#['SENTENCE','FRAGMENT']#转换字符串表示形式#一个数字到ints列表中。list_of_ints=list(map(int,"1234567")))print(list_of_ints)#[1,2,3,4,5,6,7]viewrawmap.py由?托管GitHub看看你自己的代码,看看你是否可以在某个地方使用map()而不是循环!18.从列表和字符串中提取唯一元素通过使用set()函数创建集合,可以从列表或类列表中创建集合获取对象中的所有唯一元素:mylist=[1,1,2,3,4,5,5,5,6,6]print(set(mylist))#{1,2,3,4,5,6}#因为一个字符串可以被视为一个#字母列表,你也可以通过这种方式从字符串中获取#个唯一字母:print(set("aaabbbcccdddeeeffff"))#{'a','b','c','d','e','f'}viewrawset.py由GitHub19以?托管。查找最常出现的值在列表或字符串中查找最常出现的值:test=[1,2,3,4,2,2,3,1,4,4,4]print(max(set(test),key=test.count))#4viewrawmost_frequent.pyhostedwith?byGitHub你明白为什么会这样吗?在继续阅读之前,试着自己找出答案。还没试过?我要告诉你答案。·max()将返回列表中的最大值。key参数接受单个参数函数来自定义排序顺序,在本例中为test.count。该函数应用于可迭代对象上的每个项目。·测试。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):#Dosomeworkbar.next()bar.finish()viewrawprogress_bar.py由GitHub21以?托管。在交互窗口中使用_来获取最后一个带有下划线运算符的表达式的结果,例如在IPython中,如下:In[1]:3*3Out[1]:9In[2]:_+3Out[2]:12这也适用于Pythonshell。此外,IPythonshell允许使用Out[n]来获取[n]中表达式的值。例如,Out[1]会给出数字9。22.快速创建一个web服务器快速启动一个web服务器,提供当前目录的内容:python3-mhttp.server如果你想与同事分享一些东西,或者想测试一个简单的这对HTML站点非常有用。23.多行字符串虽然可以在代码中使用三重引号将多行字符串括起来,但这并不理想。放在三引号之间的所有内容都变成一个字符串,包括格式,如下所示。我更喜欢第二种方法,它连接多行并允许您很好地格式化代码。唯一的缺点是您需要明确添加换行符。s1="""多行字符串可以放在三重引号之间。虽然格式化代码时并不理想"""print(s1)#多行字符串可以放在#三重引号之间。这并不理想#在格式化代码时thoughs2=("Youcanalsoconcatenatemultiple\n"+"stringsthisway,butyou'llhaveto\n""explicitlyputinthenewlines")print(s2)#你可以也可以通过这种方式连接多个#字符串,但是您必须#明确地放入由GitHub24以?托管的换行符viewrawmultiline_strings.py。用于条件赋值的三元运算符这是使代码既简洁又可读的另一种方法:[on_true]if[expression]else[on_false]示例:x="Success!"如果(y==2)否则“失败!”:从集合导入Countermylist=[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})viewrawcounter.py由GitHub26以?托管。链式比较运算符Python中的链式比较运算符创建更易读和简洁的代码:x=10#代替:ifx>5andx<15:print("Yes")#yes#你也可以这样写:if5