In [ ]:
# 装饰器应用
from functools import wraps
def decorator_name(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        if not can_run:
            return "Function will not run"
        return f(*args, **kwargs)
    return decorated
@decorator_name
def func():
    return ('Function is running')

can_run = True
print(func())

In [ ]:
# 授权装饰器
from functools import wraps
def requires_auth(f):
    @wraps(f)
    def decrated(*args, **kwargs):
        auth = request.authorization
        if not auth or not check_auth(auth.username, auth.password)
            authenticate()
        return f(*args, **kwargs)
    return decrated

In [ ]:
# 日志装饰器
from functools import wraps
def logit(func):
    @wraps(func)
    def with_loggin(*args, **kwargs):
        print(func.__name__ + " was called")
        return func(*args, **kwargs)
    return with_loggin

@logit
def addition_func(x):
    return x + x

result = addition_func(4)

In [ ]:
# 在函数中嵌入装饰器
from functools import wraps
def logit(logfile='out.log'):
    def logging_decorator(func):
        @wraps(func)
        def wrapped_function(*args, **kwargs):
            log_string = func.__name__ + " was called"
            print(log_string)
            # 打开logfile,并写入内容
            with open(logfile, 'a') as opened_file:
                opened_file.write(log_string + '\n')
        return wrapped_function
    return logging_decorator

@logit()
def myfunc1():
    pass

myfunc1()

@logit(logfile='func2.log')
def myfunc2():
    pass

myfunc2()

In [ ]:
# 装饰器类
class logit(object):
    def __init__(self, logfile='out.log'):
        self.logfile = logfile
    
    def __call__(self, func):
        log_string = func.__name__ + " was called"
        print(log_string)
        # 打开logfile写入
        with open(self.logfile, 'a') as opened_file:
            opened_file.write(log_string + '\n')
            
        # 现在,发送一个通知
        self.notify()
    
    def notify(self):
        # logit只打日志,不做别的
        pass
    
@logit()
def func1():
    pass

# 创建一个logit子类,来添加email的功能
class email_logit(logit):
    '''
        一个logit的实现版本, 可以在函数调用时发送email给管理员
    '''
    def __init__(self, email="admin@myproject.com", *args, *kwargs):
        self.email = email
        super(logit, self).__init__(*args, **kwargs)
    
    def notify(self):
        # 发送邮件
        pass

In [ ]:
def add(v1, v2):
    return v1 + v2

result = add(1,2)
print(result)

def add2(v1, v2):
    global result
    result = v1 + v2
    
add2(2,3)
print(result)

In [ ]:
# 多个return值

In [ ]:
# 对象变动Mutation
def add_to(num, target=[]):
    target.append(num);
    return target
add_to(1)
add_to(2)
add_to(3)


# def add_to2(num, target=None):
#     if target is None:
#         target = []
#     target.append(num)
#     return target

# add_to2(1)
# add_to2(2)

In [ ]:
# __slots__属性
# 不使用__slots__
def MyClass(object):
    def __init__(self, name, identifier):
        self.name = name
        self.identifier = identifier
        self.set_up()
    
def MyClass2(object):
    __slots__ = ['name', 'identifier']
    def __init__(self, name, identifier):
        self.name = name
        self.identifier = identifier
        self.set_up()

In [ ]:
import ipython_memory_usage.ipython_memory_usage as imu
imu.start_watching_memory()
imu.stop_watching_memory()
def MyClass(object):
    def __init__(self, name, identifier):
        self.name = name
        self.identifier = identifier

num = 1024 * 256
x = [MyClass("tom") for i in range(num)]

In [ ]:
def MyClass2(object):
    __slots__ = ['name', 'identifier']
    def __init__(self, name, identifier):
        self.name = name
        self.identifier = identifier

num2 = 1024 * 256
x = [MyClass2("tom") for i in range(num2)]

In [ ]:
# 容器collections
from collections import defaultdict
colours = (
    ('Yasoob', 'Yellow'),
    ('Ali', 'Blue'),
    ('Arham', 'Green'),
    ('Yasoob', 'Red'),
    ('Ahmed', 'Silver')
)

favourite_colours = defaultdict(list)
for name, colour in colours:
    favourite_colours[name].append(colour)
    
print(favourite_colours)

import collections
tree = lambda: collections.defaultdict(tree)
some_dict = tree()
some_dict['colours']['favourite'] = "yellow"
import json
print(json.dumps(some_dict))

In [ ]:
# counter
from collections import Counter
colours = (
    ('Yasoob', 'Yellow'),
    ('Ali', 'Blue'),
    ('Arham', 'Green'),
    ('Yasoob', 'Red'),
    ('Ahmed', 'Silver')
)
favs = Counter(name for name, color in colours)
print(favs)

# 统计一个文件
with open('readme.txt', 'r') as f:
    line_count = Counter(f)
print(line_count)

In [ ]:
# deque
from collections import deque
d = deque()
d.append('1')
d.append('2')
d.append('3')
print(len(d))
print(d.popleft())

d = deque(range(5))
d.pop()
d.popleft()
print(d)

In [ ]:
# namedtuple
man = ('Ali', 30)
print(man[0])

from collections import namedtuple
Animal = namedtuple('Animal', 'name age type')
perry = Animal(name="perry", age=31, type="cat")
print(perry)
print(perry[0])
print(perry.age)

print(perry._asdict())
dict_perry = perry._asdict()
dict_perry['age']

In [ ]:
# enum.Enum 枚举类型
from collections import namedtuple
from enum import Enum

class Species(Enum):
    cat = 1
    dog = 2
    horse = 3
    aardvark = 4
    butterfly = 5
    owl = 6
    platypus = 7
    dragon = 8
    unicorn = 9
    kitten = 1
    puppy = 2
    
Animal = namedtuple('Animal', 'name age type')
perry = Animal(name="Perry", age=31, type=Species.cat)
drogon = Animal(name="Drogon", age=4, type=Species.dragon)
tom = Animal(name="Tom", age=75, type=Species.cat)
charlire = Animal(name="Charlie", age=2, type=Species.kitten)

charlire.type == tom.type
charlire.type

# 三种访问方式
Species(1)
Species['cat']
Species.cat

In [ ]:
# 枚举
my_list = ['apple', 'banana', 'grapes', 'pear']
for counter, value in enumerate(my_list):
    print(counter, value)

for c, value in enumerate(my_list, 1): # 允许定制从哪个数字开始枚举
    print(c, value)

In [ ]:
# 对象自省
my_list = [1,2,3]
dir(my_list)
my_list.append(4)
print(my_list)

In [ ]:
dir()

In [ ]:
import inspect
print(inspect.getmembers(str))

In [101]:
# 列表推导式
multiples = [i for i in range(30) if i%3 is 0]
print(multiples)

# 字典推导式
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
mcase_frequency = {
    k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) 
    for k in mcase.keys()
}
print(mcase_frequency)

dict_ret = { v: k for k, v in mcase.items() }
print(dict_ret)

# 集合推导式
squared = {x**2 for x in [1,2,3]}
print(type(squared))


[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
{'a': 17, 'b': 34, 'z': 3}
{10: 'a', 34: 'b', 7: 'A', 3: 'Z'}
<class 'set'>

In [ ]: