Блог о програмировании и программистах

Чем больше всматривашься в код, тем больше код всматривается в тебя

1 - Работа с переменными

Variable Bindings(работа с переменными)

        
            //0 - простое присваивание
                let x = 5;

            //1 - распаковка значений

                let (x, y) = (1, 2);

            //2 - обозначение типа переменной

                let x: i32 = 5;

            //3 - неизменяемость

                //выдаст ошибку
                let x = 5;
                x = 10; 

            //4 - область видимости и замена переменных

                //пример ошибочного кода, переменная на доступна вне блока
                let x: i32 = 17;
                {
                    let y: i32 = 3;
                    println!("The value of x is {} and value of y is {}", x, y);
                }
                println!("The value of x is {} and value of y is {}", x, y); // This won't work

                //пример замены переменных
                let x: i32 = 8;
                {
                    println!("{}", x); // Prints "8"
                    let x = 12;
                    println!("{}", x); // Prints "12"
                }
                println!("{}", x); // Prints "8"
                let x =  42;
                println!("{}", x); // Prints "42"

                //пример смены типа и изменяемости переменной
                let mut x: i32 = 1;
                x = 7;
                let x = x; // x is now immutable and is bound to 7

                let y = 4;
                let y = "I can also be bound to text!"; // y is now of a different type
        
    

Кратко о библиотеке numpy

1)Методы класса ndarray

  • ndarray.ndim - количество измерений ил ранк матрицы
  • ndarray.shape - возвращает количество измерений по каждой из осей (n,m), где n - количество строк, m - количество столбцов
  • ndarray.size - количество элементов в массиве
  • ndarray.dtype - тип элементов массива
  • ndarray.itemsize - размер в байтах каждого элемента в массиве
  • ndarray.data - буфер, содержащий элементы массива

2)Создание массива

        
              import numpy as np
            a = np.array([2,3,4])
            a.dtype #dtype('int64')
            b = np.array([1.2, 3.5, 5.1])
            b.dtype #dtype('float64')

            #создание двухмерного массива
            b = np.array([(1.5,2,3), (4,5,6)])
            #создание трехмерного массива
            b = np.array([((1.5,0.1,2.0),(1.5,0.1,2.0)), ((1.5,0.1,2.0),(1.5,0.1,2.0))])
            #тип элементов может задан в момент создания
            c = np.array( [ [1,2], [3,4] ], dtype=complex )
        
    

Подробно о классах в Python

1)Области видимости

Пример области видимости функций и переменных:
        
        def scope_test():
            def do_local():
                spam = "local spam"
            def do_nonlocal():
                nonlocal spam
                spam = "nonlocal spam"
            def do_global():
                global spam
                spam = "global spam"
            spam = "test spam"
            do_local()
            print("After local assignment:", spam)
            do_nonlocal()
            print("After nonlocal assignment:", spam)
            do_global()
            print("After global assignment:", spam)

        scope_test()
        print("In global scope:", spam)
        #The output of the example code is:
        """
        After local assignment: test spam
        After nonlocal assignment: nonlocal spam
        After global assignment: nonlocal spam
        In global scope: global spam
        """
        
    
....

Установка прав доступа для контролера

Определение, является ли пользователь админом:



from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
from django.contrib import messages
from django.utils.decorators import available_attrs
from functools import wraps
#Пишем декоратор, для контролера
def is_user_admin(view_func):
    @wraps(view_func, assigned=available_attrs(view_func))
    def wrap(request, *args, **kwargs):
        if request.user.is_superuser:
            #исполняем переданный нам контролер
            res = view_func(request, *args, **kwargs)
        else:
            #редиректим на начальную страницу с ошибкой
            messages.error(request, u'У Вас недостаточно прав для доступа')
            return HttpResponseRedirect('/')
        return res
    return wrap   

#Пример применения на контролере
@is_user_admin
def index_controler(request):
    context={}
    return render_to_response('index.html', context, context_instance=RequestContext(request)) 


Кратко о метаклассах в Python

О работе с метакласами по порядку:

1)Простой пример создания метакласса:

# coding=utf-8
class AttributeInitType(type):
    def __call__(self, *args, **kwargs):
        """Вызов класса при котором создается новый объект. """
        #создаем сам объект
        obj = type.__call__(self, *args)
        #добавляем нашему классу переданные атрибуты
        for name in kwargs:
            setattr(obj, name, kwargs[name])
        # вернем готовый объект
        return obj

....

Интересные особенности работы со словарями

Пишу про то, с чем непосредственно самому приходилось работать

1)Подсчет элементов в списке:

from collections import defaultdict
d = defaultdict(int)
color_list = ['red','black','red','blue']
for color in color_list:
    d[color] += 1
#{'blue': 1, 'black': 1, 'red': 2}
print d

2)Соединение двух списков в один словарье:

from itertools import izip
names = ['raymond', 'rachel', 'matthew']
colors = ['red', 'green', 'blue']
d = dict(izip(names, colors))
# {'matthew': 'blue', 'rachel': 'green', 'raymond': 'red'}
print d

Код авторизации под пользователя

Можно вставить в любой контролер и исполнении зайти уже авторизованным:


from django.contrib.auth.models import User
u = User.objects.get(id=3)
backend = get_backends()[0]
u.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__)
login(request, u)\