Найти - Пользователи
Полная версия: Подсчет количества нулей в массиве_что не так
Начало » Python для новичков » Подсчет количества нулей в массиве_что не так
1 2 3 4
AD0DE412
 q = ['0', '1', '0']
print(len([i for i in q if i == '0']))
Sabach
AD0DE412
Спасибо за ещё один вариант решения задачи. Положил в копилку.
Мне главное, понять логику, о чем писал в предыдущем сообщении. Общение с людьми, которые могут не то, чтобы дать готовый ответ, а именно объяснить доступным языком что не так и где копать - первопричина обращения сюда на форум.
Очень надеюсь на дальнейшую помощь…
py.user.next
Sabach
1. Вводим данные:
  
N=int(input("Ввести кол-во элементов: "))
n=[]
for i in range(N):
    n.append(int(input("Введите число: ")))
print(n)
2. Считаем нули:
  
q=0
for i in range(len(n)):
    if n[i]==0:
        q+=1
print(q)
3. В результатах выходит и сам и список и количество нулей
Ты обратил внимание, что третий пункт называется “Вывести результаты”, но в нём нет ни строчки кода и при этом какие-то данные выводятся на экран? Вот эта пустота на месте, где должен быть код, - признак того, что произошла ошибка при реализации какого-то из предыдущих пунктов (шагов алгоритма).

В чём же ошибка? Можно задаться вопросом “какая разница, где этот вывод размещать? всё же выводится на экран, как и нужно”. Дело в том, что ты нарушил правило реализации алгоритма. Правило выше я писал “сначала сделать первый пункт и проверить его на правильность (если он правильный - отложить его; если он неправильный - переделать его); затем сделать второй пункт и проверить его на правильность (если он правильный - отложить его; если он неправильный - переделать его); затем сделать третий пункт и проверить его на правильность (если он правильный - отложить его; если он неправильный - переделать его)”. Когда ты проделал это всё в такой последовательности и каждый пункт по очереди стал правильным, ты реализовал правильно алгоритм.

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

Давай, делай и выкладывай результаты.
Sabach
py.user.next
Завтра выложу… Мне же надо было убедиться, что обе части работают…
Sabach
py.user.next
выкладывай результаты
1. Вводим данные:
 N=int(input("Ввести кол-во элементов: "))
n=[]
for i in range(N):
    n.append(int(input("Введите число: ")))
2. Считаем нули:
 q=0
for i in range(len(n)):
    if n[i]==0:
        q+=1
3. Выводим результаты:
 print("Создан список: ",n)
print("Количество нулей в списке: ",q)
marvellik
Sabach
за один цикл.
 N = int(input("Ввести кол-во элементов: "))
n = []
result = 0
for i in range(N):
    number = int(input("Введите число: "))
    if number == 0:
        result += 1
    n.append(number)
print("Создан список: ",n)
print("Количество нулей в списке: ",result)
Sabach
marvellik
Sabachза один цикл.
До этого я додуматься не смог.
Спасибо!
py.user.next
Sabach
1. Вводим данные:
  
N=int(input("Ввести кол-во элементов: "))
n=[]
for i in range(N):
    n.append(int(input("Введите число: ")))
2. Считаем нули:
  
q=0
for i in range(len(n)):
    if n[i]==0:
        q+=1

3. Выводим результаты:
  
print("Создан список: ",n)
print("Количество нулей в списке: ",q)
Вот теперь всё правильно. Правилен каждый пункт. Поэтому можно сказать, что весь алгоритм, состоящий из этих пунктов, правилен. Так как весь этот алгоритм правилен, его можно весь как одну единицу использовать в качестве пункта в другом алгоритме, в более обширном.

Допустим, теперь ты вдруг увидел, что нули посчитались неправильно, это ты понял по выводу на экране. Ты задаёшься вопросом “как посчитались нули? почему неправильно они посчитались?” и идёшь в пункт подсчёта нулей и там выясняешь, что произошло и как это исправить. При этом ты не трогаешь ни пункт ввода данных, ни пункт вывода результатов. То есть код, с которым ты работаешь, сужается до одного маленького пункта. И теперь представь, что у тебя пунктов не три (ввод, подсчёт, вывод), а тридцать (ввод одного, ввод второго, ввод третьего, посчёт первого, подсчёт второго, подсчёт третьего, вывод первого, вывод второго, вывод третьего и так далее). Так вот, когда у тебя, допустим, 27-ое выведется неправильно, ты точно так же пойдёшь в пункты ввода данных для 27-ого и подсчёта введённых данных для 27-ого и быстро найдёшь, где источник ошибки. И ты так же безопасно для всего остального кода исправишь эту ошибку, потому что остальной код вообще не затрагивается, так как он правильный. Так ты изолированно работаешь над каждым фрагментом программы.

