Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.70/43: Рейтинг темы: голосов - 43, средняя оценка - 4.70
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101

Изучаем Python по книге Лутца

17.04.2020, 12:37. Показов 9173. Ответов 87
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
на 490 стр 5 того издания 1 части Лутца встречаются первые задания по практики...
1. Написание базовых циклов. В данном упражнении предлагается поэкспериментировать с циклами for.
а) Напишите цикл for, который выводит код ASCII каждого символа в строке по
имени S. Для преобразования символа в целочисленный код ASCII используйте встроенную функцию ord (символ). Формально функция ord в Python З.Х
возвращает кодовую точку Unicode, но если вы ограничите содержимое строки символами ASCII, то будете получать обратно коды ASCIL (Опробуйте ее
интерактивно, чтобы посмотреть, как она работает.)
Python
1
2
3
4
s = 'spam'
for i in s:
    v = ord(i)
    print(v, end=' ')
б) Далее измените цикл для вычисления суммы кодов ASCII всех символов в строке.

здесь что то пошло не так..
Python
1
2
3
4
5
s = 'spam'
for i in s:
    v = ord(i)
    print(v, end=' ')
print(sum(v))
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.04.2020, 12:37
Ответы с готовыми решениями:

Объясните текст из книги Лутца "Изучаем python"
В книге написано: В текущей реализации python это ещё и программный пакет который называется интерпретатором. Интерпретатор - это такой...

