d = {'name': 'sekiro', 'hobby': 'blacksmithing', 'tendency': 'death'}
[key for key in d.keys()]
# ['name', 'hobby', 'tendency']
[value for value in d.values()]
# ['sekiro', 'blacksmithing', 'death']
[f'{key}: {value}' for key, value in d.items()]
# ['name: sekiro', 'hobby: blacksmithing', 'tendency: death']
even_sum_under_10 = sum(i for i in range(11) if not i % 2)
even_sum_under_10
# 30
import time
from functools import wraps
def clock(func):
@wraps(func) # 防止被装饰函数的属性被wrapper覆盖
def wrapper(*args, **kwargs):
t0 = time.perf_counter()
result = func(*args, **kwargs) # 由于闭包,wrapper函数包含了自由变量func
elapsed = time.perf_counter() - t0
name = func.__name__
args = ', '.join(repr(arg) for arg in args)
kwargs = ', '.join(f'{k}={w}' for k, w in sorted(kwargs.items()))
all_args_str = ', '.join(astr for astr in [args_str, kwargs_str] if astr)
print(f'[{elapsed:.8f}s] {name}({all_args_str}) -> {result}')
return result
return wrapper # 返回内部函数,取代被装饰的函数
@clock
def factorial(n: int) -> int:
return 1 if n < 2 else n * factorial(n-1)
factorial(5)
# [0.00000044s] factorial(1) -> 1
# [0.00011111s] factorial(2) -> 2
# [0.00022622s] factorial(3) -> 6
# [0.00030844s] factorial(4) -> 24
# [0.00042222s] factorial(5) -> 120
# 120
import time
from functools import wraps
DEFAULT_FMT = '[{elapsed:.8f}s] {name}({all_args_str}) -> {result}'
def clock(fmt=DEFAULT_FMT):
def decorate(func):
@wraps(func)
def wrapper(*args, **kwargs):
t0 = time.perf_counter()
result = func(*args, **kwargs)
elapsed = time.perf_counter() - t0
name = func.__name__
args_str = ', '.join(repr(arg) for arg in args)
kwargs_str = ', '.join(f'{k}={w}' for k, w in sorted(kwargs.items()))
all_args_str = ', '.join(astr for astr in [args_str, kwargs_str] if astr)
print(fmt.format(**locals()))
return result
return wrapper
return decorate
@clock()
def factorial_default_fmt(n: int) -> int:
return 1 if n < 2 else n * factorial_default_fmt(n-1)
@clock('{name}: {elapsed}s')
def factorial_customed_fmt(n: int) -> int:
return 1 if n < 2 else n * factorial_customed_fmt(n-1)
factorial_default_fmt(3)
# [0.00000044s] factorial_default_fmt(1) -> 1
# [0.00009600s] factorial_default_fmt(2) -> 2
# [0.00018133s] factorial_default_fmt(3) -> 6
# 6
factorial_customed_fmt(3)
# factorial_customed_fmt: 4.444450496521313e-07s
# factorial_customed_fmt: 9.733346314533264e-05s
# factorial_customed_fmt: 0.0001831113553407704s
# 6
# try:
# f = open(input_path)
# data = f.read()
# finally:
# f.close()
with open(input_path) as f:
data = f.read()
# with open('file') as i:
# data = i.read()
from pathlib import Path
data = Path('file').read_text()
from contextlib import contextmanager
@contextmanager
def open_write(filename):
try:
f = open(filename, 'w')
yield f
finally:
f.close()
with open_write('onegai.txt') as f:
f.write('Dagakotowaru!')
class A:
def __init__(self):
print('A')
class B(A):
def __init__(self):
print('enter B')
super().__init__()
print('leave B')
class C(A):
def __init__(self):
print('enter C')
super().__init__()
print('leave C')
class D(B, C):
pass
d = D()
# enter B
# enter C
# A
# leave C
# leave B
print(d.__class__.__mro__)
# (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
class Validator:
def __init__(self, storage_name):
self.storage_name = storage_name
def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError('Value must be an integer')
if value > 200:
raise ValueError('Value must be under 200')
class Person:
age = Validator('age')
def __init__(self, age):
self.age = age
person = Person(age=100)
person.age = 'young'
# Traceback (most recent call last):
# ValueError: Value must be an integer
person.age = 201
# Traceback (most recent call last):
# ValueError: Value must be under 200
type(name, bases, dict) -> a new type
class A:
a = 1
def foo(self):
return self.a * 2
# 以上类的创建等价于
A = type('A', (object, ), {'a': 1, 'foo': lambda self: self.a * 2})
class UpperAttrMeta(type):
def __new__(cls, name, bases, attrs):
"""
__init__方法用来初始化对象并传入参数
而__new__方法专门用来创建对象(显然这里我们要创建一个类对象并定制它)
"""
upper_attrs = {k.upper() if not k.startswith('_') else k: v for k, v in attrs.items()}
return super().__new__(cls, name, bases, upper_attrs)
class Foo(metaclass=UpperAttrMeta):
name = 'alphardex'
__love = 'unknown'
f = Foo()
f.NAME
# 'alphardex'
f._Foo__love
# 'unknown'
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
p = Person(name='alphardex', age='24')
p.age
# 24