Dodaj zmienne do krotki

282

Uczę się języka Python i tworzę połączenie z bazą danych. Próbując dodać do bazy danych, myślę o utworzeniu krotek z informacji, a następnie dodaniu ich do bazy danych.

Co robię : pobieram informacje od użytkownika i przechowuję je w zmiennych. Czy mogę dodać te zmienne do krotki? Czy możesz mi pomóc ze składnią?

Również jeśli istnieje skuteczny sposób na zrobienie tego, udostępnij ...

EDYCJA Pozwól mi trochę edytować to pytanie ... Potrzebuję tylko krotki, aby wprowadzić informacje do DB. Czy po dodaniu informacji do bazy danych należy usunąć krotkę? To znaczy, nie potrzebuję już krotki.

amit
źródło

Odpowiedzi:

371

Krotki są niezmienne; nie można zmienić, które zmienne zawierają po budowie. Można je jednak połączyć lub pokroić w plasterki, aby utworzyć nowe krotki:

a = (1, 2, 3)
b = a + (4, 5, 6)  # (1, 2, 3, 4, 5, 6)
c = b[1:]  # (2, 3, 4, 5, 6)

I oczywiście zbuduj je na podstawie istniejących wartości:

name = "Joe"
age = 40
location = "New York"
joe = (name, age, location)
John Millikin
źródło
Potrzebuję tylko tych krotek do dodawania do bazy danych po wprowadzeniu danych przez użytkownika. więc powinienem zniszczyć te krotki po zakończeniu aktualizacji do bazy danych?
amit
5
Po zaktualizowaniu bazy danych nie trzeba niszczyć krotek. Jeśli wykroczą poza zakres, powinny zostać wyrzucone.
Justin Standard
Aby dodać ciąg do krotki bez zerwania samego łańcucha, sprawdź stackoverflow.com/a/16449189
Enzo Ferey
Wystarczy dodać a = (), i b= a + (5), prowadzi do b = 5, zatem b= a + (5,)prowadzi do b = (5,); krotka.
yashgarg1232
222

Możesz zacząć od pustej krotki z czymś takim t = (). Możesz dodać za pomocą +, ale musisz dodać kolejną krotkę. Jeśli chcesz dodać pojedynczy element, sprawiają, że pojedyncza: t = t + (element,). Możesz dodać krotkę wielu elementów z tym przecinkiem lub bez niego.

>>> 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)
Daniel
źródło
20
W tym przykładzie można również zrobić: t = ()następniet += (1,)
Douglas Denhartog
2
Jakie korzyści ma dodanie przecinka końcowego?
Łącznie
13
Przecinek końcowy jest konieczny dla singletonu, aby uniknąć pomylenia elementu w nawiasach. Proste nawiasy są używane w kolejności operacji, więc (7) to tylko 7. Ale (7,) jest krotką z jednym elementem, w której elementem jest 7. Podobnie, 3 * (7 + 8) = 45, ale 3 * ( 7 + 8,) = (15, 15, 15) - czy to ma sens?
Daniel
2
W przypadku krotek wieloelementowych przecinek końcowy jest w 100% opcjonalny. Oznacza to, że „jest to krotka, wiem, że to krotka, wiem, jak działają krotki i wiem, że mogę to zrobić”. Ale przecinek nie wydaje się bardziej naturalny. Nie wiem. Zależy od Ciebie.
Daniel
Myślę, że ważne jest, aby pamiętać, że krotki są niezmienne - w rzeczywistości nie można ich modyfikować. Rozwiązanie to tworzy nową krotkę na podstawie dwóch istniejących krotek.
That1Guy,
44

Inną taktyką, o której jeszcze nie wspomniano, jest dołączanie do listy, a następnie przekształcanie listy w krotkę na końcu:

mylist = []
for x in range(5):
    mylist.append(x)
mytuple = tuple(mylist)
print mytuple

zwroty

(0, 1, 2, 3, 4)

Czasami używam tego, gdy muszę przekazać krotkę jako argument funkcji, co często jest konieczne dla funkcji numpy.

ehontz
źródło
3
Warto wiedzieć, że jest odwrotnie, tzn. Też list(someTuple)działa. Te dwa typy obiektów są najwyraźniej wymienne
khaverim
Niezupełnie wymienne, myślę, że konwersja z krotki na listę spowoduje skopiowanie wszystkich elementów z listy, więc na pewno jest miejsce, aby tego uniknąć
gbtimmon
41

W Pythonie 3 możesz użyć *do utworzenia nowej krotki elementów z oryginalnej krotki wraz z nowym elementem.

>>> tuple1 = ("foo", "bar")
>>> tuple2 = (*tuple1, "baz")
>>> tuple2
('foo', 'bar', 'baz')
Yang Bo
źródło
2
Jest to dla mnie zdecydowanie najbardziej pytoniczny.
Bumsik Kim,
6
Jest to 10 razy wolniej niż tuple1 + ("baz",).
Mateen Ulhaq,
9

„Czy po dodaniu informacji do bazy danych powinienem usunąć krotkę? Mam na myśli, że nie potrzebuję krotki”.

Nie.

Zasadniczo nie ma powodu, aby cokolwiek usuwać. Istnieją pewne specjalne przypadki usuwania, ale są one bardzo, bardzo rzadkie.

Po prostu zdefiniuj wąski zakres (tj. Definicję funkcji lub funkcję metody w klasie), a obiekty będą śmieciami zbierane na końcu zakresu.

Nie martw się o usunięcie czegokolwiek.

[Uwaga. Pracowałem z facetem, który - oprócz prób usuwania obiektów - zawsze pisał metody „resetowania”, aby je usunąć. Jakby zamierzał je uratować i wykorzystać ponownie. Również głupie zarozumiałość. Po prostu zignoruj ​​obiekty, których już nie używasz. Jeśli zdefiniujesz swoje funkcje w wystarczająco małych blokach kodu, nie będziesz musiał myśleć o niczym więcej.]

S.Lott
źródło
7

Jest to tak proste, jak:

info_1 = "one piece of info"
info_2 = "another piece"
vars = (info_1, info_2)
# 'vars' is now a tuple with the values ("info_1", "info_2")

Krotki w Pythonie są jednak niezmienne , więc nie można dodawać zmiennych do krotki po jej utworzeniu.

mipadi
źródło
3

Jak zauważyły ​​inne odpowiedzi, nie możesz zmienić istniejącej krotki, ale zawsze możesz utworzyć nową krotkę (która może zabrać niektóre lub wszystkie przedmioty z istniejących krotek i / lub innych źródeł).

Na przykład, jeśli wszystkie interesujące przedmioty znajdują się w zmiennych skalarnych i znasz nazwy tych zmiennych:

def maketuple(variables, names):
  return tuple(variables[n] for n in names)

do użycia, np. jak w tym przykładzie:

def example():
  x = 23
  y = 45
  z = 67
  return maketuple(vars(), 'x y z'.split())

oczywiście ten jeden przypadek byłby prościej wyrażony jako (x, y, z)(lub nawet w ogóle porzucając nazwy (23, 45, 67)), ale maketuplepodejście to może być przydatne w niektórych bardziej skomplikowanych przypadkach (np. gdy nazwy do użycia są również określane dynamicznie i dołączane do listy podczas obliczenie).

Alex Martelli
źródło
2

Jestem prawie pewien, że składnia tego w pythonie jest następująca:

user_input1 = raw_input("Enter Name: ")
user_input2 = raw_input("Enter Value: ")
info = (user_input1, user_input2)

po ustawieniu krotek nie można zmienić.

Jon W.
źródło