М. Лутц Изучаем Python. Том 1
Добрый день! Заказал по ошибке 2 книги (5 издание, 1 том) с ozon (...

Лутц Марк - Изучаем Python. 5 издание
Как ориентироваться в исходниках? https://www.oreilly.com/library/view/learning-python-5th/9781449355722/ ...

87
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
19.05.2020, 14:51
Студворк — интернет-сервис помощи студентам
Viktorrus, еще проще: создаем вначале одну переменную равную нулю, проходим по элементам списка и если число больше нуля - инкрементируем, если меньше - декрементируем. В конце смотрим на знак этой переменной. Все.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
20.05.2020, 01:17
u235, Да, Ваш алгоритм лучше. Правда я забыл рассмотреть такой вопрос. Чем является ноль, положительным или не тем и не другим? Нужно полазить по интернету. По памяти раньше вроде смотрел и вроде у математиков нет однозначного мнения на этот счет. Но для этой задачи нужно с этим определится.

Добавлено через 11 минут
Цитата Сообщение от coa3 Посмотреть сообщение
к стати, что из теории дальше неспешно читать?
для решения задач нужно уже сейчас знать приемы форматирования. самое лучшее и современное, это Форматные строки (f-string). Вся необходимая информация есть в справочнике по ссылке
https://pythonz.net/references/named/str-f/ Внутри этого материала есть ссылка на "мини-язык форматирования". Его тоже посмотри. Все это сложно запомнить. Важно получить общее представление и понимание как этим пользоваться. И когда в задаче понадобится форматирование, то нужно просто обращаться к этому справочнику.
Ну а потом можно переходить на изучение у Лутца Части V "Модули и пакеты".

Добавлено через 46 минут
Цитата Сообщение от coa3 Посмотреть сообщение
Формат ввода
Программа получает на вход в одной строке число S – размер свободного места на диске (натуральное, не превышает 10000), и число N – количество пользователей (натуральное, не превышает 100), после этого идет N чисел - объем данных каждого пользователя (натуральное, не превышает 1000), записанных каждое в отдельной строке.
Формат вывода
Выведите наибольшее количество пользователей, чьи данные могут быть помешены в архив.
Сначала на бумаге реши эту задачу, что бы составить алгоритм решения. Потом начинай писать код.
На самом деле задача не простая, на оптимизацию.
Алгоритм может оказаться не тривиальным.
Можно конечно в лоб рассмотреть все возможные сочетания объемов данных пользователей и выбрать оптимальный. Все зависит как долго это будет обрабатываться. Если получится и программа не будет зависать на обработке больших объемов, то он однозначно будет давать верное решение.
https://ru.wikipedia.org/wiki/... 0%B8%D0%B5
Отсюда видно, что если элементов N, то необходимо будет рассмотреть всех пользователей по одному, затем все сочетания из N по 2, затем по 3, и так далее пока k не станет равно N (в этом случае будет только одно сочетание, это весь список пользователей).
Где ты взял это задание? Оно не простое.
Помню Garry Galler, предлагал какой то инструмент в питоне, по работе с сочетаниями. Не знаю, найду ли эту информацию.
Может кто то предложит лучший алгоритм для решения этой задачи.
Пока попробуй через сочетания используя цикл for.

Добавлено через 5 минут
coa3, На самом деле предложенный мной алгоритм мне не нравится. Нужно еще подумать.

Добавлено через 18 минут
coa3, Из интернета:
"Число 0 разделяет положительные и отрицательные целые числа и само не является ни положительным, ни отрицательным. "
Поэтому, при решении задачи на вычисление количества положительных и отрицательных чисел, нужно это иметь ввиду.

Добавлено через 12 минут
coa3, Вообще , если на практике понадобится решать задачу на заполнение архива. то оптимальное решение. с учетом времени работы программы, будет такой алгоритм. Отсортировать все объемы данных пользователей по убыванию и в цикле проверять, что объем текущего пользователя влазит в оставшееся свободное место архива. И если он влазит, то имя пользователя заносить в список. Не могу гарантировать, что во всех случаях это будет оптимальным размещением объемов данных пользователей в архиве, но на практике это будет наиболее простым решением задачи.
В общем прежде чем решать такие задачи, нужно сначала получить их математическое решение.

Добавлено через 3 часа 52 минуты
Цитата Сообщение от coa3 Посмотреть сообщение
длинный наверное код получился, но не раздумывая сразу набросал с ходу
Цикл while здесь не нужен. Лучше использовать конструкцию
Python
1
2
3
4
5
6
if len(min1) > len(plus):
    print('отрицательных больше чисел')
elif len(min1) < len(plus):
    print('положительных чисел больше')
else:
    print('положительные = отрицательным')
А вообще то я бы здесь не разносил по спискам, а использовал бы счетчики. Но твой вариант тоже будет работать.

Добавлено через 9 минут
Я сразу не заметил, у тебя в цикле for ошибка
Python
1
2
3
4
5
for i in a:
    if i > 0:
        plus.append(i)
    else:
        min.append(i)
У тебя нули войдут в список отрицательных чисел, что не верно. Нужно было написать так:
Python
1
2
3
4
5
for i in a:
    if i > 0:
        plus.append(i)
    elif i < 0:
        min.append(i)
Добавлено через 11 минут
Когда при ветвлении каждая из веток требует своего условия, то нужно использовать в инструкции if блоки elif. В некоторых языках пишется else if: что переводится как "иначе если". Таких блоков elif в инструкции if может быть много.
Синтаксис инструкции if
Python
1
2
3
4
5
6
if <test1>:            # Инструкция if с условным выражением test1
    <statements1>      # Ассоциированный блок
elif <test2>:          # Необязательные части elif
    <statements2> 
else:                  # Необязательный блок else
    <statements3>
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
21.05.2020, 18:38
coa3, Даю примеры форматирования.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    animal = 'кот'
    age = 7
    f'У меня есть {animal}. Ему {age+1}.'  # У меня есть кот. Ему 8.
    
    def print_me(one, two):
        print(f'Вот тебе {one}, а вот тебе {two}.')
 
Фиксированное количество знаков после запятой в Python 
 
print(f"{4.5:.6f}")     # 4.500000
 
    >>> name = "Eric"
    >>> age = 74
    >>> f"Hello, {name}. You are {age}."
    'Hello, Eric. You are 74.'
 
 
    >>> f"{2 * 37}"
    '74'
 
    >>> def to_lowercase(inputStr):
    ...     return inputStr.lower()
    >>> name = "Eric Idle"
    >>> f"{to_lowercase(name)} is funny."
    'eric idle is funny.'
Реши задачу:
**************************************** *******************************
Задано число num = 4/3
Вывести на экран число num с точностью четыре знака после запятой (точки), то есть должны получить на экране 1.3333 .

**************************************** ********************************

Добавлено через 35 минут
Форматированные строковые литералы также известны как f-строки или форматные строки.
PEP-498
Добавлено в Python 3.6
Общий вид маркера:
{(выражение)[!преобразование][:формат]}.

Преобразование и формат не обязательны.

Преобразование (обозначается ! )
Если затребовано преобразование, оно будет выполнено над результатом вычисления выражения непосредственно перед форматированием.

!r Использовать repr().
!s Использовать str().
!a Использовать ascii()

Форматирование (обозначается : )
Для форматирования используется Мини-язык форматирования.

Общий вид инструкции:
[[заполнение]равнение][знак]['#']['0'][минразмер][',']['.'точность][тип].

Точность
Для чисел с плавающей запятой — это количество цифр, которые требуется вывести после десятичного разделителя (для форматирования f и F), либо до и после разделителя (для форматирования g и G).
Для целых точность не обрабатывается.
Для прочих типов — это количество знаков, которые требуется взять из значения.

Python
1
2
3
4
>>> f"{4.5:.2f}"
'4.50'
>>> f"{'some':.2s}"
'so'
Добавлено через 8 минут
coa3, Извини, я забыл. У тебя какая версия питона?
f-строки или форматные строки работают только начиная с версии 3.6 .
0
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
22.05.2020, 11:38  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
я забыл. У тебя какая версия питона?
f-строки или форматные строки работают только начиная с версии 3.6
3.4 себе ставил, т.к. многие библиотеки с гитхаба с последними версиями питона не работают..

Добавлено через 3 минуты
Цитата Сообщение от Viktorrus Посмотреть сообщение
Задано число num = 4/3
Вывести на экран число num с точностью четыре знака после запятой (точки), то есть должны получить на экране 1.3333 .
print(f"{4.5:.4f}") ну вот это используем
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
22.05.2020, 12:04
Цитата Сообщение от coa3 Посмотреть сообщение
3.4 себе ставил, т.к. многие библиотеки с гитхаба с последними версиями питона не работают.
Ставь 3.7 . Это достаточно современная и наиболее стабильная версия питона. Устаревшие библиотеки с гитхаба не повод, для того, что бы работать с устаревшей версией питона. Ты лишаешься многих нужных возможностей, которые есть в 3.7 . Например работа с форматными строками (f-строками). Старые средства форматирования не идут ни в какое сравнение с f-строками. Есть более новая версия питона 3.8 , но она по отзывам работает не стабильно. Поэтому версия 3.7 самое то. Мне не понятно, находясь на стадии обучения, какие библиотеки с гитхаба тебе так необходимы, что ты не можешь от них отказаться.

Даже если тебе так необходимы какие то старые библиотеки, то ставят на комп две версии питона. Иначе ты никогда не изучишь современные средства питона.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
23.05.2020, 03:31
coa3, Реши задачу.
Задача по программированию
**************************************** **************************************** ********
1) Понятие ФУНКЦИЯ еще не введено, поэтому использовать только циклы, операторы, и переменные.
2) Входной параметр сделать вводимым с клавиатуры.
**************************************** **************************************** *********

