设为首页 - 加入收藏 92站长网 (http://www.92zhanzhang.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: javascript 2019 中国 苹果
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

编程大神进阶之路:Python技巧小贴士

发布时间:2019-10-27 12:12 所属栏目:[优化] 来源:机器之心编译
导读:介绍 Python 炫酷功能(例如,变量解包,偏函数,枚举可迭代对象等)的文章层出不穷。但是还有很多 Python 的编程小技巧鲜被提及。因此,本文会试着介绍一些其它文章没有提到的小技巧,这些小技巧也是我平时会用到的的。让我们一探究竟吧! 整理字符串输入 整

介绍 Python 炫酷功能(例如,变量解包,偏函数,枚举可迭代对象等)的文章层出不穷。但是还有很多 Python 的编程小技巧鲜被提及。因此,本文会试着介绍一些其它文章没有提到的小技巧,这些小技巧也是我平时会用到的的。让我们一探究竟吧!

编程大神进阶之路:Python技巧小贴士

整理字符串输入

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

  1. user_input?=?"This\nstring?has\tsome?whitespaces...\r\n"?
  2. ?
  3. character_map?=?{?
  4. ????ord('\n')?:?'?',?
  5. ????ord('\t')?:?'?',?
  6. ????ord('\r')?:?None?
  7. }?
  8. user_input.translate(character_map)??#?This?string?has?some?whitespaces...??

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

迭代器切片(Slice)

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

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

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

跳过可迭代对象的开头

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

  1. string_from_file?=?"""?
  2. //?Author:?...?
  3. //?License:?...?
  4. //?
  5. //?Date:?...?
  6. Actual?content...?
  7. """?
  8. ?
  9. import?itertools?
  10. ?
  11. for?line?in?itertools.dropwhile(lambda?line:?line.startswith("//"),?string_from_file.split("\n")):?
  12. ????print(line)?

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

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

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

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

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

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

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

  1. class?Connection:?
  2. ????def?__init__(self):?
  3. ????????...?
  4. ?
  5. ????def?__enter__(self):?
  6. ????????#?Initialize?connection...?
  7. ?
  8. ????def?__exit__(self,?type,?value,?traceback):?
  9. ????????#?Close?connection...?
  10. ?
  11. with?Connection()?as?c:?
  12. ????#?__enter__()?executes?
  13. ????...?
  14. ????#?conn.__exit__()?executes?

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

  1. from?contextlib?import?contextmanager?
  2. ?
  3. @contextmanager?
  4. def?tag(name):?
  5. ????print(f"<{name}>")?
  6. ????yield?
  7. ????print(f"")?
  8. ?
  9. with?tag("h1"):?
  10. ????print("This?is?Title.")?

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

用「__slots__」节省内存

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章