2017-02-21 3 views
0
a = (x for x in range(5)) 
print(type(a)) # prints "<class 'generator'>" 

Но это поднимает SyntaxError (как и ожидалось):Неявный генератор внутри скобок класса конструктора?

a = x for x in range(5) 

Если я хочу, чтобы определить кортеж со значениями от генератора, оба эти работы:

tup1 = tuple(x for x in range(5)) 
tup2 = tuple((x for x in range(5))) 

В tup1, то скобки являются частью конструктора класса tuple. Но почему это работает?

+1

Потому что это было определено именно так. А также не столкнуться с синтаксисом цикла 'for' – JBernardo

+0

@JBernardo Но что передается конструктору класса кортежа? И первый подход правильный? –

+0

Кронштейны имеют 2 функции (оберните генератор и вызов функции) в примере 'tup1'. Это правильный способ сделать, если в функции есть только один аргумент. – JBernardo

ответ

1

В вашем примере:

  • Первый a1 = (x for x in range(5)) является генератором
  • Второго a2 = x for x in range(5) недействителен
  • Третьего tup1 = tuple(x for x in range(5))
  • и четвёртая tup2 = tuple((x for x in range(5))) конвертировать генератор в кортеж. Сравните с написанием tuple(a1).

Третий подход предпочтительнее, поскольку он более понятен и менее шумный, если вы хотите получить кортеж. Первый подход - это только генератор, который был бы предпочтительнее, если бы вам фактически не нужен сам экземпляр, но, например, хотите зациклиться на нем.

+1

Нет такого как «кортеж». Это генератор, который затем преобразуется в кортеж. Обе формы - это точно такая же операция. – JBernardo

+1

Что сказал @JBernardo. Предполагается, что все повторяющиеся типы в Python могут быть созданы с помощью одного итеративного аргумента, который может быть генератором: 'set (x for x ...)', 'tuple (x for x ...)' и т. Д. . '[x for x ...]' является просто синтаксическим сахаром для 'list (x for x ...)'. – schwobaseggl

+0

Спасибо, изменил его. – Roelant