• 并行编程概述


    并发编程

    多线程之——threa模块

    >>> import time
    >>> time.ctime()
    'Thu Jan  9 07:52:57 2020'
    
    import time
    
    """单线程示例
    """
    
    def worker(n):
        print(f'函数执行开始于:{time.ctime()}')
        time.sleep(n)#休眠时间
        print(f'函数执行结束于:{time.ctime()}')
    
    def mian():
        print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
        worker(4)#执行4秒
        worker(2)#执行2秒
        print(f'【主函数执行结束于:{time.ctime()}】')
    
    if __name__ == '__main__':
        mian()  

    结果

    【主函数执行开始于:Thu Jan  9 08:00:57 2020】
    函数执行开始于:Thu Jan  9 08:00:57 2020
    函数执行结束于:Thu Jan  9 08:01:01 2020
    函数执行开始于:Thu Jan  9 08:01:01 2020
    函数执行结束于:Thu Jan  9 08:01:03 2020
    【主函数执行结束于:Thu Jan  9 08:01:03 2020】 

    多线程

    _thread模式弊端并不能决定函数 程序什么时候结束

    import time
    import _thread
    
    
    """_thread 实现多线程
    """
    
    def worker(n):
        print(f'函数执行开始于:{time.ctime()}')
        time.sleep(n)#休眠时间
        print(f'函数执行结束于:{time.ctime()}')
    
    def mian():#多线程只修改main函数
        print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
        _thread.start_new_thread(worker,(4,))#开始一个新的线程,function函数名称叫worker,args传递参数,以元组形式展现
        _thread.start_new_thread(worker, (2,))
        print(f'【主函数执行结束于:{time.ctime()}】')
    
    if __name__ == '__main__':
        mian()  

    结果

    【主函数执行开始于:Thu Jan  9 08:14:44 2020】
    【主函数执行结束于:Thu Jan  9 08:14:44 2020】

    想执行等一等 就是加上time sleep

    import time
    import _thread
    
    
    """_thread 实现多线程
    """
    
    def worker(n):
        print(f'函数执行开始于:{time.ctime()}')
        time.sleep(n)#休眠时间
        print(f'函数执行结束于:{time.ctime()}')
    
    def mian():#多线程只修改main函数
        print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
        _thread.start_new_thread(worker,(4,))#开始一个新的线程,function函数名称叫worker,args传递参数,以元组形式展现
        _thread.start_new_thread(worker, (2,))
    
        time.sleep(6)
        print(f'【主函数执行结束于:{time.ctime()}】')
    
    if __name__ == '__main__':
        mian()

    threading 模块

    主函数的主线程没有和子线程同步

    import time
    import threading
    
    
    """threading.Thread() 实现多线程
    """
    
    def worker(n):
        print(f'函数执行开始于:{time.ctime()}')
        time.sleep(n)#休眠时间
        print(f'函数执行结束于:{time.ctime()}')
    
    def mian():#多线程只修改main函数
        print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
        #_thread.start_new_thread(worker,(4,))#开始一个新的线程,function函数名称叫worker,args传递参数,以元组形式展现
        #_thread.start_new_thread(worker, (2,))
    
        threads = []#先申请一个数组让他为空
        t1 = threading.Thread(target=worker, args=(4,))#构造一个他t1线程,执行目标函数,atgs耗费4秒
        threads.append(t1) #追加t1线程
    
        t2 = threading.Thread(target=worker, args=(2,))
        threads.append(t2)
    
        for t in threads:
            t.start()
    
    
        #time.sleep(6)
        print(f'【主函数执行结束于:{time.ctime()}】')
    
    if __name__ == '__main__':
        mian()

    理想状态是等待当前状态执行完毕之后再主线程执行完

    import time
    import threading
    
    
    """threading.Thread() 实现多线程
    """
    
    def worker(n):
        print(f'函数执行开始于:{time.ctime()}')
        time.sleep(n)#休眠时间
        print(f'函数执行结束于:{time.ctime()}')
    
    def mian():#多线程只修改main函数
        print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
        #_thread.start_new_thread(worker,(4,))#开始一个新的线程,function函数名称叫worker,args传递参数,以元组形式展现
        #_thread.start_new_thread(worker, (2,))
    
        threads = []#先申请一个数组让他为空
        t1 = threading.Thread(target=worker, args=(4,))#构造一个他t1线程,执行目标函数,atgs耗费4秒
        threads.append(t1) #追加t1线程
    
        t2 = threading.Thread(target=worker, args=(2,))
        threads.append(t2)
    
        for t in threads:
            t.start()
    
        for t in threads:
            t.join()
    
    
        #time.sleep(6)
        print(f'【主函数执行结束于:{time.ctime()}】')
    
    if __name__ == '__main__':
        mian()
    import time
    import threading
    
    
    """threading.Thread() 实现多线程
    """
    
    def worker(n):
        print('{} 函数执行开始于:{}'.format(threading.current_thread().name, time.ctime()))#出现当前线程名称
        time.sleep(n)#休眠时间
        print(f'{threading.current_thread().name} 函数执行结束于:{time.ctime()}')#获得当前线程
    
    def mian():#多线程只修改main函数
        print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
        #_thread.start_new_thread(worker,(4,))#开始一个新的线程,function函数名称叫worker,args传递参数,以元组形式展现
        #_thread.start_new_thread(worker, (2,))
    
        threads = []#先申请一个数组让他为空
        t1 = threading.Thread(target=worker, args=(4,))#构造一个他t1线程,执行目标函数,atgs耗费4秒
        threads.append(t1) #追加t1线程
    
        t2 = threading.Thread(target=worker, args=(2,))
        threads.append(t2)
    
        for t in threads:
            t.start()
    
        for t in threads:
            t.join()
    
    
        #time.sleep(6)
        print(f'【主函数执行结束于:{time.ctime()}】')
    
    if __name__ == '__main__':
        mian()

    结果

    【主函数执行开始于:Thu Jan  9 10:33:17 2020】
    Thread-1 函数执行开始于:Thu Jan  9 10:33:17 2020
    Thread-2 函数执行开始于:Thu Jan  9 10:33:17 2020
    Thread-2 函数执行结束于:Thu Jan  9 10:33:19 2020
    Thread-1 函数执行结束于:Thu Jan  9 10:33:21 2020
    【主函数执行结束于:Thu Jan  9 10:33:21 2020】

     派生类

    import time
    import threading
    
    
    """threading.Thread() 实现多线程
    """
    
    def worker(n):
        print('{} 函数执行开始于:{}'.format(threading.current_thread().name, time.ctime()))#出现当前线程名称
        time.sleep(n)#休眠时间
        print(f'{threading.current_thread().name} 函数执行结束于:{time.ctime()}')#获得当前线程
    
    class MyThread(threading.Thread):#继承基类
        def __init__(self, func, args):#指定信息
            threading.Thread.__init__(self)
            self.func = func
            self.args = args
    
        def run(self):
            self.func(*self.args)
    
    def mian():#多线程只修改main函数
        print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
        #_thread.start_new_thread(worker,(4,))#开始一个新的线程,function函数名称叫worker,args传递参数,以元组形式展现
        #_thread.start_new_thread(worker, (2,))
    
        threads = []#先申请一个数组让他为空
        t1 = MyThread(worker, (4,))
        threads.append(t1) #追加t1线程
    
        #t2 = threading.Thread(target=worker, args=(2,))
        t2 = MyThread(worker,(2,))
        threads.append(t2)
    
        for t in threads:
            t.start()
    
        for t in threads:
            t.join()
    
    
        #time.sleep(6)
        print(f'【主函数执行结束于:{time.ctime()}】')
    
    if __name__ == '__main__':
        mian()

    结果

    【主函数执行开始于:Thu Jan  9 10:44:08 2020】
    Thread-1 函数执行开始于:Thu Jan  9 10:44:08 2020
    Thread-2 函数执行开始于:Thu Jan  9 10:44:08 2020
    Thread-2 函数执行结束于:Thu Jan  9 10:44:10 2020
    Thread-1 函数执行结束于:Thu Jan  9 10:44:12 2020
    【主函数执行结束于:Thu Jan  9 10:44:12 2020】

    同步锁

    import threading
    import time
    
    """同步原语之:锁
    """
    
    eggs = []
    
    def put_egg(n, lst):
        for i in range(1,n+1):#做遍历
            lst.append(i)
    
    
    def main():
        threads = [] #变量等于数组
    
        for i in range(3):
            t = threading.Thread(target=put_egg,args=(5,eggs))
            threads.append(t)
    
        for t in threads:
            t.start()
    
        for t in threads:
            t.join()
    
        print(eggs)
    
    if __name__ == '__main__':
       main()

    结论

    [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
    import threading
    import time
    import random
    
    """同步原语之:锁
    """
    
    eggs = []
    lock = threading.Lock()#声明变量
    
    def put_egg(n, lst):
        lock.acquire()
        for i in range(1,n+1):#做遍历
            time.sleep(random.randint(0, 2))
            lst.append(i)
        lock.release()
    
    
    def main():
        threads = [] #变量等于数组
    
        for i in range(3):
            t = threading.Thread(target=put_egg,args=(5,eggs))
            threads.append(t)
    
        for t in threads:
            t.start()
    
        for t in threads:
            t.join()
    
        print(eggs)
    
    if __name__ == '__main__':
       main()

     qunue队列

    由生产者每个半秒向队列里放入一个随机数,总共放5个,先进先出,在队列里有消费者线程来取到某一项进行处理,

    处理完毕后一个task——down告诉任务结束,取内容有个超时操作3秒,取不到就不取得到一个空的异常

    import threading #输入模块
    import queue#队列模块
    import time#时间模块
    import random#使用随机数
    
    """LIFO 队列示例
    """
    
    def producer(data_queue):#定义生产者函数
        for i in range(5):#循环5次
            time.sleep(0.5)#每循环一次停留一会儿
            item = random.randint(1, 100)#1-100间随便一个数字
            data_queue.put(item)#队列里放入一个信息,把item放入进去
            print(f'{threading.current_thread().name} 在队列中放入数据项:{item}') #放入对象到队列的方法
    
    def consumer(data_queue):
        while True:
            try:
                item = data_queue.get(timeout=3)#获取信息,3秒钟得不到算超时
                print(f'{threading.current_thread().name} 从队列中移除了 {item}')#当前线程从队列中移除
            except queue.Empty:#捕获异常
                break#跳出当前循环
            else:#声明当前数据项处理完毕
                data_queue.task_done()
    
    def main():#定义主函数,声明对象
        q = queue.Queue()
    
        threads = []
        p = threading.Thread(target=producer, args=(q,))
        p.start()
    
        for i in range(2):#创建两个消费者线程
            c = threading.Thread(target=consumer, args=(q,))
            threads.append(c)
    
        for t in threads:
            t.start()
    
        for t in threads:
            t.join()#让主线程等待当前线程执行完毕
    
        q.join()#让主线程等待整个队列的操作
    
    if __name__ == '__main__':
        main()

    import multiprocessing
    import time
    
    """多进程示例
    """
    
    def func(n):
        print(f'{multiprocessing.current_process().name} 执行开始于:{time.ctime()}')#当前进程有个属性叫name
        time.sleep(n)
        print(f'{multiprocessing.current_process().name} 执行结束于:{time.ctime()}')
    
    def main():
        print(f'主函数执行于:{time.ctime()}')
    
        processes = []
        p1 = multiprocessing.Process(target=func, args=(4,))
        processes.append(p1)
    
        p2 = multiprocessing.Process(target=func, args=(2,))
        processes.append(p2)
    
        print(f'主函数结束于:{time.ctime()}')
    
    if __name__ == '__main__':
        main()
    
    
    
        print(f'主函数结束于:{time.ctime()}')

     

    更多并行编程

    import time
    import concurrent.futures
    
    """concurrent.futures应用
    """
    numbers = list(range(1,11))#做一个列表,生成范围1-10
    
    def count(n):#定义函数,接收参数n
        for i in range(1000000):
            i += i
        return i * n
    
    def worker(x):
        result = count(x) #计算
        print(f'数字:{x}的计算结果是:{result}')
    
    #顺序执行
    def sequential_execution():
        start_time = time.clock()
        for i in numbers:
            worker(i)
        print(f'顺序执行花费时间:{time.clock()-start_time}秒')
    
    #线程池执行
    def threading_execution():
        start_time = time.clock()
        with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
            for i in numbers:
                executor.submit(worker, i)#分配调度使用函数
    
        print(f'线程池执行花费时间:{time.clock()-start_time}秒')
    
    #进程池执行
    def process_execution():
        start_time = time.clock()
    
        with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:
            for i in numbers:
                executor.submit(worker, i)
    
        print(f'进程池执行花费时间:{time.clock()-start_time}秒')
    
    if __name__ == '__main__':
        #sequential_execution()
        #threading_execution()
        process_execution()

     函数基础

     

    将函数赋给变量

    In[2]: def hello(name):
      ...:     print('Hello ', name)
      ...:     
    In[3]: hello('Tom')#函数名称加特定参数
    Hello  Tom
    In[4]: type(hello)#用type检查
    Out[4]: function
    In[5]: hello
    Out[5]: <function __main__.hello(name)>
    In[6]: greeting = hello
    In[7]: greeting
    Out[7]: <function __main__.hello(name)>
    In[8]: hello('Tom')
    Hello  Tom
    In[9]: greeting('Jerry')
    Hello  Jerry

    将函数作为参数传递

    In[2]: def add(a, b):#把两个参数相加
      ...:     return a + b
      ...: 
    In[4]: def subtract(a, b):
      ...:     return a - b
      ...: 
    In[5]: add(3,5)
    Out[5]: 8
    In[6]: subtract(5,3)
    Out[6]: 2
    In[7]: def action(x, y, func):
      ...:     return func(x, y)
      ...: 
    In[8]: action(5, 3, add)
    Out[8]: 8
    In[9]: action(5, 3, subtract)
    Out[9]: 2
    In[10]: action(5, 3, lambda x, y:x*y)
    Out[10]: 15

    函数嵌套及跨域访问

    加括号是返回执行结果,不加括号是返回当前的对象

    
    

    >>> def greeting():#定义函数greeting
    ... def hello():#函数里定义一个函数greeting
    ... return 'Hello'
    ... return hello()#hello作为一个字符串在greeting结果返回
    ...
    >>> greeting()#调用
    'Hello'
    >>> def greeting():
    ... def hello():
    ... return 'Hello'
    ... return hello
    ...
    >>> greeting()
    <function greeting.<locals>.hello at 0x00000000037E31E0>
    >>> greeting()()#想执行再写个括号
    'Hello'

    
    

     函数嵌套域成员访问

    >>> def func_1():
    ...     x = 10
    ...     def func_2():
    ...         x = 20
    ...         return x + 10
    ...     return func_2()
    ... 
    >>> func_1()#用的是本地变量与外侧
    30
    
    想用func1里func2外面的
    >> def func_1():
    ...     x = 10
    ...     def func_2():
    ...         nonlocal x #非本地的x,使用上一层函数封装区域
    ...         return x + 10
    ...     return func_2()
    ... 
    >>> func_1()
    20

     函数定义装饰器

    """函数定义装饰器
    """
    
    def p_decoratior(func):#把gettext传入装饰器里
        def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
            return '<p>' +  func(*args,**kwargs) + '</p>'
    
        return wrapper
    
    @p_decoratior#对gettext做个装饰器,进行装饰
    def get_text():
        return '欢迎学习优品课堂课程'
    
    if __name__ == '__main__':
        print(get_text())

    """函数定义装饰器
    """
    
    def p_decoratior(func):#把gettext传入装饰器里
        def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
            return '<p>' +  func(*args,**kwargs) + '</p>'
    
        return wrapper
    
    #@p_decoratior#对gettext做个装饰器,进行装饰
    def get_text():
        return '欢迎学习优品课堂课程'
    
    if __name__ == '__main__':
       html = p_decoratior(get_text)#把gettext函数作为参数传递到decoratorfunc里
       print(html())#结果返回的字符串再打印
    """函数定义装饰器
    """
    
    def p_decoratior(func):#把gettext传入装饰器里
        def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
            return '<p>' +  func(*args,**kwargs) + '</p>'
    
        return wrapper
    
    @p_decoratior#对gettext做个装饰器,进行装饰
    def get_text():
        return '欢迎学习优品课堂课程'
    
    def get_upper_text(text):
        return text.upper()
    
    if __name__ == '__main__':
       print(get_upper_text('www.codeclassroom.com'))

    装饰器修饰

    """函数定义装饰器
    """
    
    def p_decoratior(func):#把gettext传入装饰器里
        def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
            return '<p>' +  func(*args,**kwargs) + '</p>'
    
        return wrapper
    
    @p_decoratior#对gettext做个装饰器,进行装饰
    def get_text():
        return '欢迎学习优品课堂课程'
    
    @p_decoratior
    def get_upper_text(text):
        return text.upper()
    
    if __name__ == '__main__':
       print(get_upper_text('www.codeclassroom.com'))

     类定义装饰器

    """类定义装饰器
    """
    
    class P:
        def __init__(self, func): #构造传递函数
            self.func = func
    
        def __call__(self, *args, **kwargs):#调用
            return '<p>' + self.func(*args,**kwargs) + '</p>'#返回p标签加/p标签
    
    def get_text():
        return '欢迎学习优品课堂课程'
    
    def get_upper_text(text):
        return text.upper()
    
    if __name__ == '__main__':
        print(get_text())#未加修饰的

    想修饰

    """类定义装饰器
    """
    
    class P:
        def __init__(self, func): #构造传递函数
            self.func = func
    
        def __call__(self, *args, **kwargs):#调用
            return '<p>' + self.func(*args,**kwargs) + '</p>'#返回p标签加/p标签
    
    @P
    def get_text():
        return '欢迎学习优品课堂课程'
    
    def get_upper_text(text):
        return text.upper()
    
    if __name__ == '__main__':
        print(get_text())#未加修饰的

    函数定义装饰器

    """函数定义装饰器
    """
    
    def p_decoratior(func):#把gettext传入装饰器里
        def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
            return '<p>' +  func(*args,**kwargs) + '</p>'
    
        return wrapper
    
    class Student:
        def __init__(self, name):
            self.name = name
    
    
        @p_decoratior
        def get_name(self):
            return self.name.upper()
    
    @p_decoratior#对gettext做个装饰器,进行装饰
    def get_text():
        return '欢迎学习优品课堂课程'
    
    @p_decoratior
    def get_upper_text():
        return text.upper()
    
    if __name__ == '__main__':
        s = Student('Mike')
        print(s.get_name())

    类定义装饰器

    """类定义装饰器
    """
    
    class P:
        def __init__(self, func): #构造传递函数
            self.func = func
    
        def __call__(self, *args, **kwargs):#调用
            return '<p>' + self.func(*args,**kwargs) + '</p>'#返回p标签加/p标签
    
    class Student:
        def __init__(self,name):
            self.name = name
    
        def get_name(self):
            return self.name.upper()
    
    @P
    def get_text():
        return '欢迎学习优品课堂课程'
    
    @P
    def get_upper_text(text):
        return text.upper()
    
    if __name__ == '__main__':
        s = Student('John')
        print(s.get_name())

    参数化装饰器

    """函数定义装饰器
    """
    
    def p_decorator(func):#把gettext传入装饰器里
        def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
            return '<p>' +  func(*args,**kwargs) + '</p>'
    
        return wrapper
    
    def div_decorator(func):
        def wrapper(*args,**kwargs):
            return '<div>{}</div>'.format(func(*args, **kwargs))
    
        return wrapper
    
    class Student:...
    
    
    @p_decorator#对gettext做个装饰器,进行装饰
    def get_text():
        return '欢迎学习优品课堂课程'
    
    @div_decorator
    def get_upper_text(text):
        return text.upper()
    
    if __name__ == '__main__':
        print(get_upper_text('www.codeclassroom.com'))

     再加个@p_decorator,看看修饰的先后

    """函数定义装饰器
    """
    
    def p_decorator(func):#把gettext传入装饰器里
        def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
            return '<p>' +  func(*args,**kwargs) + '</p>'
    
        return wrapper
    
    def div_decorator(func):
        def wrapper(*args,**kwargs):
            return '<div>{}</div>'.format(func(*args, **kwargs))
    
        return wrapper
    
    class Student:...
    
    
    @p_decorator#对gettext做个装饰器,进行装饰
    def get_text():
        return '欢迎学习优品课堂课程'
    
    @div_decorator
    @p_decorator
    def get_upper_text(text):
        return text.upper()
    
    if __name__ == '__main__':
        print(get_upper_text('www.codeclassroom.com'))

    不加装饰器 原本返回一个地址

    """函数定义装饰器
    """
    
    #参数化装饰器
    def tags(tag):
        def tag_decorator(func):
            def wrapper(*args,**kwargs):
                return f'<{tag}>{func(*args,**kwargs)}</{tag}>'#返回格式化字符串
            return wrapper
    
        return tag_decorator
    
    
    def p_decorator(func):#把gettext传入装饰器里
        def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
            return '<p>' +  func(*args,**kwargs) + '</p>'
    
        return wrapper
    
    def div_decorator(func):
        def wrapper(*args,**kwargs):
            return '<div>{}</div>'.format(func(*args, **kwargs))
    
        return wrapper
    
    class Student:...
    
    
    #@p_decorator#对gettext做个装饰器,进行装饰
    def get_text():
        return '欢迎学习优品课堂课程'
    
    #@div_decorator
    #@p_decorator()
    def get_upper_text(text):
        return text.upper()
    
    if __name__ == '__main__':
        print(get_upper_text('www.codeclassroom.com'))

    加一个标签,装饰器叫tags

    """函数定义装饰器
    """
    
    #参数化装饰器
    def tags(tag):
        def tag_decorator(func):
            def wrapper(*args,**kwargs):
                return f'<{tag}>{func(*args,**kwargs)}</{tag}>'#返回格式化字符串
            return wrapper
    
        return tag_decorator
    
    
    def p_decorator(func):#把gettext传入装饰器里
        def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
            return '<p>' +  func(*args,**kwargs) + '</p>'
    
        return wrapper
    
    def div_decorator(func):
        def wrapper(*args,**kwargs):
            return '<div>{}</div>'.format(func(*args, **kwargs))
    
        return wrapper
    
    class Student:...
    
    
    #@p_decorator#对gettext做个装饰器,进行装饰
    def get_text():
        return '欢迎学习优品课堂课程'
    
    #@div_decorator
    #@p_decorator()
    
    @tags('p')#加标签
    def get_upper_text(text):
        return text.upper()
    
    if __name__ == '__main__':
        print(get_upper_text('www.codeclassroom.com'))

    想变div

    """函数定义装饰器
    """
    
    #参数化装饰器
    def tags(tag):
        def tag_decorator(func):
            def wrapper(*args,**kwargs):
                return f'<{tag}>{func(*args,**kwargs)}</{tag}>'#返回格式化字符串
            return wrapper
    
        return tag_decorator
    
    
    def p_decorator(func):#把gettext传入装饰器里
        def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
            return '<p>' +  func(*args,**kwargs) + '</p>'
    
        return wrapper
    
    def div_decorator(func):
        def wrapper(*args,**kwargs):
            return '<div>{}</div>'.format(func(*args, **kwargs))
    
        return wrapper
    
    class Student:...
    
    
    #@p_decorator#对gettext做个装饰器,进行装饰
    def get_text():
        return '欢迎学习优品课堂课程'
    
    #@div_decorator
    #@p_decorator()
    
    @tags('div')#加标签
    def get_upper_text(text):
        return text.upper()
    
    if __name__ == '__main__':
        print(get_upper_text('www.codeclassroom.com'))
    """函数定义装饰器
    """
    
    #参数化装饰器
    def tags(tag):
        def tag_decorator(func):
            def wrapper(*args,**kwargs):
                return f'<{tag}>{func(*args,**kwargs)}</{tag}>'#返回格式化字符串
            return wrapper
    
        return tag_decorator
    
    
    def p_decorator(func):#把gettext传入装饰器里
        def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
            return '<p>' +  func(*args,**kwargs) + '</p>'
    
        return wrapper
    
    def div_decorator(func):
        def wrapper(*args,**kwargs):
            return '<div>{}</div>'.format(func(*args, **kwargs))
    
        return wrapper
    
    class Student:...
    
    
    #@p_decorator#对gettext做个装饰器,进行装饰
    def get_text():
        return '欢迎学习优品课堂课程'
    
    #@div_decorator
    #@p_decorator()
    
    @tags('div')#加标签
    @tags('p')
    def get_upper_text(text):
        return text.upper()
    
    if __name__ == '__main__':
        print(get_upper_text('www.codeclassroom.com'))

     python sublime text python 配置

     
  • 相关阅读:
    对“一道有趣的题目”的解答
    在Debian中使用Notify
    Debian服务器安装详细流程
    Lighttpd1.4.20源码分析之插件系统(1)plugin结构体和插件接口
    Lighttpd1.4.20源码分析之etag.c(h) HTTP/1.1中的Etag域
    Lighttpd1.4.20源码分析之bitset.c(h) 位集合的使用
    伸展树
    GCC中的弱符号与强符号
    Lighttpd1.4.20源码分析之fdevent系统(3) 使用
    Lighttpd1.4.20源码分析之插件系统(3)PLUGIN_TO_SLOT宏
  • 原文地址:https://www.cnblogs.com/shirleysu90/p/12169463.html
Copyright © 2020-2023  润新知