Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Определение функции и ее вызовСодержание книги
Поиск на нашем сайте
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; просмотров: 306; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.154.238 (0.009 с.) |