我正在创建一个数据库连接。 在尝试添加到DB时,我正在考虑用信息创建元组,然后将它们添加到DB中。
我从用户获取信息并将其存储在变量中。 我可以将这些变量添加到元组中吗?你能帮我解释一下语法吗?
我只需要元组输入信息到DB。一旦信息添加到DB,我是否应该删除元组?我不再需要元组了。
我正在创建一个数据库连接。 在尝试添加到DB时,我正在考虑用信息创建元组,然后将它们添加到DB中。
我从用户获取信息并将其存储在变量中。 我可以将这些变量添加到元组中吗?你能帮我解释一下语法吗?
我只需要元组输入信息到DB。一旦信息添加到DB,我是否应该删除元组?我不再需要元组了。
当前回答
在Python 3中,您可以使用*从原始元组和新元素一起创建一个新的元素元组。
>>> tuple1 = ("foo", "bar")
>>> tuple2 = (*tuple1, "baz")
>>> tuple2
('foo', 'bar', 'baz')
字节码几乎与tuple1 + ("baz",)相同
Python 3.7.5 (default, Oct 22 2019, 10:35:10)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def f():
... tuple1 = ("foo", "bar")
... tuple2 = (*tuple1, "baz")
... return tuple2
...
>>> def g():
... tuple1 = ("foo", "bar")
... tuple2 = tuple1 + ("baz",)
... return tuple2
...
>>> from dis import dis
>>> dis(f)
2 0 LOAD_CONST 1 (('foo', 'bar'))
2 STORE_FAST 0 (tuple1)
3 4 LOAD_FAST 0 (tuple1)
6 LOAD_CONST 3 (('baz',))
8 BUILD_TUPLE_UNPACK 2
10 STORE_FAST 1 (tuple2)
4 12 LOAD_FAST 1 (tuple2)
14 RETURN_VALUE
>>> dis(g)
2 0 LOAD_CONST 1 (('foo', 'bar'))
2 STORE_FAST 0 (tuple1)
3 4 LOAD_FAST 0 (tuple1)
6 LOAD_CONST 2 (('baz',))
8 BINARY_ADD
10 STORE_FAST 1 (tuple2)
4 12 LOAD_FAST 1 (tuple2)
14 RETURN_VALUE
唯一的区别是BUILD_TUPLE_UNPACK和BINARY_ADD。确切的性能取决于Python解释器的实现,但是实现BUILD_TUPLE_UNPACK比BINARY_ADD更快是很自然的,因为BINARY_ADD是一个多态运算符,需要额外的类型计算和隐式转换。
其他回答
另一个没有提到的策略是使用追加到列表,然后在最后将列表转换为元组:
mylist = []
for x in range(5):
mylist.append(x)
mytuple = tuple(mylist)
print mytuple
返回
(0, 1, 2, 3, 4)
当我必须传递一个元组作为函数参数时,我有时会使用这个,这对于numpy函数来说通常是必要的。
你可以从一个空白的元组开始,比如t =()。你可以用+进行加法,但你必须添加另一个元组。如果您想添加单个元素,请将其设置为单例:t = t + (element,)。您可以添加包含多个元素的元组,可以带逗号,也可以不带逗号。
>>> t = ()
>>> t = t + (1,)
>>> t
(1,)
>>> t = t + (2,)
>>> t
(1, 2)
>>> t = t + (3, 4, 5)
>>> t
(1, 2, 3, 4, 5)
>>> t = t + (6, 7, 8,)
>>> t
(1, 2, 3, 4, 5, 6, 7, 8)
正如其他答案所指出的,您不能更改现有的元组,但您总是可以创建一个新的元组(它可以从现有的元组和/或其他来源中获取部分或全部项)。
例如,如果所有感兴趣的项都在标量变量中,并且您知道这些变量的名称:
def maketuple(variables, names):
return tuple(variables[n] for n in names)
被使用,如在本例中:
def example():
x = 23
y = 45
z = 67
return maketuple(vars(), 'x y z'.split())
当然,这种情况下可以更简单地表示为(x, y, z)(或者甚至将名称一起省略,(23,45,67)),但maketuple方法可能在一些更复杂的情况下有用(例如,所使用的名称也是动态确定的,并在计算过程中添加到列表中)。
在Python 3中,您可以使用*从原始元组和新元素一起创建一个新的元素元组。
>>> tuple1 = ("foo", "bar")
>>> tuple2 = (*tuple1, "baz")
>>> tuple2
('foo', 'bar', 'baz')
字节码几乎与tuple1 + ("baz",)相同
Python 3.7.5 (default, Oct 22 2019, 10:35:10)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def f():
... tuple1 = ("foo", "bar")
... tuple2 = (*tuple1, "baz")
... return tuple2
...
>>> def g():
... tuple1 = ("foo", "bar")
... tuple2 = tuple1 + ("baz",)
... return tuple2
...
>>> from dis import dis
>>> dis(f)
2 0 LOAD_CONST 1 (('foo', 'bar'))
2 STORE_FAST 0 (tuple1)
3 4 LOAD_FAST 0 (tuple1)
6 LOAD_CONST 3 (('baz',))
8 BUILD_TUPLE_UNPACK 2
10 STORE_FAST 1 (tuple2)
4 12 LOAD_FAST 1 (tuple2)
14 RETURN_VALUE
>>> dis(g)
2 0 LOAD_CONST 1 (('foo', 'bar'))
2 STORE_FAST 0 (tuple1)
3 4 LOAD_FAST 0 (tuple1)
6 LOAD_CONST 2 (('baz',))
8 BINARY_ADD
10 STORE_FAST 1 (tuple2)
4 12 LOAD_FAST 1 (tuple2)
14 RETURN_VALUE
唯一的区别是BUILD_TUPLE_UNPACK和BINARY_ADD。确切的性能取决于Python解释器的实现,但是实现BUILD_TUPLE_UNPACK比BINARY_ADD更快是很自然的,因为BINARY_ADD是一个多态运算符,需要额外的类型计算和隐式转换。
“一旦信息被添加到DB,我应该删除元组吗?”我不再需要元组了"
No.
一般来说,没有理由删除任何东西。有一些删除的特殊情况,但它们非常非常罕见。
只需定义一个狭窄的作用域(即类中的函数定义或方法函数),对象就会在作用域结束时被垃圾收集。
不要担心删除任何东西。
【注。我和一个人一起工作,他除了试图删除对象之外,还总是写“重置”方法来清除对象。就好像他要把它们保存起来重新使用一样。也是愚蠢的自负。忽略你不再使用的对象。如果你用足够小的代码块来定义你的函数,你就没有什么可考虑的了。