Определение функции и ее вызов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Определение функции и ее вызов



def func():

pass

 

 

def func():

print("Текст до инструкции return")

return "Возвращаемое значение"

print("Эта инструкция никогда не будет выполнена")

 

print(func()) # Вызываем функцию

 

Листинг 11.1. Определения функций

def print_ok():

""" Пример функции без параметров """

print("Сообщение при удачно выполненной операции")

 

def echo(m):

""" Пример функции с параметром """

print(m)

 

def summa(x, y):

""" Пример функции с параметрами,

возвращающей сумму двух переменных """

return x + y

 

Листинг 11.2. Вызов функций

print_ok() # Вызываем функцию без параметров

echo("Сообщение") # Функция выведет сообщение

x = summa(5, 2) # Переменной x будет присвоено значение 7

a, b = 10, 50

y = summa(a, b) # Переменной y будет присвоено значение 60

 

 

def summa(x, y):

return x + y

 

print(summa("str", "ing")) # Выведет: string

print(summa([1, 2], [3, 4])) # Выведет: [1, 2, 3, 4]

 

Листинг 11.3. Сохранение ссылки на функцию в переменной

def summa(x, y):

return x + y

 

f = summa # Сохраняем ссылку в переменной f

v = f(10, 20) # Вызываем функцию через переменную f

 

Листинг 11.4. Функции обратного вызова

def summa(x, y):

return x + y

 

def func(f, a, b):

""" Через переменную f будет доступна ссылка на

функцию summa() """

return f(a, b) # Вызываем функцию summa()

 

# Передаем ссылку на функцию в качестве параметра

v = func(summa, 10, 20)

 

 

>>> def summa(x, y):

""" Суммирование двух чисел """

return x + y

 

>>> dir(summa)