Картину, где показано, что нужно получить при выводе на экран, смотри по ссылке.

Нужно написать два цикла, один для верхнего треугольника, второй для нижнего. Циклы идут один за другим (не вложенные). На каждом шаге цикла формируешь строку, содержащую пробелы и цифры и печатаешь ее.

Добавлено через 3 минуты
На условие "3) Использовать стиль PEP-8. " не обращай внимание. Твоя задача написать циклы, что бы на экран выводилось как на картинке.
0
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
23.05.2020, 21:06  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Реши задачу.
я такие задачи не умею решать...

Добавлено через 7 минут
на 2рой страницы этой темы уже сталкивался с данной задачкой, так особо не дошла она...
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
23.05.2020, 23:16
Цитата Сообщение от coa3 Посмотреть сообщение
я такие задачи не умею решать...
Тогда давай здесь разберем те решения, которые даны в комментариях по этой ссылке. Я копирую сюда, ты пытаешься разобраться и говоришь, что тебе не понятно.
Python
1
2
3
4
5
6
s = '123456789'
n = 9
for i in range(n):
    print((n+1)*' ' + s[i::-1])
for i in range(n):
    print(s[:n-i].rjust(n))
На каждый треугольник свой цикл, так как в каждом треугольнике свой алгоритм формирования строки.
На каждом шаге цикла формируется своя строка и распечатывается.
Конструкция среза вида s[::-1]) переворачивает строку задом на перед:
Python
1
2
3
>>> s = '123456789'
>>> s[::-1]
'987654321'
Если же мы берем не всю строку, а начиная с какого то элемента, то срез будет выглядеть так
s[i::-1] . В этом случае (когда шаг равен -1) берется начальная часть строки, до i-того элемента, и эта часть переворачивается задом на перед.

