601 - 650 Flashcards

1
Q

__get__

A

Позволяет определить значение, возвращаемое дескриптором.

class Celsius:
    def \_\_get\_\_(self, instance, owner):
        return 5 * (instance.fahrenheit - 32) / 9

    def \_\_set\_\_(self, instance, value):
        instance.fahrenheit = 32 + 9 * value / 5

class Temperature:
    celsius = Celsius()
    def \_\_init\_\_(self, initial_f):
        self.fahrenheit = initial_f

t = Temperature(212)
print(t.celsius)
👉 100.0

t.celsius = 0
print(t.fahrenheit)
👉 32.0
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

del

A

destructor method which is called as soon as all references of the object are deleted i.e when an object is garbage collected.

class Example: 
    # Initializing
    def \_\_init\_\_(self):
        print("Example Instance.")
  
    # Calling destructor
    def \_\_del\_\_(self):
        print("Destructor called, Example deleted.")
    
obj = Example()
del obj

👉 Example Instance.
👉 Destructor called, Example deleted.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

delete

A

used to delete the attribute of an instance i.e removing the value of attribute present in the owner class for an instance.

class Example(object):
    def \_\_init\_\_(self):
        print("Example Instance.")

    def \_\_delete\_\_(self, instance):
        print ("Deleted in Example object.")
  
class Foo(object):
    exp = Example()
  
f = Foo()
del f.exp

👉 Example Instance.
👉 Deleted in Example object.
class Example(object):
    def \_\_init\_\_(self):
        self.value = ''
  
    def \_\_delete\_\_(self, instance):
        print ("Inside \_\_delete\_\_")

    def \_\_del\_\_(self):
        print("Inside \_\_del\_\_")
      
class Foo(object):
    exp = Example()

f = Foo()
del f.exp

👉 Inside \_\_delete\_\_
👉 Inside \_\_del\_\_
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

property(fget=None, fset=None, fdel=None, doc=None)property(fget=None, fset=None, fdel=None, doc=None)

    • fget=None* - функция для получения значения атрибута
    • fset=None* - функция для установки значения атрибута
    • fdel=None* - функция для удаления значения атрибута
    • doc=None* - строка, для строки документации атрибута
A

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

class C:
    def \_\_init\_\_(self):
        self._x = None

    def getx(self):
        return self._x

    def setx(self, value):
        self.x = value

    def delx(self):
        del self.x
    
    x = property(getx, setx, delx, "I am the x property.")

Если c является экземпляром C , то:

👉 c.x вызовет метод getx,
👉 c.x = value вызовет setx,
👉 del c.x вызовет delx.
class C():
    def \_\_init\_\_(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        print("getter of x called")
        return self._x

    @x.setter
    def x(self, value):
        print("setter of x called")
        self._x = value

    @x.deleter
    def x(self):
        print("deleter of x called")
        del self._x

c = C()
c.x = 'foo'  👉 setter of x called
foo = c.x    👉 getter of x called
del c.x      👉 deleter of x called
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

pandas.DataFrame.transpose(*args, copy=False)

A

Transpose index and columns. Reflect the DataFrame over its main diagonal by writing rows as columns and vice-versa.

d1 = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})

d1
   col1  col2
0     1     3
1     2     4

df1_transposed = d1.transpose() # or you can use d1.T
df1_transposed
      0  1
col1  1  2
col2  3  4
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

sys.getrefcount(object)

A

возвращает счетчик ссылок объекта.

def a():
    pass

x = a()
y = a()

print(sys.getrefcount(a))
👉 2
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

collections.defaultdict([default_factory[, …]])

A

представляет собой словарь со значениями по умолчанию.

  • default_factory - тип данных или функция, которая возвращает значение по умолчанию для новых значений.
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)

sorted(d.items())
👉 [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
s = 'mississippi'
d = defaultdict(int)
for k in s:
    d[k] += 1

sorted(d.items())
👉 [('i', 4), ('m', 1), ('p', 2), ('s', 4)]
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = defaultdict(set)
for k, v in s:
    d[k].add(v)

sorted(d.items())
👉 [('blue', {2, 4}), ('red', {1, 3})]
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

collections.namedtuple(typename, field_names, rename=False, defaults=None, module=None)

typename - строка, имя именованного кортежа.
field_names - последовательность строк, имена элементов кортежа.
rename - bool, авто-переименование повторяющихся имен элементов.
defaults=None - итерируемая последовательность, значения по умолчанию имен кортежа.
module=None - атрибут __module__ именованного кортежа.
—————————————————————–
._make(iterable) - создает новый экземпляр класса namedtuple() из существующей последовательности или итерации iterable.
._asdict()- вернет новый словарь dict, который отображает имена полей в соответствии с их значениями.
._fields - вернет кортеж строк, перечисляющий имена полей.
._replace(kwargs) - вернет новый экземпляр именованного кортежа, заменив указанные поля новыми значениями.
._field_defaults - вернет словарь, который сопоставляет имена полей со значениями по умолчанию.

A

возвращает новый подкласс кортежа с именем typename. Новый подкласс используется для создания объектов, похожих на кортежи, которые имеют индексируемые и итерируемые поля, доступные для поиска по атрибутам.

t = [11, 22]
Point._make(t)

👉 Point(x=11, y=22)
p = Point(x=11, y=22)
p._asdict()

👉 {'x': 11, 'y': 22}
p = Point(x=11, y=22)
p._replace(x=33)

👉 Point(x=33, y=22)
Point(x=11, y=22)
Color = namedtuple('Color', 'red green blue')
Pixel = namedtuple('Pixel', Point._fields + Color._fields)

👉 Pixel(11, 22, 128, 255, 0)
👉 Pixel(x=11, y=22, red=128, green=255, blue=0)
Account = namedtuple('Account', ['type', 'balance'], defaults=[0])

Account._field_defaults
👉 {'balance': 0}

Account('premium')
👉 Account(type='premium', balance=0)
Point = namedtuple('Point', ['x', 'y'])

p = Point(11, y=22)

p[0] + p[1]
👉 33
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

collections.deque

.deque.append(x) - добавляет x к правой стороне (в конец) контейнера deque().
.deque.appendleft(x) - добавляет x к левой стороне (в начало) контейнера deque().
.deque.copy() - создает мелкую копию контейнера deque().
.deque.clear() - удаляет все элементы из контейнера deque(), оставляя его длиной 0.
.deque.count(x) - подсчитывает количество элементов контейнера deque(), равное значению x.
.deque.extend(iterable) - расширяет правую сторону (с конца) контейнера deque(), добавляя элементы из итерируемого аргумента iterable.
.deque.extendleft(iterable) - расширяет левую сторону (с начала) контейнера deque(), добавляя элементы из итерируемого аргумента iterable.
.deque.index(x[, start[, stop]]) - вернет позицию (индекс) первого совпадения значения аргумента x в контейнере deque(), расположенного после необязательного аргумента start и до необязательного аргумента stop.
.deque.insert(i, x) - вставляет значение аргумента x в позицию i контейнера deque().
.deque.pop() - удаляет и возвращает элемент с правой стороны (с конца).
.deque.popleft() - удаляет и возвращает элемент с левой стороны (с начала)
.deque.remove(value) - удаляет первое вхождение значения value в контейнер deque().
.deque.reverse() - разворачивает элементы контейнера deque() на месте и возвращает None.
.deque.rotate(n=1) - разворачивает контейнер deque() на n шагов вправо. Если аргумент n имеет отрицательное значение, то разворачивает контейнер налево.
.deque.maxlen - возвращает максимальный размер maxlen контейнера deque(), если параметр maxlen не задан, то возвращает None.

A

is preferred over a list in the cases where we need quicker append and pop operations from both the ends of the container, as deque provides an O(1) time complexity for append and pop operations as compared to list which provides O(n) time complexity.

queue = deque(['name','age','DOB'])

print(queue)
👉 deque(['name', 'age', 'DOB'])
dq = deque('ghi')

👉 deque(['g', 'h', 'i'])
deque(['g', 'h', 'i'])
dq.append('j')

dq
👉 deque(['g', 'h', 'i', 'j'])
deque(['g', 'h', 'i', 'j'])
dq.appendleft('f')

dq
👉 deque(['f', 'g', 'h', 'i', 'j'])
deque(['f', 'g', 'h', 'i', 'j'])
cp_dq = dq.copy()

cp_dq
👉 deque(['f', 'g', 'h', 'i', 'j'])
deque(['f', 'g', 'h', 'i', 'j'])
dq.append('g')

dq.count('g')
👉 2

dq
👉 deque(['f', 'g', 'h', 'i', 'j', 'g'])
deque(['f', 'g', 'h', 'i', 'j', 'g'])
dq.extend('jkl')

dq
👉 deque(['f', 'g', 'h', 'i', 'j', 'g', 'j', 'k', 'l'])
deque(['f', 'g', 'h', 'i', 'j', 'g', 'j', 'k', 'l'])
dq.extendleft('ab')

dq
👉 deque(['b', 'a', 'f', 'g', 'h', 'i', 'j', 'g', 'j', 'k', 'l'])
deque(['b', 'a', 'f', 'g', 'h', 'i', 'j', 'g', 'j', 'k', 'l'])

dq.index('g', 2)
👉 3
deque(['b', 'a', 'f', 'g', 'h', 'i', 'j', 'g', 'j', 'k', 'l'])
dq.insert(2, 'c')

dq
👉 deque(['b', 'a', 'c', 'f', 'g', 'h', 'i', 'j', 'g', 'j', 'k', 'l'])
dq.pop()
👉 'i'
dq.popleft()
👉 'b'
dq.remove('g')

dq
👉 deque(['a', 'c', 'f', 'h', 'i', 'j', 'g', 'j', 'k'])
deque(['a', 'c', 'f', 'h', 'i', 'j', 'g', 'j', 'k'])
dq.reverse()

dq
👉 deque(['k', 'j', 'g', 'j', 'i', 'h', 'f', 'c', 'a'])
dq.rotate(2)

dq
👉 deque(['c', 'a', 'k', 'j', 'g', 'j', 'i', 'h', 'f'])

dq.rotate(-4)

dq
👉 deque(['g', 'j', 'i', 'h', 'f', 'c', 'a', 'k', 'j']
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

@decorator

A

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

def decorator(func):
    return func

@decorator
def f(x):
    print(f'hello {x}')

f(1)
👉 hello 1
def decorator(func):
    def wrapper(x):
        print("Before " + func.\_\_name\_\_)
        func(x.upper())
        print("After " + func.\_\_name\_\_)
    return wrapper

@decorator
def user(name):
    print(f"Hi, {name}")

user("sam")

👉 Before user
👉 Hi, SAM
👉 After user
def decorator(gretting, farewell):
    def decorator_2(func):
        def decorator_inner(*args, **kwargs):
            print(gretting)
            ret = func(*args, **kwargs)
            print(farewell)
            return ret

        return decorator_inner

    return decorator_2

@decorator('hello', 'goodbye')
def f(x: int) -> None:
    print(f'hello {x}')

f(1)
👉 hello
👉 hello 1
👉 goodbye
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name=’value’, col_level=None, ignore_index=True)

A

Unpivot a DataFrame from wide to long format, optionally leaving identifiers set.

df = pd.DataFrame({'A': ['a', 'b', 'c'],
                   'B': [1, 3, 5],
                   'C': [2, 4, 6]})

new = pd.melt(df, id_vars=['A'], value_vars=['B'])

print(new)
   A variable  value
0  a        B      1
1  b        B      3
2  c        B      5
df = pd.DataFrame({'A': ['a', 'b', 'c'],
                   'B': [1, 3, 5],
                   'C': [2, 4, 6]})

new_2 = pd.melt(df, id_vars=['A'], value_vars=['B', 'C'])

print(new_2)

   A variable  value
0  a        B      1
1  b        B      3
2  c        B      5
3  a        C      2
4  b        C      4
5  c        C      6
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

pandas.wide_to_long(df, stubnames, i, j, sep=’’, suffix=’\d+’)

A

Unpivot a DataFrame from wide to long format. Less flexible but more user-friendly than melt.

df = pd.DataFrame({
    'famid': [1, 1, 1, 2, 2, 2, 3, 3, 3],
    'birth': [1, 2, 3, 1, 2, 3, 1, 2, 3],
    'ht1': [2.8, 2.9, 2.2, 2, 1.8, 1.9, 2.2, 2.3, 2.1],
    'ht2': [3.4, 3.8, 2.9, 3.2, 2.8, 2.4, 3.3, 3.4, 2.9]
})

l = pd.wide_to_long(df, stubnames='ht', i=['famid', 'birth'], j='age')

famid birth age
1     1     1    2.8
            2    3.4
      2     1    2.9
            2    3.8
      3     1    2.2
            2    2.9
2     1     1    2.0
            2    3.2
      2     1    1.8
            2    2.8
      3     1    1.9
            2    2.4
3     1     1    2.2
            2    3.3
      2     1    2.3
            2    3.4
      3     1    2.1
            2    2.9
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

string.partition(sep)

A

разбивает строку при первом появлении разделителя sep и вернет кортеж, содержащий часть строки str перед разделителем, сам разделитель sep и часть строки str после разделителя.

x = 'один два три раз, два три раз два три'
sep = 'раз'

x.partition(sep)
('один два три ', 'раз', ' два три раз два три')

x.partition(' ')
('один', ' ', 'два три раз два три раз два три')

x.partition('четыре')
('один два три раз, два три раз два три', '', '')
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

inspect.signature() and inspect.getargspec()

A

get the list of parameters name of function or method passed as an argument in one of the methods.

import inspect

print(inspect.signature(collections.Counter))
👉 (*args, **kwds)
def fun(a, b):
    return a**b

print(inspect.signature(fun))
👉 (a, b)
print(inspect.signature(len))
👉 (obj, /)
print(inspect.getargspec(collections.Counter))
👉 ArgSpec(args=[], varargs=’args’, keywords=’kwds’, defaults=None)
def fun(a, b):
    return a**b

print(inspect.getargspec(fun))
👉 ArgSpec(args=[‘a’, ‘b’], varargs=None, keywords=None, defaults=None)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

collections.OrderedDict([items])

.move_to_end() - для эффективного перемещения элемента в конечную точку.
.popitem(last=True) - для упорядоченных словарей возвращает и удаляет пару (key, value). Пары (key, value) возвращаются в порядке LIFO, если аргумент last=True или в порядке FIFO, если last=False.

A

возвращает экземпляр подкласса dict, у которого есть методы, специализированные для изменения порядка словаря. И удления как в списке с помошью pop.

d = OrderedDict.fromkeys('abcde')
d.move_to_end('b')

''.join(d.keys())
👉 'acdeb'
d = OrderedDict.fromkeys('abcde
d.move_to_end('b', last=False)

''.join(d.keys())
👉 'bacde'
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
od['d'] = 4
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

collection.ChainMap()

.maps - представляет собой обновляемый пользователем список словарей dict() и должен всегда содержать хотя бы один словарь.
.new_child(m=None) - возвращает новый экземпляр класса ChainMap(), содержащий новый словарь m, за которым следуют все словари в текущем экземпляре.
.parents - возвращает новый экземпляр класса ChainMap(), содержащий все словари в текущем экземпляре, кроме первого. Это полезно для пропуска первого словаря при поиске ключей.

A

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

from collections import ChainMap
first = {'two': 22, 'three': 3}
last = {'one': 1, 'two': 2}

d = ChainMap(first, last)
👉 ChainMap({'two': 22, 'three': 3}, {'one': 1, 'two': 2})
d = ChainMap({'two': 22, 'three': 3}, {'one': 1, 'two': 2})

d['four'] = 4
👉 ChainMap({'two': 22, 'three': 3, 'four': 4}, {'one': 1, 'two': 2})

d['one'] = 11
👉 ChainMap({'two': 22, 'three': 3, 'one': 11}, {'one': 1, 'two': 2})
d.maps
👉 [{'three': 3, 'one': 11}, {'one': 1, 'two': 2, 'four': 4}]
d = [{'three': 3, 'one': 11}, {'one': 1, 'two': 2, 'four': 4}]
d['one']
👉 11

d.maps.reverse()
d.maps
👉 [{'one': 1, 'two': 2, 'four': 4}, {'three': 3, 'one': 11}]
d_child = d.new_child()
👉 ChainMap({}, {'one': 0, 'two': 2, 'five': 5}, {'a': 10, 'b': 20})

d_child = d.new_child({'one': 1, 'a': 1})
👉 ChainMap({'one': 1, 'a': 1}, {'one': 0, 'two': 2, 'five': 5}, {'a': 10, 'b': 20})
d_child.parents
👉 ChainMap({'one': 0, 'two': 2, 'five': 5}, {'a': 10, 'b': 20})

d.parents
👉 ChainMap({'a': 10, 'b': 20})
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

file.open(file, mod=”r”, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

🎯 file - абсолютное или относительное значение пути к файлу или файловый дескриптор открываемого файла.
🎯 mode - необязательно, строка, которая указывает режим, в котором открывается файл.
❗ r - открывает файл только для чтения,
❗ w - открыт для записи (перед записью файл будет очищен),
❗ x - эксклюзивное создание, бросается исключение FileExistsError, если файл уже существует.
❗ a - открыт для добавления в конец файла (на некоторых Unix-системах пишет в конец файла вне зависимости от позиции курсора).
❗ + - символ обновления (чтение + запись).
❗ t - символ текстового режима.
❗ b - символ двоичного режима.

🎯 buffering - необязательно, целое число, используемое для установки политики буферизации.
🎯 encoding - необязательно, кодировка, используемая для декодирования или кодирования файла.
🎯 errors - необязательно, строка, которая указывает, как должны обрабатываться ошибки кодирования и декодирования.
🎯 newline - необязательно, режим перевода строк. Варианты: None, ‘\n’, ‘\r’ и ‘\r\n’. Следует использовать только для текстовых файлов.
🎯 closefd - необязательно, bool, флаг закрытия файлового дескриптора.
🎯 opener - необязательно, пользовательский объект, возвращающий открытый дескриптор файла.

A

открывает файл для чтения или записи при помощи файлового потока. Если файл не может быть открыт, бросается исключение OSError.

f = open("demofile.txt")
f.clothe()
with open("file_name.txt", "a") as f:
    f.write("Text to write\n")
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

file.read(size)

🎯 size - Optional. The number of bytes to return. Default -1, which means the whole file.

A

method returns content of the file.

f = open("demofile.txt", "r")

print(f.read())

Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!
f = open("demofile.txt", "r")

print(f.read(33))

Hello! Welcome to demofile.txt
Th
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

file.seek(offset[, whence])

🎯 file - объект файла
🎯 offset - int байтов, смещение указателя чтения/записи файла.
🎯 whence - int, абсолютное позиционирование указателя.
0 - означает, что нужно сместить указатель на offset относительно начала файла.
1 - означает, что нужно сместить указатель на offset относительно относительно текущей позиции.
2 - означает, что нужно сместить указатель на offset относительно конца файла.

A

устанавливает текущую позицию в байтах offset для указателя чтения/записи в файле file.

text = b'This is 1st line\nThis is 2nd line\nThis is 3rd line\n'
fp = open('foo.txt', 'bw+')
fp.write(text)
👉 51

fp.seek(20, 0)
👉 20

fp.read(10)
👉 b's is 2nd l'

fp.seek(10, 1)
👉 40

fp.read(10)
👉 b's 3rd line'

fp.seek(-11, 2)
👉 40

fp.read(10)
👉 b's 3rd line'

fp.close()
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

file.readable()

A

method returns True if the file is readable, False if not.

f = open("demofile.txt", "r")
print(f.readable())
👉 True
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

file.tell()

A

возвращает текущую позицию указателя чтения/записи в файле в байтах. Установить указатель чтения/записи в файле в нужную позицию можно используя метод файла file.seek().

text = 'This is 1st line\nThis is 2nd line\nThis is 3rd line\n'
fp = open('foo.txt', 'w+')
fp.write(text)
👉 51

fp.tell()
👉 51

fp.seek(0)
👉 0

fp.read(10)
👉 'This is 1s'

fp.tell()
👉 10

fp.read(15)
👉 't line\nThis is '

fp.tell()
👉 25

fp.close()
22
Q

with

A

The with statement simplifies exception handling by encapsulating common preparation and cleanup tasks. In addition, it will automatically close the file. The with statement provides a way for ensuring that a clean-up is always used.

with open("welcome.txt") as file:
   data = file.read()
with open('output.txt', 'w') as file:  
    file.write('Hi there!')
class MessageWriter(object):
    def \_\_init\_\_(self, file_name):
        self.file_name = file_name
     
    def \_\_enter\_\_(self):
        self.file = open(self.file_name, 'w')
        return self.file
 
    def \_\_exit\_\_(self, *args):
        self.file.close()
 
with MessageWriter('my_file.txt') as xfile:
    xfile.write('hello world')
from contextlib import contextmanager
 
class MessageWriter(object):
    def \_\_init\_\_(self, filename):
        self.file_name = filename
 
    @contextmanager
    def open_file(self):
        try:
            file = open(self.file_name, 'w')
            yield file
        finally:
            file.close()

message_writer = MessageWriter('hello.txt')
with message_writer.open_file() as my_file:
    my_file.write('hello world')
23
Q

file.write()

🎯 “a” - Append - will append to the end of the file
🎯 “w” - Write - will overwrite any existing content

A

write to an existing file.

f = open("demofile2.txt", "a")
f.write("Now the file has more content!")
f.close()
f = open("demofile3.txt", "w")
f.write("Woops! I have deleted the content!")
f.close()
24
Q

file.writelines(sequence)

🎯 file - объект файла
🎯 sequence - последовательность (список) строк.

A

записывает последовательность (список) строк в файл file.
Последовательностью может быть любой итерируемый объект, содержащий в качестве элементов строки.

text = ["This is 1st line\n", "This is 2nd line\n", "This is 3rd line\n"]
fp = open("foo.txt", "w")
fp.writelines(text)
fp.clothe()
f = open("demofile3.txt", "a")
f.writelines(["See you soon!", "Over and out."])
f.close()
25
Q

file.truncate([size])

🎯 file - объект файла,
🎯 size - int.

A

усекает размер файла.

text = "This is 1st line\This is 2nd line\nThis is 3rd line\n"
fp = open("foo.txt", "w+")
fp.write(text)
👉 51

Ограничить размер файла до 34 байт
fp.truncate(34)
👉 34

сбрасываем буфер в файл
fp.flush()

указатель чтения\записи в начало файла
fp.seek(0)
👉 0

fp.clothe()
26
Q

file.flush()

A

очищает внутренний буфер. Обычно используется только для выходного потока. Его цель - очистить выходной буфер и переместить буферизованные данные на диск.

text = "This is 1st line\nThis is 2nd line\nThis is 3rd line\n"
fp = open("foo.txt", "r+")
fp.write(text)
51

после выполнения flush() данные из переменной text физически запишутся в файл "foo.txt"
fp.flush()
fp.clothe()
27
Q

collections.Counter()

.elements() - возвращает итератор по элементам.
.most_common() - список наиболее распространенных элементов.
.subtract() - вычитает элементы счетчика и итерируемой последовательности.
.total() - вычисляет сумму значений счетчика.
.update() - складывает элементы счетчика и итерируемой последовательности.

A

предназначен для удобных и быстрых подсчетов количества появлений неизменяемых элементов в последовательностях.

from collections import Counter
cnt = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
dict(cnt)
👉 {'blue': 3, 'red': 2, 'green': 1}
Counter('abracadabra').most_common(3)
👉 [('a', 5), ('b', 2), ('r', 2)]
cnt = Counter(a=4, b=2, c=0, d=-2)
sorted(cnt.elements())
👉 ['a', 'a', 'a', 'a', 'b', 'b']
c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
c.subtract(d)
👉 Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
c = Counter(a=10, b=5, c=0)
c.total()
👉 15
c = Counter(a=10, b=5, c=0)
sum(c.values())
👉 15
c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
c.update(d)
👉 Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2})
28
Q

itertools.accumulate(iterable[, func, *, initial=None])

🎯 iterable - итерируемая последовательность,
🎯 func - функция, принимающая два аргумента,
🎯 initial=None - начальное значение.

A

создает итератор, который возвращает накопленные суммы или накопленные результаты других функций, которая задается с помощью необязательного аргумента func.

data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
list(accumulate(data, operator.mul)) 
👉 [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0]
data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
list(accumulate(data, max))
👉 [3, 4, 6, 6, 6, 9, 9, 9, 9, 9]
data = [2, 4, 6, 2, 1, 9, 0, 7, 5, 8]
print(list(accumulate(data, lambda bal, x: x**2 + x)))
👉 [2, 20, 42, 6, 2, 90, 0, 56, 30, 72]
29
Q

itertools.filterfalse(predicate, iterable)

.predicate - функция, возвращающая значение bool.
.iterable - итерируемая последовательность.

A

создает итератор, который удаляет элементы из последовательности iterable до тех пор, пока функция predicate равна False или 0. Возвращается итератор с отобранными элементами.

# например удалим значения списка x<3
z = [0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0]
rez = filterfalse(lambda x: x<3, z)

print(list(rez))
👉 [3, 4, 5, 5, 4, 3]
# теперь наоборот.
z = [0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0]
rez = filterfalse(lambda x: x>3, z)

print(list(rez))
👉 [0, 1, 2, 3, 3, 2, 1, 0]
# отобрать четные значения
rez = filterfalse(lambda x: x%2, range(10))

print(list(rez))
👉 [0, 2, 4, 6, 8]
# отобрать нечетные значения
rez = filterfalse(lambda x: not x%2, range(10))

print(list(rez))
👉 [1, 3, 5, 7, 9]
30
Q

itertools.compress(data, selectors)

.data - последовательность элементов,
.selectors - последовательность, состоящая из значений 0, 1 или False, True.

A

создает итератор, который фильтрует элементы из данных data, возвращая только те, которые имеют соответствующий элемент, равный True или 1 в последовательности selectors.

data = 'ABCDEF'
selectors = [1,0,1,0,1,1]
rez = compress(data, selectors)

print(list(rez))
👉 ['A', 'C', 'E', 'F']
31
Q

itertools.chain(*iterables)

A

создает итератор, который возвращает элементы из первой iterables, пока она не будет исчерпана, а затем переходит к следующей iterables, пока все итерируемые последовательности не будут исчерпаны.

it1 = range(1, 6)
it2 = range(10, 16)
rez = chain(it1, it2)

print(list(rez))
👉 [1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15]
32
Q

itertools.zip_longest(*iterables, fillvalue=None)

🎯 *iterables - итерируемые последовательности,
🎯 fillvalue=None - заполнитель, если одна из итераций меньше.

A

создает итератор, который объединяет элементы из каждой итерируемой последовательности *iterables в кортежи. Работает пока самая длинная итерация не будет исчерпана, а пропущенные элементы заполняются значением fillvalue.

a = list(range(5))
b = list(range(3, 10))
rez = zip_longest(a, b, fillvalue=100)

print(list(rez))
👉 [(0, 3), (1, 4), (2, 5), (3, 6), (4, 7), (100, 8), (100, 9)]
33
Q

itertools.repeat(object[, times])

🎯 object - объект Python, например функция или [список],
🎯 times - количество повторений.

A

создает итератор, который возвращает объект снова и снова.
Работает бесконечно, если не указан аргумент times.

# квадраты элементов списка

print(list(map(pow, range(10), repeat(2)))
👉 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# кубы элементов списка

print(list(map(pow, range(10), repeat(3))))
👉 [0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
34
Q

itertools.count(start=0, step=1)

🎯 start=0 - начало отсчета, int или float.
🎯 step=1 - шаг, int или float.

A

создает бесконечный итератор, который возвращает равномерно распределенные значения, начиная с номера start с шагом step.

for i in count(10):
    print(i, end=' ')
    if i > 16:
        print()
        break
👉 10 11 12 13 14 15 16 17
for i in count(10, 0.5):
    print(i, end=' ')
    if i > 13:
        print()
        break
👉 10 10.5 11.0 11.5 12.0 12.5 13.0 13.5
35
Q

itertools.groupby(iterable, key=None)

🎯 iterable - итерируемая последовательность,
🎯 key=None - функция, вычисляющая значение ключа для каждого элемента.

A

создает итератор, который возвращает последовательные ключи и группы из итерируемой последовательности iterable.

x = list('abc' * 3)
👉 ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']

x.sort()
👉 ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c']

for i, j in groupby(x):
    print(i, list(j))
 
a ['a', 'a', 'a']
b ['b', 'b', 'b']
c ['c', 'c', 'c']
36
Q

itertools.tee(iterable, n=2)

🎯 iterable - итерируемая последовательность,
🎯 n=2 - int.

A

вернет n одинаковых, независимых итераторов из одной итерируемой последовательности.

x = list(range(9,15))
rez = tee(x, 4)
for l in rez:
     print(list(l))
 
[9, 10, 11, 12, 13, 14]
[9, 10, 11, 12, 13, 14]
[9, 10, 11, 12, 13, 14]
[9, 10, 11, 12, 13, 14]
37
Q

itertools.combinations(iterable, r)

🎯 iterable - итерируемая последовательность,
🎯 r - int, длина возвращаемых кортежей.

A

возвращает итератор со всеми возможными комбинациями элементов входной последовательности iterable. Каждая комбинация заключена в кортеж с длинной r элементов, в которой нет повторяющихся элементов.

x = [1, 2, 3, 4]

print(list(combinations(x, 2)))
👉 [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
x = [1, 2, 3, 4]

print(list(combinations(x, 3)))
👉 [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
x = ['a', 'b', 'c', 'd']

print(list(combinations(x, 3)))
👉 [('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'd'), ('b', 'c', 'd')]
38
Q

itertools.product(*iterables, repeat=1)

A

возвращает декартово произведение(каждая переменная из первой последовательности соединяется с каждой переменной из второй последовательности) входных итерируемых последовательностей.

x = ['a', 'b', 'c']
y = ['1', '2']

print(list(product(x, y)))
👉 [('a', '1'), ('a', '2'), ('b', '1'), ('b', '2'), ('c', '1'), ('c', '2')]
x = ['a', 'b', 'c']
y = ['1', '2']

print(list(product(y, repeat=3)))
👉 [('1', '1', '1'), ('1', '1', '2'), ('1', '2', '1'), ('1', '2', '2'), 
    ('2', '1', '1'), ('2', '1', '2'), ('2', '2', '1'), ('2', '2', '2')]
x = ['a', 'b', 'c']
y = ['1', '2']

print(list(product(x, y, repeat=2)))
👉 [('a', '1', 'a', '1'), ('a', '1', 'a', '2'), ('a', '1', 'b', '1'), ('a', '1', 'b', '2'), 
    ('a', '1', 'c', '1'), ('a', '1', 'c', '2'), ('a', '2', 'a', '1'), ('a', '2', 'a', '2'), 
    ('a', '2', 'b', '1'), ('a', '2', 'b', '2'), ('a', '2', 'c', '1'), ('a', '2', 'c', '2'), 
    ('b', '1', 'a', '1'), ('b', '1', 'a', '2'), ('b', '1', 'b', '1'), ('b', '1', 'b', '2'), 
    ('b', '1', 'c', '1'), ('b', '1', 'c', '2'), ('b', '2', 'a', '1'), ('b', '2', 'a', '2'), 
    ('b', '2', 'b', '1'), ('b', '2', 'b', '2'), ('b', '2', 'c', '1'), ('b', '2', 'c', '2'), 
    ('c', '1', 'a', '1'), ('c', '1', 'a', '2'), ('c', '1', 'b', '1'), ('c', '1', 'b', '2'), 
    ('c', '1', 'c', '1'), ('c', '1', 'c', '2'), ('c', '2', 'a', '1'), ('c', '2', 'a', '2'), 
    ('c', '2', 'b', '1'), ('c', '2', 'b', '2'), ('c', '2', 'c', '1'), ('c', '2', 'c', '2')]
39
Q

itertools.permutations(iterable, r=None)

🎯 iterable - итерируемая последовательность,
🎯 r=None - int, длина возвращаемых кортежей.

A

возвращает итератор с последовательными перестановками из элементов входной последовательности iterable. Если r не указано или None, тогда по умолчанию r равна длине iterable и генерируются все возможные перестановки полной длины.

x = [1, 2, 3]

print(list(permutations(x)))
👉 [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
x = [1, 2, 3]

print(list(permutations(x, 2)))
👉 [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
40
Q

itertools.combinations_with_replacement(iterable, r)

🎯 iterable - итерируемая последовательность,
🎯 r - int, длина возвращаемых кортежей.

A

возвращает итератор с комбинациями из элементов входной последовательности iterable, позволяя повторять в комбинациях отдельные элементы более одного раза.

x = [1, 2, 3]

print(list(combinations_with_replacement(x, 2)))
👉 [(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]
x = [1, 2, 3]

print(list(combinations_with_replacement(x, 3)))
👉 [(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 2), (1, 2, 3), 
    (1, 3, 3), (2, 2, 2), (2, 2, 3), (2, 3, 3), (3, 3, 3)]
41
Q

functools.@lru_cache() or functools.cache(быстрее)

🎯 user_function - пользовательская функция,
🎯 maxsize=128 - int, максимальный размер кеша,
🎯 typed=False - bool, как кэшировать при разных типах аргументов.

A

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

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)
		
👉 [fib(n) for n in range(16)]
@cache
def fuctorial(n)
    return n * factorial(n-1) if n else 1

factorial(10)
👉 3628800
42
Q

functools.wraps and update_wrapper(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)

🎯 wrapped - исходная функция,

🎯 assigned - какие атрибуты исходной функции присваиваются декоратору,
WRAPPERASSIGNMENTS - присваивает функции обертке __module__ , __name__, __qualname__,
__annotations__ и __doc__.
WRAPPERUPDATES - обновляет в функции обертке __dict__.

🎯 updated - какие атрибуты декоратора обновляются из исходной функции.

A

обновляет функцию-обертку wrapped, чтобы она выглядела как исходная функция wrapper. Другими словами дополняет функцию-обертку, данными из некоторых атрибутов оборачиваемой функции.

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print('Calling decorator function')
        return func(*args, **kwargs)

    return wrapper

@my_decorator
def example():
    """Docstring"""
    print('Calling example function')

example()
👉 Calling decorator function
👉 Calling example function

print(example.\_\_name\_\_)
👉 example
print(example.\_\_doc\_\_)
👉 Docstring

👨🏼‍🎓 Without @wraps(func) 👇👇👇

print(example.\_\_name\_\_)
👉 wrapper
print(example.\_\_doc\_\_)
👉 None
from functools import update_wrapper

def my_func():
    """Wrapped function"""
    return "This original function"

def wrapper_func():
    """Wrapper function"""
    return "This wrapper func"

wrapper_func = update_wrapper(wrapper_func, my_func)

print(wrapper_func.\_\_name\_\_)
👉 my_func

print(wrapper_func.\_\_doc\_\_)
👉 Wrapped function

print(wrapper_func())
👉 This wrapper func

👨🏼‍🎓 Без update_wrapper то что ниже не будет работать ❗  ❗  ❗ 
print(wrapper_func.\_\_wrapped\_\_()) 
👉 This original function
43
Q

SQL.GROUP BY

A

statement groups rows that have the same values into summary rows, like “find the number of customers in each country”.

The GROUP BY statement is often used with aggregate functions (COUNT(), MAX(), MIN(), SUM(), AVG()) to group the result-set by one or more columns.

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country;
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;
SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName
44
Q

slice(start, stop, step)

A

вернет объект, представляющий срез/часть последовательности, которая будет следовать шаблону, указанному в аргументах.

a = ("a", "b", "c", "d", "e", "f", "g", "h")
x = slice(3, 5)

print(a[x])
👉 ('d', 'e')
a = ("a", "b", "c", "d", "e", "f", "g", "h")

print(a[slice(0, 8, 3)])
👉 ('a', 'd', 'g')
line = 'срезы'

print(line[slice(0, 3)])
👉 сре
45
Q

itertools.islice(iterable, start, stop[,step])

🎯 iterable - итератор,
🎯 start - int, начало среза,
🎯 stop - int, конец среза (не входит),
🎯 step - int, шаг среза.

A

создает итератор, который возвращает выбранные элементы из итератора iterable. Другими словами, получает срез итератора/генератора, для которых нельзя получить срез обычными средствами или встроенной функцией slice().

from itertools import islice

print(list(islice('ABCDEFG', 2)))
👉 ['A', 'B']
print(list(islice('ABCDEFG', 2, 4)))
👉 ['C', 'D']
print(list(islice('ABCDEFG', 2, None)))
👉 ['C', 'D', 'E', 'F', 'G']
print(list(islice('ABCDEFG', 0, None, 2)))
👉 ['A', 'C', 'E', 'G']
46
Q

itertools.pairwise(iterable)

A

returns the successive overlapping pairs taken from the input iterable.

lst = [1,3,5,2,4]

print(list(pairwise(lst)))
👉 [(1, 3), (3, 5), (5, 2), (2, 4)]
string = "hello world"

print(list(pairwise(string)))
👉 [('h', 'e'), ('e', 'l'), ('l', 'l'), ('l', 'o'), ('o', ' '), 
    (' ', 'w'), ('w', 'o'), ('o', 'r'), ('r', 'l'), ('l', 'd')]
47
Q

itertools.takewhile(predicate, iterable)

🎯 predicate - функция возвращающая bool значение,
🎯 iterable - итерируемая последовательность.

A

создает итератор, который возвращает элементы из последовательности iterable до тех пор, пока функция predicate равна True или 1.

z = [0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0]
rez = takewhile(lambda x: x < 5, z)

print(list(rez))
👉 [0, 1, 2, 3, 4]
z = [0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0]
rez = takewhile(lambda x: x < 3, z)

print(list(rez))
👉 [0, 1, 2]
48
Q

SQL.USE

A

Statement is used to select a database and perform SQL operations into that database.

USE database_name;
database_name - is the name of the database to be selected
48
Q

SQL.RENAME

A

rename our table to give it a more relevant name.

ALTER TABLE table_name
RENAME TO new_table_name;
ALTER TABLE table_name
RENAME COLUMN old_name TO new_name;
ALTER TABLE table_name
CHANGE COLUMN old_name TO new_name;
49
Q

SQL.RENAME

A

rename the table to give it a more relevant name.

ALTER TABLE table_name
RENAME TO new_table_name;
ALTER TABLE table_name
RENAME COLUMN old_name TO new_name;
ALTER TABLE table_name
CHANGE COLUMN old_name TO new_name;