DEV Community

Cover image for Функції
Григорій Лізанець
Григорій Лізанець

Posted on • Edited on

Функції

  1. Невід'ємна частина програми і/або мови програмування.
  2. Розбивають програму на під-програму.
  3. Запобігають повторному написанню того чи іншого коду.

Top comments (10)

Collapse
 
gr555 profile image
Григорій Лізанець • Edited

Досить тривіальна задача, але мій рівень поки не дозволив її виконати швидко і грамотно

from collections import Counter

votes = ['Alice', 'Bob', 'Alice', 'Alice', 'Bob', 'Charlie', 'Bob']


def show_winner(lst):
    """
    Підраховує кількість голосів
    та визначає переможця

    Args: 
        lst: (list) список голосів
    Returns: 
        str: Ім'я переможця та кількість його голосів
    """

    # Підрахунок голосів
    votes_count = Counter(lst)

    # Пошук переможця
    winner, max_votes = max(votes_count.items(), key=lambda x: x[1])

    return f'{winner} {max_votes} votes'


print(show_winner(votes)) # Виводить Alice 3 votes
Enter fullscreen mode Exit fullscreen mode
Collapse
 
gr555 profile image
Григорій Лізанець

Підрахунок змінних, що створені всередині функції:

def test_function():
    earn = 80
    bonus = 16
    total_earn = earn + bonus

    return total_earn


def count_locals(func):
    func()
    return len(func.__code__.co_varnames)


print("Number of variables:", count_locals(test_function))
Enter fullscreen mode Exit fullscreen mode

Виведе: Number of variables: 3

Collapse
 
gr555 profile image
Григорій Лізанець

Робота з аргументами функції

Щоб отримати назву функції та їїаргументи, використовуємо func.__name__ та *args і **kwargs

Collapse
 
gr555 profile image
Григорій Лізанець • Edited

Числа Фібоначчі в список:

def fib_func(count):

    fib_list = []

    while len(fib_list) < 10:

        if len(fib_list) < 2:
            fib_list.append(count)
            count += 1
        else:
            fib_list.append(fib_list[-1] + fib_list[-2])

    return print(fib_list)


fib_func(0)
Enter fullscreen mode Exit fullscreen mode

Маю надію, що це можна зробити простіше.. згодом гляну.

Collapse
 
gr555 profile image
Григорій Лізанець • Edited
def say_hello(name):
    print(f'Hello, I'm {name}.')


say_hello('Peter')
Enter fullscreen mode Exit fullscreen mode

-Виведе 'Hello, I'm Peter.'
Найкраще, коли функція має тільки одне застосування, а її ім'я це досконально відображає.

Collapse
 
gr555 profile image
Григорій Лізанець • Edited

Ще такий варіант, додадючий функції універсальності, коли кортедж *args - невідомо, скільки аргументів ми передаватимемо:

def sum_of_squares(*args):

    return_value = 0

    for num in args:
        return_value += num**2

    return return_value


print(sum_of_squares(2, 2, 3))
Enter fullscreen mode Exit fullscreen mode

-Виведе 17

Collapse
 
gr555 profile image
Григорій Лізанець • Edited

Така собі функція-конструктор домашньої тваринки:

def build_pet(species, name, **pet_info):

    pet = {}
    pet['species'] = species
    pet['name'] = name

    for key, value in pet_info.items():
        pet[key] = value

    return pet


my_pet = build_pet('Dvorova', 'Jessy', color='Sun-fire', age=7)

print(my_pet)
Enter fullscreen mode Exit fullscreen mode

-Виведе словник з ключ-значеннями песика.

Collapse
 
gr555 profile image
Григорій Лізанець • Edited

А так ми виведемо ялинку з доларів:

def print_tree(n):

    for i in range(n):

        for j in range(n-i):
            print(' ', end='')

        for k in range(2*i + 1):
            print('$', end='')

        print()


print_tree(7)
Enter fullscreen mode Exit fullscreen mode

-Вийде щось таке:

        $
       $$$
      $$$$$
     $$$$$$$
    $$$$$$$$$
   $$$$$$$$$$$
  $$$$$$$$$$$$$
Enter fullscreen mode Exit fullscreen mode
Collapse
 
gr555 profile image
Григорій Лізанець • Edited

Цю домашку хочу зарефакторити

def make_operation(sign, *args):

    res = args[0]

    if type(sign) == str and (sign == '+' or sign == '-' or sign == '*') and len(args) > 1:

        for i in args[1:]:
            if type(i) == int:
                if sign == '+':
                    res += i
                elif sign == '-':
                    res -= i
                elif sign == '*':
                    res *= i
            else: 
                return print('Invalid input parameter') 

    else: 
        return print('Invalid input parameter')

    return print(res)


make_operation('/', 5, 7, -12)
Enter fullscreen mode Exit fullscreen mode
Collapse
 
gr555 profile image
Григорій Лізанець

Ось так буде простіше (маю надію)

def make_operation(sign, *args):
    """
    Виконує арифметичну операцію (+, -, *) для послідовності чисел.  
    Args:
        sign (str): Оператор ('+', '-', '*').
        *args (int): Послідовність чисел для операції.
    Returns:
        int: Результат обчислення.
    """
    if sign not in {'+', '-', '*'}:
        return 'Invalid operator. Use "+", "-" or "*" only.' 
    if not all(isinstance(i, int) for i in args):
        return 'Invalid input parameter. All arguments must be integers.'
    # Використання словника операторів
    operations = {
        '+': sum(args),
        '-': args[0] - sum(args[1:]),
        '*': eval('*'.join(map(str, args)))
    }

    return operations[sign]


print(make_operation('/', 3, 4, 2)) #Invalid operator. Use "+", "-" or "*" only.
print(make_operation('+', 3, '4', 2)) #Invalid input parameter. All arguments must be integers.
print(make_operation('+', 3, 4, 2)) # 9
print(make_operation('-', 3, 4, 2)) # -3
print(make_operation('*', 3, 4, 2)) # 24
Enter fullscreen mode Exit fullscreen mode