Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350

Обработка строк. Объясните действия готового кода

11.08.2021, 18:05. Показов 2844. Ответов 24

Студворк — интернет-сервис помощи студентам
Начал изучать Python.
Нашел решение одной задачи: "Сделать слова в обратном порядке не меняя своего положения. Кол-во пробелов остается"
Python
1
2
3
4
5
text = "hello   world"
s = " ".join([i[::-1] for i in text.split(" ")])
print(s)
 
>>> olleh   dlrow
Мне не понятна строка 3. Единственное что понятно:
  • это создание списка путем разделения предложения на слова с разделителем пробел - text.split.
  • " ".join - объединение списка в одну строку
Непонятно:
  1. что делает это - [i[::-1].
  2. Не понятно как сохраняются 2 пробела между словами.
  3. что делает конкретно этот код: for i in text.split(" ") (что такое цикл я знаю)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.08.2021, 18:05
Ответы с готовыми решениями:

Объясните, пожалуйста, действия кода
Здравствуйте, я новичок. Пытаюсь понять принципы программирования посредством изучения Free Pascal. Читаю учебник, там разбирается задача,...

Объясните значения строк кода
1) trim($_GET) 2) nl2br(trim($_GET)) 3) isset($_GET) 4) $fp=fopen("text_form.txt","a"); 5) fclose($fp); ...

Объясните смысл кода в 10 строк
Добрый день. Я знаком с программирование, но пользуюсь скриптовым языком. Он намного проще. Попытался самостоятельно понять...