Посмотрим например, как будет формироваться срез для пятой строки, который создается на пятом шаге цикла.
Так как в питоне отсчет смещения начинается с нуля 0, то и переменные цикла будут получать значения начиная с нуля 0.
Поэтому на пятом шаге переменная цикла будет равна четырем 4 (0, 1, 2, 3, 4).
Python
1
2
3
4
>>> s = '123456789'
>>> i = 4
>>> s[i::-1]
'54321'
Давай разберем почему так происходит.
Срез формируется начиная с элемента 5, имеющего смещение 4, и двигаясь вниз. следующим берется элемент со смещением 4-1 =3, то есть элемент 4, затем со смещением 3-1=2, то есть элемент 3 и так далее. В результате и получаем строку '54321'. Затем складываем строку пробелов и строку полученную с помощью среза и получаем строку для печати на текущем шаге цикла.

Постарайся с этим разобраться, потом разберись со вторым циклом, где кроме среза используется метод:
Prolog
1
2
3
4
5
6
str.rjust(width[, fillchar]) -> str
 
width : Желаемая минимальная длина результирующей строки.
 
fillchar : Символ, которым следует расширять строку. По умолчанию — пробел.
Изначальная строка не обрезается, даже если в ней меньше символов, чем указано в параметре желаемой длины.
0
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
24.05.2020, 14:44  [ТС]
Python
1
2
3
4
5
s = '123456789'
n = 9
for i in range(n): # 0...8
    print(n + 1) # 9+1
10..10 9-раз
не соображу почему к примеру печатаются 10тки 9 раз..., что происходит

Добавлено через 57 минут
print((n + 1) * ' ' + s[i::-1])
читал, но уже и забыл, что здесь * делает...?
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
24.05.2020, 16:45
coa3, n это введенное число, определяющее количество цифр в треугольнике и отсюда его размер.
Так как в первом треугольнике цифры начинают печататься с отступом в 10 пробелов, это видно из картинки, то мы в формируемую строку добавляем 10 пробелов (n + 1) * ' ' (девять плюс 1 умножить на пробел).
Так как в первом треугольнике количество лидирующих пробелов всегда будет на один больше чем введенное число (что видно из рисунка), поэтому мы используем выражение (n + 1) * ' '

В выражениях звезда * обозначает умножение, а две звезды ** возведение в степень.
Не только звезда, но и некоторые другие символы в питоне имеют в разных местах разный смысл. Это просто нужно знать.

Добавлено через 10 минут
Цитата Сообщение от coa3 Посмотреть сообщение
print(n + 1) # 9+1
Цитата Сообщение от coa3 Посмотреть сообщение
не соображу почему к примеру печатаются 10тки 9 раз..., что происходит
Здесь печатается не
(n + 1), а сформированная строка
Python
1
(n+1)*' ' + s[i::-1]
Следи за парностью скобок.
(n+1)*' ' это строка, состоящая из десяти пробелов, к которой добавляется строка из срезе. В результате получаем строку для печати
Python
1
"          987654321"
Добавлено через 1 час 15 минут
coa3, И еще, активно пользуйся отладчиком, точками останова и пошаговым режимом в нем, что бы видеть, что делает программа.
0
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
24.05.2020, 20:00  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
девять плюс 1 умножить на пробел)
вот блин, никак не рассмотрел самый простой вариант, что знак * здесь всего лишь умножение, а не более сложный вариант применение звездочки...
теперь все понятно, что с этой половиной происходит...

Добавлено через 28 минут
Цитата Сообщение от Viktorrus Посмотреть сообщение
print(s[:n-i].rjust(n))
за счет чего здесь происходит смещение в каждой строке в право на один пробел не пойму
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
25.05.2020, 14:53
coa3, Сначала дополню объяснение по звездочке. Для того, что бы понять какую роль играет звездочка в конкретном месте, нужно смотреть какую роль звездочка может играть в данном месте. Что бы звезда была оператором умножения, она должна иметь два операнда, которые размещены справа и слева от звезды, которые можно умножить один на другой. А что бы звезда была оператором распаковывания в аргументах функции, она не должна иметь слева и справа операндов для умножения и должна иметь права операнд в виде итерируемого объекта (который будет распаковывать). В нашем случае число 10 не является итерируемым объектом, поэтому звезда тут не может выполнять роль распаковывания. А вот выполнять роль умножения она может, что и делает.
Теперь по поводу
Python
1
print(s[:n-i].rjust(n))
Цитата Сообщение от coa3 Посмотреть сообщение
за счет чего здесь происходит смещение в каждой строке в право на один пробел
Здесь не задается напрямую смещение в каждой строчке на один пробел, а это происходит автоматически в результате выравнивания по праваму краю строки, размер которой задается. Все это делается с помощью строкового метода rjust.
Синтаксис которого:
Python
1
2
3
4
5
6
str.rjust(width[, fillchar]) -> str
 
