当前位置: 首页 > 科技观察

Python3.0中首次亮相的3个值得使用的特性

时间:2023-03-13 08:22:16 科技观察

探索一些未被充分利用但仍然有用的Python特性。这是关于Python3.x首次亮相功能的系列文章中的第一篇。Python3.0于2008年首次发布,尽管它已经发布了一段时间,但它引入的许多功能并未得到充分利用,而且非常酷。这是你应该知道的三个。仅关键字参数Python3.0首先引入了仅关键字参数的概念。在此之前,无法指定仅通过关键字传递某些参数的API。这在具有许多参数的函数中很有用,其中一些参数可能是可选的。看一个人为的例子:defshow_arguments(base,extended=None,improved=None,augmented=None):print("baseis",base)ifextendedisnotNone:print("extendedis",extended)ifimprovedisnotNone:print("improvedis",improved)ifaugmentedisnotNone:print("augmentedis",augmented)在阅读调用函数的代码时,有时很难理解发生了什么:show_arguments("hello","extra")baseishelloextendedisextrashow_arguments("hello",None,"extra")baseishelloimprovedisextra虽然可以用关键字参数调用这个函数,但这显然不是最好的方式。相反,您可以将这些参数标记为仅限关键字:defshow_arguments(base,*,extended=None,improved=None,augmented=None):print("baseis",base)ifextendedisnotNone:print("extendedis",extended)ifimprovedisnotNone:print("improvedis",improved)ifaugmentedisnotNone:print("augmentedis",augmented)现在,你不能传入带有位置参数的附加参数:show_arguments(“你好”,“额外”)--------------------------------------------------------------------------TypeErrorTraceback(最近调用最后)---->1show_arguments("hello","extra")TypeError:show_arguments()接受1个位置参数,但2个被赋予对该函数的有效调用更可预测:show_arguments("hello",improved="extra")baseishelloimprovedisextranonlocal有时函数式程序员通过编写累加器的难易程度来判断一种语言。累加器是一个函数,当被调用时,它返回迄今为止所有给它的参数的总和。在3.0之前,Python的标准答案是:class_Accumulator:def__init__(self):self._so_far=0def__call__(self,arg):self._so_far+=argreturnself._so_fardefmake_accumulator():return_Accumulator()虽然我承认它有点冗长,但它可以工作:acc=make_accumulator()print("1",acc(1))print("5",acc(5))print("3",acc(3))likethis输出将是:115639在Python3.x中,nonlocal关键字可以用更少的代码实现相同的行为。defmake_accumulator():so_far=0defaccumulate(arg):nonlocalso_farso_far+=argreturnso_farreturnaccumulate虽然累加器是人为的例子,但使用nonlocal关键字使内部函数有状态的能力是一个强大的工具。扩展解构假设你有一个CSV文件,每一行由几个元素组成:第一个元素是年份,第二个元素是月份,其他元素是当月发表的所有文章的数量,每天一篇请注意,最后一个元素是文章总数,而不是每天发布的文章数。例如,一行可以以:2021,1,5,8,10开头,表示2021年1月第一天发表了5篇文章。第二天,又发表了三篇文章,使总数达到八篇。第三天,又发表了两篇文章。一个月可以有28、30或31天。提取月份、日期和文章总数有多难?在Python3.0之前的版本中,您可能会这样写:year,month,total=row[0],row[1],row[-1]这是正确的,但它模糊了格式。使用扩展析构函数,相同的表达式可以这样表示:year,month,*rest,total=row这意味着如果将格式更改为前缀描述,则可以将代码更改为:_,year,month,*rest,total=行,每个索引不加1。下一步是什么Python3.0及其更高版本已经面世12年多了,但它的一些特性仍未得到充分利用。在本系列的下一篇文章中,我将再写三个。