24
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
11.08.2021, 18:27
Цитата Сообщение от Worldmen Посмотреть сообщение
что делает это - [i[::-1].
Кури срезы.
Цитата Сообщение от Worldmen Посмотреть сообщение
Не понятно как сохраняются 2 пробела между словами.
Выведи text.split(" ") и подумай как.
Цитата Сообщение от Worldmen Посмотреть сообщение
что делает конкретно этот код: for i in text.split(" ") (что такое цикл я знаю)
Кури list-comprehensions.
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
11.08.2021, 19:00
Цитата Сообщение от Worldmen Посмотреть сообщение
что делает это
[::-1] это slice: slice(start, stop[, step])
Открой документацию Python - там все описано.
Открой книгу Лутца Изучаем Python - там все разжевано.

Добавлено через 21 минуту
Цитата Сообщение от Worldmen Посмотреть сообщение
Не понятно как сохраняются 2 пробела между словами.
Немного закулисной магии:
Python
1
2
3
>>> text = "hello   world"
>>> [i[::-1] for i in text.split(" ")]
['olleh', '', '', 'dlrow']
та-да-там.... пробелы не сохраняются...
Python
1
2
3
>>> " ".join(['olleh', '', '', 'dlrow'])
'olleh   dlrow'
>>>
Они воссоздаются!

И, кстати, их не два, а три.
1
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350
12.08.2021, 22:39  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
[i[::-1] for i in text.split(" ")]
не пойму как правая (i[::-1]) часть взаимодействует с левой (for i in text.split(" "))?
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
12.08.2021, 22:46
Worldmen,
Python
1
2
3
4
5
6
7
8
9
10
11
text = "hello   world"
s = " ".join([i[::-1] for i in text.split(" ")])
print(s)
 
# эквивалентно
 
text = "hello   world"
s = []
for i in text.split(" "):
    s.append(i[::-1])
print(" ".join(s))
Так понятно?
1
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350
12.08.2021, 23:02  [ТС]
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Python
1
2
3
4
5
text = "hello   world"
s = []
for i in text.split(" "):
    s.append(i[::-1])
print(" ".join(s))
Так понятно. Не понятно почему в join есть 2 параметра разделенные пробелом и они как-то отождествляются.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
12.08.2021, 23:08
Цитата Сообщение от Worldmen Посмотреть сообщение
в join есть 2 параметра разделенные пробелом и они как-то отождествляются
Чего? Где ты там два параметра увидел?
Вот почему бы не открыть доку и не посмотреть? Почему не поэкспериментировать? Все же становится ясно как Божий день.
Python
1
2
3
lst = ["1", "a", "@"]
print(" ".join(lst))    # 1 a @
print("+++".join(lst))  # 1+++a+++@
0
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350
12.08.2021, 23:13  [ТС]
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Где ты там два параметра увидел?
Вот тут:
Python
1
s = " ".join([i[::-1] for i in text.split(" ")])
Первый - i[::-1]
Второй - for i in text.split(" ")
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
12.08.2021, 23:21
Worldmen, в-общем ты ничего не понял из того, что я тебе написал. В методе join - один параметр. Это список.
s = " ".join([i[::-1] for i in text.split(" ")])
Да, это список. Я тебе разложил как это будет не в виде листкомпса, но ты не понял. Хотя и написал что понял.

Добавлено через 1 минуту
Вот это
Python
1
s = [i[::-1] for i in text.split(" ")]
то же самое что и
Python
1
2
3
s = []
for i in text.split(" "):
    s.append(i[::-1])
В итоге получаем список s и джойним его пробелом

Добавлено через 2 минуты
Python
1
2
3
4
5
6
print(" ".join([i[::-1] for i in text.split(" ")]))
 
# то же самое что и 
 
s = [i[::-1] for i in text.split(" ")]
print(" ".join(s))
Добавлено через 31 секунду
Теперь-то понятно?
2
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350
28.08.2021, 22:55  [ТС]
очень хорошо объясняется синтаксис в обучении Pathon на stepik.org - Списочные выражения
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
28.08.2021, 23:08
Цитата Сообщение от Worldmen Посмотреть сообщение
очень хорошо объясняется синтаксис в обучении Pathon
Если ты не прочитал Лутца - никакой stepik тебе не поможет.
0
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350
28.08.2021, 23:29  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Если ты не прочитал Лутца - никакой stepik тебе не поможет.
Есть у меня эти 2 тома.
В первом 300 страниц рассказывается как :
  • Как Python выполняет программы
  • Как пользователь выполняет программы
  • Числовые типы
  • Кратко о динамической типизации
  • Фундаментальные основы строк
  • Списки и словари
  • Кортежи, файлы и все остальное
если б я это прочитал, я знал бы только теорию, а на сайте я по каждой теме сделал не менее 20 задач и достаточно сложных, чтобы эти знания закрепились в голове. я на это потратил 19 дней (на книгу меньше ушло бы) и я не жалею.
Книги хорошие как help
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
30.08.2021, 11:20
Цитата Сообщение от Worldmen Посмотреть сообщение
очень хорошо объясняется синтаксис в обучении Pathon на stepik.org - Списочные выражения
Если бы объяснялось хорошо, то Вам было бы все понятно.
Выражения в питоне помещаются в круглые скобки. А квадратные скобки, с размещенным внутри циклом for создают списковые включения. Именно такое у Вас.
Для того, что бы понимать Ваш код, Вам нужно изучить синтаксис спискового включения. Хотя бы простой базовый синтаксис спискового включения. Но нужно иметь ввиду, что встречаются и списковые включения с довольно сложной, многоуровневой структурой, которые трудно читаемы. Такие коды в основном используют любители СИшного стиля программирования, где коды сжимаются по максимуму.
А вообще то включения бывают разных типов, и различаются они применяемыми скобками.
Python
1
2
3
4
5
6
7
8
9
10
11
Ниже представлена сводка по всем альтернативным версиям включений в Python
З.Х и 2.7. Последние две версии недоступны в Python 2.6 и более ранних выпусках:
>>> [х * х for х in range (10)]                # Списковое включение: строит список      => список
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]           
>>> (х * х for х in range (10))                # Генераторное выражение:                       => итератор
                                                                    # производит элементы
