ToxaLay

Списки и цикл for

Jul 1st, 2022 (edited)
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.00 KB | None | 0 0
  1. name = "Дарья"
  2. # Для создания списка используются квадратные скобочки
  3. some_list = [0, 1.2345, "строка", ["список внутри списка"], name]
  4. # К спискам работают индексы и возвращают они элемент списка:
  5. print(some_list[0])
  6. # 0
  7. print(some_list[3])
  8. # ['список внутри списка']
  9.  
  10. # К спискам работают срезы и возвращают они обрезанный список:
  11. print(some_list[0:2])
  12. # [0, 1.2345]
  13. print(some_list[3:])
  14. # [['список внутри списка'], 'Дарья']
  15.  
  16. # Списки можно складывать и умножать
  17. # Сложение:
  18. a = [1, 2]
  19. b = [3, 4]
  20. print(a+b)
  21. # [1, 2, 3, 4]
  22.  
  23. # Умножение:
  24. a = [1, 2] * 3
  25. print(a)
  26. # [1, 2, 1, 2, 1, 2]
  27. b = [0] * 6
  28. print(b)
  29. # [0, 0, 0, 0, 0, 0]
  30.  
  31.  
  32. # А теперь про подводные камни
  33. # Программисты часто используют со списками срез вида [:],
  34. # чтобы скопировать содержимое списка.
  35. # Что это значит и почему просто не переназначить?
  36. # Сейчас разберёмся!
  37. # Создаём список:
  38. some_list = [0, 1, 2]
  39. # Создаём copy_list с содержимым some_list
  40. copy_list = some_list
  41. # Выводим оба списка:
  42. print("some: " + str(some_list))
  43. # some: [0, 1, 2]
  44. print("copy: " + str(copy_list))
  45. # copy: [0, 1, 2]
  46.  
  47. # Видите разницу? Ну конечно же нет, поскольку мы ничего не изменяли.
  48. # А теперь добавим к скопированному списку цифру 3:
  49. copy_list.append(3)
  50. # И выведем оба списка:
  51. print("some: " + str(some_list))
  52. # some: [0, 1, 2, 3]
  53. print("copy: " + str(copy_list))
  54. # copy: [0, 1, 2, 3]
  55.  
  56. # Заметили? Мы добавляли значение к списку copy_list, а добавился он и в some_list.
  57. # Чтобы такой хрени не происходило достаточно использовать для копирования [:]
  58. # Перепишем код, но с использованием [:]
  59. some_list = [0, 1, 2]
  60. copy_list = some_list[:] # вот тут мы добавляем [:]
  61. copy_list.append(3) # Добавляем цифру 3
  62. print("some: " + str(some_list))
  63. # some: [0, 1, 2]
  64. print("copy: " + str(copy_list))
  65. # copy: [0, 1, 2, 3]
  66.  
  67. # Проблема решена!
  68.  
  69.  
  70. # Функция list(переменная)
  71. # При помощи list мы можем переводить разные виды данных к спискам
  72. # Пример:
  73. #    строка является набором символов и при попытке применить list()
  74. #    мы получим список из символов.
  75. x = "Маша"
  76. print( list(x) )
  77. # ['М', 'а', 'ш', 'а']
  78.  
  79. # Некоторые типы данных мы не можем переводить к спискам.
  80. # Пример:
  81. #   Числа являются одним целым, при попытке разбить их на
  82. #   список выйдет ошибка
  83. # print( list(123) )
  84. # Traceback (most recent call last):
  85. #   File "main.py", line 69, in <module>
  86. #     print(list(123))
  87. # TypeError: 'int' object is not iterable
  88.  
  89. # Но как тогда поменять к примеру первый элемент числа на 10?
  90. num = 123
  91. # Сначала мы переводим число к строке
  92. num = str(123) # '123'
  93. # Теперь мы делаем список этой строки
  94. num = list(num) # ['1', '2', '3']
  95. # Смело меняем первый элемент списка на '10'
  96. num[0] = '10' # ['10', '2', '3']
  97. # Теперь осталось только как-то всё обратно соединить и перевести
  98. # в число...
  99.  
  100.  
  101. # У строки есть ещё пара команд, о которых я умолчал в предыдущем уроке,
  102. # т.к. без знания списков они абсолютно бесполезны.
  103.  
  104.  
  105. # строка.split(разделитель)
  106. # Эта функция делит строку на список,
  107. # используя в качестве элементов списка значения между разделителями.
  108. # По умолчанию разделитель пробел
  109. # Сам разделитель в список не входит!
  110.  
  111. # Пример 1:
  112. #   Разделим предложение на слова,
  113. #   используя в качестве разделителя пробел.
  114. text = "Шла Маша по шоссе и сосала сушку"
  115. text_list = text.split() # По умолчанию разделитель пробел
  116. print(text_list)
  117. # ['Шла', 'Маша', 'по', 'шоссе', 'и', 'сосала', 'сушку']
  118.  
  119. # Пример 2:
  120. #   Найдём основной адрес в ссылке.
  121. #   1. Мы знаем, что каждый адрес в начале имеет https://
  122. #   2. Сразу после этой конструкции идёт основной адрес.
  123. #   3. После основного адреса через символы слеша (/) идут каталоги сайта
  124. site = "https://www.vk.com/feed"
  125. # Обрежем начало
  126. site = site[7:] # "www.vk.com/feed"
  127. # Создадим список из этой строки с разделителем "/"
  128. site = site.split("/") # ['www.vk.com', 'feed']
  129. # Выведем основной адрес через индекс
  130. print(site[0])
  131. # www.vk.com
  132.  
  133.  
  134. # разделитель.join(список)
  135. # Эта функция собирает список в строку, вставляя между элементами разделитель.
  136. # Пример:
  137. text_list = ['Шла', 'Маша', 'по', 'шоссе', 'и', 'сосала', 'сушку']
  138. text = " ".join(text_list)
  139. print(text)
  140. # Шла Маша по шоссе и сосала сушку
  141.  
  142.  
  143.  
  144. # Цикл for и списки
  145. # Записывается, как:
  146. # for переменная in итеррируемый_объект:
  147. #   тело_цикла
  148.  
  149. # переменная - создаётся переменная, которая каждый новый цикл цикла
  150. # будет меняться.
  151. # Если мы не хотим использовать переменную достаточно написать вместо
  152. # неё нижнее подчёркивание (_).
  153. # итеррируемый_объект - любой объект, который поддерживает индексацию,
  154. # примеры итеррируемых_объектов: строка, список, генератор и т.д.
  155. # тело_цикла - код, который будет выполняться каждый новый цикл.
  156.  
  157.  
  158. # Генератор range(start, stop, step) # эквивалентен x[start:stop:step],
  159. # где x - бесконечная последовательность цифр.
  160. # Генерирует значения от start до stop (не включительно) с шагом step
  161. # Чтобы вывести значение генератора надо обязательно использовать функцию list()
  162. # Другие виды записи range:
  163. #   range(stop) # эквивалентен x[:stop]
  164. #   range(start, stop) # эквивалентен x[start:stop]
  165. # Пример:
  166. print(list(range(10)))
  167. # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  168.  
  169. # Генератор range очень часто используется вместе с циклом for
  170. # Пример:
  171. for index in range(1, 11):
  172.     print("Вывод номер " + str(index))
  173. # Вывод номер 1
  174. # Вывод номер 2
  175. # ...
  176. # Вывод номер 10
  177.  
  178. # При помощи цикла for можно генерировать списки.
  179. # Пример 1:
  180. #   Сгенерируем список с последовательностью Фибоначчи до 100го элемента.
  181. #   Последовательность Фибоначчи:
  182. #       первые два числа равны 0 и 1,
  183. #       а каждое последующее число равно сумме двух предыдущих чисел.
  184. #       0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...
  185. fibonacci = [0, 1]
  186. for _ in range(100):
  187.     next_num = fibonacci[-1] + fibonacci[-2]
  188.     fibonacci.append(next_num)
  189. print(fibonacci)
  190.  
  191. # Пример 2:
  192. #   Сгенерируем список квадратов чисел от 0 до 20
  193. #   Возведение в степень записывается оператором **
  194. nums = []
  195. for i in range(21):
  196.     nums.append(i**2)
  197. print(nums)
  198. # [0, 1, 4, 9, 16, 25, ... 361, 400]
  199. # Циклы которые генерируют списки и у которых в теле 1 строка можно
  200. # представить в виде:
  201. # some_list = [тело_цикла for переменная in итеррируемый_объект]
  202. # Решение "примера 2" с генерацией в одну строку:
  203. nums = [i**2 for i in range(21)]
  204. print(nums)
  205. # [0, 1, 4, 9, 16, 25, ... 361, 400]
  206.  
  207.  
  208. # Циклы внутри других циклов
  209. # Циклы можно встраивать в тело другого цикла
  210. # Пример:
  211. #   Нам дана 2х мерная матрица matrix:
  212. matrix = [["Т","с","л","п"], ["ы","а","у","л"], [" ","м","ч","ю"], [" ","ы","ш","и"], [" ","й","и","к"], [" "," ","й"," "]]
  213. #   Чтобы красиво её вывести в виде реальной матрицы
  214. #   следует использовать цикл вложенный в другой цикл.
  215. #   P.S. В данном случае более разумно использовать
  216. #        один цикл и "|".join(line_list), но я хочу
  217. #        показать, что можно использовать и 2 цикла
  218.  
  219. # Цикл для координаты y (для каждой строки переносит строку)
  220. for y in range(len(matrix)):
  221.     line_list = matrix[y] # Получаем список с индексом y
  222.     # Строка линии, которую мы будем выводить
  223.     # в конце каждого цикла
  224.     line_text = "|"
  225.     # Цикл для координаты x
  226.     for x in range(len(line_list)):
  227.         # Добавляем к line_text элемент матрицы с координатами x и y
  228.         # а после добавляем визуальный (декоративный) разделитель
  229.         line_text += matrix[y][x] + "|"
  230.     print(line_text)
  231. # Вывод программы:
  232. # |Т|с|л|п|
  233. # |ы|а|у|л|
  234. # | |м|ч|ю|
  235. # | |ы|ш|и|
  236. # | |й|и|к|
  237. # | | |й| |
  238. # Я надеюсь вы смогли понять скрытое послание
  239.  
  240.  
  241. # Пример кода, который улучшает визуальный вид чисел.
  242. num = 1234567890
  243. # переводим к списку символов
  244. num = list(str(num))
  245. # Это хитрой строкой мы получим индексы [9, 6, 3, 0]
  246. indexes = list(range(len(num)))[::-3]
  247. for i in indexes:
  248.     # добавляем после символов с индексами,
  249.     # которые мы нашли пробел.
  250.     num[i] = num[i] + " "
  251. # переводим строку к списку
  252. num = "".join(num)
  253. print(num)
  254. # 1 234 567 890
  255. # Вуаля, число 1234567890 преобрело
  256. # более читаемый вид
  257.  
  258.  
  259. # Задания для проверки:
  260. # 1. Дано переменная abc с именем и отчеством:
  261. abc = "Аркадий Семёнович"
  262. # 1.1. Разбейте строку на список и выведите имя (первый элемент списка)
  263. # 1.2. Поменяйте имя в списке на "Николай"
  264. # 1.3. Выведите новое имя и отчество одной строкой не используя сложение
  265. # 2. Выведите при помощи 2х циклов следующую таблицу из 9ти цифр:
  266. #      1 2 3
  267. #      4 5 6
  268. #      7 8 9
  269. # 3. Дан список пар, где первое слово всегда девушка, а третье мужчина:
  270. data = ["Маша и Паша", "Саша и Игорь", "Лиза и Кирилл", "Катя и Алексей", ""]
  271. # 3.1. Выведите при помощи цикла for для каждой пары:
  272. #        "ЖЕН и МУЖ живут вместе"
  273. # 3.2. Создайте списки только из мужчин и только из женщин.
  274. # 3.3. Выведите всех мужчин через запятые и в конце напишите "живут одни.":
  275. #        "МУЖ, МУЖ, МУЖ, ... МУЖ живут одни."
  276. # 3.4. Выведите всех женщин через запятые, но вместо последней запятой напишите "и"
  277. #      в конце напишите "весело проводят вместе время!"
  278. #        "ЖЕН, ... ЖЕН, ЖЕН и ЖЕН весело проводят вместе время!"
  279.  
  280. # Подсказки:
  281. # 1.1. Используйте .split()
  282. # 1.2. Переопределите элемент списка с индексом 0
  283. # 1.3. Используйте " ".join()
  284. # 2. Достаточно сложное задание, надо использовать 2 цикла и 2 переменных.
  285. #    Первую переменную надо использовать как номер строки,
  286. #    а вторую как номер столбца. И не забыть добавить +1.
  287. #    Из чего вытекает, что значение элемента some_list[y][x] должно быть: y*3 + x + 1
  288. # 3.1. Это не должно быть проблемой...
  289. # 3.2. Надо создать 2 пустых списка, к примеру: wom и men,
  290. #      к каждой строке применить функцию split()
  291. #      без аргументов (тогда индексы 0 и 2 то, что вы ищите) или
  292. #      с аргументом " и " (тогда индексы 0 и 1 то, что вы ищете)
  293. #      и при помощи функции wom.append и men.append добавлять мужчин
  294. #      и женщин в разные списки.
  295. # 3.3. Тут надо использовать ", ".join(men) и добавить окончание строки.
  296. # 3.4. Тут делать то же самое, что и в прошлом примере, но для всех, кроме
  297. #      последней. Для последней надо вручную написать " и " + wom[i] и
  298. #      добавить окончание строки из задания.
Add Comment
Please, Sign In to add comment