- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章容易被忽略的Python内置类型由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Python中的内置类型是我们开发中最常见的,很多人都能熟练的使用它们.
然而有一些内置类型确实不那么常见的,或者说往往会被我们忽略,所以这次的主题就是带领大家重新认识这些“不同寻常”的内置类型.
(注意:本文基于python3,不会包含任何python2相关内容) 。
。
不可变集合(frozenset)与普通的set一样,只不过它的元素是不可变的,因此诸如`add`,`remove`,`update`等可以添加/删除/改变集合内元素的方法是不存在的,换句话说一旦frozenset建立后你将不再可能更改集合内的元素。其他的方法与set一致: ```python >>> 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}) ``` 。
。
`range`事实上相当得常见,所以你也许会奇怪我为什么把它列出来。 其实原因很简单,因为大部分人熟悉range的使用,但并不清楚range到底是什么。返回迭代器?返回一个可迭代对象?range本身又是什么呢?
答案揭晓:
1
2
|
>>>
range
<
class
'range'
>
|
是的,range是个class!所以当我们使用for i in range(1, 10)这样的代码时,实际上我们遍历了一个range对象,而range也实现了可迭代对象需要的__iter__魔法方法,所以它自身是可迭代对象:
1
2
|
>>>
range
.__iter__
<slot wrapper
'__iter__'
of
'range'
objects>
|
因此,range既不返回迭代器,也不返回其他可迭代对象,而是返回的自己.
。
`bytearray`一般情况下并不常见,它主要为了可以实现原地修改bytes对象而出现,因为bytes和str一样是不可变对象,例如这样是非法的: ```python >>> 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`时就可以进行原地修改了: ```python >>> array = bytearray(b) >>> array[-1] = 98 >>> array.decode('utf8') 测试用例b ``` `bytearray`对象没有字面常量,因此只能通过构造函数创建,它有着和bytes一样的方法,只是可变以及多了一些序列对象的特性。如果要创建一个`bytearray`可以有如下的几种方法: - `bytearray()`返回一个空的`bytearray`对象 - `bytearray(10)`创建一个长度为10且内容被0填充的`bytearray` - `bytearray(iterable)`会将可迭代对象的内容转换成bytes然后存入对象中 - `bytearray(b'Hi!')`将已有的二进制数据复制进对象 。
另外bytearray还提供了fromhex和hex方便将数据以16进制的形式输入输出:
1
2
3
4
|
>>> array.
hex
()
'e6b58be8af95e794a8e4be8b62'
>>> bytearray().fromhex(
'e6b58be8af95e794a8e4be8b62'
).decode(
'utf8'
)
'测试用例b'
|
。
`memoryview`提供了直接访问对象内存的机制,只要目标对象支持[buffer protocol](https://docs.python.org/3/c-api/buffer.html#bufferobjects),例如`bytes`和`bytearray`。 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是资源可以解除这些限制.
结合示例可以更清晰地了解这些特性:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
>>> 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'
)
|
。
准确的说,这不是一种类型,而是一种概念。然而typing里仍然将其视为一种类型,所以也就罗列在此了。 概念:返回自dict.keys(),dict.values()和dict.items()的对象被称作dict-views.
对于views对象,可以使用len,成员检测,它本身也是可迭代对象:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
>>> 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
]
>>>
# 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对象是相当有用的.
。
`...`不是一个类型,不过算是一个内置对象。 它没什么特殊的含义,仅表示省略,通常被用在type hints中:
1
2
3
4
|
>>> ...
Ellipsis
>>>
from
typing
import
Callable
>>> func:
Callable
[...,
None
]
=
lambda
x,y:
print
(x
*
y)
|
func是一个没有返回值的函数,参数列表没有做任何限制.
你也可以写成Ellipsis,两者是等价的,不过显然是...这种形式更简单明了.
以上就是这些容易被忽略和遗忘的内置类型,如有错误和疏漏欢迎指出.
。
https://docs.python.org/3/library/stdtypes.html 。
https://docs.python.org/3/c-api/buffer.html#bufferobjects 。
以上就是容易被忽略的Python内置类型的详细内容,更多关于Python内置类型的资料请关注我其它相关文章! 。
原文链接:https://www.cnblogs.com/apocelipes/p/10252081.html 。
最后此篇关于容易被忽略的Python内置类型的文章就讲到这里了,如果你想了解更多关于容易被忽略的Python内置类型的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试设置我的 git 配置,以便我可以使用工作环境和个人环境。 这是我的 ~.gitconfig 文件的内容(碰巧 work 和 private 在 github 上): [url "git@
我有以下情况。我在 Sheet1 上有一个项目列表,我想将项目复制到 Sheet2 并排除特定项目。 假设我在 Sheet1 上有以下项目列表: 我想将“梨”单元格留在 Sheet2 上。 它应该完全
我试图让 gcc 以不同的语言提供错误消息。但它仍然给我英文的错误信息。 我的语言环境输出 varun@varun-desktop:$ 语言环境 LANG=en_IN LC_CTYPE="es_EC.
我在 Linux x86 上使用 gcc。 我的程序将指向 C 函数的指针导出到 LLVM JIT 函数。调用约定是 cdecl。它在 Windows 上的 MingW 上运行良好。但是奇怪的事情发生
windows 上 php 的奇怪问题...我的应用程序加载了一个“核心”文件,该文件加载了一个设置文件、注册自动加载、进行初始化等。在核心文件的顶部我有 include_once("config.p
在工具|选项|调试器选项 |语言异常可以忽略特定的异常类型。是否可以为每个项目定义这个?例如在调试构建配置中(Delphi 2009 和/或 2010)? /编辑:Reported in QC 最佳答
我在一个文本框旁边有 2 个按钮,在这 2 个按钮后面还有另一个文本框。第一个文本框的 tabindex 为 1000,第一个按钮为 1001,第二个按钮为 1002。第二个文本框的 tabindex
我是 python 新手,正在尝试类型提示,但它们似乎只在某些情况下起作用。它们似乎在属性返回类型上按预期工作,但是当我尝试将整数分配给字符串值(即 self._my_string = 4)时,我没有
问题陈述 我有一些国家和这些国家的州的依赖组合框。我使用 VBA 在第一个组合框中填充唯一值,然后在第二个组合框中动态填充唯一值。该代码似乎忽略了初始传递中的条件。 例如,该代码适用于第一个国家/地区
我对 Javascript 有点陌生。我试图做到这一点,以便单击一个页面上的图像会将您带到一个新页面,并在该新页面上显示特定的 div,因此我使用 sessionStorage 来记住并使用 bool
我不确定我是否正确地处理了这个问题。 我有一个 ASP.NET MVC Web 应用程序。有 4 个主要“页面”通过单击菜单选项,可以选择一个页面,并将该页面选项存储在本地存储中。 现在,如果我刷新页
我的页面工作正常,并按预期显示日期和时间,直到我不得不添加 new Date() 以避免 momentjs deprecation warning 。现在我的约会比应有的时间晚了 5 个小时。 我该如
我需要合并一个 fork 项目。不幸的是,CVS $Id 行不同,因此我尝试的合并工具报告所有文件都不同(其中 95% 只有这一行不同) 是否有一个合并工具可以配置为忽略基于模式的行比较结果? [编辑
我是 python 新手,正在尝试类型提示,但它们似乎只在某些情况下起作用。它们似乎在属性返回类型上按预期工作,但是当我尝试将整数分配给字符串值(即 self._my_string = 4)时,我没有
我正在尝试根据 How do a send an HTTPS request through a proxy in Java? 使用代理访问 https 网页 但是我遇到了一个奇怪的问题:HttpsU
我有一个简单的 CMakeLists.txt 文件: cmake_minimum_required(VERSION 2.8.9) project (sample) add_library(Shared
这个问题在这里已经有了答案: typedef pointer const weirdness (6 个答案) 关闭 8 年前。 我有一个结构体 type_s。然后我将指向 struct type_s
我正在尝试制作一个使用 AES 256 加密的应用程序。不幸的是我无法让它工作。也许我没有完全理解密码逻辑。 所以它正在工作,但据我了解,哈希包含密码。但如果我更改密码,输出是相同的。因此,Crypt
我的文件包含一些行,例如 "This is a string." = "This is a string's content." " Another \" example \"" = " New ex
我尝试使用此查询来获取所选健身房的所有用户。 我的问题是查询忽略了这部分:ual.user_id = weekUsers.user_id 查询似乎获取了与我选择的日期匹配的所有用户 ID,而不检查该用
我是一名优秀的程序员,十分优秀!