3 个值得使用的首次亮相在 Python 3.0 中的特性

开发 后端
这是 Python 3.x 首发特性系列文章的第一篇。Python 3.0 于 2008 年首次发布,尽管它已经发布了一段时间,但它引入的许多特性都没有被充分利用,而且相当酷。这里有三个你应该知道的。

[[400678]]

探索一些未被充分利用但仍然有用的 Python 特性。

这是 Python 3.x 首发特性系列文章的第一篇。Python 3.0 于 2008 年首次发布,尽管它已经发布了一段时间,但它引入的许多特性都没有被充分利用,而且相当酷。这里有三个你应该知道的。

仅限关键字参数

Python 3.0 首次引入了仅限关键字参数参数的概念。在这之前,不可能指定一个只通过关键字传递某些参数的 API。这在有许多参数,其中一些参数可能是可选的函数中很有用。

请看一个特意设计的例子:

  1. def show_arguments(base, extended=None, improved=None, augmented=None):
  2. print("base is", base)
  3. if extended is not None:
  4. print("extended is", extended)
  5. if improved is not None:
  6. print("improved is", improved)
  7. if augmented is not None:
  8. print("augmented is", augmented)

当阅读调用该函数的代码时,有时很难理解发生了什么:

  1. show_arguments("hello", "extra")
  2.  
  3. base is hello
  4. extended is extra
  5.  
  6. show_arguments("hello", None, "extra")
  7.  
  8. base is hello
  9. improved is extra

虽然可以用关键字参数来调用这个函数,但这明显不是最好的方法。相反,你可以将这些参数标记为仅限关键字:

  1. def show_arguments(base, *, extended=None, improved=None, augmented=None):
  2. print("base is", base)
  3. if extended is not None:
  4. print("extended is", extended)
  5. if improved is not None:
  6. print("improved is", improved)
  7. if augmented is not None:
  8. print("augmented is", augmented)

现在,你不能用位置参数传入额外的参数:

  1. show_arguments("hello", "extra")
  2. ---------------------------------------------------------------------------
  3.  
  4. TypeError Traceback (most recent call last)
  5.  
  6. <ipython-input-7-6000400c4441> in <module>
  7. ----> 1 show_arguments("hello", "extra")
  8.  
  9. TypeError: show_arguments() takes 1 positional argument but 2 were given

对该函数的有效调用更容易预测:

  1. show_arguments("hello", improved="extra")
  2. base is hello
  3. improved is extra

nonlocal

有时,函数式编程的人根据编写累加器的难易程度来判断一种语言。累加器是一个函数,当它被调用时,返回目前为止发给它的所有参数的总和。

在 3.0 之前,Python 的标准答案是:

  1. class _Accumulator:
  2. def __init__(self):
  3. self._so_far = 0
  4. def __call__(self, arg):
  5. self._so_far += arg
  6. return self._so_far
  7.  
  8. def make_accumulator():
  9. return _Accumulator()

虽然我承认有些啰嗦,但这确实有效:

  1. acc = make_accumulator()
  2. print("1", acc(1))
  3. print("5", acc(5))
  4. print("3", acc(3))

这样做的输出结果将是:

  1. 1 1
  2. 5 6
  3. 3 9

在 Python 3.x 中,nonlocal 关键字可以用少得多的代码实现同样的行为。

  1. def make_accumulator():
  2. so_far = 0
  3. def accumulate(arg):
  4. nonlocal so_far
  5. so_far += arg
  6. return so_far
  7. return accumulate

虽然累加器是人为的例子,但使用 nonlocal 关键字使内部函数拥有具有状态的的能力是一个强大的工具。

扩展析构

想象一下,你有一个 CSV 文件,每一行由几个元素组成:

  • 第一个元素是年份
  • 第二个元素是月
  • 其他元素是该月发表的全部文章数,每天一个条目

请注意,最后一个元素是 文章总数,而不是 每天发表的文章。例如,一行的开头可以是:

  1. 2021,1,5,8,10

这意味着在 2021 年 1 月,第一天发表了 5 篇文章。第二天,又发表了三篇文章,使总数达到 8 篇。第三天,又发表了两篇文章。

一个月可以有 28 天、30 天或 31 天。提取月份、日期和文章总数有多难?

在 3.0 之前的 Python 版本中,你可能会这样写:

  1. year, month, total = row[0], row[1], row[-1]

这是正确的,但它掩盖了格式。使用扩展析构,同样可以这样表达:

  1. year, month, *rest, total = row

这意味着如果该格式改为前缀了一个描述,你可以把代码改成:

  1. _, year, month, *rest, total = row

而不需要在每个索引中添加 1

接下来是什么?

Python 3.0 和它的后期版本已经推出了 12 年多,但是它的一些功能还没有被充分利用。在本系列的下一篇文章中,我将会写另外三个。 

 

责任编辑:庞桂玉 来源: Linux中国
相关推荐

2021-05-28 05:24:22

Python 3.1开发命令

2014-07-01 09:39:07

Orange Box

2021-03-09 11:20:35

Linux终端

2009-02-04 17:33:24

ibmdwPython

2009-06-15 14:53:00

NetBeans 6.

2013-06-30 09:51:54

SpringWeb服务器

2021-05-29 07:35:13

Python编程语言

2013-09-22 16:35:33

H3CCloudPac云业务系统

2011-02-25 10:00:04

Windows 8

2021-05-12 10:25:29

开发技能代码

2021-10-27 10:15:25

Python新特性编程语言

2017-03-13 15:27:55

CSS新特性

2010-03-24 09:46:16

Python 2.6

2021-01-16 10:27:37

微软漏洞补丁安全

2012-06-13 10:26:21

iOS 6

2020-03-01 14:57:47

Python编程函数

2020-12-09 11:52:28

Python字符串代码

2009-04-20 09:55:48

2021-05-12 10:25:53

组件验证漏洞

2010-07-27 09:37:44

Flex
点赞
收藏

51CTO技术栈公众号