['__annotations__', '__call__', '__class__', '__closure__', '__code__',

'__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',

'__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__',

'__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__',

'__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__',

'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

>>> summa.__name__

'summa'

>>> summa.__code__.co_varnames

('x', 'y')

>>> summa.__doc__

' Суммирование двух чисел '

Расположение определений функций

def summa(x, y):

return x + y

v = summa(10, 20) # Вызываем после определения. Все нормально

 

 

v = summa(10, 20) # Идентификатор еще не определен. Это ошибка!!!

def summa(x, y):

return x + y

 

Листинг 11.5. Определение функции в зависимости от условия

# -*- coding: utf-8 -*-

n = input("Введите 1 для вызова первой функции: ")

if n == "1":

def echo():

print("Вы ввели число 1")

else:

def echo():

print("Альтернативная функция")

 

echo() # Вызываем функцию

input()

 

 

def echo():

print("Вы ввели число 1")

def echo():

print("Альтернативная функция")

echo() # Всегда выводит "Альтернативная функция"

Необязательные параметры и сопоставление по ключам

Листинг 11.6. Необязательные параметры

def summa(x, y=2): # y — необязательный параметр

return x + y

a = summa(5) # Переменной a будет присвоено значение 7

b = summa(10, 50) # Переменной b будет присвоено значение 60

 

 

def summa(x, y):

return x + y

print(summa(10, 20)) # Выведет: 30

 

Листинг 11.7. Сопоставление по ключам

def summa(x, y):

return x + y

print(summa(y=20, x=10)) # Сопоставление по ключам

 

 

def summa(a=2, b=3, c=4): # Все параметры являются необязательными

return a + b + c

print(summa(2, 3, 20)) # Позиционное присваивание

print(summa(c=20)) # Сопоставление по ключам

 

Листинг 11.8. Пример передачи значений из кортежа и списка

def summa(a, b, c):

return a + b + c

t1, arr = (1, 2, 3), [1, 2, 3]

print(summa(*t1)) # Распаковываем кортеж

print(summa(*arr)) # Распаковываем список

t2 = (2, 3)

print(summa(1, *t2)) # Можно комбинировать значения

 

Листинг 11.9. Пример передачи значений из словаря

def summa(a, b, c):

return a + b + c

d1 = {"a": 1, "b": 2, "c": 3}

print(summa(**d1)) # Распаковываем словарь

t, d2 = (1, 2), {"c": 3}

print(summa(*t, **d2)) # Можно комбинировать значения

 

 

def func(a, b):

a, b = 20, "str"

x, s = 80, "test"

func(x, s) # Значения переменных x и s не изменяются

print(x, s) # Выведет: 80 test

 

 

def func(a, b):

a[0], b["a"] = "str", 800

x = [1, 2, 3] # Список

y = {"a": 1, "b": 2} # Словарь

func(x, y) # Значения будут изменены!!!

print(x, y) # Выведет: ['str', 2, 3] {'a': 800, 'b': 2}

 

Листинг 11.10. Передача изменяемого объекта в функцию

def func(a, b):

a = a[:] # Создаем поверхностную копию списка

b = b.copy() # Создаем поверхностную копию словаря

a[0], b["a"] = "str", 800

x = [1, 2, 3] # Список

y = {"a": 1, "b": 2} # Словарь

func(x, y) # Значения останутся прежними

print(x, y) # Выведет: [1, 2, 3] {'a': 1, 'b': 2}

 

 

func(x[:], y.copy())

 

 

def func(a=[]):

a.append(2)

return a

print(func()) # Выведет: [2]

print(func()) # Выведет: [2, 2]

print(func()) # Выведет: [2, 2, 2]

 

 

def func(a=None):

# Создаем новый список, если значение равно None

if a is None:

a = []

a.append(2)

return a

print(func()) # Выведет: [2]

print(func([1])) # Выведет: [1, 2]

print(func()) # Выведет: [2]

Переменное число параметров в функции

Листинг 11.11. Сохранение переданных данных в кортеже

def summa(*t):

""" Функция принимает произвольное количество параметров """

res = 0

for i in t: # Перебираем кортеж с переданными параметрами

res += i

return res

print(summa(10, 20)) # Выведет: 30

print(summa(10, 20, 30, 40, 50, 60)) # Выведет: 210

 

 

def summa(x, y=5, *t): # Комбинация параметров

res = x + y

for i in t: # Перебираем кортеж с переданными параметрами

res += i

return res

print(summa(10)) # Выведет: 15

print(summa(10, 20, 30, 40, 50, 60)) # Выведет: 210

 

Листинг 11.12. Сохранение переданных данных в словаре

def func(**d):

for i in d: # Перебираем словарь с переданными параметрами

print("{0} => {1}".format(i, d[i]), end=" ")

func(a=1, b=2, c=3) # Выведет: a => 1 c => 3 b => 2

 

Листинг 11.13. Комбинирование параметров

def func(*t, **d):

""" Функция примет любые параметры """

for i in t:

print(i, end=" ")

for i in d: # Перебираем словарь с переданными параметрами

print("{0} => {1}".format(i, d[i]), end=" ")

func(35, 10, a=1, b=2, c=3) # Выведет: 35 10 a => 1 c => 3 b => 2

func(10) # Выведет: 10

func(a=1, b=2) # Выведет: a => 1 b => 2

 

 

def func(*t, a, b=10, **d):

print(t, a, b, d)

func(35, 10, a=1, c=3) # Выведет: (35, 10) 1 10 {'c': 3}

func(10, a=5) # Выведет: (10,) 5 10 {}

func(a=1, b=2) # Выведет: () 1 2 {}

func(1, 2, 3) # Ошибка. Параметр a обязателен!

 

 

def func(x=1, y=2, *, a, b=10):

print(x, y, a, b)

func(35, 10, a=1) # Выведет: 35 10 1 10

func(10, a=5) # Выведет: 10 2 5 10

func(a=1, b=2) # Выведет: 1 2 1 2

func(a=1, y=8, x=7) # Выведет: 7 8 1 10

func(1, 2, 3) # Ошибка. Параметр a обязателен!

Анонимные функции

Листинг 11.14. Пример использования анонимных функций

f1 = lambda: 10 + 20 # Функция без параметров

f2 = lambda x, y: x + y # Функция с двумя параметрами

f3 = lambda x, y, z: x + y + z # Функция с тремя параметрами

print(f1()) # Выведет: 30

print(f2(5, 10)) # Выведет: 15

print(f3(5, 10, 30)) # Выведет: 45

 

Листинг 11.15. Необязательные параметры в анонимных функциях

f = lambda x, y=2: x + y

print(f(5)) # Выведет: 7

print(f(5, 6)) # Выведет: 11

 

Листинг 11.16. Сортировка без учета регистра символов

arr = ["единица1", "Единый", "Единица2"]

arr.sort(key=lambda s: s.lower())

for i in arr:

print(i, end=" ")

# Результат выполнения: единица1 Единица2 Единый

Функции-генераторы

Листинг 11.17. Пример использования функций-генераторов

def func(x, y):

for i in range(1, x+1):

yield i ** y

for n in func(10, 2):

print(n, end=" ") # Выведет: 1 4 9 16 25 36 49 64 81 100

print() # Вставляем пустую строку

for n in func(10, 3):

print(n, end=" ") # Выведет: 1 8 27 64 125 216 343 512 729 1000

 

Листинг 11.18. Использование метода __next__()

def func(x, y):

for i in range(1, x+1):

yield i ** y

 

i = func(3, 3)

print(i.__next__()) # Выведет: 1 (1 ** 3)

print(i.__next__()) # Выведет: 8 (2 ** 3)

print(i.__next__()) # Выведет: 27 (3 ** 3)

print(i.__next__()) # Исключение StopIteration

 

Листинг 11.19. Вызов одной функции-генератора из другой (простой случай)

def gen(l):

for e in l:

yield from range(1, e + 1)

 

l = [5, 10]

for i in gen([5, 10]): print(i, end = " ")

 

Листинг 11.20. Вызов одной функции-генератора из другой (сложный случай)

def gen2(n):

for e in range(1, n + 1):

yield e * 2

 

def gen(l):

for e in l:

yield from gen2(e)

 

l = [5, 10]

for i in gen([5, 10]): print(i, end = " ")

Декораторы функций

Листинг 11.21. Декораторы функций

def deco(f): # Функция-декоратор

print("Вызвана функция func()")

return f # Возвращаем ссылку на функцию

@deco

def func(x):

return "x = {0}".format(x)

 

print(func(10))

 

 

@deco

 

 

def deco(f):

print("Вызвана функция func()")

return f

def func(x):

return "x = {0}".format(x)

# Вызываем функцию func() через функцию deco()

print(deco(func)(10))

 

Листинг 11.22. Указание нескольких декораторов

def deco1(f):

print("Вызвана функция deco1()")

return f

def deco2(f):

print("Вызвана функция deco2()")

return f

@deco1

@deco2

def func(x):

return "x = {0}".format(x)

print(func(10))

 

Листинг 11.23. Ограничение доступа с помощью декоратора

passw = input("Введите пароль: ")

 

def test_passw(p):

def deco(f):

if p == "10": # Сравниваем пароли

return f

else:

return lambda: "Доступ закрыт"

return deco # Возвращаем функцию-декоратор

 

@test_passw(passw)

def func():

return "Доступ открыт"

print(func()) # Вызываем функцию

Рекурсия. Вычисление факториала

Листинг 11.24. Вычисление факториала

def factorial(n):

if n == 0 or n == 1: return 1

else:

return n * factorial(n — 1)

 

while True:

x = input("Введите число: ")

if x.isdigit(): # Если строка содержит только цифры

x = int(x) # Преобразуем строку в число

break # Выходим из цикла

else:

print("Вы ввели не число!")

print("Факториал числа {0} = {1}".format(x, factorial(x)))

 

 

>>> import math

>>> math.factorial(5), math.factorial(6)

(120, 720)



Поделиться:


Последнее изменение этой страницы: 2016-06-23; просмотров: 274; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.206.76.160 (0.068 с.)