width : Желаемая минимальная длина результирующей строки.
 
fillchar : Символ, которым следует расширять строку. По умолчанию — пробел.
Изначальная строка не обрезается, даже если в ней меньше символов, чем указано в параметре желаемой длины.
Где с помощью n (которое равно девяти) задаем ширину строки width. А дальше метод создает n позиций для символов и размещает содержимое строки, к которой применяется этот метод справа строки (выравнивая по правому краю), а какие позиции в формируемой строке остаются не заполненными, заполняются символами пробела.
Таким образом мы для всех строк во втором цикле получаем одинаковую ширину и все данные, которые создает срез, выровненные по правому краю.
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
27.05.2020, 11:51
coa3, Ты изучил f-string форматирование по ссылке, которую я тебе дал?
И установил версию питона 3.7 ?
Что бы попрактиковаться, вот задачка. Дан код вывода матрицы на экран, использующий метод str.format() для форматирования.
Python
1
2
3
4
5
6
7
8
9
10
11
12
def printMatrix ( matrix ): 
   for row in matrix: 
      for x in row: 
          print ( "{:4d}".format(x), end = "" ) # выводит число в нужной позиции
      print ()
 
if __name__ == '__main__':
    M = [[-1, 0, 1], 
    [-1, 0, 1], 
    [0, 1, -1],
    [1, 1, -1]]
    printMatrix(M)
Выводит
Python
1
2
3
4
  -1   0   1
  -1   0   1
   0   1  -1
   1   1  -1
Замени форматирование внутри функции print, которое выполнено с помощью метода format()
Python
1
print ( "{:4d}".format(x), end = "" )
на форматирование с помощью f-string.
Что не понятно в исходном варианте функции, сразу спрашивай.
0
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
27.05.2020, 14:38  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Ты изучил f-string форматирование по ссылке, которую я тебе дал?
И установил версию питона 3.7 ?
скажем так, прочитал, т.к. как только сложнее описание, то не понятно о чем оно, похоже со всякими нововведениями питон становится все сложнее для понимания и сложнее, что фигня со звездочкой * (вчера еще раз в лутце перечитал эту тему), что это f:... ну или я тупее. тоже вариант...
3.7 поставил

Добавлено через 48 минут
width = 10
precision = 4
value = decimal.Decimal('12.34567')
f'result: {value:{width}.{precision}}' # result: 12.35
...

my_var = 'cat'
print(f'{my_var=}') # my_var = 'cat'
# Имеется возможность дополнения строки до указанной длины:
print(f'{my_var.upper() = :a^7}') # my_var = 'aaCATaa'
print(f'{my_var.upper() = :b>7}') # my_var = 'bbbbCAT'

animal = 'cat'
f"{animal:>6}" # ' cat'
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
27.05.2020, 23:51
coa3, Мини-язык форматирования один и тот же и для метода format() и для f-строк. Только по разному размещаются форматируемые объекты. В методе формат объекты (здесь х) внутри скобок, format(x), а в f-строках объекты внутри строки и там внутри фигурных скобок. Кстати возможно несколько уровней вложения фигурных скобок. Вот как будет в данной задаче:
Python
1
2
3
4
5
6
7
8
9
10
11
12
def printMatrix ( matrix ): 
   for row in matrix: 
      for x in row: 
          print ( f"{x:4d}", end = "" ) 
      print ()
 
if __name__ == '__main__':
    M = [[-1, 0, 1], 
    [-1, 0, 1], 
    [0, 1, -1],
    [1, 1, -1]]
    printMatrix(M)
Выводит
Python
1
2
3
4
  -1   0   1
  -1   0   1
   0   1  -1
   1   1  -1
х это переменная, которая содержит ссылку на число. Двоеточие ":" показывает что дальше пойдет указание формата на мини-языке.

Общий вид инструкции: [[заполнение]равнение][знак]['#']['0'][минразмер][',']['.'точность][тип].

