温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

利用 Python 3.7 的特性来切片无限生成器

发布时间:2021-06-15 15:00:13 来源:亿速云 阅读:143 作者:chen 栏目:编程语言

本篇内容介绍了“利用 Python 3.7 的特性来切片无限生成器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!



这是关于 Python 3.x 首发特性系列文章的第八篇。Python 3.7 于 2018 年首次发布,尽管它已经发布了几年,但它引入的许多特性都未被充分利用,而且相当酷。下面是其中的三个。

注解推迟评估

在 Python 3.7 中,只要激活了正确的 __future__ 标志,注解在运行时就不会被评估:

from __future__ import annotations def another_brick(wall: List[Brick], brick: Brick) -> Education:    pass
another_brick.__annotations__
    {'wall': 'List[Brick]', 'brick': 'Brick', 'return': 'Education'}

它使递归类型(指向自己的类)和其他有趣的事情成为了可能。然而,这意味着如果你想做自己的类型分析,你需要明确地使用 ast

import astraw_type = another_brick.__annotations__['wall'][parsed_type] = ast.parse(raw_type).body
subscript = parsed_type.valuef"{subscript.value.id}[{subscript.slice.id}]"
    'List[Brick]'

itertools.islice 支持 index

Python 中的序列切片长期以来一直接受各种 类 int 对象(具有 __index__() 的对象)作为有效的切片部分。然而,直到 Python 3.7,itertools.islice,即核心 Python 中对无限生成器进行切片的唯一方法,才获得了这种支持。

例如,现在可以用 numpy.short 大小的整数来切片无限生成器:

import numpyshort_1 = numpy.short(1)short_3 = numpy.short(3)short_1, type(short_1)
    (1, numpy.int16)
import itertoolslist(itertools.islice(itertools.count(), short_1, short_3))
    [1, 2]

functools.singledispatch() 注解注册

如果你认为 singledispatch 已经很酷了,你错了。现在可以根据注解来注册了:

import attrimport mathfrom functools import singledispatch @attr.s(auto_attribs=True, frozen=True)class Circle:    radius: float       @attr.s(auto_attribs=True, frozen=True)class Square:    side: float @singledispatchdef get_area(shape):    raise NotImplementedError("cannot calculate area for unknown shape",                              shape) @get_area.registerdef _get_area_square(shape: Square):    return shape.side ** 2 @get_area.registerdef _get_area_circle(shape: Circle):    return math.pi * (shape.radius ** 2) get_area(Circle(1)), get_area(Square(1))
    (3.141592653589793, 1)

“利用 Python 3.7 的特性来切片无限生成器”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI