python pycharm 03 - nadin.miem.edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/python_pycharm_03.pdf ·...
TRANSCRIPT
Python_Pycharm_03
Трубочкина Н.К.
2018
Работа со строками • Строки - последовательность чувствительных к
регистру символов • Можно сравнивать строки (==,>, <) • len () - функция, используемая для получения
длины строки, указанной в скобках.
s = "abc" значение len (s) 3
Квадратные скобки, используются для индексации строки, чтобы получить значение по определенному индексу / позиции
индекс: 0 1 2 Индексирование всегда начинается с 0 индекс: -3 -2 -1 последний элемент всегда по индексу -1
s = "abc"
0 1 2 -3 -2 -1
s [0] оценивается как "a" s [1] оценивается как "b" s [2] оценивается как "c" s [3] - попытка индексировать за пределами, ошибка s [-1] оценивается как "c" s [-2] оценивается как "b" s [-3] оценивается как "а"
Можно использовать сечения строк, используя [start: stop: step] Если указать два числа, [start: stop], step = 1 по умолчанию Можно опустить числа и оставить только двоеточия
s = "abcdefgh " 0 1 2 3 4 5 6 7
s [3: 6] оценивается как "def", так же [3: 6: 1] s [3: 6: 2] оценивается как "df" s [::] оценивается как "abcdefgh", так же, как s [0: len (s): 1] s [:: - 1] переводится в "hgfedbca", так же, как s [-1 :-( len (s) +1): - 1] s [4: 1: -2] оценивается как "ec"
Строки являются «неизменяемыми» - не могут быть изменены
s = "hello"
s [0] = "y" выдает ошибку
s = "y" + s [1: len (s)] - разрешено, привязано к новому объекту
Пр
им
ер 2
-1
Для циклов есть переменная цикла, которая перебирает набор значений
for var in range(4) <выражения> для переменной цикла var в диапазоне (4) изменяются значения 0,1,2,3 Для каждого значения var выполняются <выражения> внутри цикла,
var в for var in range (4,6) изменяет значения 4,5
range - это способ перебора чисел, переменная цикла for может перебирать любой набор значений, и не только числа!
Строки и циклы Вариант 1
s = "abcdefgh"
for index in range(len(s)):
if s[index] == 'i' or s[index] == 'u':
print("There is an i or u")
Вариант 2
for char in s:
if char == 'i' or char == 'u':
print("There is an i or u")
1 вариант
Пр
им
ер 2
-2-1
1 вариант
Пр
им
ер 2
-2-2
2 вариант
Пр
им
ер 2
-2-3
2 вариант
Пр
им
ер 2
-2-4
ПРИМЕР КОДА
Пр
им
ер 3
Пр
им
ер 4
«Угадай и проверь» -
• такой процесс также называется исчерпывающим перечислением: – Вы можете угадать значение для решения
– Вы можете проверить, является ли решение правильным
– Продолжайте гадать, пока не найдете решение или не угадаете все значения
Пр
им
ер 5
-1
Пр
им
ер 5
-2
ПРИБЛИЖЕННЫЕ РЕШЕНИЯ
- достаточно хорошие решения
• Начните с guess (некоторое предположение) и increment (приращение самой малой величины)
• Продолжайте изменение guess как в |guess3-cube| при epsilon (некоторый маленький epsilon) – уменьшение размера приращения => более медленная
программа
– «Увеличивающийся эпсилон» => менее точный ответ
Метод деления пополам для ускорения программ
• Половина интервала каждой итерации
• Новое предположение находится на полпути
Пр
им
ер 6
ФУНКЦИИ • Можно записывать многократно используемые фрагменты
кода, в виде функций – функции не запускаются в программе до тех пор, пока они не
будут «вызваны»
• Характеристики: • имеет имя • имеет параметры (0 или более) • имеет строку документации (необязательно, но рекомендуется) • имеет тело • возвращает что-то
КАК НАПИСАТЬ И ВЫЗВАТЬ ФУНКЦИЮ
Объявление функций
def <имя_функции> ( [ <список_параметров>] ): <тело_функции>
Здесь <тело_функции> - последовательность операторов, выровненных по тексту правее слова "def". <список_параметров> в самом общем виде выглядит так: [ < id > [,< id >]* ] [ < id >=< v > [,< id >=< v >]* ] [, *< id >] Здесь < id > - идентификатор переменной; < v > - некое значение. Параметры < id > за которыми следует "=" получают значения < v > по умолчанию. Если список заканчивается строкой " *< id > ", то id присваивается тьюпл (tuple) из всех оставшихся аргументов, переданных функции.
В теле функции
ОБЛАСТЬ ПРИМЕНЕНИЯ ПЕРЕМЕННОЙ
ОДНО ПРЕДУПРЕЖДЕНИЕ, ЕСЛИ НЕТ return
• Python возвращает значение None, если нет return
• None представляет отсутствие значения
Уста
но
вка
пл
аги
га D
ash
2 1
3
1
3
2 Уста
но
вка
пл
аги
га D
ash
CGI: пишем простой сайт на Python. Часть 1: Hello world
• Проще всего создать динамические страницы на Python при помощи CGI-скриптов. CGI-скрипты - это исполняемые файлы, которые выполняются веб-сервером, когда в URL запрашивается соответствующий скрипт.
CGI — стандарт интерфейса, используемого для связи внешней программы с веб-сервером Common Gateway Interface, a standard for dynamic generation of web pages by a web server
Настройка локального сервера
В Python уже есть встроенный CGI сервер, поэтому его настройка элементарна.
Для запуска из консоли (для любителей linux-систем). Запускать нужно из той папки, где мы хотим работать:
python3 -m http.server --cgi
• Для сидящих на Windows чуть проще будет запуск Python файла (заметьте, что он должен находиться в той же папке, в которой мы планируем работать!):
from http.server import HTTPServer, CGIHTTPRequestHandler server_address = ("", 8000) httpd = HTTPServer(server_address, CGIHTTPRequestHandler) httpd.serve_forever()
• Теперь откройте браузер и в адресной строке
наберите localhost:8000
Файл cgi-serv.py
Нас
тро
йка
ло
кал
ьно
го с
ерве
ра
Создаем файл hello.py • Теперь в той папке, где мы запустили сервер, создаём папку cgi-bin (в PyCcarm
она уже создана). • В этой папке создаём скрипт hello.py со следующим содержимым:
#!/usr/bin/env python3 print("Content-type: text/html") print() print("<h1>Hello world!</h1>")
• Первая строка говорит о том, что это Python скрипт (CGI-скрипты можно не только на Python писать).
• Вторая строка обозначает, что это будет html файл (бывает ещё css, javascript, pdf и другиe, и браузер различает их по заголовкам).
• Третья строка (просто символ новой строки) отделяет заголовки от тела ответа. • Четвёртая печатает Hello world.
В строке адреса браузера набираем localhost:8000/cgi-bin/hello.py
Получение данных из форм. Создадим в корневой папке новый файл index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Form 1</title> </head> <body> <form action="/cgi-bin/form.py"> <input type="text" name="TEXT_1"> <input type="text" name="TEXT_2"> <input type="submit"> </form> </body> </html>
ind
ex.h
tml
У класса FieldStorage есть 2 метода получения значений данных формы:
• FieldStorage.getfirst(name, default=None) - всегда возвращает только одно значение, связанное с именем поля формы. Метод возвращает только первое значение в том случае, если нехороший пользователь послал более одного значения. Обратите внимание, что порядок, в котором будут получены значения, могут отличаться от браузера к браузеру. Если нет такого поля формы или значение не существует, то метод возвращает default.
• FieldStorage.getlist(name) - возвращает список значений, связанных с именем поля формы.
в папке cgi-bin/ - файл form.py
(обработчик формы)
#!/usr/bin/env python3 import cgi form = cgi.FieldStorage() text1 = form.getfirst("TEXT_1", "не задано") text2 = form.getfirst("TEXT_2", "не задано") print("Content-type: text/html\n") print("""<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>Обработка данных форм</title> </head> <body>""") print("<h1>Обработка данных форм!</h1>") print("<p>TEXT_1: {}</p>".format(text1)) print("<p>TEXT_2: {}</p>".format(text2)) print("""</body> </html>""")
form
.py
В б
рау
зер
е:
loca
lho
st:8
00
0
Теги html не воспринимаются как текст Чтобы исправить эту уязвимость, измените form.py
Измененный form.py
#!/usr/bin/env python3
import cgi
import html
form = cgi.FieldStorage()
text1 = form.getfirst("TEXT_1", "не задано")
text2 = form.getfirst("TEXT_2", "не задано")
text1 = html.escape(text1)
text2 = html.escape(text2)
print("Content-type: text/html\n")
print("""<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Обработка данных форм</title>
</head>
<body>""")
print("<h1>Обработка данных форм!</h1>")
print("<p>TEXT_1: {}</p>".format(text1))
print("<p>TEXT_2: {}</p>".format(text2))
print("""</body>
</html>""")
Cookies • Cookies (печеньки) — небольшой фрагмент данных, отправленный веб-сервером и
сохраняемый на компьютере пользователя. • Браузер всякий раз при попытке открыть страницу соответствующего сайта
пересылает этот фрагмент данных веб-серверу в составе HTTP-запроса. • Собственно, cookies - хороший способ сохранить некоторые данные о пользователях. • Отправка печенек осуществляется заголовком Set-cookie: #!/usr/bin/env python3 print("Set-cookie: name=value; expires=Wed May 18 03:33:20 2033; path=/cgi-bin/; httponly") print("Content-type: text/html\n") print("Cookies!!!")
localhost:8000/cgi-bin/cookie.py
• вам поставится печенька с именем name и значением value. Срок её хранения до мая 2033 года, отправляется повторно на сервер только к скриптам, которые расположены в /cgi-bin/, и передается только http-запросами (её нельзя получить из браузера пользователя с помощью javascript).
print("Set-cookie: name=value; expires=Wed May 18 03:33:20 2033; path=/cgi-bin/; httponly")
Обработка Cookies • Теперь научимся получать cookies. Они передаются
на сервер и доступны в переменной os.environ (словарь, cookies хранятся по ключу HTTP_COOKIE). Они передаются в виде пар ключ=значение, что не очень удобно при обработке. Для упрощения работы можно использовать модуль http.cookies.
• Напишем простой скрипт (/cgi-bin/cookie.py), проверяющий, установлена ли кука, и если нет, устанавливает:
Пример приложения • напишем прототип приложения типа "твиттер". Данные
в файлах будем хранить в json (JSON (JavaScript Object Notation) - простой формат обмена данными, основанный на подмножестве синтаксиса JavaScript. Модуль json позволяет кодировать и декодировать данные в удобном формате).
• Создадим 2 файла: – первый (wall.py) будет отвечать за обработку данных,
вводимых пользователем, – Второй (_wall.py) - вспомогательный модуль (подключить
модуль можно с помощью инструкции import), который упростит код первого.
Вы можете их взять в текстовом формате:
• http://nadin.miem.edu.ru/wall.txt
• http://nadin.miem.edu.ru/_wall.txt
http://localhost:8000/cgi-bin/wall.py
Учебник
• http://www.tutorialspoint.com/python/python_cgi_programming.htm
Шаблонизаторы для платформы Python :
• Mako http://www.makotemplates.org/
• Genshi http://genshi.edgewall.org/
• Jinja http://jinja.pocoo.org/
Работа с HTML-шаблонами в Python при помощи Jinja
• https://eax.me/python-jinja/
Этот шаблонизатор есть во Flask
Установка Flask на Pycharm
В Pycharm:
• Создайте проект Flask_01
• Перейдите в: Файл -> Настройки -> Проект: имя_проекта -> Интерпретатор проекта.
• Нажмите на знак + для поиска Flask. Выберите его и нажмите Установить пакет
Установка Django на Pycharm
В Pycharm:
• Создайте проект Django_01
• Перейдите в: Файл -> Настройки -> Проект: имя_проекта -> Интерпретатор проекта.
• Нажмите на знак + для поиска Django. Выберите его и нажмите Установить пакет