学习装饰器,首先听haifeng老师讲解了一下准备知识。

1.函数即变量

2.高阶函数+嵌套函数==》装饰器

装饰器的作用是在,1)不改变源代码,2)不改变原函数的调用方式的前提下为函数增加新的功能。

首先学习了最基本的装饰器

使用方法:在原先函数定义的上方加入@wrapper语法糖,等价于 func = wrapper(func)

如果原函数带参数,则在第二层函数加入(*args,**kwargs)

如果装饰器也需要带参数,则需要再次嵌套一层,并且参数传递的顺序为:

def deco(args):

  def first(args):

    def second(args):

    return second

  return first

@deco(args)    #args --> 装饰器第一层

def func(args):    #func --> 装饰器第二层  args --> 装饰器第三层
  pass

#Authon Ivor
import time #装饰器
def timer(func):
def deco(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs)
stop_time = time.time()
print("The program cost %s" % (stop_time-start_time))
return deco
#装饰方法
@timer # 等价于 test1 = timer(test1)
def test1():
time.sleep(1.5)
print("I'm in the test1 !")
@timer
def test2(name,age):
time.sleep(0.5)
print("%s's age is %s" % (name,age)) test1()
test2("Ivor",25)

下面是武sir的博客,是高阶装饰器的一个小例子

#!/usr/bin/env python

#coding:utf-8

def Before(request,kargs):

    print 'before'

def After(request,kargs):

    print 'after'

def Filter(before_func,after_func):

    def outer(main_func):

        def wrapper(request,kargs):

            before_result = before_func(request,kargs)

            if(before_result != None):

                return before_result;

            main_result = main_func(request,kargs)

            if(main_result != None):

                return main_result;

            after_result = after_func(request,kargs)

            if(after_result != None):

                return after_result;

        return wrapper

    return outer

@Filter(Before, After)

def Index(request,kargs):

    print 'index'

列表生成器、可迭代对象、迭代器

#列表生成器
#[i for i in range(100)] #生成器
#(i for i in range(100))
#生成器只有在调用的时候才会生成相应的数据
#只记录当前的位置
#只有一个__next__()方法 #可迭代对象
#from collections import Iterable
#isinstance([],Iterable)
#列表,字典,元组等都是可迭代对象 #迭代器
#有next方法的才是迭代器 #能用for循环的都是可迭代对象
#能用next方法的都是迭代器对象

协程,简单消费者模型

#Authon Ivor
import time def consumer(name):
print("我准备吃包子啦!")
while True:
baozi = yield
print("包子(%s)来了,(%s)吃掉了!" % (baozi,name)) def producer():
c1 = consumer("A")
c2 = consumer("B")
c1.__next__()
c2.__next__()
print("我开始做包子了!")
for i in range(10):
print("做好了一个!")
time.sleep(1)
c1.send(i)
c2.send(i) producer()

斐波那契数列

#Authon Ivor

def fib(max):
n,a,b=0,0,1
for n in range(max):
yield b
a,b=b,a+b
return "done" f = fib(15)
for i in f:
print(i)

