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))
In [ ]: