Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 2, 2016 11:03:51

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

помогите разобраться в примере.

Этот код бессмысленен чуть более чем полностью.



Офлайн

#2 Дек. 2, 2016 11:08:55

kochevnick48
Зарегистрирован: 2016-12-01
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться в примере.

Данный код из книги, автора я уже указал. Если Вы считаете себя умнее автора то объясните его бессмысленность.

Офлайн

#3 Дек. 2, 2016 11:16:39

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

помогите разобраться в примере.

kochevnick48
Данный код из книги, автора я уже указал.
А я то при чем? Выкинь её на помойку.
kochevnick48
объясните его бессмысленность
1. Потому что цикл, который заведомо выполняется один и только один раз не имеет смысла.
2. Потому что выполнять цикл по заведомо пустому списку еще более бессмысленно



Офлайн

#4 Дек. 2, 2016 11:24:31

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

помогите разобраться в примере.

kochevnick48
получается , что found_one - переменная которая сигнализирует о том что в списке что-то найдено ?
1. На данном форуме необходимо код обертывать в теги, как Вам справедливо уже указал модератор.
2. Да, found_one - это переменная логического типа, принимающая одно из двух возможных значений (False/True). Смотрим еще раз внимательно на Ваш пример из книги:
 cheeses = []
found_one = False
for cheese in cheeses:
   found_one = True
   print('This shop has some lovely', cheese)
   break
if not found_one:
   print('This is not much of a cheese shop, is it?')
Запускаем и получаем:
>>>This is not much of a cheese shop, is it?
Это говорит о том, что переменная found_one осталась равной False, хоть ей и было присвоено True в цикле. Но в цикле for вообще никакие действия не выполнялись, в том числе и found_one = True. А не выполнялись они потому, что ни одного сыра (cheese) в пустом списке cheeses не было найдено.

Этим примером автор книги показывает, что будет, если попробовать отказаться от else в цикле for. Как видим, можно обойтись и без else, но тогда придется создавать дополнительную логическую переменную (found_one) и отдельно проверять ее по условию. К тому же эта переменная глобальная, а глобальных переменных в программах следует по возможности избегать. Они являются источником уязвимости, ошибок, и вообще это плохой стиль программирования.

Отредактировано old_monty (Дек. 2, 2016 11:27:42)

Офлайн

#5 Дек. 2, 2016 11:37:17

kochevnick48
Зарегистрирован: 2016-12-01
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться в примере.

Вот это более понятно. Спасибо. Про “обертывание кода” я извиняюсь. Т.е. если бы в списке был “сыр” found_one изменился бы на true и сработал бы break . Верно ?

Офлайн

#6 Дек. 2, 2016 11:50:40

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

помогите разобраться в примере.

kochevnick48
Вот это более понятно. Спасибо. Про “обертывание кода” я извиняюсь. Т.е. если бы в списке был “сыр” found_one изменился бы на true и сработал бы break . Верно ?
В этом Вы легко можете убедиться сами. Попробуйте внести один, два или больше сыров в список cheeses:
 cheeses = ['parmesan', 'holland_special', 'smoked']
И запустите этот вариант. Что получается?

Основная же мысль автора была показать преимущества от использования else в цикле for. Посмотрите, насколько проще и короче получается тот же самый результат с тем же самым пустым списком, но без дополнительной глобальной переменной и без ее проверки в if:
 cheeses = []
for cheese in cheeses:
   print('This shop has some lovely', cheese)
   break
 else:
   print('This is not much of a cheese shop, is it?')

Офлайн

#7 Дек. 2, 2016 11:56:43

kochevnick48
Зарегистрирован: 2016-12-01
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться в примере.

С конструкцией где есть else всё сразу было понятно.
Да конструкция проще и удобнее.
Ещё один вопрос - а почему глобальная переменная found_one изначально объявляется False ?

Офлайн

#8 Дек. 2, 2016 12:06:04

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

помогите разобраться в примере.

kochevnick48
Ещё один вопрос - а почему глобальная переменная found_one изначально объявляется False ?
Потому что изначально (до прохождения по элементам списка при помощи for) мы не можем гарантировать, что уже найден хотя бы один сыр. Да, у автора в примере список сыров пустой, это видно из кода. Но кто сказал, что мы всегда будем читать из списка? Более реально читать из файла, а его содержимое заранее неизвестно. Если все же будем читать из списка, то опять же, он может оказаться пустым (например, если элементы списка вводятся пользователям с консоли, а программа перед добавлением в список проверяет введенные значения, и отбрасывает недопустимые - например цифры, знаки @#$% и т.д.)

Отредактировано old_monty (Дек. 2, 2016 12:12:24)

Офлайн

#9 Дек. 2, 2016 12:10:23

kochevnick48
Зарегистрирован: 2016-12-01
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться в примере.

Большое Спасибо. Вы помогли мне разобраться.

Офлайн

#10 Дек. 2, 2016 18:58:40

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

помогите разобраться в примере.

MickeyMouse
MickeyMouse
Это как в том приколе с башорга про студента, который читая учебник увидел код на С++, который не смог осмыслить ни он сам ни его компилятор. Студент долго мучился с этим кодом, играл с ключами компилятора, переменными окружения, библиотеками и когда он накурив банку бычков и разбив клавиатуру почти понял, как оно работает, он перевернул страницу и прочитал: “Этот код, конечно же не работает потому что…”.

Человек постит кусок говна, говорит “Я ж из книги его нарыл, не из пупа наковырял то. Почему в этом коде так то и так то сделано? Ну-ка ответь, ты ж не умнее Джона Пупкина!!!”. А то что этот код приведен как пример “так не надо делать” человек толи не понимает, толи лыжи не едут.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version