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