2018/11/18(python)

装饰器-----本质是函数,功能是为其他函数添加附加功能

原则:1.不修改被装饰函数的源代码

   2.不修改被装饰函数的调用方式

装饰器=高阶函数+函数嵌套+闭包

闭包——闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个参数a, 内层函数依旧传入一个参数b,def timer(func):

def wrapper():
        print(func)
        func()
    return# encoding:utf-8
例子1
# encoding:utf-8
import time
def timer(fun):
    def wrapper():
        start=time.time()
        fun()
        stop=time.time()
        print("运行时间%s"%(stop-start))
    return wrapper
@timer     #等价于test=timer(test)
def test():
    time.sleep(3)
    print("运行完毕")
                       #test=timer(test)
test()
例子2.在例子1中,如果test()有返回值,不会输出
# encoding:utf-8
import time
def timer(fun):
    def wrapper():
        start=time.time()
        result=fun()        #改动1
        stop=time.time()
        print("运行时间%s"%(stop-start))
        return result           #改动2
    return wrapper
@timer     #等价于test=timer(test)
def test():
    time.sleep(3)
    print("运行完毕")
    return "这是test的结果"
                       #test=timer(test)
r=test()
print(r)

例子3.被修饰的函数有参数

准备知识——解压序列(一一对应)

a,b,c=(1,2,3)
print(a)
print(b)
print(c)

# encoding:utf-8import  timedef timer(func):    def wrapper(*args,**kwargs):     #可变参数*args和关键字参数**kwargs        start_time=time.time()        res=func(*args,**kwargs)     #res接受func的返回值        stop_time=time.time()        print(‘运行时间为%s‘%(stop_time-start_time))        return res    return wrapper                      #内部函数调用

@timer              #test=timmer(test),第一个test是用来接受函数的变量(test=wrapper),第二个是函数名def test(name,age,gender):    time.sleep(3)    print(‘test运行结束‘)    return ‘这是test返回值‘res=test("1",3,‘man‘)print(res)

python中交换

a=2
b=1
a,b=b,a
print(a,b)

京东登陆模拟

# encoding:utf-8
user_dic={‘username‘:None,‘log‘:False}      #用状态保存登陆状态

def auth_func(func):
    def wrapper(*args,**kwards):
        if user_dic[‘username‘] and user_dic[‘login‘]:
            res=func(*args,**kwards)
            return res
        username=input(‘用户名:‘).strip()  #除去空格或者换行符
        passwd=input(‘密码:‘).strip()
        if username==‘小明‘and passwd==‘123456‘:
            user_dic[‘username‘]=username
            user_dic[‘login‘]=True
            res=func(*args,**kwards)
            return res
        else: print(‘用户名或者密码错误‘)
    return wrapper
@auth_func
def index():
    print(‘欢迎到来‘)

@auth_func
def home(name):
    print(‘欢迎%s到来‘%(name))
@auth_func
def shopping(name):
    print(‘欢迎%s到来‘%(name))

index()
home(‘小明‘)
shopping(‘小明‘)

  

原文地址:https://www.cnblogs.com/2018-1025/p/10132563.html

时间: 2024-10-09 06:42:11

2018/11/18(python)的相关文章

2018/11/12(python)

文件处理流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 f=open('实验文件.txt',encoding='gbk') data=f.read() print (data ) f.close() 读写都是字符串形式 读 f=open('实验文件.txt','r',encoding='gbk') print(f.readlines()) f.close() 写,会覆盖原文件 f=open('实验文件.txt','w',encoding='gbk')

2018/11/6(python)

1.百分号字符串拼接 s="i am %s,i like playing basketball"%"alex" print(s) s="i am %s,i like playing %s"%("alex","basketball") #%s可以接受一切,%d只能接受数字 print(s) a="alex" b="basketball" s="i am %s,

2018/11/3(python)

1.九九乘法表 s="" for i in range(1,10): for j in range(1,i+1): s+=str(i)+"*"+ str(j)+"="+str(i*j)+"\t" print(s) s="" 2.print()    <==不换行 for i in range(1,10): print(i,end=" ") for i in range(1,10):

2018/11/16(python(迭代器与生成器))

1.迭代----每次结果都是基于上一个结果 2.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下项,要么就引起一个stoplteration异常,以终止迭代(只能往后走,不能往前看) 3.可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__ x='helloworld' x_t=x.__iter__() #遵循迭代器协议,生成可迭代对象 print(x_t.__next__()) print(x_t.__next__()) print(x_t.__n

2018/10/31(python)

1.列表(list) 列表中的元素可以是字符串,数字,布尔值,列表还可以嵌套列表. 例   l=[1,2,3,"abc","name",[5,"pad"],b]                          <==列表中的列表被视为一个元素 列表元素可以在原来基础上修改 l=[2,"qwe",'p',1,['r',9,3,"po"],9] l[0]="ide" #改 print

[LeetCode]题解(python):029-Divide Two Integers

题目来源: https://leetcode.com/problems/divide-two-integers/ 题意分析: 不用乘法,除法和mod运算来实现一个除法.如果数值超过了int类型那么返回int的最大值. 题目思路: 初步来说,有两个做法. ①模拟除法的过程,从高位开始除,不够先右挪一位.这种方法首先要将每一位的数字都先拿出来,由于最大int类型,所以输入的长度不超过12位.接下来就是模拟除法的过程. ②利用左移操作来实现出发过程.将一个数左移等于将一个数×2,取一个tmp = di

[LeetCode]题解(python):131-Palindrome Partitioning

题目来源: https://leetcode.com/problems/palindrome-partitioning/ 题意分析: 给定一个字符串s,将s拆成若干个子字符串,使得所有的子字符串都是回文字符串,返回所有这样的子字符串集合.比如s = “aab”,那么返回[["aa","b"],["a","a","b"]]. 题目思路: 这是一个动态规划问题,如果s[:i]是回文字符串,那么s[:i] X s

[LeetCode]题解(python):057-Insert Interval

题目来源 https://leetcode.com/problems/insert-interval/ Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary). You may assume that the intervals were initially sorted according to their start times. Examp

[LeetCode]题解(python):056-Merge Intervals

题目来源 https://leetcode.com/problems/merge-intervals/ Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,10],[15,18],return [1,6],[8,10],[15,18]. 题意分析 Input:a list of intervals Output:a list of intervals