Python学习-day4的更多相关文章

  1. python学习day4软件目录结构规范

    为什么要设计好目录结构? 参考:http://www.cnblogs.com/alex3714/articles/5765046.html "设计项目目录结构",就和"代 ...

  2. Python学习day4 数据类型Ⅱ(列表,元祖)

    day4 知识补充&数据类型:列表,元祖 1.知识补充 1.编译型/解释型 编译型:在代码编写完成之后编译器将其变成另外一个文件教给你算计执行. 代表语言:Java,c,c++ ,c#, Go ...

  3. python学习day4 数据类型 if语句

    1.变量的内存管理 cpython解释器垃圾回收机制 什么是垃圾,当一个值身上没有绑定变量名时,(该值的引用计数=0时)就是一个垃圾 age=18 #18的引用计数=1 x=age  #18的引用计数 ...

  4. python学习day4之路文件的序列化和反序列化

    json和pickle序列化和反序列化 json是用来实现不同程序之间的文件交互,由于不同程序之间需要进行文件信息交互,由于用python写的代码可能要与其他语言写的代码进行数据传输,json支持所有 ...

  5. python学习day4之路

    装饰器(http://egon09.blog.51cto.com/9161406/1836763) 1.装饰器:本质是函数: 装饰器(装饰其他函数),就是为其他函数添加附加功能: 原则:1.不能修改被 ...

  6. python学习day4

    目录 一.迭代器 二.yield生成器 三.装饰器 四.递归 五.基础算法 迭代器 #1.在不使用for循环的情况下 li = [11 ,22, 33, 44] #count = len(li) #s ...

  7. python学习Day4 流程控制(if分支,while循环,for循环)

    复习 1.变量名命名规范 -- 1.只能由数字.字母 及 _ 组成 -- 2.不能以数字开头 -- 3.不能与系统关键字重名 -- 4._开头有特殊含义 -- 5.__开头__结尾的变量,魔法变量 - ...

  8. python学习 day4 (3月5日)---列表

    列表: 容器性数据 有序  可更改 大量数据 一.增 1.追加    append(objcet) 2.索引增加   Insert(index,元素) 3.迭代追加   extend(object) ...

  9. Python学习笔记,day4

    Python学习第四天 一.装饰器 函数调用顺序: 其他高级语言类似,Python 不允许在函数未声明之前,对其进行引用或者调用 高阶函数: 满足下列条件之一就可成函数为高阶函数 某一函数当做参数传入 ...

随机推荐

  1. JS根据选择的日期计算年龄

    本例中用的是easyUI的datebox $('#cal_birthday').datebox({ onSelect: function(date){ //根据选则的日期计算年龄 //alert(da ...

  2. PHP判断两个矩形是否相交

    <?php $s = is_rect_intersect(1,2,1,2,4,5,0,3); var_dump($s); /* 如果两个矩形相交,那么矩形A B的中心点和矩形的边长是有一定关系的 ...

  3. COGS 2342. [SCOI2007]kshort

    ★★☆   输入文件:bzoj_1073.in   输出文件:bzoj_1073.out   简单对比时间限制:2 s   内存限制:512 MB [题目描述] 有n个城市和m条单向道路,城市编号为1 ...

  4. COGS 1715. [CQOI2011]动态逆序对

    ★★★   输入文件:inverse.in   输出文件:inverse.out   简单对比时间限制:2 s   内存限制:128 MB [题目描述] 对于序列A,它的逆序对数定义为满足i<j ...

  5. OpenGL小试牛刀第一季

    效果截图:代码展示:using System;using System.Collections.Generic;using System.ComponentModel;using System.Dat ...

  6. UVA 10537 Toll! Revisited (逆推,最短路)

    从终点逆推,d[u]表示进入u以后剩下的货物,那么进入u之前的货物数量设为y,d[u] = x,那么y-x=ceil(y/20.0)=(y-1)/20+1=(y+19)/20. (y-x)*20+r= ...

  7. Android(java)学习笔记109:Java中输入和输出流概念

     程序在内存中运行,文件在磁盘上,把文件从磁盘上读入内存中来,当然是输入流了,   反之,把内存中的数据写到磁盘上的文件里面去就是输出.通常都是这样的,用了过滤流的情况复杂一些,则另当别论.

  8. vue跨域处理(vue项目中baseUrl设置问题)

    1.开发环境: 2.生产环境: 然后 const instance = axios.create({ baseURL: process.env.API })

  9. NIOP 膜你题

    NOIp膜你题   Day1 duliu 出题人:ZAY    1.大美江湖(mzq.cpp/c) [题目背景] 细雪飘落长街,枫叶红透又一年不只为故友流连,其实我也恋长安听门外足音慢,依稀见旧时容颜 ...

  10. 基于matlab的蓝色车牌定位与识别---定位

    接着昨天的工作继续.定位的过程有些是基于车牌的颜色进行定位的,自己则根据数字图像一些形态学的方法进行定位的. 合着代码进行相关讲解. 1.相对彩色图像进行灰度化,然后对图像进行开运算.再用小波变换获取 ...