foo.__code__ = bar.__code__
python -m dis hello.py
None
- это объект NoneType
, и есть только один инстанс, т.е. это
синглтон.
Если левая часть истина - то правая даже не будет вычисляться.
>>> s = '1234567890'
>>> s[::2]
'13579'
>>> d = {'a': 1}
>>> 'a' in d.keys()
True
>>> 'a' in d
True
>>> a = {'name': 'Denis', 'surname': 'Krumko'}
>>> {**a, 'name': 'Blablabla'}
{'name': 'Blablabla', 'surname': 'Krumko'}
min ## (B)uilitins
min = 42 ## (G)lobal
def f(*args):
min = 2
def g(): ## (E)nclosing
min = 4 ## (L)ocal
print(min)
Для присваивания - сложнее. Всегда берется локальная видимость.
Но для этого есть операторы global
и nonlocal
.
a = '123'
b = 'abc'
c = 'xyz'
zip(a, b, c)
map(lambda *args: args, a, b, c)
@functools.singledispatch
def pack(obj):
## Поведение по умолчанию
pass
@pack.register(int)
def _(obj):
## Поведение для int
pass
>>> 'axxxaxabcx'.lstrip('xa') ## 'x' и 'a' удаляются независимо а не слитно
'bcx'
- без аргументов идет разрез по пробельному символу
- любое кол-во пробельных символов - это 1 символ
>>> '\t \n foo bar \n'.split()
['foo', 'bar']
- а второй аргумент - это кол-во разрезов
- если указать их хоть 1000 - ошибки тут не будет
>>> 'foo.bar.tz'.split('.', 1)
['foo', 'bar.tz']
>>> 'foo.bar.tz'.rsplit('.', 1)
['foo.bar', 'tz']
- до разделителя, разделитель, после разделителя
>>> 'foo.bar.tz'.partition('.')
('foo', '.', 'bar.tz')
>>> 'foo.bar.tz'.rpartition('.')
('foo.bar', '.', 'tz')
>>> 'foobar'.endswith(('bar', 'baz'))
True
>>> 'foobar'.startswith(('hey', 'man'))
False
find
- возвращает или позицию или -1index
- кидаетValueError
если не была найдена позиция- могут принимать 2 и 3 аргументы для обозначения позиции, будет работать как
'abracadabra'[0:3].find('ra')
- для поиска справа есть
rfind
иrindex
>>> 'abracadabra'.find('ra')
2
>>> 'abracadabra'.find('ra', 0, 3)
-1
>>> 'abracadabra'.find('x')
-1
>>> 'abracadabra'.index('x')
ValueError: substring not found
- замены все еще идут слева направо
>>> 'abracadabra'.replace('ra', 'XX')
'abXXcadabXX'
>>> 'abracadabra'.replace('ra', 'XX', 1)
'abXXcadabra'
- но принимает не символы, а КОД символа (ЧТО ВАЩЕ ЗАЧЕМ)
>>> translation_map = {ord('a'): '*', ord('b'): '?'}
>>> 'abracadabra'.translate(translation_map)
'*?r*c*d*?r*'
>>> round(1.5) == round(2.5)
True
Потому что "rounding is done toward the even choice".
>>> x = [[1, 2, 3]] * 2
>>> y = [[1, 2, 3] for i in range(2)]
>>> x[0][1] = 200
>>> y[0][1] = 200
>>> x
[[1, 200, 3], [1, 200, 3]]
>>> y
[[1, 200, 3], [1, 2, 3]]
Когда мы "умножаем" список, то мы делаем ссылки на один и тот же объект. НО объекты должны быть mutable, типа списка.
>>> def append(x=[]):
x.append(len(x))
return x
>>> append(['a', 'b'])
['a', 'b', 2]
>>> append()
[0] # тут мы записали в x значение 0
>>> append()
[0, 1] # тут в x остался 0, т.е. длина == 1, поэтому добавили 1
Вывод: не объявлять в kwargs mutable элементы, типа списков.
>>> x = [lambda: i for i in range(3)]
>>> print(x[0]())
2
>>> print(x[1]())
2
Может быть будет проще понять:
[lambda: i for i in range(3)] --> [(lambda: i) for i in range(3)]
lambda: i
возвращает значение i
. В конце цикла i будет равняться 2. Поэтому
все три элемента в x условно возвращают lambda: 2
, что по факту просто 2.
>>> sum({1: 1, 2: 2, 1.0: 3}.values())
5
Вызов {1: 1, 2: 2, 1.0: 3}
преобразуется в {1: 3, 2: 2}
.
class C:
name = 'abc'
>>> C().name
'abc'
>>> C.name
'abc'
>> C.__dict__['name']
'abc'
Но если объявить private attrubute...
class C:
__secret = 'found it!'
def p(self):
return self.__secret
def x(self):
return self._C__secret
>>> C().__secret
AttributeError
>>> C.__secret
AttributeError
>> C.__dict__['__secret']
KeyError
>>> C._C__secret
'found it!'
>> C.__dict__['_C__secret']
'found it!'
>>> C().p()
'found it!'
>>> C().x()
'found it!'
@multiply(5)
def function(foo):
return foo
>>> function(2)
10
Ответ:
def multiply(x):
def decorator(f):
def wrap(*args, **kwargs):
return f(*args, **kwargs) * x
return wrap
return decorator
или через Class based decorator:
class multiply:
def __init__(self, x):
self.x = x
def __call__(self, f):
def decorated(*args, **kwargs):
return f(*args, **kwargs) * self.x
return decorated