<generator object at 0x009E7328>      # Круглые скобки часто необязательны
>>> {x * x for x in range (10) }             # Включение множества, Python З.Х и 2.7 => множество
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}            # (х, у} - тоже множество в этих версиях
>>> {x: x * x for x in range (10) }           # Включение словаря, Python З.Х и 2.7     => словарь
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7; 49, 8: 64, 9: 81}
В общем читайте документацию.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
30.08.2021, 11:22
Цитата Сообщение от Viktorrus Посмотреть сообщение
Такие коды в основном используют любители СИшного стиля программирования, где коды сжимаются по максимуму.
Чего???
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
30.08.2021, 11:35
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Чего???
У Лутца посвящен этому абзац, где он ссылается на один из тезисов разработчиков питона "Простое лучше сложного". И он говорит, что включения можно делать неоправдано сложными, и трудно читаемыми. И советует не увлекаться сложными включениями.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
30.08.2021, 11:39
Полностью согласен с Лутцем.

А вот эта ересь откуда?
Цитата Сообщение от Viktorrus Посмотреть сообщение
Такие коды в основном используют любители СИшного стиля программирования, где коды сжимаются по максимуму.
Добавлено через 1 минуту
Viktorrus, вы сишный код вообще видели? Не helloworld ессно.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
30.08.2021, 11:55
"Общая оценка для всех заявлений о производительности в этой книге, касающихся списковых включений или других инструментов: относительная
скорость выполнения кода во многом зависит от конкретного тестируемого кода и используемой версии Python, а также предрасположена к изменениям от выпуска к выпуску.
Например, в CPython 2.7 и 3.3 списковые включения по-прежнему могут
быть в два раза быстрее соответствующих циклов for в одних тестах, но
лишь минимально быстрее в других и возможно даже слегка медленнее в
случае применения конструкций фильтров if."
Лутц М. Изучаем Python (том 1, 5-е издание, 2019) стр. 452


