Python для сбора данных

Алла Тамбовцева, НИУ ВШЭ

Практикум 3: решения

**Общий комментарий:** если в задаче не сказано явно, что функция принимает на вход информацию, введенную пользователем с клавиатуры, не нужно добавлять input().

Задача 1

Напишите функцию square(), которая принимает на вход число и:

  • возвращает его квадрат;
  • выводит на экран сообщение вида "Квадрат числа равен: n" и ничего не возвращает;
  • выводит на экран сообщение вида "Квадрат числа равен: n" и возвращает квадрат числа;
In [1]:
# возвращает квадрат числа
def square(x):
    return x**2
In [2]:
square(6)
Out[2]:
36
In [3]:
res1 = square(6)
res1 # результат сохранен
Out[3]:
36
In [4]:
# выводит на экран сообщение и ничего не возвращает
def square2(x):
    print("Квадрат числа равен: ", x**2)
    # без return
In [5]:
# или так (тот же код)
def square2(x):
    print("Квадрат числа равен: ", x**2)
    # с пустым return
    return
In [6]:
square2(6)
Квадрат числа равен:  36
In [7]:
res2 = square2(6)
res2 # результат не сохранен
Квадрат числа равен:  36
In [8]:
print(res2) # вместо результата - пустота
None
In [9]:
# и возвращает результат, и выводит сообщение
def square3(x):
    print("Квадрат числа равен: ", x**2)
    return x**2
In [10]:
square3(6) 
Квадрат числа равен:  36
Out[10]:
36
In [11]:
res3 = square3(6)
res3 # результат сохранен
Квадрат числа равен:  36
Out[11]:
36

Задача 2

Напишите функцию nums(), которая принимает на вход целое число, а возвращает список из двух элементов: целое число, предшествующее принятому на вход, и число, следующее за ним.

Пример:

Входные данные:

7

Выходные данные:

[6, 8]
In [12]:
def nums(n):
    r = [n - 1, n + 1]
    return r
In [13]:
nums(0)
Out[13]:
[-1, 1]
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("В лесу родилась ёлочка В лесу она росла")
Out[19]:
['в', 'лесу', 'родилась', 'ёлочка', 'в', 'лесу', 'она', 'росла']
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("В лесу родилась ёлочка В лесу она росла")
Out[21]:
['в', 'лесу', 'родилась', 'ёлочка', 'в', 'лесу', 'она', 'росла']

Задача 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])
Out[23]:
[0.0,
 1.0986122886681098,
 0.9162907318741551,
 None,
 2.1972245773362196,
 None,
 0.9969486348916096]

Задача 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])
Out[33]:
{'Ann': 12, 'Sam': 17, 'Tim': 23}
In [34]:
ages(["Ann", "Tim", "Sam"], [12, 23])
Списки имеют разную длину
Out[34]:
{}

Задача 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)
Out[37]:
0.3125

Задача 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)
Out[39]:
[-2, 0, 1, 3, 6, 7, 8]