def lecturers(): return ['Стефан Кънев', 'Точо Точев', 'Димитър Димитров', 'Николай Бачийски'] def date(): return (2009, 3, 16, 19, 0)
Дефинират се с ключовата дума def
Връщат стойност с return
def factorial(n): if n == 0: return 1 else: return n * factorial(n-1) >>> factorial(4) 24
Ако искате една функция да взема повече от един аргумент, просто ги разделяте със запетаи:
def order_pizza(type, ketchup, mayo): order = "I want a " + type + " pizza." if ketchup: order += " Please add ketchup." if mayo: order += " And please add mayo." reply = call_and_order("555-PIZZA", order) return reply order_pizza("Margaritta", False, True)
Може да слагате стойности по подразбиране на аргументите:
def order_pizza(type, ketchup = True, mayo = True): order = "I want a " + type + " pizza." if ketchup: order += " Please add ketchup." if mayo: order += " And please add mayo." reply = call_and_order("555-PIZZA", order) return reply order_pizza("Margaritta")
Имайте предвид, че стойностите по подразбиране се инициализират само веднъж
def add_beer(beers = []): beers.append("Beer") print(beers) >>> add_beer() ['Beer'] >>> add_beer() ['Beer', 'Beer']
В този случай е по-добре да сложите beers
със стойност по подразбиране None
и създавате нов списък в тялото на функцията, ако потребителя не подаде нещо друго.
При извикване можете да подавате параметрите с имената им. По този начин може да ги дадете в различен ред или да използвате само някои, които имат стойност по подразбиране.
def order_pizza(type, ketchup = True, mayo = True): order = "I want a " + type + " pizza." if ketchup: order += " Please add ketchup." if mayo: order += " And please add mayo." reply = call_and_order("555-PIZZA", order) return reply order_pizza(ketchup = False, mayo = False, type = "Margaritta") order_pizza(type = "Margaritta", ketchup = False) order_pizza("Margaritta", ketchup = False)
Python не прави разлика между имена на функции и обекти. Може да ги третирате по еднакъв начин.
def scare(): print("Ni!")
>>> say_it = scare
>>> say_it()
Ni!
>>> scare()
Ni!
>>> del scare
>>> say_it()
Ni!
>>> scare()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'scare' is not defined
Съответно може да предавате функции като аргументи…
def calculate(operation, n1, n2): return operation(n1, n2) def addition(n1, n2): return n1 + n2 def multiplication(n1, n2): return n1 * n2 >>> calculate(addition, 6, 7) 13 >>> calculate(multiplication, 6, 7) 42
…или като връщани стойности:
def make_surrounder(begin, end): def surround(sth): return begin + sth + end return surround >>> surrounder = make_surrounder('[', ']') >>> surrounder('1 + 2') '[1 + 2]'
def
твърденията се пресмятат по време на изпълнение
def operation(name, n1, n2): if name == "addition": def oper(x, y): return x + y else: def oper(x, y): return x * y return oper(n1, n2) >>> operation('addition', 6, 7) 13 >>> operation('multiplication', 6, 7) 42
Като поставите *
прeд списък…
>>> preference = ('Margaritta', True, True) >>> order_pizza(*preference)
…или **
пред речник:
>>> preference = {'type': 'Margaritta', 'mayo': True} >>> order_pizza(**preference)
def sum(prefix, *things): result = 0 for n in things: result += n print(prefix + str(result)) >>> sum("The answer: ", 1, 2, 3, 5, 7, 11, 13) The answer: 42
def student_info(name, **things):
print("Hello, my name is", name)
print("I come from", things['country'])
print("I like", things['cheese'])
>>> student_info('The Black Knight',
country = 'Assyria', cheese = 'Limburger')
Hello, my name is The Black Knight
I come from Assyria
I like Limburger
def func(param, param2, *args, **kwargs)
def order_pizza(size, *ingredients, **preparations):
order = "I want a " + size + " pizza."
order += " With " + ', '.join(ingredients[:-1])
order += ' and ' + ingredients[-1] + '.'
for what, how in preparations.items():
order += ' ' + what.capitalize() + ': ' + how + '.'
print(order)
call_end_order(order)
>>> order_pizza("small", "egg", "bacon", "spam", bake="medium")
I want a small pizza. With egg, bacon, spam. Bake: medium.
>>> order_pizza("medium", "spam", "egg", "spam", "spam", "bacon", "spam", bake="medium")
I want a medium pizza. With spam, egg, spam, spam, bacon and spam. Bake: medium.
>>> order_pizza("large", "spam", "spam", "spam", "spam", "spam",
"spam", "baked beans", "spam", "spam", "spam", "spam")
I want a large pizza. With spam, spam, spam, spam, spam, spam,
baked beans, spam, spam, spam and spam.
Можем да накараме аргументи да могат да се използват само с наименован параметър.
def connect(url, *, timeout=10, reties=3) for range(0, retries): connected = connect_with_timeout(url, timeout) if connected: return connected else: return None
В Python има четири области на видимост
x = 11 def stuff(): x = 14 print(x) stuff() print(x)
Резултат:
14 11
Ако искате да променяте глобални променливи, трябва ви ключовата дума global
x = 11 def stuff(): global x x = 14 print(x) stuff() print(x)
Резултат:
14 14
Глобалните променливи са ЗЛО! Не искайте да ги ползвате.
def build_destroyer(power=None): if power is None: power = 100 def destroyer(world): print('{0} PW love energy sent to {1}'.format(power, world)) return destroyer santa_maria = build_destroyer(50) santa_maria('Earth')
Резултат:
50 PW love energy sent to Earth
Искаме след всяко изстрелване да намаляваме общата мощност наполовина
def build_destroyer(): power = 100 def destroyer(world): print('{0} PW love energy sent to {1}'.format(power, world)) power = power // 2 return destroyer santa_maria = build_destroyer() santa_maria('Earth') santa_maria('Neptune')
Резултат:
UnboundLocalError UnboundLocalError
Присвояването на x
във вътрешната не променя x
във външната
Ако искате да променяте глобални променливи, трябва ви ключовата дума nonlocal
def build_destroyer(): power = 100 def destroyer(world): nonlocal power print('{0} PW love energy sent to {1}'.format(power, world)) power = power // 2 return destroyer santa_maria = build_destroyer() santa_maria('Earth') santa_maria('Neptune')
Резултат:
100 PW love energy sent to Earth 50 PW love energy sent to Earth
Достъпни са навсякъде.
Примери:
str list dict help ...
for
list
lambda
>>> operation = lambda x, y: x * y >>> print(operation(6, 7)) 42
>>> list(map(lambda x: x ** 2, range(1, 10))) [1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> list(filter(lambda x: x % 2, range(1, 10))) [1, 3, 5, 7, 9]
Python има специален синтаксис за map
[израз for променлива in поредица]
>>> [x * x for x in range(0, 10)] [1, 4, 9, 16, 25, 36, 49, 64, 81]
Можете да добавите функционалността и на filter
[израз for променлива in поредица if условие]
>>> [x * x for x in range(0, 10) if x % 2] [1, 9, 25, 49, 81]
Може да вложите list comprehension в друг такъв:
>>> nums = list(range(0, 10)) >>> [(x, y) for x in nums for y in nums if (x + y) == 13] [(4, 9), (5, 8), (6, 7), (7, 6), (8, 5), (9, 4)]
Можете да ползвате set и dict comprehension
>>> {x % 8 for x in range(0, 20) if (x % 2) == 0} {0, 2, 4, 6} >>> {x: x**2 for x in range(0, 5)} {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}