"Не злоупотребляйте списковыми включениями: KISS.
При такой универсальности списковые включения могут быстро стать малопонятными, особенно когда они вложенные. Некоторые задачи программирования сложны по своей природе, и мы не можем приукрашивать их в попытке сделать проще, чем они есть на самом деле (в качестве основного примера дождитесь грядущих перестановок). Инструменты вроде включений являются мощными решениями, когда используются разумно, и по существу нет ничего плохого в том, чтобы применять их в своих сценариях. Вместе с тем код, подобный представленному в предыдущем разделе, может выйти за границы допустимой сложности — и, откровенно говоря, способен непропорционально возбудить интерес у тех, кто придерживается ошибочного предположения о том, что запутывание кода каким-то образом намекает на наличие таланта. Поскольку такие инструменты имеют тенденцию быть притягательными для определенных людей больше, чем вероятно должны, я вынужден прояснить здесь область их применения. В книге демонстрируются усложненные включения в учебных целях, но в реальном мире использование неоправданно трудного для понимания и замысловатого кода служит признаком скверного проектирования и плохой заботы о его потребителях. Перефразируя мысль из первой главы: программа не должна быть заумной и непонятной — она должна четко сообщать о своем предназначении. Или вот один из девизов, выводимых import this:
Простое лучше сложного.
Написание кода со сложными включениями может быть веселым академическим развлечением, но ему не место в программах, которые когда-нибудь придется разбирать другим. Поэтому вот вам мой совет: в начале работы с Python применяйте простые циклы for и включения или вызовы тар в отдельных случаях, где их легко использовать. Как всегда, здесь применимо правило “сохраняйте его простым”: лаконичность кода — гораздо менее важная цель, чем его читабельность. Если вы вынуждены переводить код в операторы, чтобы понять его, то вероятно там и должны быть операторы. Таким образом, старый акроним KISS по-прежнему актуален: фраза Keep It Simple (сохраняйте его простым), за которой следует либо слово, считающееся в наши дни слишком сексистским (Sir (сэр)), либо чересчур красочным для такой книги, читаемой всей семьей…
Обратная сторона: производительность, лаконичность, выразительность
Тем не менее, применительно к данному случаю в настоящее время дополнительная сложность дает солидное преимущество в плане производительности: современные тесты в Python показывают, что вызовы тар могут выполняться вдвое быстрее эквивалентных циклов for, а списковые включения зачастую даже быстрее вызовов тар. Разница в скорости может варьироваться в зависимости от особенностей использования и версии Python, но в целом объясняется тем фактом, что тар и списковые включения выполняются со скоростью кода на языке С внутри интерпретатора, которая часто гораздо выше, чем скорость выполнения байт-кода циклов for внутри PVM. Вдобавок списковые включения обеспечивают лаконичность кода, которая поощряется и даже предписывается, когда из такого сокращения размера не вытекает также уменьшение смысла для следующего программиста. Кроме того, многие считают выразительность включений мощным союзником. Поскольку вызовы тар и списковые включения представляют собой выражения, синтаксически они также разрешены в местах, где операторы цикла for не допускаются, скажем, в теле функций lambda, внутри списковых и словарных литералов и т.п. По указанным причинам списковые включения и вызовы тар заслуживают изучения и применения для более простых видов итераций, особенно если скорость приложения является важным фактором. Однако из-за того, что циклы for делают логику более явной, они в целом рекомендуются на основании простоты и зачастую для получения более прямолинейного кода. В случае использования вы должны стараться сохранять вызовы тар и списковые включения простыми; для более сложных задач взамен применяйте полные операторы."
Лутц М. Изучаем Python (том 1, 5-е издание, 2019) стр. 605-607
Так как объем текста посвященного разбору этого вопроса достаточно большой, я не стал давать его весь. Читайте указанные страницы.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
30.08.2021, 12:03
Viktorrus, класс!
Но на мой-то вопрос ответите? Откуда вы взяли, что
Цитата Сообщение от Viktorrus Посмотреть сообщение
Такие коды в основном используют любители СИшного стиля программирования, где коды сжимаются по максимуму.
???
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
30.08.2021, 12:09
Сорри, при копировании текста, map скопировалось как тар. Исправить уже не могу.

Добавлено через 3 минуты
iSmokeJC, Просто я когда то немного изучал С++. И там часто группа команд заменяется одной командой. Что делает код очень компактным, но требует для его понимания высокого профессионализма (хорошего знания языка С++)

Добавлено через 2 минуты
И это ни как в питоне, когда одна команда обозначает одно укрупненное действие, а там одна команда может обозначать именно несколько действий, которые нужно помнить применяя эту команду.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
30.08.2021, 12:13
Цитата Сообщение от Viktorrus Посмотреть сообщение
одна команда может обозначать именно несколько действий
Это как?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.08.2021, 12:13
Помогаю со студенческими работами здесь

Объясните значения некоторых строк кода
1) &lt;LINK href=&quot;style.css&quot; type=text/css rel=stylesheet&gt; 2) &lt;script src=&quot;script_box.js&quot;&gt;&lt;/script&gt; 3) &lt;FORM name=&quot;demoform&quot;...

Объясните доступным языком пару строк кода
что обозначает подобный код: #include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; int** createInt(int m,int n) { ...

В поисках готового кода
Здравствуйте , вот решил я как-то написать свой brute force ... Короче не смог . Есть у кого исходнек не декомпил ОДНОПОТОЧНОГО...

Комментирование готового кода
Здравствуйте, у меня есть задача: У меня есть последовательность, содержащая от 3 до 30 слов, в каждом из которых от 1 до 5 прописных...

Комментирование готового кода
Здравствуйте, у меня есть задача: У меня есть последовательность, содержащая от 3 до 30 слов, в каждом из которых от 1 до 5 прописных...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru