Python中容易被忽略的内置类型

这篇具有很好参考价值的文章主要介绍了Python中容易被忽略的内置类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python中的内置类型是我们开发中最常见的,很多人都能熟练的使用它们。

然而有一些内置类型确实不那么常见的,或者说往往会被我们忽略,所以这次的主题就是带领大家重新认识这些“不同寻常”的内置类型。

1.frozenset

不可变集合(frozenset)与普通的set一样,只不过它的元素是不可变的,因此诸如addremoveupdate等可以添加/删除/改变集合内元素的方法是不存在的,换句话说一旦frozenset建立后你将不再可能更改集合内的元素。

其他的方法与set一致:

>>> frozen = frozenset([1, 1, 2, 3, 4, 5, 6, 6]) 
frozenset({1, 2, 3, 4, 5, 6}) 
>>> frozen | {1, 2, 3, 7, 8} 
frozenset({1, 2, 3, 4, 5, 6, 7, 8}) 
>>> frozen ^ {1, 2, 3, 7, 8} 
frozenset({4, 5, 6, 7, 8})

2.range

range事实上相当得常见,所以你也许会奇怪我为什么把它列出来。

其实原因很简单,因为大部分人熟悉range的使用,但并不清楚range到底是什么。返回迭代器?返回一个可迭代对象?range本身又是什么呢?

答案揭晓:

>>> range

<class 'range'>

是的,range是个class!所以当我们使用for i in range(1, 10)这样的代码时,实际上我们遍历了一个range对象,而range也实现了可迭代对象需要的__iter__魔法方法,所以它自身是可迭代对象:

>>> range.__iter__

<slot wrapper '__iter__' of 'range' objects>

因此,range既不返回迭代器,也不返回其他可迭代对象,而是返回的自己。

3.bytearray

bytearray一般情况下并不常见,它主要为了可以实现原地修改bytes对象而出现,因为bytes和str一样是不可变对象,例如这样是非法的:

>>> b = '测试用例a'.encode('utf8') 
>>> b[-1] = 98 # change 'a' -> 'b' 
Traceback (most recent call last): File "", line 1, in TypeError: 'bytes' object does not support item assignment 

而当我们把bytes的内容复制给bytearray时就可以进行原地修改了:

>>> array = bytearray(b) 
>>> array[-1] = 98 
>>> array.decode('utf8') 

bytearray对象没有字面常量,因此只能通过构造函数创建,它有着和bytes一样的方法,只是可变以及多了一些序列对象的特性。如果要创建一个bytearray可以有如下的几种方法: - bytearray()返回一个空的bytearray对象 - bytearray(10)创建一个长度为10且内容被0填充的bytearray - bytearray(iterable)会将可迭代对象的内容转换成bytes然后存入对象中 - bytearray(b'Hi!')将已有的二进制数据复制进对象

另外bytearray还提供了fromhex和hex方便将数据以16进制的形式输入输出:

>>> array.hex()
'e6b58be8af95e794a8e4be8b62'
>>> bytearray().fromhex('e6b58be8af95e794a8e4be8b62').decode('utf8')

'测试用例b'

4.memoryview

memoryview提供了直接访问对象内存的机制,只要目标对象支持[buffer protocol],例如bytesbytearray

memoryview有个称为“元素”的概念,也就是对象规定的最小的内存单元,比如bytes和bytearray的最小内存单元就是一个byte,具体取决于对象的实现。

len(view)通常等于len(view.tolist()),也就是等于view的“元素”数量。如果view.ndim == 0,那么整个view的内存会被视作一个整体,len会返回1,如果view.ndim == 1那么就正常返回“元素”的个数。view.itemsize会返回单个“元素”的大小。单位是byte。

view.readonly表示当前的memoryview是否是只读的,例如bytes对象的view就是只读的,view.readonly的值为True。是否只读取决于被引用的对象是否可变以及对buffer protocol的实现。

对于使用完毕的memoryview应该尽快调用其release()方法释放资源,而且部分对象在被view引用时会自动进行一些限制,比如bytearray会禁止调整大小,及时释放view是资源可以解除这些限制。

结合示例可以更清晰地了解这些特性:

>>> data = bytearray(b'abcefg')
>>> v = memoryview(data)
>>> v.readonly
False
>>> v[0] = ord(b'z')
>>> data
bytearray(b'zbcefg')
>>> v[1:4] = b'123'
>>> data
bytearray(b'z123fg')
>>> v[2:3] = b'spam'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: memoryview assignment: lvalue and rvalue have different structures
>>> v[2:6] = b'spam'
>>> data

bytearray(b'z1spam')

5.dict-views

准确的说,这不是一种类型,而是一种概念。然而typing里仍然将其视为一种类型,所以也就罗列在此了。

概念:返回自dict.keys(),dict.values()和dict.items()的对象被称作dict-views。

对于views对象,可以使用len,成员检测,它本身也是可迭代对象:

>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
 
>>> # iteration
>>> n = 0
>>> for val in values:
...     n += val
>>> print(n)
504
 
>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]
#学习中遇到问题没人解答?小编创建了一个Python学习交流群:153708845
 
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']
 
>>> # set operations
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}
>>> keys ^ {'sausage', 'juice'}

