Почему я не могу получить два значения с двумя переменными в цикле python for?

#python #for-loop

#python #for-цикл

Вопрос:

У меня есть следующие сомнения

Первый код:

 x= 'ab'
y = 'cd'
z = 'ef'

for i,j in x,y :
    print (i,j)

>>> Output : a b
             c d
  

Переменная ‘i’ — это: a c , а переменная ‘j’ — это: b d

Второй код:

 x= 'ab'
y = 'cd'
z = 'ef'

for i,j in x,y,z:
    print (i,j)

>>> Output : a b
             c d
             e f
  

Переменная ‘i’: a c e, а переменная ‘j’: b d f

. . и так далее.

Теперь посмотрите на это:

 x= 'ab'
y = 'cd'
z = 'ef'

for i,j in x :
    print (i,j)

>>> Output : error not enough values to unpack
             
  

Почему я не могу получить: a b , где :

Переменная ‘i’: a, а переменная ‘j’: b

Я очень смущен.

Комментарии:

1. Попробуйте for i,j in [x] : print (i,j)

Ответ №1:

Проблема в том, что «in x» перебирает строку в виде строки. Первая итерация возвращает a ; вторая возвращает b . Каждый отдельный символ — это «недостаточно значений для распаковки». Просто

 i, j = x
  

работает так, как вы хотите. Обратите внимание, что в других циклах вы перебирали кортеж строк; это не то же самое, что перебирать одну строку.

Ответ №2:

В первом фрагменте кода вы выполняете итерацию по кортежу строк (x, y) (вы не написали круглые скобки, но запятая создает кортеж, а не круглые скобки).

Итак, это сводится к:

 for two_letters_string in (x, y):
    ...
  

Здесь вы делаете вторую вещь: вместо two_letters_string этого вы использовали кортеж (i, j) в качестве переменной. Итак, Python распакует строку из двух букв, и первая буква заканчивается in i , вторая in j .

То же самое происходит во втором фрагменте кода. У вас просто есть еще один цикл и повторите еще одну строку.

Последний фрагмент кода сильно отличается: вы выполняете итерацию не по кортежу строк, а по строке, состоящей из 2 символов. Итерация по строке повторяет ее символы, поэтому она приведет 'a' к первому циклу и 'b' ко второму. Но вы пытаетесь распаковать эти односимвольные строки в две переменные i и j , что невозможно.

Обратите внимание, что это работает:

 x = 'ab'


for i, j in x, :  # Note the comma after x!
    print (i, j)
    
# a b
  

поскольку запятая после x создает кортеж из одного элемента. Вы находитесь в той же ситуации, что и в первых двух случаях, но здесь только один цикл.

Ответ №3:

это происходит потому, что в цикле вам заданы 2 элемента i, j

попробуйте это сейчас:

 x= 'ab'
y = 'cd'
z = 'ef'

for i in x :
   print (i)
  

Ответ №4:

Вы можете попробовать что-то вроде этого:

 x = 'ab'
y = 'cd'
z = 'ef'

i, j = x
print(i, j)
  

Комментарии:

1. Нет необходимости оборачивать строку в кортеж и список. Итерация по одному элементу списка, который является кортежем итерируемого, бессмысленна. Просто используйте i, j = x без дополнительных слоев.