Програмиране с Python: Основни типове и конструкции за управление
Author: Стефан Кънев, Николай Бачийски и Димитър Димитров

# Основни типове и конструкции за управление

### „ Програмиране с Python“, ФМИ

### Стефан Кънев & Николай Бачийски & Димитър Димитров

#### 27.02.2008г.

# Python shell

Позволява изпълняването на малки парчета код, без да се налага да пишете цели програми

    >>> animal = "Badger "
    >>> print animal * 6
    Badger Badger Badger Badger Badger Badger
    >>> food = "Mushroom "
    >>> print animal * 6 + food * 2
    Badger Badger Badger Badger Badger Badger Mushroom Mushroom
    >>> answer = 42
    >>> print "The answer: %s" % answer
    The answer: 42

# Програми на python

- Представляват най-обикновенни текстови файлове
- hello.py

      name = "Guido"
      familyName = "van Rosum"
      print "Welcome,", name, familyName, " to Python!"

- Изпълняват се с double click под Windows
- Отвъд това, може да стартирате програмата с командата: `python hello.py`

# Обекти, имена и променливи

- Пред имената им няма никакви долари, диези, маймуни или други странни символи
- Свързването на обект с име става с =

      answer = 42
      answer = "Fourty two"

- Типът обект, който стои зад дадено име, може да се променя
- Използването на недефинирани имена води до грешка:

      print question

      Traceback (most recent call last):
        File "<stdin%gt;", line 1, in <module>
      NameError: name 'question' is not defined

# Основни типове

Основни типове в Python

- Цели числа — `int`, `long`
- Не толкова цели числа — `float`, `complex`
- Текстови низове — `str`, `unicode`
- Булеви данни — `bool`
- Типове дефинирани от потребителя

# Цели числа

- Типове цели числа - `1 42 256 123454321L`
  - `int` — с големината на думата на процесора
  - `long` — колкото може да побере оперативната ви памет
- Преобразуването от `int` към `long` става автоматично при препълване
- В общия случай не ви интересува дали работите с `int` или `long`

# float и complex

- `float` — `1. 0.314е1 217Е-2`
  - Съвсем класически числа с плаваща запетая
  - Точността им зависи от архитектурата
  - Ако искате числа с фиксирана точност, може да ползвате модула `decimal`
- `complex` — `0+1j complex(1,2) 3.0+4.0j`
  - Имат реална и имагинерна част
  - Преобразуването до тях не е автоматично
  - Едва ли ще ги използвате

# Операции с числа

- събиране (`+`), изваждане (`−`), умножение (`*`)
- деление (`/`), целочислено деление (`//`), деление с остатък (`%`)
- повдигане на степен (`**`)
- побитови операции (само за цели числа) - `<<`, `>>`, `&`, `|`, `^`, `~`

# Операции с числа (2)

    >>> 6 * 7
    42
    >>> 10 / 3
    3
    >>> 10.0 / 3
    3.3333333333333335
    >>> 10.0 // 3
    3.0
    >>> 10 % 3
    1
    >>> 2 ** 31 -1
    2147483647
    >>> 1j * 1j
    (-1+0j)

# Текстови низове

- Текстовите низове обикновено се представят с класа `str`
- Може да ги представяте и с класа `unicode`
- Записът е с единични или двойни кавички — `"spam and eggs"` `'larodi'`
- Единствената разлика е кои кавички трябва да escape-вате
- Някои escape кодове: `\\ \' \" \a \b \f \n \r \t \v`
- С тройни кавички може да правите heredoc — `"""This is heredoc"""`
- Има и "сурови" (raw) низове - `r'C:\"Windows"\regedit.exe'` и `r"(bb|[^b]{2})|\d+"`

# Текстови низове (2)

    "Hello world!"
    'Quoth the Raven "Nevermore"'
    "We don't have any \"cheese\", sir!"

    """Within "heredocs", we don't need
    to escape single or double qoutes...
    Or care about newlines"""

    r'C:\Program Files\Python\'
    "Subsequent " 'literals ' r'are ' """concatenated."""

# Булеви данни

- Тип `bool` - `True` `False`
- Всъщност, `True` и `False` са други имена на `1` и `0`
- `True + True` връща `2`
- Да, тъпо е. Седи за backwards compatibility
- Все пак, ползвайте `True` и `False` - така кодът се чете по-лесно

# Булеви операции

- `and`, `or` и `not` работят точно както очаквате
- `==` и `!=` също действат както очаквате.
- `"Foo" == 'Foo'` връща `True`
- `6 * 9 == 42` връща `False`
- Има оператор `<>`, но той е остаряла версия на `!=` и не се препоръчва

# Булеви операции (2)

- `<` и `>` са оператори за сравнение
- `"Perl" < "Python"` връща `True`
- Можете да образувате вериги от сравнения - `"Bar" < "Baz" < "Foo"` връща `True`
- Горното е еквивалентно на `"Bar" < "Baz" and "Baz" < "Foo"`
- Разбира се, можете да ползвате всички тези оператори и за числа
- Операторите имат `<=` и `>=` версии
- Когато сравнявате обекти от различни типове, по подразбиране Python сравнява имената на типовете им лексикографски.
  Т.е. `20 < "Foo"` връща `True`.

# Конструкции за управление

Класическо:

    if answer == 42:
        print "- We know the answer!"
        print "- Erm... what was the question again?"
    else:
        print "Something went wrong. Let's try it again"

# Две думи за блоковете в Python

- Блоковете в Python се идентират с whitespace (табулации или интервали)
- Което и да изберете, бъдете консистентни. Непоследователното отместване води до синтактична грешка!
- Преди всяко изместване по-навътре се слагат `:`
- Ако имате само един израз, може да съберете това на един ред:

      if hungry: print "We should go get some food"

- Ако искате да оставите празен блок, използвайте ключовата дума `pass`:

      if something:
          pass
      else:
          print "Else happened!"

- Горното беше глупав код! Разбира се, че се сетихме за `not something`. `pass` има някои смислени приложения при изключения и класове, но за това - по-натам

# Обратно към if-а

Цялостен пример:

    if name == "King Arthur":
        print "What is the average speed of a swallow?"
    elif name == "Sir Robin":
        print "What is the capital of Assyria"
    elif name == "Sir Lancelot":
        print "What is your favourite color?"
    else:
        print "Run! It's the Legendary Black Beast of Aaaaarrrrrrggghhh"

Не, в Python няма `case`. Може би в следващата версия :(

# Троен if

- В Python има и "троен" if оператор (от версия 2.5)
- Синтаксисът е... екзотичен:
  `[израз1] if [условие] else [израз2]`
  и е еквивалентен на `[условие]? [израз1] : [израз2]`

-       print "We're connected" if conntected else ":("

# while statement

Отново, while цикълът в Python е съвсем класически:

    while not connected:
    	print "Trying..."
    	connected = retry()

    print "We're now connected"

# break

    retries = 3
    connected = False

    while retries:
    	print "Trying to connect"
    	connected = connect()

    	if connected: break

    	retries -= 1
    	print "Failed. Trying again - %d times left..." % retries

    if connected:
    	print "Connected succesfully"
    else:
    	print "Failed miserably"

# while... else?!

    retries = 3
    connected = False

    while retries:
    	print "Trying to connect"
    	connected = connect()

    	if connected: break

    	retries -= 1
    	print "Failed. Trying again - %d times left..." % retries
    else:
    	print "Failed :("