python 中的9个实用技巧,助你提高开发效率

整理字符串输入

整理用户输入的问题在编程过程中极为常见。通常情况下,将字符转换为小写或大写就够了,有时你可以使用正则表达式模块「Regex」完成这项工作。但是如果问题很复杂,可能有更好的方法来解决:

user_input = "This
string has some whitespaces...
"
character_map = {
  ord(
 ) :  ,
  ord(   ) :  ,
  ord(
 ) : None
}
user_input.translate(character_map) # This string has some whitespaces... 

在本例中,你可以看到空格符「 n」和「 t」都被替换成了单个空格,「 r」都被删掉了。这只是个很简单的例子,我们可以更进一步,使用「unicodedata」程序包生成大型重映射表,并使用其中的「combining()」进行生成和映射,我们可以

迭代器切片(Slice)

如果对迭代器进行切片操作,会返回一个「TypeError」,提示生成器对象没有下标,但是我们可以用一个简单的方案来解决这个问题:

import itertools
s = itertools.islice(range(50), 10, 20) # <itertools.islice object at 0x7f70fab88138>
for val in s:
  ... 

我们可以使用「itertools.islice」创建一个「islice」对象,该对象是一个迭代器,可以产生我们想要的项。但需要注意的是,该操作要使用切片之前的所有生成器项,以及「islice」对象中的所有项。

跳过可迭代对象的开头

有时你要处理一些以不需要的行(如注释)开头的文件。「itertools」再次提供了一种简单的解决方案:

string_from_file = """
// Author: ...
// License: ...
//
// Date: ...
Actual content...
 """
import itertools
for line in itertools.dropwhile(lambda line: line.startswith("//"), string_from_file.split("
")):
  print(line) 

这段代码只打印初始注释部分之后的内容。如果我们只想舍弃可迭代对象的开头部分(本示例中为开头的注释行),而又不知道要这部分有多长时,这种方法就很有用了。

只包含关键字参数的函数 (kwargs)

当我们使用下面的函数时,创建仅仅需要关键字参数作为输入的函数来提供更清晰的函数定义,会很有帮助:

def test(*, a, b):
  pass
test("value for a", "value for b") # TypeError: test() takes 0 positional arguments...
test(a="value", b="value 2") # Works... 

如你所见,在关键字参数之前加上一个「*」就可以解决这个问题。如果我们将某些参数放在「*」参数之前,它们显然是位置参数。

创建支持「with」语句的对象

举例而言,我们都知道如何使用「with」语句打开文件或获取锁,但是我们可以实现自己上下文表达式吗?是的,我们可以使用「__enter__」和「__exit__」来实现上下文管理协议:

class Connection:
  def __init__(self):
    ...
  def __enter__(self):
    # Initialize connection...
  def __exit__(self, type, value, traceback):
    # Close connection...
with Connection() as c:
  # __enter__() executes
  ...
  # conn.__exit__() executes 

这是在 Python 中最常见的实现上下文管理的方法,但是还有更简单的方法:

from contextlib import contextmanager
@contextmanager
def tag(name):
  print(f"<{name}>")
  yield
  print(f"</{name}>")
with tag("h1"):
  print("This is Title.") 

上面这段代码使用 contextmanager 的 manager 装饰器实现了内容管理协议。在进入 with 块时 tag 函数的第一部分(在 yield 之前的部分)就已经执行了,然后 with 块才被执行,最后执行 tag 函数的其余部分。

用「__slots__」节省内存

如果你曾经编写过一个创建了某种类的大量实例的程序,那么你可能已经注意到,你的程序突然需要大量的内存。那是因为 Python 使用字典来表示类实例的属性,这使其速度很快,但内存使用效率却不是很高。通常情况下,这并不是一个严重的问题。但是,如果你的程序因此受到严重的影响,不妨试一下「__slots__」:

class Person:
  __slots__ = ["first_name", "last_name", "phone"]
  def __init__(self, first_name, last_name, phone):
    self.first_name = first_name
    self.last_name = last_name
    self.phone = phone 

当我们定义了「__slots__」属性时,Python 没有使用字典来表示属性,而是使用小的固定大小的数组,这大大减少了每个实例所需的内存。使用「__slots__」也有一些缺点:我们不能声明任何新的属性,我们只能使用「__slots__」上现有的属性。而且,带有「__slots__」的类不能使用多重继承。

限制「CPU」和内存使用量

如果不是想优化程序对内存或 CPU 的使用率,而是想直接将其限制为某个确定的数字,Python 也有一个对应的库可以做到:

import signal
import resource
import os
# To Limit CPU time
def time_exceeded(signo, frame):
  print("CPU exceeded...")
  raise SystemExit(1)
def set_max_runtime(seconds):
  # Install the signal handler and set a resource limit
  soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
  resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
  signal.signal(signal.SIGXCPU, time_exceeded)
# To limit memory usage
def set_max_memory(size):
  soft, hard = resource.getrlimit(resource.RLIMIT_AS)
  resource.setrlimit(resource.RLIMIT_AS, (size, hard)) 

我们可以看到,在上面的代码片段中,同时包含设置最大 CPU 运行时间和最大内存使用限制的选项。在限制 CPU 的运行时间时,我们首先获得该特定资源(RLIMIT_CPU)的软限制和硬限制,然后使用通过参数指定的秒数和先前检索到的硬限制来进行设置。最后,如果 CPU 的运行时间超过了限制,我们将发出系统退出的信号。在内存使用方面,我们再次检索软限制和硬限制,并使用带「size」参数的「setrlimit」和先前检索到的硬限制来设置它。

控制可以/不可以导入什么

有些语言有非常明显的机制来导出成员(变量、方法、接口),例如在 Golang 中只有以大写字母开头的成员被导出。然而,在 Python 中,所有成员都会被导出(除非我们使用了「__all__」):

def foo():
  pass
def bar():
  pass
__all__ = ["bar"] 

在上面这段代码中,我们知道只有「bar」函数被导出了。同样,我们可以让「__all__」为空,这样就不会导出任何东西,当从这个模块导入的时候,会造成「AttributeError」。

实现比较运算符的简单方法

为一个类实现所有的比较运算符(如 __lt__ , __le__ , __gt__ , __ge__)是很繁琐的。有更简单的方法可以做到这一点吗?这种时候,「functools.total_ordering」就是一个很好的帮手:

from functools import total_ordering
@total_ordering
class Number:
  def __init__(self, value):
    self.value = value
  def __lt__(self, other):
    return self.value < other.value
  def __eq__(self, other):
    return self.value == other.value
print(Number(20) > Number(3))
print(Number(1) < Number(5))
print(Number(15) >= Number(15))
print(Number(10) <= Number(2)) 

这里的工作原理究竟是怎样的呢?我们用「total_ordering」装饰器简化实现对类实例排序的过程。我们只需要定义「__lt__」和「__eq__」就可以了,它们是实现其余操作所需要的最小的操作集合(这里也体现了装饰器的作用——为我们填补空白)。

结语

并非本文中所有提到的功能在日常的 Python 编程中都是必需或有用的,但是其中某些功能可能会不时派上用场,而且它们也可能简化一些原本就很冗长且令人烦恼的任务。还需指出的是,所有这些功能都是 Python 标准库的一部分。而在我看来,其中一些功能似乎并不像标准库中包含的标准内容,所以当你使用 Python 实现本文提到的某些功能时,请先参阅 Python 的标准库,如果你不能找到想要的功能,可能只是因为你还没有尽力查找(如果真的没有,那它肯定也存在于一些第三方库)。

以上就是python 中的9个实用技巧,助你提高开发效率的详细内容,更多关于python 实用技巧的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python爬虫防封ip的一些技巧

    在编写爬虫爬取数据的时候,因为很多网站都有反爬虫措施,所以很容易被封IP,就不能继续爬了.在爬取大数据量的数据时更是瑟瑟发抖,时刻担心着下一秒IP可能就被封了. 本文就如何解决这个问题总结出一些应对措施,这些措施可以单独使用,也可以同时使用,效果更好. 伪造User-Agent 在请求头中把User-Agent设置成浏览器中的User-Agent,来伪造浏览器访问.比如: headers ={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleW

  • python 19个值得学习的编程技巧

    Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净.整洁.一目了然.要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀的源代码值得阅读,比如:requests.flask.tornado,下面列举一些常见的Pythonic写法. 0. 程序必须先让人读懂,然后才能让计算机执行. "Programs must be written for people to read, and only incidentally f

  • python使用建议与技巧分享(二)

    这是一个系列文章,主要分享python的使用建议和技巧,每次分享3点,希望你能有所收获. 1 如何在if语句中检测多个条件 不推荐方式 flag1 = 1 flag2 = 0 flag3 = 0 if flag1 == 1 or flag2 == 1 or flag3 == 1: print 'ok' 推荐方式 flag1 = 1 flag2 = 0 flag3 = 0 if 1 in (flag1, flag2, flag3): print 'ok' 可以看到,前一种方式重复代码太多,不推荐.

  • python使用建议与技巧分享(一)

    这是一个系列文章,主要分享python的使用建议和技巧,每次分享3点,希望你能有所收获. 1 如何创建指定长度且有特定值的list 不推荐方式 list1 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] print list1 # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 推荐方式 list1 = [0] * 10 print list1 # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 其实,前一种方式一看就不符合DRY(Don't Rep

  • python使用建议技巧分享(三)

    这是一个系列文章,主要分享python的使用建议和技巧,每次分享3点,希望你能有所收获. 1 如何去掉list中重复元素 my_list = [3, 2, 1, 1, 2, 3] print my_list # [3, 2, 1, 1, 2, 3] unique_list = list(set(my_list)) print unique_list # [1, 2, 3] 或者 from collections import OrderedDict my_list = [3, 2, 1, 1,

  • 常用的10个Python实用小技巧

    大家好,都说追女孩方法大于态度,学Python也是,今天就给大家分享的是我在用Python编写程序时常用的一些小技巧. 1.多次打印同一个字符 在Python中,不用特地写一个函数来重复打印同一个字符,直接使用Print就可以 tem = 'I Love Python ' print(tem * 3) I Love Python I Love Python I Love Python 2.在函数内部使用生成器 在写Python程序时,我们可以在函数内部直接使用生成器,这样可以使代码更简洁. su

  • python 使用建议与技巧分享(四)

    这是一个系列文章,主要分享python的使用建议和技巧,每次分享3点,希望你能有所收获. 1 如何打印更易读的类 不推荐方式 class Point(object): def __init__(self, x, y): self.x = x self.y = y p = Point(3, 4) print p # <__main__.Point object at 0x0000000001E1B9E8> 推荐方式 class Point(object): def __init__(self,

  • Python 代码调试技巧示例代码

    Debug 对于任何开发人员都是一项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中的 bug.python 提供了一系列 debug 的工具和包,可供我们选择.本文将主要阐述如何利用 python debug 相关工具进行 debug. 使用 pdb 进行调试 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了一些常用的调试命令,详情见表

  • 超级实用的8个Python列表技巧

    列表(List)是你使用Python过程中接触最为频繁的数据结构,也是功能最为强大的几种数据结构之一.Python列表非常的万能且蕴含着许多隐藏技巧,下面我们就来探索一些常用的列表技巧. 一.列表元素的过滤 1. filter()的使用 filter()函数接受2个参数:1个函数对象以及1个可迭代的对象,接下来我们定义1个函数然后对1个列表进行过滤. 首先我们创建1个列表,并且剔除掉小于等于3的元素: 回顾一下发生了什么: 我们定义了列表original_list接着我们定义了一个接受数值型参数

  • python 中的9个实用技巧,助你提高开发效率

    整理字符串输入 整理用户输入的问题在编程过程中极为常见.通常情况下,将字符转换为小写或大写就够了,有时你可以使用正则表达式模块「Regex」完成这项工作.但是如果问题很复杂,可能有更好的方法来解决: user_input = "This string has some whitespaces... " character_map = { ord( ) : , ord( ) : , ord( ) : None } user_input.translate(character_map) #

  • 13个Pandas实用技巧,助你提高开发效率

    原作:风控猎人 整理:数据管道 归纳整理了一些工作中常用到的pandas使用技巧,方便更高效地实现数据分析. 1.计算变量缺失率 df=pd.read_csv('titanic_train.csv') def missing_cal(df): """ df :数据集 return:每个变量的缺失率 """ missing_series = df.isnull().sum()/df.shape[0] missing_df = pd.DataFram

  • 总结python爬虫抓站的实用技巧

    前言 写过的这些脚本有一个共性,都是和web相关的,总要用到获取链接的一些方法,累积不少爬虫抓站的经验,在此总结一下,那么以后做东西也就不用重复劳动了. 1.最基本的抓站 import urllib2 content = urllib2.urlopen('http://XXXX').read() 2.使用代理服务器 这在某些情况下比较有用,比如IP被封了,或者比如IP访问的次数受到限制等等. import urllib2 proxy_support = urllib2.ProxyHandler(

  • Python中字符串的常见操作技巧总结

    本文实例总结了Python中字符串的常见操作技巧.分享给大家供大家参考,具体如下: 反转一个字符串 >>> S = 'abcdefghijklmnop' >>> S[::-1] 'ponmlkjihgfedcba' 这种用法叫做three-limit slices 除此之外,还可以使用slice对象,例如 >>> 'spam'[slice(None, None, -1)] >>> unicode码与字符(single-characte

  • Python 中 list 的各项操作技巧

    最近在学习 python 语言.大致学习了 python 的基础语法.觉得 python 在数据处理中的地位和它的 list 操作密不可分. 特学习了相关的基础操作并在这里做下笔记. ''' Python --version Python 2.7.11 Quote : https://docs.python.org/2/tutorial/datastructures.html#more-on-lists Add by camel97 2017-04 ''' list.append(x) #在列表

  • Python中最大最小赋值小技巧(分享)

    码代码时,有时候需要根据比较大小分别赋值: import random seq = [random.randint(0, 1000) for _ in range(100)] #方法1: xmax, xmin = max(seq), min(seq) #方法2: xmax, *_, xmin = sorted(seq) 从上面这个来看,看不出来方法2的优势来,不过我们常用的是比较两个数的大小,并选取: dx, dy = random.sample(seq, 2) #方法1: dx, dy = m

  • 在Python中f-string的几个技巧,你都知道吗

    目录 最基础用法 自记录表达式 多行f-string 在f-string中格式化日期 控制浮点数精度 标准化显示宽度 修改为左对齐 设置科学计数法格式 控制有效数字位数 f-string想必很多Python用户都基础性的使用过,作为Python3.6版本开始引入的特性,通过它我们可以更加方便地向字符串中嵌入自定义内容,但f-string真正蕴含的功能远比大多数用户知道的要丰富,今天我们就来一起get它们~ 最基础用法 f-string最基础的用法很简单,如下例所示,在前缀f的字符串中向{}内直接

  • Python数据处理的三个实用技巧分享

    目录 1 Pandas 移除某列 2 统计标题单词数 3 Genre 频次统计 我使用的 Pandas 版本如下,顺便也导入 Pandas 库. >>> import pandas as pd >>> pd.__version__ '0.25.1' 在开始前先确保解释器和数据集在同一目录下: >>> import os >>> os.chdir('D://source/dataset') # 这是我的数据集所在目录 >>&

  • python 提高开发效率的5个小技巧

    很多时候学习是一种难者不会,会者不难的事情. 下面的5个python技巧是性价比极高的知识点,一学就会,不难但是相当管用. 使用交互模式 使用python -i xxxx.py可以直接进入python的交互模式,可以很方便的调用xxxx.py中定义的方法和函数,特别适合调试没有main()方法的文件,强力推荐. 使用pdb进行调试 很多从c++/java转到python的同学可能对python没有断点功能相当失望. 其实python自带的pdb库就可以解决这个问题. 看这个例子. def sum

  • 56个实用的JavaScript 工具函数助你提升开发效率

    目录 1. 数字操作 (1)生成指定范围随机数 2. 数组操作 (1)数组乱序 (2)数组扁平化 (3)数组中获取随机数 3. 字符串操作 (1)生成随机字符串 (2)字符串首字母大写 (3)手机号中间四位变成* (4)驼峰命名转换成短横线命名 (5)短横线命名转换成驼峰命名 (6)全角转换为半角 (7)半角转换为全角 4. 格式转化 (1)数字转化为大写金额 (2)数字转化为中文数字 5. 操作存储 (1)存储loalStorage (2)获取localStorage (3)删除localSt

随机推荐