Python是现在的热门技能。很多人都想学习Python编程,甚至一些名人,比如知名房地产开发商潘石屹,也开始学习Python。网上也有很多关于Python编程的内容。本文总结了Python编程的一些常用技巧,帮助初学者快速上手。一、字符串处理技巧1、清理用户输入清理输入值是一个常见的程序需求。比如做大小写转换,验证输入字符的注入,通常可以使用Regex,通过编写正则表达式来完成特殊的任务。但是对于复杂的情况,可以使用一些小技巧,比如:user_input="This\nstringhas\tsomewhitespaces...\r\n"character_map={ord('\n'):'',ord('\t'):'',ord('\r'):None}在这个例子中,你可以看到空格字符“\n”和“\t”都被替换为空格,而“\r”被删除.这是一个简单的例子,我们也可以使用unicodedata包和combinein()函数生成大型映射表来生成映射来替换字符串。2.提示用户输入需要用户名和密码才能操作的命令行工具或脚本。要使用此功能,一个有用的技巧是使用getpass模块:importgetpassuser=getpass.getuser()password=getpass.getpass()这三行代码让我们可以优雅地交互以提醒用户输入密码并捕获当前系统输入的用户和密码,输入密码后会自动屏蔽显示,防止被盗。3.查找字符串频率如果需要查找与某些输入字符串相似的词,可以使用difflib来实现:importdifflibdifflib.get_close_matches('appel',['ape','apple','peach','puppy'],n=2)#return['apple','ape']difflib.get_close_matches会找到相似度最好的字符串。在此示例中,第一个参数与第二个参数匹配。提供了一个可选参数n,它指定要返回的匹配项的最大数量,设置为thr的参数截止值(默认值0.6)确定匹配字符串的分数。4、多行字符串中可以使用反斜杠Python:In[20]:multistr="select*fromtest\...:whereid<5"In[21]:multistrOut[21]:'select*fromtestwhereid<5'也可以用三个引号:In[23]:multistr="""select*fromtest...:whereid<5"""In[24]:multistrOut[24]:'select*testwhereid<5'以上methodsshare的问题是缺少正确的缩进,如果我们尝试缩进,它会在字符串中插入空格。所以最终的解决方案是将字符串拆分为多行,并将整个字符串括在括号中:In[25]:multistr=("select*frommulti_row"...:"whererow_id<5"...:"orderbyage")In[26]:multistrOut[26]:'select*frommulti_rowwhererow_id<5orderbyage'5.处理IP地址常用的套路之一就是验证匹配IP地址。这个功能有一个特殊的模块ipaddress。比如我们要使用IP网段(CIDR使用IP和掩码位)生成IP地址列表:importipaddressnet=ipaddress.ip_network('192.168.1.0/27')结果:#192.168.1.0#192.168.1.1#192.168.1.2#192.168.1.3#...另一个验证IP地址是否在IP段中的好功能:ip=ipaddress.ip_address("192.168.1.2")ipinnet#Trueip=ipaddress.ip_address("192.168.1.253")ipinnet#伪IP地址转字符串,整数转换:>>>str(ipaddress.IPv4Address('192.168.0.1'))'192.168.0.1'>>>int(ipaddress.IPv4Address('192.168.0.1'))3232235521>>>str(ipaddress.IPv6Address('::1'))'::1'>>>int(ipaddress.IPv6Address('::1'))1请注意,ipaddress还支持许多其他功能,例如如支持ipv4、ipv6等,具体请参考模块文档。二、性能优化技巧1、限制CPU和内存使用如果Python程序占用资源过多,想限制资源的使用,可以使用资源包。#CPU限制deftime_exceeded(signo,frame):print("CPUexcess...")raiseSystemExit(1)defset_max_runtime(seconds):soft,hard=resource.getrlimit(resource.RLIMIT_CPU)resource.setrlimit(resource.RLIMIT_CPU,(seconds,hard))signal.signal(signal.SIGXCPU,time_exceeded)#限制内存使用defset_max_memory(size):soft,hard=resource.getrlimit(resource.RLIMIT_AS)resource.setrlimit(resource.RLIMIT_AS,(size,hard))限制CPU时,首先获取特定资源(RLIMIT_CPU)的软限制和硬限制,然后使用参数指定的秒数和获取的硬限制进行设置。如果超过CPU时间,将记录导致系统退出的信号。对于内存限制,首先获取softlimit和hardlimit,通过setrlimit和size参数进行设置。2、通过__slots__节省内存如果程序中有一个类需要创建大量的实例,那么它可能会占用大量的内存。因为Python使用字典来表示类实例的属性,这加快了执行速度,但内存效率很低,通常这不是问题。__slots__可用于优化:importsysclassFileSystem(object):def__init__(self,files,folders,devices):self.files=filesself.folders=foldersself.devices=devicesprint(sys.getsizeof(FileSystem))classFileSystem1(object):__slots__=['files','folders','devices']def__init__(self,files,folders,devices):self.files=filesself.folders=foldersself.devices=devicesprint(sys.getsizeof(FileSystem1))#Python3.5下一步#1->1016#2->888在定义__slots__属性时,Python使用固定大小的数组作为属性而不是字典,这大大减少了每个实例所需的内存。当然使用__slots__也有缺点,比如不能声明任何新的属性,只能在__slots__上使用,__slots__的类不能使用多重继承。3.使用lru_cache缓存函数调用。据说Python性能很差,尤其是做一些计算的时候。其实解决程序性能问题有一些通用的方法,比如缓存和内存。在functools中使用lru_cache可以解决迭代计算中大量重复迭代调用的问题:#CacheInfo(hits=2,misses=4,maxsize=32,currsize=4)在上面的例子中,我们执行的GET请求是缓存(最多3个缓存结果)。还可以使用cache_info方法检查函数的缓存信息。装饰器还提供了一个clear_cache方法来删??除缓存。4.__all__控制一些语言支持导入成员(变量、方法、接口)的导入机制。在Python中,默认情况下会导入所有内容,但是可以使用__all__来限制defffoo():passdefbar():pass__all__=["bar"]这样我们就可以在使用fromsome_moduleimport*时限制可以导入的内容。在本例中,仅导入了bar函数。如果__all__留空并且在使用通配符导入时没有导入任何内容,则会触发AttributeError错误。三、面向对象1、创建支持With语句的对象我们都知道open或者close语句,比如打开文件或者获取锁,但是如何实现自己的方法呢?您可以使用__enter__和__exit__方法:#__enter__()executes...#conn.__exit__()executes这是在Python中实现上下文管理最常用的方法,但还有一种更简单的方法:fromcontextlibimportcontextmanager@contextmanagerdeftag(name):print(f"<{name}>")yieldprint(f"{name}>")withtag("h1"):print("ThisisTitle.")上面的代码片段使用contextmanager装饰器实现了内容管理协议。进入with块时,会执行标记函数的第一部分(在yield之前),然后执行块,最后执行标记函数的其余部分。2.重载运算符的技巧考虑到有很多比较运算符:__lt__、__le__、__gt__,一个类实现所有比较运算符可能很烦人。这时候可以使用functools.total_ordering:fromfunctoolsimporttotal_ordering@total_orderingclassNumber:def__init__(self,value):self.value=valuedef__lt__(self,other):returnsself.value
