- Введение
- Примеры простых программ
- Замена значений переменных местами
- Написание числа в обратном порядке
- Преобразование разделённого запятыми списка в строку
- Найти среднее значение элементов массива
- Проверить, является ли слово палиндромом
- Есть ли число в списке
- Вывод всех чисел, кратных определенному числу, в заданном диапазоне
- Количества цифр в числе
- Суммы всех цифр данного числа
- Сумма цифр от 1 до n
- Играемся со звёздочками
- Получаем гласные
- Чуть сложнее
- Все перестановки трех чисел
- Декартово произведение
- Генератор чисел Фибоначчи
- Объединяем два словаря
- Проверка дубликатов
- Вычисляем время выполнения
- Разбиение на фрагменты
Введение
В данном уроке мы приведём несколько примеров небольших программ на Python. Общая рекомендация к изучению любого языка: практикуйтесь как можно больше. Чтобы достичь хоть какого-то уровня профессионализма в программировании, не достаточно только изучать теорию. Пишите код. Желательно, каждый день, хотя бы по чуть-чуть. Это важно. Ваши руки должны привыкнуть к синтаксису, а мозги – к решению стандартных задач программирования.
Примеры простых программ
Замена значений переменных местами
На большинстве других языков эта задача была бы решена следующим образом:
var_1 = 15
var_2 = 67
print('var_1:', var_1, 'var_2:', var_2)
var_temp = var_1
var_1 = var_2
var_2 = var_temp
print('var_1:', var_1, 'var_2:', var_2)
# Вывод:
var_1: 15 var_2: 67
var_1: 67 var_2: 15
Но Пайтон творит магию:
var_1, var_2 = 15, 67
print('var_1:', var_1, 'var_2:', var_2)
var_1, var_2 = var_2, var_1
print('var_1:', var_1, 'var_2:', var_2)
# Вывод:
var_1: 15 var_2: 67
var_1: 67 var_2: 15
Написание числа в обратном порядке
var_1 = 1567
reverse = 0
while var_1 > 0:
rest = var_1 % 10
reverse = reverse * 10 + rest
var_1 = var_1 // 10
print("Число в обратном порядке:", reverse)
# Вывод:
Число в обратном порядке: 7651
В Питоне, несмотря на одну из его заповедей: «должно быть только одно решение», решений, как правило много. Всегда стоит задуматься о том, какой алгоритм оптимальнее. Пример, приведённый выше, работает, но его можно оптимизировать (сократить объём кода).
var_1 = 1567
var_1 = str(var_1)[::-1]
print("Число в обратном порядке:", var_1)
# Вывод:
Число в обратном порядке: 7651
Преобразование разделённого запятыми списка в строку
favorites = ["Python", "SQL", "GO"]
print("Мои любимые языки программирования:", ", ".join(favorites))
# Вывод:
Мои любимые языки программирования: Python, SQL, GO
Найти среднее значение элементов массива
var_1 = [1, 5, 6, 7]
sum = 0
for i in var_1:
sum += i
print(sum/len(var_1))
# Вывод:
4.75
Оптимизируем код:
var_1 = [1, 5, 6, 7]
print(eval(str(var_1).replace(', ', '+'))[0]/len(var_1))
# Вывод:
4.75
Тут следует заметить, что сокращение кода, почти всегда, ведёт к ухудшению читаемости и это следует делать с большой осторожностью. К примеру, в приведённом выше варианте, читаемость «убита» полностью, хоть код сократился всего на три строки.
Проверить, является ли слово палиндромом
Палиндром – это слово, которое читается одинаково в обоих направлениях. Для разнообразия покажем, как сокращение кода из-за выбора альтернативного алгоритма повышает читаемость кода и производительность. Вот одна из худших реализаций:
var_1 = 'level'
var_2 = list(var_1)
var_2.reverse()
var_2 = str(var_2).replace('\', \'', '').replace('[\'', '').replace('\']', '')
print(var_2)
if var_1 == var_2:
print('Palindrom')
else:
print('Simple word')
# Вывод:
Palindrome
Вариант получше:
var_1 = 'level'
ispalindrome = var_1 == var_1[::-1]
if ispalindrome:
print('Palindrome')
else:
print('Simple word')
# Вывод:
Palindrome
Вишенка на торте. Тоже самое в одну строку:
var_1 = 'level'
print('Palindrome') if var_1 == var_1[::-1] else print('Simple word')
# Вывод:
Palindrome
Есть ли число в списке
var_1 = 11
print(var_1 in [5, 6, 40, 126])
# Вывод:
False
Вывод всех чисел, кратных определенному числу, в заданном диапазоне
lower = int(input("Введите нижнюю границу диапазона: "))
upper = int(input("Введите верхнюю границу диапазона: "))
n = int(input("Введите делитель: "))
for i in range(lower, upper + 1):
if(i % n == 0):
print(i)
# Вывод:
Введите нижнюю границу диапазона: 5
Введите верхнюю границу диапазона: 30
Введите делитель: 5
5
10
15
20
25
30
Количества цифр в числе
var_1 = int(input("Введите число: "))
count = 0
while var_1 > 0:
count = count + 1
var_1 = var_1 // 10
print("Количество цифр равно:", count)
# Вывод:
Введите число: 123456789
Количество цифр равно: 9
Суммы всех цифр данного числа
var_1 = int(input("Введите число: "))
total = 0
while var_1 > 0:
rest = var_1 % 10
total = total + rest
var_1 = var_1//10
print("Сумма цифр равна:", total)
# Вывод:
Введите число: 123456789
Сумма цифр равна: 45
Сумма цифр от 1 до n
var_1 = int(input("Введите число: "))
agregator = []
for i in range(1, var_1+1):
print(i, sep=" ", end=" ")
if i < var_1:
print("+", sep=" ", end=" ")
agregator.append(i)
print("=", sum(agregator))
# Вывод:
Введите число: 18
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 = 171
Играемся со звёздочками
Вывести n рядов, заполненных знаком ‘*’
var_1 = int(input("Введите количество рядов: "))
for i in range(var_1, 0, -1):
print((var_1-i) * ' ' + i * '*')
# Вывод:
Введите количество рядов: 5
*****
****
***
**
*
Получаем гласные
def get_vowels(word):
return [each for each in word if each in "aeiouy"]
print(get_vowels("animal"))
print(get_vowels("sky"))
print(get_vowels("football"))
# Вывод:
['a', 'i', 'a']
['y']
['o', 'o', 'a']
Чуть сложнее
Все перестановки трех чисел
Программа принимает три числа и выводит все возможные перестановки этих чисел.
var_1 = int(input("Введите первое число: "))
var_2 = int(input("Введите второе число: "))
var_3 = int(input("Введите третье число: "))
agregator = []
agregator.append(var_1)
agregator.append(var_2)
agregator.append(var_3)
for i in range(0, 3):
for j in range(0, 3):
for k in range(0, 3):
if(i != j & j != k & k != i):
print(agregator[i], agregator[j], agregator[k])
# Вывод:
Введите первое число: 10
Введите второе число: 20
Введите третье число: 30
10 20 30
10 30 20
20 10 30
20 30 10
30 10 20
30 20 10
Декартово произведение
Необходимо объединить два списка таким образом, чтоб получить список из всех возможных пар элементов.
print([(var_1, var_2) for var_1 in ['dfa', '\eb'] for var_2 in [154, 248, 873]])
# Вывод:
[('dfa', 154), ('dfa', 248), ('dfa', 873), ('\\eb', 154), ('\\eb', 248), ('\\eb', 873)]
Генератор чисел Фибоначчи
def fibonacci(limit): # генератор (а не функция, т.к. оператор return заменён на yield)
var_1, var_2 = 0, 1
while var_1 < limit:
yield var_1 # return a, + запоминаем место рестарта для следующего вызова
var_1, var_2 = var_2, var_1 + var_2 # параллельное присваивание, которое выполняется одновременно и параллельно
for n in fibonacci(1000): # используем генератор fibonacci() как итератор
print(n, end=' ') # печатаем все числа Фибоначчи меньшие 1000 через пробел
# Вывод:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Объединяем два словаря
def merge(dic_1, dic_2):
dic_3 = dic1.copy()
dic_3.update(dic_2)
return dic_3
dic1 = {1: "Hello", 2: "pythoninfo,"}
dic2 = {3: "Python", 4: "is awesome",}
print(merge(dic1, dic2))
# Вывод:
{1: 'Hello', 2: 'pythoninfo,', 3: 'Python', 4: 'is awesome'}
Проверка дубликатов
def check_duplicate(lst):
return len(lst) != len(set(lst))
print(check_duplicate([51, 37, 3, 45, 5, 49, 77]))
print(check_duplicate([1, 3, 3]))
print(check_duplicate([11, 2, 88, 4, 16]))
# Вывод:
False
True
False
Вычисляем время выполнения
Очень полезный пример. Приведённый код – самый простой способ проводить профилирование Вашего кода. Позволяет понять какой блок тормозит работу программы. Здесь мы записываем текущее время перед запуском функции и после запуска. Затем сравниваем их и выводим, сколько времени заняло выполнение функции.
import time
def fun(i):
res = lambda i: i ** i
return res(i)
start_time = time.time()
fun(fun(5))
end_time = time.time()
timetaken = end_time - start_time
print("Время выполнения: ", timetaken)
# Вывод:
Время выполнения: 0.0009870529174804688
Разбиение на фрагменты
def chunk(ishod_list, size):
return [ishod_list[i:i + size] for i in range(0, len(ishod_list), size)]
ishod_list = ['q', 'w', 'e', 'r', 't', 'y']
print(chunk(ishod_list, 2))
# Вывод:
[['q', 'w'], ['e', 'r'], ['t', 'y']]