# Объявление функции
def min2(a, b):
    if a <= b:
        return a
    else:
        return b
    
#Вызов функции
# минимум чисел 42, 30
m = min2(42, 30)
# минимум чисел 42, 30, 25
m = min2(min2(42, 30), 25)
# Функуия должна быть объявлена ранее первго вызова 


def f(n):
    return n * 10 + 5


# Раздичные функции
#без возвращаемого параметра - (return __)
#без параметров - def foo():
#произвольное число параметров
def min(*a): # *a - произвольное число аргументов
    m = a[0]
    for x in a:
        if m > x:
            m = x
    return m
#Вызовы ф-ии min:
min(5)
min(5, 3)
min(5, 3, 6, 10)
min([5, 3, 6, 10])


# Значения параметров по умолчанию
def my_range(start, stop, step = 1):
    res = []
    if step > 0:
        x = start
        while x < stop:
            res += [x]
            x += step
    elif step < 0:
        x = start
        while x > stop:
            res += [x]
            x += step
    return res
print(my_range(2, 5))
[2, 3, 4]
print(my_range(2, 15, 3))
[2, 5, 8, 11, 14]
print(my_range(15, 2, -3))
[15, 12, 9, 6, 3]


# Локальные переменные
def init_values():
    a = 100
    b = 200

# невозможен вызов локальных переменных вне ф-ии
init_values()
print(a + b) #Ошибка, переменные a и b не объявлены

# Изменение локальных переменных
def init_values():
    a = 100 # все изменения с этой перменной происходят внутри ф-ии

# эти две переменные a = 100 и a = 0 РАЗНЫЕ
a = 0 
init_values()# запуск ф-ии
print(a) # 0

#Изменение объектов, связанных с
# локальными переменными
def append_zero(xs):
    xs.append(0)

a = [] #связали a с изменяемым объектом []-список
append_zero(a)# вызовом ф-ии связали xs с изменяемым объектом []-список
print(a) # [0] # следовательно изменили сам объект []


#Варианты изменения локальных переменных
def append_zero(xs):
    xs.append(0)# 1. добавление значения с список
    xs = [100]# 2. связь переменной с новым объектом

a = []
append_zero(a)# запись xs = [100] не влияет на a =[]
print(a) # [0]



#Глобальные переменные
def print_value():
    print(a)

a = 5
print_value() #5

#Глобальные и локальные переменные
def print_value():
    print(a)
    a = 10 #если меняем значение переменной внутри ф-ии, то переменная считается ЛОКАЛЬНОЙ
    print (a)

a = 5 # Это значение ни как не свяжется со значением внутри ф-ии
print_value() #UnboundLocalError: local variable 'a' referenced before assignment



'''
1.
Напишите функцию f(x), которая возвращает значение следующей функции, определённой на всей числовой прямой:
     ⎧ 1−(x + 2)** 2, при x ≤ −2
f(x)=⎨−x/2,  при −2 < x ≤ 2
     ⎩(x−2)** 2+1, при 2 < x

Требуется реализовать только функцию, решение не должно осуществлять операций ввода-вывода.'''

def f(x):
	if x <= -2:
		f = 1 - ((x +2)**2)
	elif -2 < x <= 2:
		f = - (x / 2)
	else :
		f = (((x - 2) ** 2) + 1)
	return f



'''
2.
Напишите функцию modify_list(l), которая принимает на вход список целых чисел, 
удаляет из него все нечётные значения, а чётные нацело делит на два. 
Функция не должна ничего возвращать, требуется только изменение переданного списка, например:
Функция не должна осуществлять ввод/вывод информации'''

def modify_list(l):
    le = len(l)-1
    i = le
    while i != -1:
        if l[i] % 2:
            del l[i]
        else:
            l[i] = l[i] // 2
        i -= 1
    return

