How does the following expression work in python?
>>> 1 ++++++++++++++++++++ 1
2
>>> 1 ++++++++++++++++++++-+ 1
0
Run Code Online (Sandbox Code Playgroud)
I thought this would raise SyntaxError but that was not the case.
python中的元组在设计上是不可变的,因此如果我们尝试改变元组对象,python会发出以下TypeError有意义的信息。
>>> a = (1, 2, 3)
>>> a[0] = 12
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如果元组在设计上是不可变的,为什么cpython 公开PyTuple_SetItem为 C-API?
从文档中它被描述为
int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o)
o在 指向的元组的 pos 位置插入对对象的引用p。0成功归来。如果 pos 越界,则返回-1并设置 IndexError 异常。
这句话不是和tuple[index] = valuepython层中的完全一样吗?如果目标是从项目集合创建一个元组,我们可以使用PyTuple_Pack.
附加说明:
经过大量的试验和错误后,ctypes.pythonapi我设法使用以下命令来改变元组对象PyTuple_SetItem
import ctypes
from …Run Code Online (Sandbox Code Playgroud) 说我有一个字符串a.
a = "12 I have car 8 200 a"
Run Code Online (Sandbox Code Playgroud)
我需要以输出应该这样的方式对这个字符串进行排序
8 a car have 12 200 I
Run Code Online (Sandbox Code Playgroud)
即,对字符串进行排序,使所有单词按字母顺序排列,所有整数按数字顺序排列.此外,如果字符串中的第n个元素是整数,则它必须保持整数,如果是单词则必须保留为单词.
这是我试过的.
a = "12 I have car 8 200 a"
def is_digit(element_):
"""
Function to check the item is a number. We can make using of default isdigit function
but it will not work with negative numbers.
:param element_:
:return: is_digit_
"""
try:
int(element_)
is_digit_ = True
except ValueError:
is_digit_ = False
return is_digit_
space_separated = a.split()
integers = [int(i) for …Run Code Online (Sandbox Code Playgroud) Python3.11向该dis.dis函数引入了两个新参数,show_caches和adaptive。
>>> 导入磁盘
>>>
>>> 帮助(dis.dis)
模块 dis 中函数 dis 的帮助:
dis(x=无、*、文件=无、深度=无、show_caches=False、自适应=False )
反汇编类、方法、函数和其他编译对象。
不带任何参数,反汇编最后一个回溯。
编译对象目前包括生成器对象、异步生成器
对象和协程对象,它们都存储它们的代码对象
在一个特殊的属性中。
这个参数在 python 3.11 中意味着什么?我确实通过将其设置为来检查结果,True但结果与将其设置为相同False。
>>> dis.dis("a = 1", show_caches=True, adaptive=True)
0 0 RESUME 0
1 2 LOAD_CONST 0 (1)
4 STORE_NAME 0 (a)
6 LOAD_CONST 1 (None)
8 RETURN_VALUE
>>>
>>>
>>> dis.dis("a = 1")
0 0 RESUME 0
1 2 LOAD_CONST 0 (1)
4 STORE_NAME 0 (a)
6 …Run Code Online (Sandbox Code Playgroud) 我正在经历python 语法规范并找到以下语句
\n\nfor_stmt:\n | \'for\' star_targets \'in\' ~ star_expressions \':\' [TYPE_COMMENT] 块 [else_block]\n\n
~这个语法规则是什么意思?语法中使用的其他符号(如&, !, |)已记录但尚未记录~。
\n\n\n
EBNF该符号是和的混合PEG。特别是,&后面跟有符号、标记或括号组表示正向先行(即需要匹配但不消耗),而!表示负向先行(即不需要匹配)。我们\n使用|分隔符来表示 PEG\xe2\x80\x99s \xe2\x80\x9cordered choice\xe2\x80\x9d (写为/传统 PEG 语法编写)
我下面有一个简单的类,
class MyClass(int):
def __index__(self):
return 1
Run Code Online (Sandbox Code Playgroud)
根据operator.index文档,
operator.index(a)返回一个转换为整数的值。相当于
a.__index__()
但是当我使用operator.index与MyClass实例,我得到了100,而不是1(我越来越1如果我用a.__index__())。这是为什么?。
>>> a = MyClass(100)
>>>
>>> import operator
>>> print(operator.index(a))
100
>>> print(a.__index__())
1
Run Code Online (Sandbox Code Playgroud) 我在一个名为 的 Python 文件中有以下代码benchmark.py:
source = """
for i in range(1000):
a = len(str(i))
"""
import timeit
print(timeit.timeit(stmt=source, number=100000))
Run Code Online (Sandbox Code Playgroud)
当我尝试运行多个 python 版本时,我发现性能存在巨大差异。
C:\Users\Username\Desktop>py -3.10 benchmark.py
16.79652149998583
C:\Users\Username\Desktop>py -3.11 benchmark.py
10.92280820000451
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这段代码在 python 3.11 中运行得比以前的 Python 版本更快。我尝试反汇编字节码以了解此行为的原因,但我只能看到操作码名称的差异(CALL_FUNCTION被替换为PRECALL和CALL操作码)。
我很不确定这是否是性能变化的原因。所以我正在寻找一个参考 cpython 源代码来证明合理的答案。
python 3.11字节码:
0 0 RESUME 0
2 2 PUSH_NULL
4 LOAD_NAME 0 (range)
6 LOAD_CONST 0 (1000)
8 PRECALL 1
12 CALL 1
22 GET_ITER
>> 24 FOR_ITER 22 …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以在 Python 中使用匹配大小写来在字符串中进行匹配 - 即字符串是否包含匹配大小写。例子:
mystring = "xmas holidays"
match mystring:
case "holidays":
return true
case "workday":
return false
Run Code Online (Sandbox Code Playgroud)
我可以理解为什么它不会,因为这可能会同时匹配多个案例,但我想知道这是否可能。
让我说我有一个PyListObject,我想附加一个PyObject然后我可以使用PyList_Append记录在其中的API List Objects C-API.但是对于我的用例,我想要pop一个元素PyListObject(即my_list.pop()在python层中).
但是List Objects C-API文档没有提到有关pop操作的任何内容.
那么有关于PyListPopAPI函数的文档吗?
请注意,我这个问题仅供参考
我知道标题听起来像是查找内置Python函数的源代码的副本?.但让我解释一下.
比方说,我想找到类most_common方法的源代码collections.Counter.由于Counter该类是在python中实现的,我可以使用该inspect模块获取它的源代码.
即
>>> import inspect
>>> import collections
>>> print(inspect.getsource(collections.Counter.most_common))
Run Code Online (Sandbox Code Playgroud)
这将打印
def most_common(self, n=None):
'''List the n most common elements and their counts from the most
common to the least. If n is None, then list all element counts.
>>> Counter('abcdeabcdabcaba').most_common(3)
[('a', 5), ('b', 4), ('c', 3)]
'''
# Emulate Bag.sortedByCount from Smalltalk
if n is None:
return sorted(self.items(), key=_itemgetter(1), reverse=True)
return _heapq.nlargest(n, self.items(), key=_itemgetter(1))
Run Code Online (Sandbox Code Playgroud)
因此,如果在C中实现的方法或类 …
我正在摆弄字符串并遇到以下行为:
>>> import dis
>>> dis.dis('"abcdefgh" * 513')
1 0 LOAD_CONST 0 ('abcdefgh')
2 LOAD_CONST 1 (513)
4 BINARY_MULTIPLY
6 RETURN_VALUE
>>> dis.dis('"abcdefgh" * 512')
1 0 LOAD_CONST 0 ('abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh')
2 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,当我乘以 时"abcdefgh",512python 在编译阶段预先计算完整的字符串,但是当我将数字更改为513它时,它不再这样做,而是生成两个LOAD_CONST和 BINARY_MULTIPLY操作码(换句话说,python 不再预先计算编译阶段的结果)。有人可以解释这种行为的原因吗?
注意:我知道从代码的角度来看它工作得很好,但我很想知道这种行为的原因。
python cpython compiler-optimization python-3.x python-internals
我在玩弄sum函数并观察到以下行为。
情况1:
source = """
class A:
def __init__(self, a):
self.a = a
def __add__(self, other):
return self.a + other;
sum([*range(10000)], start=A(10))
"""
import timeit
print(timeit.timeit(stmt=source))
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我使用自定义类的实例作为函数start的参数sum。在我的系统中,对上面的代码进行基准测试大约需要几192.60747704200003秒钟的时间。
案例2:
source = """
class A:
def __init__(self, a):
self.a = a
def __add__(self, other):
return self.a + other;
sum([*range(10000)], start=10). <- Here
"""
import timeit
print(timeit.timeit(stmt=source))
Run Code Online (Sandbox Code Playgroud)
但如果我删除自定义类实例并int直接使用对象,则只需要111.48285191600007几秒钟。我很想知道这种速度差异的原因是什么?
我的系统信息:
>>> import platform
>>> platform.platform()
'macOS-12.5-arm64-arm-64bit'
>>> import sys
>>> sys.version
'3.11.0 …Run Code Online (Sandbox Code Playgroud) python ×11
cpython ×7
python-3.x ×7
python-3.11 ×3
performance ×2
ctypes ×1
ebnf ×1
iterator ×1
list ×1
match ×1
optimization ×1
parsing ×1
peg ×1
python-2.7 ×1
python-3.10 ×1
python-c-api ×1
sorting ×1
tuples ×1