Sabach
marvellik
Sabach
за один цикл.
До этого я додуматься не смог.
Правильно, что не смог. В программировании нужно всё разделять, а не сливать воедино. Я приводил пример подводной лодки, где всё разделено на отсеки. marvellik тебе предложил убрать все перегородки отсеков из подводной лодки, потому что через них неудобно перешагивать. Как думаешь, что будет, если один отсек загорится? В нормальной лодке команда его изолирует, закрыв люки с двух сторон, и огонь погаснет, когда закончится кислород в отсеке. В лодке от marvellik вся команда сначала задохнётся в лодке от продуктов горения, а потом вся лодка выгорит изнутри ещё. Потому что ему было так удобнее, ему там что-то казалось, когда он её проектировал.

Правила я тебе написал все. Протренировывай их на вот таких алгоритмах в которых чуть-чуть шагов. Все они потом работают на больших алгоритмах точно так же. Учишься ты на маленьких, а навыки эти применяешь потом на больших.
marvellik
py.user.next ну вы и ужасов расписали а как время выполнения программы? а как по памяти? иногда в угоду весу лодки и увеличению боевой загрузки можно убрать пару не сильно важных перегородок уменьшив тем самым вес. но при этом прежде чем убрать нужно просчитать все до мелочей. то есть как у вас в примере разделить по блокам и после испытаний получить что то более легкое.
py.user.next
marvellik
ну вы и ужасов расписали
Я написал понятный любому пример. Я не стал писать всё то, что будет в программе происходить на протяжении всей её жизни и как она в итоге из-за этого всего подохнет, потому что кто-то там что-то там решил сократить, руководствуясь своим личным удобством при её разработке. Мы сейчас наблюдаем Windows, которую усиленно пытаются спасти. Почему она не живёт сама? Потому что прямо на уровне ядра системы там ляп на ляпе. Её пытались облагородить, ничего не вышло. А другие системы качественные, растут и набирают обороты за счёт её топтания на месте и в итоге выталкивают её с рынка.

marvellik , у тебя вообще ничего друг от друга не отделено. Ты из модульной архитектуры всё слил в монолитную архитектуру. То есть ты при вводе числа производишь подсчёт этого числа. Аргумент у тебя какой при этом? Что это выполняется в одном цикле, а не в двух и якобы ты сэкономил какое-то там время. А вот теперь в программу извне приходит требование “отключить вывод на консоль”. Пользователь при вызове программы указал опцию quiet через -q. У тебя этой опции нет изначально, не поддерживается, но пользователь программы тебе говорит “а мне она нужна, эта опция”. И ты что будешь делать? Сначала ты будешь выцеживать из кода все эти места, где что-то выводится на консоль, а потом в каждое из этих мест вставлять флажок, который будет хранить значение выводить/не выводить. И в результате у тебя весь код, такой хороший и красивый и такой умный по скорости изначально (это когда он всего три строчки занимал по объёму), будет засран этими проверками флажков. Очень скоро весь твой код будет засран всякими такими проверками для всяких разных требований либо он ничего вообще делать не будет, потому что ты будешь всем пользователям говорить “требование выполнить невозможно”, а сам будешь думать в это время “блин, лиш бы меня ещё о чём-нибудь не попросили, я же сам в своём коде не могу уже разобраться”. Он такой маленький был изначально, а теперь он разросся и в нём теперь хрен разберёшься. Какой же дурак его писал? И в итоге ты поймёшь, что виноват в этом только ты. А пользователь посидит с твоей программкой, в которой опций всё нет и нет (месяц, два, полгода), ну и заменит её на другую, более проворную и дающую ему больше возможностей. Дальше твою программку забудут как страшный сон и получится, что ты проработал впустую.

А что будет, если программа разделена на модули - на первый, второй и третий пункты? Мы получили требование “отключить вывод на консоль”, мы взяли и добавили проверку флажка выводить/не выводить в первый пункт и проверку флажка выводить/не выводить в третий пункт. А куда выводить результаты? Например, в файл. Что нужно сделать для этого? Нужно зайти в третий пункт и добавить там вывод в файл, если флажок установлен в состояние “не выводить”. Нам не надо лазить по всей программе и думать “а что там? а где там? а ничего мы не забыли поправить ещё? все ли места программы, где есть вывод, мы просмотрели?”. Требования могут приходить разные: изменить формат вывода; изменить формат ввода; изменить источник ввода; изменить метод подсчёта; изменить количество структур с данными. Ты их не можешь все предугадать, эти требования, которые будут потом. Но ты изначально можешь сделать программу такой, что любое требование будет реализуемо очень быстро и без ошибок.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB