01. Въведение в Python
Къде отива кода?
- Код се пише в .py файлове (например gameoflife.py).
- Изпълнява се с python3 gameoflife.py
- Можем да пишем код интерактивно като пуснем python3 без аргументи.
Python е предсказуем
Когато не сте сигурни, просто пробвайте.
>>> 5 + 10
15
>>> a = 5
>>> b = a + 10
>>> print(b)
15
>>> a * 2
10
>>> a ** 2
25
>>> "hello" + ', ' + "world"
"hello, world"
Първа помощ
В интерактивната конзола, help() показва документацията на всяка функция, клас или тип.
>>> help(str)
>>> help(5)
>>> help(SomeClass)
>>> help(some_function)
Един ред код
- Съдържа един израз, никога не завършва с ;
- Всичко след # е коментар
my_var = human_readable_num(50).upper()
print(my_var) # FIFTY
Типове: int
- Цели числа, положителни и отрицателни
- Стандартни операции: +, -, *, /, ** (степенуване)
- Без максимален размер
- Пробвай 2 ** 4 ** 8 (степенуване)
Типове: str
- Текстови низове с произволна дължина
- Единични или двойни кавички
- Unicode навсякъде
- Поддържат \n, \t и пр.
- (Но в Python 2.x има str и unicode типове, първото е ASCII.)
>>> "hello".upper()
"HELLO"
>>> len("абвгдеж")
7
>>> "hello"[1]
"e"
>>> help(str)
Типове: bool
- True и False, не забравяйте главните букви
- True == 1
- False == 0
Типове: None
- Като null в другите езици
- Когато една функция не върне нищо, тя връща None
Типове
- Всяка стойност има тип, включително функциите.
- Всеки стойност е обект и има клас, включително функциите.
- Всичко е обект, включително функциите и типовете!
- Можем да видим типа на нещо с type()
>>> type(5.5)
>>> type(type)
>>> type(type(type(type)))
Имена
-
Можем да дадем име на стойност и получаваме променлива.
velocity = distance / 60
- Динамичен език - стойностите имат тип, но имената - не.
а = 5
type(a) #
a = 'test'
type(a) #
Структури от данни
- Списък (list)
- Речник (dict)
- Tuple (tuple)
- Множество (set)
- Както винаги: help(dict)
Списъци
- Списък = list = масив = array
- Mutable и без фиксирана дължина
- Бързи за търсене по индекс, бавни за търсене по стойност
- Гарантиран ред
- Могат да се смесват типове
my_list = []
my_list = list()
Списъци (2)
my_list = []
my_list.append('word')
my_list.append(5)
my_list.append(False)
my_list[1] == 5
my_other_list = ['foo', 'bar', 'quux']
len(my_other_list) # 3
del my_other_list[1]
print(my_other_list) # ['foo', 'quux']
'foo' in my_other_list # True
False in my_list # True
Речник (dict)
- Речник = dict = hashtable = associative array
- Реда не е гарантиран
- Асоциира ключ със стойност
ages = {'Кай': 1, 'Бобо': 2}
ages['Йоан'] = 24
ages['Алек'] = 25
ages['Стефан'] = 25
ages['Кирил'] = 25
ages['Николай'] = 27
ages['Алек'] = 26 # ЧРД
print(ages['Кирил']) # 25
'Николай' in ages # True
ages.get('Георги') # None
ages.get('Георги', 'няма такъв') # няма такъв
tuple
- Tuple = n-торка = списък, който не може да бъде променян
- Гарантиран ред
- Ползват за да подадете или върнете няколко стойности от функция, когато специален клас би би твърде много
>>> args = (9.8, 3.14, 2.71)
>>> args[2]
2.71
>>> args[1] = 22/7
Traceback (most recent call last)
File "", line 1, in
TypeError: 'tuple' object does not support item assignment
- Tuple от един елемент - със запетайка на края: ('Your friends will never love you.',)
Структури от данни: set
- Set = множество = списък без повтарящи се елементи
- Реда не е гарантиран
- Спомнете си теория на категориите
>>> unique_numbers = {2,3,5,6}
>>> unique_numbers
{2, 3, 5, 6}
>>> unique_numbers.add(5)
>>> unique_numbers
{2, 3, 5, 6}
>>> unique_numbers.remove(5)
>>> unique_numbers
{2, 3, 6}
>>> my_list = [5,1,6,6,2,3,5,5]
>>> set(my_list)
{1, 2, 3, 5, 6}
Mutable vs immutable
- Immutable са стойностите, които не могат да бъдат променяни.
а = 5
а += 2 # 7
Този код не променя стойноста на 5, а кара а да сочи към друга стойност (7). Числата са immutable.
а = [1,2,3]
a.append(4)
Този код променя списъка, към който сочи a. Списъците са mutable.
- Immutable са числа, низове, tuples, True, False, None, дата/час (datetime), класове и функции.
- Всичко останало е mutable.
- Като ключ на dict или елемент на set могат да се ползват само immutable стойности.
Контролни структури
- if .. elif .. else
- while
- for
if
- Точно каквото очаквахте.
if a == 5
print("a is five")
elif a == 3 and not b == 2
print("a is three, b is not two")
else
print("a is something else")
- Не слагайте скоби около условията.
- and и or и not вместо &&, ||, !
if
Още булеви тестове
a = True
if a
print("a is True")
if not a
print("a is not True")
Индентация
- Къде са къдравите скоби?!
- Всеки вложен блок код (тяло на if, тяло на функция, и т.н.) се определя с индентацията му спрямо предишния блок.
- Блокът свършва, когато се върнете към предишната индентация.
- 4 празни места = нов блок. Не 3, не 5, не табулация.
- Настройте редактора си да слага 4 празни места когато натиснете Tab.
while
while a > 5
a -= 1
print("a is %d" % a)
for
- for е като foreach в другите езици
- Не увеличава индекси, а обхожда структури от данни
primes = [3,5,7,11]
for e in primes
print(e ** 2) # prints 9 25 49 121
people = {'bob': 25, 'john': 22, 'mitt': 56}
for name, age in people
print("%s is %d years old" % (name, age))
# bob is 25 years old
# john is 22 years old
# ...
for като в C
for i in range(0, 20)
print(i)
# 0 1 2 3 4 5 6 .. 19
for i in range(0, 20, 3)
print(i)
# 0 3 6 9 12 15 18
break и continue
- Работят както очаквате в for и while.
- Афектират само най-вътрешния цикъл.
switch/case
Няма.
Функции
def say_hello(name, from)
return "Hello, %s! -- %s" % (name, from)
- Функцията приема аргументи
- Функцията може да върне нещо с return, иначе автоматично се връща None
- Както очакваме, не се описват типовете на аргументите, нито типа на резултата
- Имената
Аргументи на функции
- Аргументи по подразбиране
def multiply(a, b = 2)
return a * b
multiply(5) # 10
multiply(5, 10) # 50
def is_pythagorean(a = 2, b = 3, c = 4)
return a * a + b * b == c * c
is_pythagorean(b = 5) # a = 2, c = 4
is_pythagorean(1, c = 3) # a = 1, b = 3
Променливи аргументи
- Функциите могат да приемат произволен брой аргументи
- Позиционните аргументи (тези без име) отиват в tuple args
- Именованите аргументи отиват в dict kwargs
- Имената args и kwargs могат да се променят, но това е конвенция, която не трябва да нарушавате
def varfunc(some_arg, *args, **kwargs)
...
varfunc('hello', 1,2,3, name = 'Bob', age = 12)
# some_arg == 'hello'
# args = (1,2,3)
# kwargs = {'name': 'Bob', 'age': 12}
Още въпроси?
- Пишете ни на fmi@py-bg.net
- Страница на курса: http://fmi.py-bg.net/
- Форуми на курса: http://fmi.py-bg.net/topics
- Курсът в Twitter: http://twitter.com/pyfmi
- Курсът във Facebook: http://www.facebook.com/group.php?gid=104970619536589