заполнение - это символ который заполняет незаполненные позиции. По умолчанию пробел (как и у нас).
> Равнение вправо. Используется по умолчанию для чисел. (наш случай, поэтому не указываем )
'#' и '0' у нас не используется и поэтому пропущены.
Минразмер — это целое, задающее минимальный размер (длину) значения, то есть длину строки. (мы задаем 4 позиции)
Запятой "," и точности "." у нас нет
тип - это тип представления, который требуется использовать.
У нас число, поэтому указываем "d" Десятичная форма. Число по основанию 10.

Я, что бы разобраться с этим, пользовался справочником по ссылке, которую я тебе дал.
Если что то осталось непонятно, то спрашивай.

Добавлено через 17 минут
Что касается знака.
Он означает:
Минус "-" - Использовать знак только для отрицательных. Используется по умолчанию.
Поэтому мы знак не указали.

Добавлено через 27 минут
coa3, Не переживай. В любом деле нужен опыт. Для того и решаем задачки, что бы ты набрался опыта. Со временем, набравшись опыта, начнешь сам решать такие задачи. Вон наши девушки фигуристки, такие молодцы, крутят четвертные прыжки. Ты что думаешь, они встали на лед и сразу стали крутить четвертные? Все требует труда и опыта. Никто с ходу не начинает программировать, Всем для того, что бы стать программистом нужен опыт. Как думаешь, почему предприятия не любят брать программистов без опыта работы. Требуют 2 года практики. Потому, что в любой профессии нужен опыт, и в программировании тоже.
Поэтому не переживай, что ты пока не можешь сам писать программы. Мы с тобой поэтому и разбираем задачи, что бы ты набирался опыта. Наберешься опыта и тогда начнешь сам программировать.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
29.05.2020, 00:40
coa3, Реши задачу
В строке заменить пробелы восклицательным знаком. Если встречается подряд несколько пробелов, то их заменить на "?"
**************************************** ****************************************
В строке заменить пробелы восклицательным знаком. Если встречается подряд несколько пробелов, то их следует заменить одним знаком "?"

**************************************** ****************************************
Я допускаю, что это задача легко решается с помощью регулярных выражений. Но так как ни ты ни я еще пока не изучали регулярные выражения, то будем решать с помощью циклов.
Составим алгоритм.
Напишем строку

"Данная строка, для тестирования решения задачи "

Начиная с максимальной группы пробелов начинай заменять их на символ "?" используя метод,
Python
1
2
3
4
5
6
7
8
9
 str.replace(old, new[, maxcount]) -> s
 
old - Искомая подстрока, которую следует заменить.
 
new - Подстрока, на которую следует заменить искомую.
 
maxcount=None - Максимальное требуемое количество замен. Если не указано, будут заменены все вхождения искомой строки.
 
s - Новая строка с заменой старых подстрок на новые
Добавлено через 4 часа 8 минут
За максимальное количество пробелов нужно взять длину исходной строки, так как исходная строка может состоять из одних пробелов.
Не знаю производительности кода по такому алгоритму, но код будет самым простым. Один цикл for и один метод replace() в теле цикла.
Даю заготовку. Вместо комментариев дополни ее необходимым кодом.
Python
1
2
3
4
5
6
7
8
9
10
s = "  Данная строка, для тестирования     решения задачи        "
 
n = len(s)
for i in range(n-1):
    spaceStr =  # формируем строку пробелов, которую будем заменять на "?"
    # заменяем в исходной строке строку пробелов spaceStr на "?"
 
# заменяем одиночные пробелы на "!"
 
print(s)
В шапке цикла от длины строки отнимаем единицу, что бы заменять все пробелы, кроме единичных. Благодаря этому нам не нужно на каждом шаге проверять длину заменяемой строки пробелов, и мы можем вынести замену одиночных пробелов за пределы цикла.

Добавлено через 2 минуты
В результате программа должна выводить

?Данная!строка,!для!тестирования?решения !задачи?

Что за ерунда, форум добавляет в строку пробел, который я набивая строку не делаю.
Может он не воспринимает длинные слова без пробелов?
1
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
29.05.2020, 11:39  [ТС]
с начало задача показалась легкой, но в итоге не решил...
Python
1
2
3
4
5
s = "  hhg hgdd  rg "
n = len(s)
for i in range(n - 1):
    spaceStr = str.replace(s, ' ', '!', 1)
