Hoe kunt u dynamisch variabelen maken via een tijdje? [DUPLICEER]

Ik wil variabelen dynamisch maken via een tijdje lus in Python. Heeft iemand een creatief middel om dit te doen?


1, Autoriteit 100%

Tenzij er een overweldigende noodzaak is om een ​​puinhoop van variabele namen te creëren, zou ik gewoon een woordenboek gebruiken, waar u de sleutelnamen dynamisch kunt maken en een waarde aan elk kunt associëren.

a = {}
k = 0
while k < 10:
    # dynamically create key
    key = ...
    # calculate value
    value = ...
    a[key] = value 
    k += 1

Er zijn ook enkele interessante gegevensstructuren in de nieuwe collectionsmodule die van toepassing is.


2, Autoriteit 44%

globals()retourneert een woordenboek van de variabelen van de module. U kunt een nieuwe variabele maken door een toets te maken op dat woordenboek:

# By default, a module has some hidden variables defined
print({k: v for k, v in globals().items() if not k.startswith("__")})
for i in range(1, 11):
    globals()[f"my_variable_{i}"] = i
print()
print(my_variable_1)
print(my_variable_2)
# and so on
print()
print({k: v for k, v in globals().items() if not k.startswith("__")})

Resultaat:

{}
1
2
{'i': 10, 'my_variable_1': 1, 'my_variable_2': 2, 'my_variable_3': 3, 'my_variable_4': 4, 'my_variable_5': 5, 'my_variable_6': 6, 'my_variable_7': 7, 'my_variable_8': 8, 'my_variable_9': 9, 'my_variable_10': 10}

3, Autoriteit 40%

Gebruik de exec()methode om willekeurige code uit te voeren. Zeg bijvoorbeeld dat u een woordenboek hebt en u elke sleutel wilt draaien in een variabele met zijn oorspronkelijke woordenboekwaarde, kunt u het volgende doen:

>>> c = {"one": 1, "two": 2}
>>> for k, v in c.items():
...     exec(f"{k} = {v}")
... 
>>> one
1
>>> two
2

4, Autoriteit 22%

Dingen in de globale en / of lokale naamruimten vullen is geen goed idee. Het gebruik van een DICT is zo een andere taal-ish … d['constant-key'] = valueKijkt gewoon ongemakkelijk. Python is OO. In de woorden van een meester: “” “Namespaces zijn één toeterend Geweldig idee – laten we meer van die doen!” “”

Zoals dit:

>>> class Record(object):
...     pass
...
>>> r = Record()
>>> r.foo = 'oof'
>>> setattr(r, 'bar', 'rab')
>>> r.foo
'oof'
>>> r.bar
'rab'
>>> names = 'id description price'.split()
>>> values = [666, 'duct tape', 3.45]
>>> s = Record()
>>> for name, value in zip(names, values):
...     setattr(s, name, value)
...
>>> s.__dict__ # If you are suffering from dict withdrawal symptoms
{'price': 3.45, 'id': 666, 'description': 'duct tape'}
>>>

5, Autoriteit 4%

vars()['meta_anio_2012'] = 'translate'

6, Autoriteit 4%

trefwoordparameters stellen u toe om variabelen van de ene functie naar de andere te passeren. Op deze manier kunt u de sleutel van een woordenboek gebruiken als een variabele naam (die kan worden ingevuld in uw whilelus). De woordenboeknaam moet gewoon worden voorafgegaan door **wanneer het wordt genoemd.

# create a dictionary
>>> kwargs = {}
# add a key of name and assign it a value, later we'll use this key as a variable
>>> kwargs['name'] = 'python'
# an example function to use the variable
>>> def print_name(name):
...   print name
# call the example function
>>> print_name(**kwargs)
python

zonder **, kwargsis slechts een woordenboek:

>>> print_name(kwargs)
{'name': 'python'}

7

voor gratis-dom:

import random
alphabet = tuple('abcdefghijklmnopqrstuvwxyz')
globkeys = globals().keys()
globkeys.append('globkeys') # because name 'globkeys' is now also in globals()
print 'globkeys==',globkeys
print
print "globals().keys()==",globals().keys()
for i in xrange(8):
    globals()[''.join(random.sample(alphabet,random.randint(3,26)))] = random.choice(alphabet)
del i
newnames = [ x for x in globals().keys() if x not in globkeys ]
print
print 'newnames==',newnames
print
print "globals().keys()==",globals().keys()
print
print '\n'.join(repr((u,globals()[u])) for u in newnames)

Resultaat

globkeys== ['__builtins__', 'alphabet', 'random', '__package__', '__name__', '__doc__', 'globkeys']
globals().keys()== ['__builtins__', 'alphabet', 'random', '__package__', '__name__', 'globkeys', '__doc__']
newnames== ['fztkebyrdwcigsmulnoaph', 'umkfcvztleoij', 'kbutmzfgpcdqanrivwsxly', 'lxzmaysuornvdpjqfetbchgik', 'wznptbyermclfdghqxjvki', 'lwg', 'vsolxgkz', 'yobtlkqh']
globals().keys()== ['fztkebyrdwcigsmulnoaph', 'umkfcvztleoij', 'newnames', 'kbutmzfgpcdqanrivwsxly', '__builtins__', 'alphabet', 'random', 'lxzmaysuornvdpjqfetbchgik', '__package__', 'wznptbyermclfdghqxjvki', 'lwg', 'x', 'vsolxgkz', '__name__', 'globkeys', '__doc__', 'yobtlkqh']
('fztkebyrdwcigsmulnoaph', 't')
('umkfcvztleoij', 'p')
('kbutmzfgpcdqanrivwsxly', 'a')
('lxzmaysuornvdpjqfetbchgik', 'n')
('wznptbyermclfdghqxjvki', 't')
('lwg', 'j')
('vsolxgkz', 'w')
('yobtlkqh', 'c')

Nog een manier:

import random
pool_of_names = []
for i in xrange(1000):
    v = 'LXM'+str(random.randrange(10,100000))
    if v not in globals():
        pool_of_names.append(v)
alphabet = 'abcdefghijklmnopqrstuvwxyz' 
print 'globals().keys()==',globals().keys()
print
for j in xrange(8):
    globals()[pool_of_names[j]] = random.choice(alphabet)
newnames = pool_of_names[0:j+1]
print
print 'globals().keys()==',globals().keys()
print
print '\n'.join(repr((u,globals()[u])) for u in newnames)

Resultaat:

globals().keys()== ['__builtins__', 'alphabet', 'random', '__package__', 'i', 'v', '__name__', '__doc__', 'pool_of_names']
globals().keys()== ['LXM7646', 'random', 'newnames', 'LXM95826', 'pool_of_names', 'LXM66380', 'alphabet', 'LXM84070', '__package__', 'LXM8644', '__doc__', 'LXM33579', '__builtins__', '__name__', 'LXM58418', 'i', 'j', 'LXM24703', 'v']
('LXM66380', 'v')
('LXM7646', 'a')
('LXM8644', 'm')
('LXM24703', 'r')
('LXM58418', 'g')
('LXM84070', 'c')
('LXM95826', 'e')
('LXM33579', 'j')

Other episodes