{'juice', 'sausage', 'bacon', 'spam'}

从例子中可以看出,views保持着元素的插入顺序(插入顺序的保证从python3.6开始)以及views动态反应了key/value的插入和删除以及修改,因此在某些场景下views对象是相当有用的。

6.The Ellipsis Object (...)

...不是一个类型,不过算是一个内置对象。

它没什么特殊的含义,仅表示省略,通常被用在type hints中:

>>> ...
Ellipsis
>>> from typing import Callable

>>> func: Callable[..., None] = lambda x,y:print(x*y)

func是一个没有返回值的函数,参数列表没有做任何限制。

你也可以写成Ellipsis,两者是等价的,不过显然是...这种形式更简单明了。

以上就是这些容易被忽略和遗忘的内置类型,如有错误和疏漏欢迎指出。文章来源地址https://www.toymoban.com/news/detail-854659.html

到了这里,关于Python中容易被忽略的内置类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python的数据类型的内置方法

    可变与不可变数据类型 字典的内置方法 元组的内置方法 集合的内置方法

    2024年02月10日
    浏览(35)
  • python - 内置类型 之 Generic Alias Type

      Standard Generic Collections These standard library collections support parameterized generics. tuple list dict set frozenset type collections.deque collections.defaultdict collections.OrderedDict collections.Counter collections.ChainMap collections.abc.Awaitable collections.abc.Coroutine collections.abc.AsyncIterable collections.abc.AsyncIterator collect

    2024年02月03日
    浏览(37)
  • Python——第2章 数据类型、运算符与内置函数

    目录 1 赋值语句 2 数据类型 2.1 常用内置数据类型 2.1.1  整数、实数、复数 2.1.2  列表、元组、字典、集合  2.1.3  字符串 2.2  运算符与表达式 2.2.1  算术运算符  2.2.2  关系运算符 2.2.3  成员测试运算符 2.2.4  集合运算符 2.2.5  逻辑运算符 2.3  常用内置函数 2.3.1  类型转换

    2023年04月21日
    浏览(42)
  • 【JAVA】最容易忽视的数据类型——枚举

    个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 Java枚举是一个特殊的类一般表示一组常量,比如一年的 4个季节,一年的 12 个月份,一个星期的7天,方向有东南西北等。今天就让我们来学习一下在JAVA中这个特殊的类。 枚举是一种数据类型,用于 定义一组具有相同属性的

    2024年02月08日
    浏览(34)
  • MPI内置类型与自定义类型

    MPI_CHAR: 字符型 MPI_UNSIGNED_CHAR: 无符号字符型 MPI_BYTE: 字节型 MPI_SHORT: 短整型 MPI_UNSIGNED_SHORT: 无符号短整型 MPI_INT: 整型 MPI_UNSIGNED: 无符号整型 MPI_LONG: 长整型 MPI_UNSIGNED_LONG: 无符号长整型 MPI_FLOAT: 单精度浮点型 MPI_DOUBLE: 双精度浮点型 MPI_LONG_DOUBLE: 长双精度浮点型 MPI_Type_contiguou

    2024年02月10日
    浏览(50)
  • 【Python从入门到人工智能】14个必会的Python内置函数(6)——打印输出 (详细语法参考+参数说明+具体示例) | 详解Python中的打印输出!附综合案例!

      你有不伤别人的教养,却缺少一种不被别人伤害的气场,若没有人护你周全,就请你以后善良中带点锋芒,为自己保驾护航。   🎯作者主页: 追光者♂🔥          🌸个人简介:   💖[1] 计算机专业硕士研究生💖   🌟[2] 2022年度博客之星人工智能领域TOP4🌟   🏅[

    2024年02月15日
    浏览(58)
  • iOS中容易用错的常用知识点

    坐标系转换 ios中的坐标系有三种 视图坐标系: 原点(0,0)视图的左上角 窗口坐标系: 原点(0,0)窗口的左上角 世界坐标系: 原点(0,0)游戏中世界的原点 平时开发中经常会遇到转UIWindow坐标问题,如:已知一个UI控件的坐标,把它转换到UIWindow时,它对应的UIWindow坐标是什么? 苹

    2024年02月07日
    浏览(41)
  • 20 - 常见内置数据类型

    在Python中,常用的类型是这些: Python 中查看数据类型的函数(function)为 type() 。 Python 中常看内置方法(build-in method)的函数为 dir() 。 一个对象是否可变(mutable) 一些对象的 值在对象被创建后是不能再更改的 ,这类对象被称为 不可变对象(immutable objects) ; 一些对象的 值在被创建

    2024年02月19日
    浏览(36)
  • python中的类型转换

    所谓的类型转换,将一个类型的对象转换为其他对象。 类型转换不是改变对象本身的类型,而是将对象的值转换为新的对象。 类型转换四个函数 int() 、 float() 、 str() 、 bool() int() 可以用来将其他的对象转换为整型 规则 布尔值:True - 1 False - 0 浮点数:直接取整,省略小数点

    2024年02月05日
    浏览(42)
  • Go语言内置类型和函数

    1.1.1 值类型 1.1.2 引用类型:(指针类型) Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用于系统级的操作,例如:panic。因此,它们需要直接获得编译器的支持。

    2024年02月08日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包