#!/usr/bin/env python # coding: utf-8 # In[3]: # Вспомним, как работает параметр key при сортировке names = ["Оля", "Юля", "Петя", "Маша", "Аня", "Света"] # In[5]: # Сортируем просто лексикографически list(sorted(names)) # In[6]: # Пусть теперь надо отсортировать строки по их длине # Передадим в качестве параметра стандартную функцию len list(sorted(names, key=len)) # In[8]: # Встоенная сортировка является стабильной: # порядок строк с одинаковой длиной не изменился # Пусть теперь нужно отсортировать строки сначала по длине, # а при равных длинах - лексикографически # Студенты на лекции предложили такой способ: # сначала сортируем лексикографически, а потом - стабильно по длине list(sorted(sorted(names), key=len)) # In[13]: # Можно обойтись и одной сортировкой, # если в качестве ключа передавать функцию, # возвращающую по строке x пару из её длины и самой этой строки # Такие пары будут сами сравниваться лексикографически list(sorted(names, key=lambda x: (len(x), x))) # In[16]: # Ещё пример: сортировка без учёта регистра # По умолчанию заглавные буквы идут раньше s = "Студенты Факультета компьютерных наук Высшей школы экономики" words = s.split(" ") list(sorted(words)) # In[17]: # Будем при сортировке сравнивать строки в нижнем регистре list(sorted(words, key=str.lower)) # In[19]: # Вспомним теперь функции. # Напишем функцию проверки простоты числа def is_prime(x): if x <= 1: return False for d in range(2, int(x**0.5) + 1): if x % d == 0: return False return True # In[21]: for i in range(15): print(i, is_prime(i)) # In[22]: # Списковые выражения: описание элементов списка в общем виде [x**2 for x in range(15)] # In[23]: [(x, is_prime(x)) for x in range(15)] # In[26]: [x for x in range(15) if is_prime(x)] # In[27]: # Если вместо квадратных скобок поставить круглые, # то получится так называемый "генератор". # Он не вычисляет все элементы сразу, а умеет выдавать их по очереди # (например, в цикле) (x for x in range(15) if is_prime(x)) # In[28]: list((x for x in range(15) if is_prime(x))) # In[30]: primes = (x for x in range(15) if is_prime(x)) for i in primes: print(i) # In[31]: # Мы уже проитерировались по генератору primes, поэтому теперь он пуст # Про генераторы поговорим подробнее в следующий раз list(primes) # In[34]: # Можно еще писать выражения с фигурными скобками # Получится словарь {x: is_prime(x) for x in range(15)} # In[40]: # Словарь из предыдущего примера не очень интересен, # так как ключи в нем - подряд идущие неотрицательные целые числа # Вместо словаря там можно было бы использовать список # Сделаем что-нибудь поинтереснее: {x: is_prime(x) for x in range(2, 19) if x % 2 == 1} # In[41]: # Как задать двумерный массив (матрицу)? # Воспользуемся для этого списком списков, # задавая матрицу как список строк A = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ] # In[42]: # Обычный вывод на экран печатает все "плоско": print(A) # In[43]: # Напишем для удобства функцию печати матрицы: def print_matrix(A): for row in A: print(row) # In[44]: print_matrix(A) # In[47]: # Правда, если число цифр в элементах разное, то вывод "поплывет": A[1][1] = -153 print_matrix(A) # In[48]: # Напишите сами функцию, печатающую матрицу аккуратно # In[52]: # Предположим, нам надо транспонировать матрицу. # Первый способ: def transpose(A): A_transp = [] for j in range(len(A[0])): # число столбцов row_transp = [] for row in A: row_transp.append(row[j]) A_transp.append(row_transp) return A_transp print_matrix(transpose(A)) # In[55]: # Второй способ - то же самое, но с помощью списковых выражений def transpose2(A): return [[row[j] for row in A] for j in range(len(A[0]))] print_matrix(transpose2(A)) # In[56]: # Этого же можно добиться с помощью встроенной функции zip: print_matrix(list(zip(*A))) # In[57]: # Функция zip получает на вход несколько коллекций # и группирует их первые элементы, вторые элементы, и т. д. list(zip([1,2,3], "abc", [5,6,7,8])) # In[58]: # Конструкция *A в zip(*A) - это способ передать элементы списка A как отдельные параметры # In[59]: # Давайте научимся писать функции с переменным числом аргументов (как в zip) def f(a, b, *c, **d): print(a) # a и b - обычные обязательные аргументы print(b) print(c) # с - это кортеж (быть может пустой) из дополнительных аргументов print(d) # d - это словарь остальных именованных аргументов # In[60]: f(1, 2) # In[61]: f(1, 2, 3, 4, 5) # In[62]: f(1, 2, 3, 4, 5, x=6, y=7) # In[65]: # Если у нас уже есть список или словарь (с текстовыми ключами), # то их можно "развернуть" и передать каждый их элемент как свой аргумент в функцию l = [3, 4, 5] d = {"x": 6, "y": 7} f(1, 2, *l, **d) # In[66]: # In[ ]: # In[ ]: # In[ ]: