Просте веб додаток на web.py.

Основи Python и Django. -> Рекурсивний коктейль.

Рекурсивний коктейль.

Складається з 30% води 20% спирту та 50% рекурсивного коктелі :-).

print("Making recousion coctail!!!")

def make(water,alcohol):
    mix = 0
    mix = mix + (water*30)
    mix = mix + (alcohol*20)
    mix = mix + (make(water,alcohol)*50)
    return mix

print(make(4,5))

RuntimeError: maximum recursion depth exceeded

Додамо лічильник ітерації та обмежимо рекурсію.

def make(water,alcohol,cnt):
    cnt += 1
    mix = 0
    mix = mix + (water*30)
    mix = mix + (alcohol*20)
    if cnt >10:
        return mix
    mix = mix + (make(water,alcohol,cnt)*50)
    return mix

cnt = 0    
print(make(4,5,cnt))
Основи Python и Django. -> Веб-сервер на web.py

WEB.PY

Встановлення

pip install web.py

Використання.

Найпростіший веб-додаток сервер.

import web

urls = (
    '/', 'hello'
)

app = web.application(urls,globals())#1

class hello:
    def GET(self):
        return "Hello world!"

if __name__ == "__main__":
    app.run()

1 - globalsце функція, що повертає словник, який містить усі змінні, визначені в глобальному просторі.

Якщо вона викликається з функції, то поверне словник простору того модуля, де ф-ція була визначена, а не де її викликали.

Запуск порту 8989.

python server.py 8989

Визначення параметра в URL.

import web

urls = (
    '/(.*)', 'hello'
)
app = web.application(urls, globals())

class hello:        
    def GET(self, name):
        if not name: 
            name = 'World'
        return 'Hello, ' + name + '!'

if __name__ == "__main__":
    app.run()

web.py

URL обробка (роутинг)

urls = (
    '/', 'index',
    /news', 'news',
    '/view_news/(\d+)', 'view_news',

)

class index: 
    ...
class news: 
    ...
class view_news: 
    def GET(self, id):
        """ View single news """
        post_id = int(id)

Templating

Let’s make a new directory for our templates (we’ll call it templates). Inside, make a new file whose name ends with HTML (we’ll call it index.html). Now, inside, you can just write normal HTML

<em>Hello</em>, world!

Or you can use web.py’s templating language to add code to your HTML:

$def with (name)

$if name:
    I just wanted to say <em>hello</em> to $name.
$else:
    <em>Hello</em>, world!

Under the first line, add:

import web
render = web.template.render('templates/')



....
def GET(self, name):
    return render.index(name)

Databasing

Installing MySQLdb

pip install MySQL-python

First you need to create a database object.

db = web.database(dbn='mysql', user='username', pw='password', db='dbname')


def GET(self, name):
    users = db.select('user')
    out = 'Hello '
    for u in users:
        out = out+' '+u.name
    return out

Output

Hello  dmitry sergey

Insert records

class insert:        
def GET(self, name):
    n = db.insert('user', name=name)
    return 'Ok'
Основи Python и Django. -> Домашнє завдання. Імпорт компаній.

Імпортувати базу компаній.

Сайт flagma.kz

Створити проект Django з такою командою.

from django.core.management.base import BaseCommand, CommandError

from app.models import Person, MainDocuments, Person2Document, Company, City, Person2Company, Import
import re
import psycopg2
import bs4
import requests
import time

    def parse_company(c):
        try:
            city = City.objects.get(name_ru__icontains=c.city_text)
            c.city = city
            c.save()
        except:
            print('City not found')

        namear = c.faunders_text.split(',')
        p = Person()
        p.raw_name = namear[0]
        p.role = namear[1]
        p.source = 'flagma.kz'
        p.save()
        p.parse()

        p2c = Person2Company()
        p2c.company = c
        p2c.person = p
        p2c.save()

        print('Saving person %s' % namear[0])



    class Command(BaseCommand):

        def handle(self, *args, **options):
            print('Importing.')   
            Company.objects.all().delete()
            Person.objects.filter(source='flagma.kz').delete()
            Person2Company.objects.all().delete()
            urls = []
            for cnt in range(1,1000):
                urls.append('https://flagma.kz/kompanii-k-%s.html' % cnt)

            for url in urls:
                print("Importing %s" % url)
                time.sleep(1)
                i = Import()
                i.url = url
                i.save()
                rez = requests.get(url)
                soup = bs4.BeautifulSoup(rez.text, 'html.parser')
                items = soup.findAll('div',{"class": "page-list-item-info"})
                for i in items:
                    name = i.find('a').text
                    location = i.find('span',{"itemprop": "location"}).text
                    boss = i.find('span',{"itemprop": "employee"}).text
                    arrboss = boss.split(',')
                    c = Company()
                    c.name_ru = name
                    c.name_kz = name
                    c.faunders_text = boss
                    c.city_text = location
                    c.save()
                    parse_company(c)
                    print('Saving.....%s' % name)

Створити модель даних для того, щоб ця команда працювала та заповнювала таблицю.

Основи Python и Django. -> Декоратори.

Декоратори.

Декоратори – це така конструкція мови, яка може змінити поведінку функції, методу, класу тощо. не змінюючи її саму.

Це ідеальний спосіб щось змінити в програмі без модифікації коду об’єкта, що змінюється.

Розберемо процес декорування функції.

Для початку розглянемо деякі особливості функцій.

Присвоєння функції змінної.

def greet(name):
    return "hello "+name

greet_someone = greet
print greet_someone("John")

# Outputs: hello John

Как видно, функция может быть присвоена переменной как обычное значение и следовательно быть передана как параметр другой функции.

Визначення функції усередині іншої функції.

def greet(name):
    def get_message():
        return "Hello %s" % name
    result = get_message()+'!'
    return result
print greet("John")

# Outputs: Hello John

При визначенні внутрішньої функції всі змінні, передані у зовнішню, будуть збережені у внутрішньому просторі (замиканні) зовнішньої функції та доступні з внутрішньої.

Надсилання функції як параметра іншої функції.

def greet(name):
   return "Hello " + name

def call_func(func):
    other_name = "John"
    return func(other_name)

print call_func(greet)

# Outputs: Hello John

Функція може бути передана параметром і викликана зсередини тієї функції, яку була передана.

Функція може повертати іншу функцію.

Іншими словами – функція може створювати функцію.

def compose_greet_func():
    def get_message():
        return "Hello there!"

    return get_message

greet = compose_greet_func()
print greet()

# Outputs: Hello there!

Внутрішня функція має доступ до замикаючого простору зовнішніх імен.

def compose_greet_func(name):
    def get_message():
        return "Hello there "+name+"!"

    return get_message

greet = compose_greet_func("John")
print greet()

# Outputs: Hello there John!

Зверніть увагу на те, як ми забираємо змінну name з замикання і повертаємо внутрішню функцію.

У момент виклику greet = compose_greet_func(“John”) в greet буде рядок “John”.

Декоратор.

Давайте сумісний ідеї, викладені вище і побудувати декоратор.

Putting the ideas mentioned above together, we can build a decorator. In this example let’s consider a function that wraps the string output of another function by p tags.

У прикладі припустимо, що необхідно змінити висновок функції get_text, уклавши її виведення у теги

.

def get_text(name):
   return "Hello, {0}".format(name)

def p_decorate(func):
   def func_wrapper(name):
       return "<p>{0}</p>".format(func(name))
   return func_wrapper

my_get_text = p_decorate(get_text)

print my_get_text("John")

# <p>Hello, John</p>

Це був наш перший декоратор. Тобто. функція-декоратор, що приймає іншу (декоровану) функцію як аргумент і змінює її поведінку. Поведінка змінюється всередині вкладеної функції декоратора рядком return “

{0}

“.format(func(name)). При цьому ми викликаємо функцію, що декорується, в тому місці, де хочемо отримати її результат. Наприкінці повертаємо цю вкладену функцію, яка називається обгорткою (wrapper).

Синтаксис декоратора в Python.

Застосування декоратора може бути спрощене використанням символу @.

Цей знак - еквівалент процедури my_get_text = p_decorate(get_text)** з прикладу вище.

def p_decorate(func):
   def func_wrapper(name):
       return "<p>{0}</p>".format(func(name))
   return func_wrapper

@p_decorate
def get_text(name):
   return "lorem ipsum, {0} dolor sit amet".format(name)

print get_text("John")

# Outputs <p>lorem ipsum, John dolor sit amet</p>

Now let’s consider we wanted to decorate our get_text function by 3 other functions.

Тепер уявімо, що нам потрібно задекорувати не однією трьома функціями послідовно, додавши додаткові теги strong і div.

Визначимо ці три функції-декоратори.

def p_decorate(func):
   def func_wrapper(name):
       return "<p>{0}</p>".format(func(name))
   return func_wrapper

def strong_decorate(func):
    def func_wrapper(name):
        return "<strong>{0}</strong>".format(func(name))
    return func_wrapper

def div_decorate(func):
    def func_wrapper(name):
        return "<div>{0}</div>".format(func(name))
    return func_wrapper

With the basic approach, decorating get_text would be along the lines of

При стандартному підході, щоб задекорувати всіма трьома, потрібно виконати такий код:

get_text = div_decorate(p_decorate(strong_decorate(get_text)))

Однак при використанні синтаксису декоратора Python це можна написати набагато простіше та зрозуміліше.

@div_decorate
@p_decorate
@strong_decorate
def get_text(name):
   return "lorem ipsum, {0} dolor sit amet".format(name)

print get_text("John")

# Outputs <div><p><strong>lorem ipsum, John dolor sit amet</strong></p></div>

Декоратор з аргументом.

Що якщо нам потрібно змінювати тег, в який ми поміщаємо виведення функції, що декорується, з прикладів вище.

Очевидно, для цього тег необхідно передавати як параметр декоратору:

def decorator(opentag,closetag):

    def real_decorator(decfunc):

        def wrapper(name):

            return opentag+' '+ decfunc(name) +' '+closetag

        return wrapper


    return real_decorator

У такому разі, при декоруванні передаємо ці параметри:

@decorator('<h1>','</h1>') 
def myf(name):
    return name


print myf('Dima')
Основи Python и Django. -> Домашнє завдання. Гра Очко.

Домашнє завдання.

Написати консольну гру “Очко”.

Правила.

Гравцеві пропонується вибрати картку (елемент зі списку колоди).

Колода має вигляд:

koloda = [2,3,4,5,6,7,8,9,10,11.... и т.д.]

Перед початком гри колода перемішується.

Гравцю послідовно видається перший елемент карти зі списку, при цьому елемент видаляється з колоди.

Далі гравець може взяти карту або припинити. У разі набору 21 очок або при припиненні набору вступає в гру комп’ютер і послідовно бере карти до досягнення 18 очок, або до рахунку, що перевищує рахунок гравця.

Якщо комп’ютер набирає 18 очок, він припиняє набір та визначається переможцем.

Якщо один із гравців набирає більше 21 він вважається таким, що програв.

Виграє той, у кого більше очок.