#!/usr/bin/env python # coding: utf-8 # # Python для сбора данных # # *Алла Тамбовцева, НИУ ВШЭ* # # ## Практикум 3: решения # **Общий комментарий:** если в задаче не сказано явно, что функция принимает на вход информацию, введенную пользователем с клавиатуры, не нужно добавлять `input()`. # ### Задача 1 # Напишите функцию `square()`, которая принимает на вход число и: # # * возвращает его квадрат; # * выводит на экран сообщение вида "Квадрат числа равен: n" и ничего не возвращает; # * выводит на экран сообщение вида "Квадрат числа равен: n" и возвращает квадрат числа; # In[1]: # возвращает квадрат числа def square(x): return x**2 # In[2]: square(6) # In[3]: res1 = square(6) res1 # результат сохранен # In[4]: # выводит на экран сообщение и ничего не возвращает def square2(x): print("Квадрат числа равен: ", x**2) # без return # In[5]: # или так (тот же код) def square2(x): print("Квадрат числа равен: ", x**2) # с пустым return return # In[6]: square2(6) # In[7]: res2 = square2(6) res2 # результат не сохранен # In[8]: print(res2) # вместо результата - пустота # In[9]: # и возвращает результат, и выводит сообщение def square3(x): print("Квадрат числа равен: ", x**2) return x**2 # In[10]: square3(6) # In[11]: res3 = square3(6) res3 # результат сохранен # ### Задача 2 # Напишите функцию `nums()`, которая принимает на вход целое число, а возвращает список из двух элементов: целое число, предшествующее принятому на вход, и число, следующее за ним. # # **Пример:** # # *Входные данные:* # # 7 # # *Выходные данные:* # # [6, 8] # In[12]: def nums(n): r = [n - 1, n + 1] return r # In[13]: nums(0) # In[14]: # или совсем в две строчки def nums(n): return [n - 1, n + 1] # ### Задача 3 # Напишите функцию `str_lower()`, которая принимает на вход строку (набор слов через пробел), а возвращает список ее элементов в нижнем регистре. # # **Пример:** # # *Входные данные:* # # "В лесу родилась ёлочка В лесу она росла" # # *Выходные данные:* # # ['в', 'лесу', 'родилась', 'ёлочка', 'в', 'лесу', 'она', 'росла'] # In[18]: def str_lower(s): s_list = s.split() # разбиваем строку по пробелу new_list = [] # создаем пустой список for i in s_list: new_list.append(i.lower()) # приводим каждый элемент к нижнему регистру и добавляем в новый список return new_list # In[19]: str_lower("В лесу родилась ёлочка В лесу она росла") # In[20]: # или более компактно и быстро - списковые включения def str_lower(s): s_list = s.split() # разбиваем строку по пробелу new_list = [i.lower() for i in s_list] return new_list # In[21]: str_lower("В лесу родилась ёлочка В лесу она росла") # ### Задача 4 # Напишите функцию `my_log()`, которая принимает на вход список чисел, и возвращает список их натуральных логарифмов. Если число меньше или равно 0, на его месте в возвращаемом списке должно быть None. # # **Пример:** # # *Входные данные:* # # [1, 3, 2.5, -1, 9, 0, 2.71] # # *Выходные данные:* # # [0.0, # 1.0986122886681098, # 0.9162907318741551, # None, # 2.1972245773362196, # None, # 0.9969486348916096] # In[22]: # можно импортировать math внутри функции, но тогда Python не будет понимать команды с math за пределами my_log import math def my_log(L): logs = [] for i in L: if i > 0: logs.append(math.log(i)) else: logs.append(None) # None без кавычек return logs # In[23]: my_log([1, 3, 2.5, -1, 9, 0, 2.71]) # ### Задача 5 # Напишите функцию, которая принимает на вход два списка (имена людей и их возраст) и делает следующее: # # * если эти два списка имеют одинаковую длину, то возвращает словарь с парами имя-возраст; # # * если эти два списка имеют разную длину, то функция выводит на экран сообщение "Списки имеют разную длину" и возвращает пустой словарь. # # **Пример:** # # *Входные данные:* # # ["Ann", "Tim", "Sam"] # [12, 23, 17] # # *Выходные данные:* # # {"Ann": 12, "Tim": 23, "Sam": 17} # # *Входные данные:* # # ["Ann", "Tim", "Sam"] # [12, 23, 17, 45] # # *Выходные данные:* # # Списки имеют разную длину # {} # In[30]: def ages(L1, L2): if len(L1) == len(L2): d = dict(zip(L1, L2)) else: print("Списки имеют разную длину") d = {} return d # In[31]: # альтернативный код def ages(L1, L2): if len(L1) == len(L2): return dict(zip(L1, L2)) else: print("Списки имеют разную длину") return {} # In[32]: # еще альтернативный код def ages(L1, L2): d = {} if len(L1) == len(L2): d = dict(zip(L1, L2)) else: print("Списки имеют разную длину") return d # In[33]: ages(["Ann", "Tim", "Sam"], [12, 23, 17]) # In[34]: ages(["Ann", "Tim", "Sam"], [12, 23]) # ### Задача 6 # # Напишите функцию `binom_prob()`, которая считает вероятность того, что проведя `n` испытаний Бернулли с вероятностью успеха `p`, мы получим ровно `k` успехов. Эта функция принимает на вход три аргумента: `p`, `n` и `k` и возвращает такой результат: # # $P(X = k) = С_n^k \cdot p^k \cdot (1-p)^{n-k}$ # # Для расчета биномиального коэффициента можно использовать функцию, написанную на лекции. # In[35]: # функция для факториала с лекции def factorial(n): f = 1 for i in range(2, n + 1): f = f * i return f # функция для биномиального коэффициента с лекции def binom(n, k): c = factorial(n) // (factorial(k) * factorial(n-k)) return c # In[36]: def binom_prob(p, n, k): r = binom(n, k) * p **k * (1-p)**(n-k) return r # In[37]: binom_prob(0.5, 5, 3) # ### Задача 7 # # Напишите функцию `all_sort()`, которая принимает на вход перечень целых чисел через запятую (не список, а просто сколько угодно значений через запятую) и возвращает список этих значений, отсортированный по возрастанию. # # **Пример:** # # *Входные данные:* # # 7, 6, 1, 3, 8, 0, -2 # # *Выходные данные:* # # [-2, 0, 1, 3, 6, 7, 8] # In[38]: def all_sort(*args): res = sorted(args) return res # In[39]: all_sort(7, 6, 1, 3, 8, 0, -2)