Dans PyCharm, quand j'écris:
return set([(sy + ady, sx + adx)])
il dit "L'appel de fonction peut être remplacé par set literal" donc il le remplace par:
return {(sy + ady, sx + adx)}
Pourquoi donc? Une set()
dans Python n'est pas la même chose qu'un dictionnaire {}
?
Et s'il veut optimiser cela, pourquoi est-ce plus efficace?
Les ensembles et les dictionnaires Python peuvent tous deux être construits à l'aide d'accolades:
my_dict = {'a': 1, 'b': 2}
my_set = {1, 2, 3}
L'interprète (et les lecteurs humains) peuvent les distinguer en fonction de leur contenu. Cependant, il n'est pas possible de faire la distinction entre un ensemble vide et un dict vide, donc dans ce cas, vous devez utiliser set()
pour que les ensembles vides désambiguïsent.
Un test très simple suggère que la construction littérale est plus rapide (python3.5):
>>> timeit.timeit('a = set([1, 2, 3])')
0.5449375328607857
>>> timeit.timeit('a = {1, 2, 3}')
0.20525191631168127
Cette question couvre certains problèmes de performance des constructions littérales sur les fonctions intégrées, bien que pour les listes et les dict. Le résumé semble être que les constructions littérales nécessitent moins de travail de la part de l'interprète.
Il s'agit d'une syntaxe alternative pour set()
>>> a = {1, 2}
>>> b = set()
>>> b.add(1)
>>> b.add(2)
>>> b
set([1, 2])
>>> a
set([1, 2])
>>> a == b
True
>>> type(a) == type(b)
True
dict
la syntaxe est différente. Il se compose de paires clé-valeur. Par exemple:
my_obj = {1:None, 2:None}
Un autre exemple de la façon dont set
et {}
sont non interchangeables (comme jonrsharpe l'a mentionné):
In: f = 'FH'
In: set(f)
Out: {'F', 'H'}
In: {f}
Out: {'FH'}
set([iterable])
est le constructeur pour créer un ensemble à partir de l'itération facultative iterable
. Et {}
consiste à créer des littéraux d'objet set/dict. Donc, ce qui est créé dépend de la façon dont vous l'utilisez.
In [414]: x = {}
In [415]: type(x)
Out[415]: dict
In [416]: x = {1}
In [417]: type(x)
Out[417]: set
In [418]: x = {1: "hello"}
In [419]: type(x)
Out[419]: dict