Отличие сортировки списков в python 2 и python 3

Проблема в том, что python 3 отказывается сортировать списки, содержащие значения None!

x = [1, 2, 3, 5555, -1, 0, None, None]
x.sort()

# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: ‘<‘ not supported between instances of ‘NoneType’ and ‘int’

Вариант обхода этой ситуации — это:
x.sort(key=lambda x: x or -1)

Реализация паттерна Адаптер на python

Адаптер — это один из структурных паттернов, из названия которого исходит его и назначения. По сути это типичный переходник для разных интерфейсов или данных.
1. Адаптер имеет интерфейс, который совместим с одним из объектов.
2. Поэтому этот объект может свободно вызывать методы адаптера.
3. Адаптер получает эти вызовы и перенаправляет их второму объекту, но уже в том формате и последовательности, которые понятны второму объекту.

Вырожденная форма адаптера — двухсторонний адаптер.
Нефизические примеры из жизни — это например система СМЭВ, которая предоставляет сервисы для получения/ обмена информацией.
Однако для работы вашего приложения со СМЭВ нужны адаптеры на вашей стороне, которые могут воспринимать данные, полученные со стороны СМЭВ, переводя их в объекты, понятные вашей системе.

Существуют адаптеры класса и адаптеры объекта.

пример адаптера на python для круглых отверстий и кольев квадратного сечения

# coding=utf-8
import math


class Hole(object):
    """
    Абстрактная дырка в вашем коде
    """
    def __init__(self, r):
        # задаем радиус дыры
        self.r = r

    def put(self, obj):
        # пытаемся поместить
        try:
            # чтобы влезло, нужно,
            # чтобы радиус дырки позволял
            if self.r >= obj.r:
                print u'Лезет!'
            else:
                print u'Не лезет'
        except AttributeError:
            print (u'Переданный объект не умеет вычислять радиус дырки,' 
                   u' в которую он влезет! Напишите Адаптер на python!')


class Square(object):
    """
    Абстрактный квадратный кол, который позволит
    закрыть абстрактную дырку в коде
    """
    def __init__(self, x, h):
        # зададим параметры дрына
        self.x = x
        self.h = h


class SquareHoleAdapter(object):
    def __init__(self, sq_obj):
        self.sq_obj = sq_obj

    @property
    def r(self):
        # половина диагонали квадрата будет как раз влезать
        # в дырку радиусом с полученное значение
        return math.sqrt(2*(self.sq_obj.x**2))/2


h1 = Hole(5)
h2 = Hole(2)
s1 = Square(5, 7)
s2 = Square(3, 3)
sa = SquareHoleAdapter(s2)

h1.put(s1)
>>> Переданный объект не умеет вычислять радиус дырки, в которую он влезет! Напишите Адаптер на python!

h1.put(sa)
>>> Лезет!

h2.put(sa)
>>> Не лезет

Как вывести информацию о переменных функции? количество, названия, значения?

Еще один интересный вопрос на аттестацию по знанию внутреннего устройства функций.

def foo(a,b,c):
     x=1
     return x*a*b*c
 
# Вывести названия переменных, которые используются в функции
print foo.func_code.co_varnames
('a', 'b', 'c', 'x')
# Вывести значения, которые определены
print foo.func_code.co_consts
(None, 1)
# Вывести количество принимаемых аргументов функции
print foo.func_code.co_argcount
3

Как написать генератор на python

Одна из задач на собеседование:
«Написать функцию генератор значений от 0 до 2»

def generator():
    num = 0
    while num <= 2:
        yield num
        num += 1


mygen = generator()
for i in mygen:
    print i

Yield это ключевое слово, которое используется примерно как return — отличие в том, что функция вернёт генератор.