print(s)
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
29.05.2020, 15:38
coa3, Я же комментариями показал, что в теле цикла должно быть две строки, а ты загнал все в одну и неправильно. Может и можно загнать в одну строку, но когда изучаешь, лучше писать развернуто, что бы была очевидна последовательность работы программы.
Вот правильный код:
Python
1
2
3
4
5
6
7
8
9
10
11
s = "  Данная строка, для тестирования     решения задачи        "
 
n = len(s)
for i in range(n-1):
    spaceStr = ' '*(n-i) # формируем строку пробелов, которую будем заменять на "?"
    s = s.replace(spaceStr, '?')   # заменяем в исходной строке строку пробелов spaceStr на "?"
 
# заменяем одиночные пробелы на "!"
s = s.replace(' ', '!')
 
print(s)
Ты не правильно понял метод replace.
str - это твоя строка, к которой нужно применить метод. В данном случае s .
Поэтому нужно писать s.replace()
Я строку spaceStr, которая состоит из одних пробелов, которые нужно заменять в исходной строке s, формирую заранее перед тем, как применить ее в методе replace, так понятнее.
И полученную в результате замены новую строку присваиваем переменной s , вместо исходной строки.
Еще твоя одна ошибка. Я же написал, что благодаря -1 в шапке цикла, мы рассматриваем строки состоящие из одних пробелов, но за исключением строк, состоящих из всего одного пробела, который нужно заменить на восклицательный знак !. Эту замену мы выполняем выйдя из цикла.
У тебя этой замены нет.
Постарайся разобраться с моим кодом, если что не ясно, то спрашивай.

Добавлено через 13 минут
coa3, Когда разберешься, как работает код с двумя строками в теле цикла, тогда разберись здесь, когда две строки в теле цикла объединены в одну.
Python
1
2
3
4
5
6
7
8
9
10
11
s = "  Данная строка, для тестирования     решения задачи        "
 
n = len(s)
for i in range(n-1):
    # заменяем в исходной строке группы пробелов, содержащие больше одного пробела, на "?"
    s = s.replace(' '*(n-i), '?')
 
# заменяем одиночные пробелы на "!"
s = s.replace(' ', '!')
 
print(s)
1
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
29.05.2020, 21:26
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
s = "  Данная строка, для тестирования     решения задачи        "
 
f=['','!','?']
idx=0
out=[]
for i in s:
    if i!=' ':
        out.append(f[idx])
        out.append(i)
        idx=0
    else:
        idx+=1
        if idx>2:
            idx=2
out.append(f[idx])
print(''.join(out))
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
30.05.2020, 17:10
u235, Это первый алгоритм, который я хотел предложить. Но потом удалил его из своего комментария, так как нашел более простой алгоритм. Если он даже работает медленнее чем Ваш, но он более простой. А я придерживаюсь того же принципа, что и Лутц, "При написании на питоне, на первом месте простота программы , а уже на втором ее быстродействие (за исключением когда это критично). Если же кого то больше интересует быстродействие, то нужно писать на языке линейки "С", например на С#. Ну а если уж совсем быстро, то это на языке assembler.
Но спасибо, что предложили свой вариант, что бы ТС знал, что задачу можно решить и так.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.05.2020, 17:10
Помогаю со студенческими работами здесь

Не работает код Эрик Матиз - Изучаем Python, упражнение 19.1
Здравствуйте Помогите пожалуйста с решением задачи 19.1 из книги Эрика Матиза - Изучаем Python Блог: создайте новый проект Django...

Изучаем С++ по книге Майкла Доусона
Всем привет, недавно начал изучать C++ и начал я с книги (Майкл Доусон - Изучаем С++ через программирование игр) по мере прочтения и...

Исходники к книге Дэвида Гриффитса - Изучаем программирование на с
Может есть у кого-нибудь хоть какие-нибудь???

Обучение программированию по книге "Изучаем С#"
Я ничего не знал о С# и почемуто купил книгу &quot;Изучаем С#&quot; (3-е издание 2014) Эндрю Стиллмен и Дженифер Грин дочитал до 350 страницы и...

Проект на PyGame из книги «Изучаем Python. Программирование игр, визуализация данных, веб-приложения», Мэтиза
Пишу первый проект на Питоне, никак не могу разобрать как исправить ошибку. Код переписывать (перекопировать с учебника) уже пытался.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru