#pragma css /css/2016.css
<<BI>>

= Подсказки к заданию 8 =

=== Python как калькулятор ===
Если набрать в командной строке слово python (без имени файла с программой) и нажать Enter, то интерпретатор питона запустится в интерактивном режиме, то есть будет выполнять введённые строки сразу после нажатия клавиши Enter. Чтобы выйти из этого режима, выполните команду `quit()` или нажмите Ctrl+D.

Преимущества у такого режима три:
 * во-первых, python можно использовать как удобный калькулятор. При этом (в отличие от обычного калькулятора) промежуточные результаты можно "запоминать" в переменных и потом использовать столько раз, сколько надо.
 * во-вторых, в таком режиме удобно проверять эффект встроенных функций, методов, операций и т.п.
 * в третьих, имеется встроенный help. Например, выполнение команды:
{{{
help(sorted)
}}} 
выдаёт краткую справку по функции sorted, а выполнение команды
{{{
help(str.split)
}}}
--- по методу split, имеющемуся у объектов типа str.

Далее примеры приводятся как копии консоли интерактивного режима интерпретатора python. Если что-то непонятно, рекомендуется самому выполнить соответствующую операцию...

=== Срез строки ===
{{{
>>> s = "abcde"
>>> s[0]
'a'
>>> s[4]
'e'
>>> s[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range 
>>> s[1:3]
'bc'
>>> s[2:]
'cde'
>>> 
}}}

=== Логика: сравнение чисел и строк ===
{{{
>>> a = 1
>>> a == 1
True
>>> a == 2
False
>>> a != 2
True
>>> a > 2
False
>>> a < 2
True
>>>
}}}
Помните разницу между `=` и `==`: принципиально разные вещи!

{{{
>>> s = "abcde"
>>> s == "abc"
False
>>> "abcde" == s
True
>>>
}}}

=== Логические операторы ===
`or`, `and`, `not` --- если смысл не до конца понятен, выводите примеры вида:
{{{
>>> (2 == 1) or (2 > 1)
}}}
{{{#!wiki noindent
пока не станет понятен.
}}}

=== Несколько полезных методов ===
Перевод в верхний/нижний регистр:
{{{
>>> s = "abcd"
>>> s.upper()
'ABCD'
>>> su = "AbCd"
>>> su.lower()
'abcd'
}}}

Проверка наличия символа (подстроки) в строке:
{{{
>>> s = "abcde"
>>> "e" in s
True
>>> "g" in s
False
>>> "bc" in s
True
>>> "ac" in s
False
>>>
}}}

Пустая строка является подстрокой любой строки:
{{{
>>> "" in "abcde"
True
>>> 
}}}

=== Списки ===
{{{
>>> el = [1, 3, 5]
>>> el[0]
1
>>> el[1]
3
>>> len(el)
3
>>> el[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> el + ["abc"]
[1, 3, 5, 'abc']
>>> 3 in el
True
>>> "3" in el
False
>>> el[1:]
[3, 5]
>>>
}}}

Обратите внимание, что можно (и часто нужно!) оперировать со списками из одного элемента:
{{{
>>> al = [6]
>>> len(al)
1
>>>
}}}
и даже со списком из нуля элементов (пустым списком):
{{{
>>> newl = []
>>> len(newl)
0
>>> newl = newl + ["word"]
>>> len(newl)
1
>>> 
}}}

Выполнение операторов
{{{
indata = open("input.txt", "r")
inlist = indata.readlines()
}}}
{{{#!wiki noindent
приведёт к тому, что в переменной inlist окажется список строк файла "input.txt"
}}}

=== Циклы ===
При выполнении следующей программы:
{{{
mm = [1, 2, 3, 4]
for i in mm:
    j = i*i
    print i, j
}}}
{{{#!wiki noindent
будет напечатана таблица из чисел 1, 2, 3, 4 в первом столбце и их квадратов во втором столбце.
}}}

Следующая программа будет печатать ("раздетые") строки файла "ex.txt", пока не наткнётся на строку, в которой ничего нет, кроме пробелов и других байтов, удаляемых методом `strip`:
{{{
indata = open("ex.txt", "r")
s = indata.readline()
s = s.strip()
while len(s) > 0:
    print s
    s = indata.readline()
    s = s.strip()
}}}
Это пример цикла не по списку, а "пока выполнено условие", в данном случае `len(s) > 0`.

=== Функция "range" ===
Функция `range` имеет аргумент --- целое число и возвращает список целых чисел от 0 до числа, на 1 меньшего, чем аргумент:
{{{
>>> range(5)
[0, 1, 2, 3, 4]
>>> 
}}}
Эта функция удобна для использования в цикле, если нужно выполнить какие-либо операции для чисел от 0 до заданного. Например для подсчёта числа сочетаний из `n` по 2 можно написать:
{{{
cn2 = 0
for i in range(n):
    cn2 = cn2 + i
}}}
Для подсчёта факториала можно написать так:
{{{
fact = 1
for i in range(1, n + 1):
    fact = fact*i
}}}
(а что возвращает выражение `range(1, n + 1)`, выясните сами. Постарайтесь также понять, что возвращает выражение вида `range(2, 10, 3)`.)


=== Условия ===
{{{
if a[0] == ">":
    print a
}}}
напечатает строку a, только если её первый символ есть ">".


=== Аргументы командной строки ===

Чтобы принимать данные из командной строки, нужно вставить в начало файла с программой строку
{{{
from sys import argv
}}}

При запуске программы в переменную `argv` записывается список, в который попадают аргументы командной строки, то есть те слова, которые введены в командную строку после имени файла с программой. При этом первый аргумент имеет индекс 1 (а индекс 0 имеет само имя файла с программой). Например, пусть файл `example.py` содержит следующие строки:
{{{
from sys import argv

indata = open(argv[1], "r")
print indata.readline()
indata.close()
}}}
Если теперь запустить программу, указав в командной строке имя файла:
{{{
python example.py test.txt
}}}
то программа напечатает первую строку файла `test.txt`.