Python 装饰器

装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator),装饰器的功能非常强大,装饰器一般接受一个函数对象作为参数,以对其进行增强,相当于C++中的构造函数,与析构函数.

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有迫切需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用.

总而言之,装饰器具有如下几个特点:

● 装饰器本身也是一个函数,其作用是,用于装饰其他函数.

● 装饰器是一个闭包函数是嵌套函数,通过外层函数提供嵌套函数的环境

● 装饰器在权限控制,增加额外功能,如增加记录日志,缓存处理,发送邮件用的比较多

◆无参装饰器◆

原函数中不带参数的装饰器,如下例子假设:我定义了一个函数lyshark(),现在想要在不改变原来函数定义的情况下,在函数运行前打印一段话,函数运行后打印另一段话,此时我们可以使用装饰器的装饰功能来简单的实现这个需求.

  1. >>> import os
  2. >>> import sys
  3. >>>
  4. >>> def outer(function):
  5. def inner():
  6. print("主函数开始执行前,会先执行我!")
  7. result=function()
  8. print("主函数执行结束后,要在执行我!")
  9. return result
  10. return inner
  11. # (1) @ + 函数名,直接作用在需要装饰的函数上一行
  12. # (2) 自动执行outer函数并且将下面的函数名lyshark()当做参数传递到outer()
  13. # (3) 将outer函数的返回值inner,重新赋值给lyshark()函数
  14. >>> @outer
  15. def lyshark():
  16. print("lyshark 的主函数体,装饰器在装饰我(*^_^*)")
  17. return "check ok"
  18. #==调用并执行函数,结果如下==========================================
  19. >>> ret=lyshark()
  20. 主函数开始执行前,会先执行我!
  21. lyshark 的主函数体,装饰器在装饰我(*^_^*)
  22. 主函数执行结束后,要在执行我!
  23. >>> print("lyshark()函数的返回值: ",ret)
  24. lyshark()函数的返回值: check

如上代码的执行流程是这样的,步骤如下:

1.当我们调用lyshark()函数时,会自动检查lyshark()函数上是否有装饰器

2.如果有则将lyshark()函数的指针,传递给装饰器outer(function)

3.outer(function)接到指针后,执行嵌套函数内的inner(),则先执行print打印一段话

4.由于lyshark()函数指针,传递给了function变量,执行function()则相当于执行lyshark()

5.紧接着,最后一步执行打印一段结束的话,并执行返回,返回inner

◆有参装饰器◆

原函数带一个参数的装饰器: 我们在以上的案例中,给装饰器添加一个参数,并在内部使用这个参数.

  1. >>> import os
  2. >>> import sys
  3. >>>
  4. >>> def outer(function):
  5. def inner(args):
  6. print("主函数开始执行前,会先执行我!")
  7. ret=function(args)
  8. print("主函数执行结束后,要在执行我!")
  9. return ret
  10. return inner
  11. >>> @outer
  12. def lyshark(args):
  13. print(args)
  14. return 0
  15. #==调用并执行函数,结果如下==========================================
  16. >>> ret=lyshark("hello world!")
  17. 主函数开始执行前,会先执行我!
  18. hello world!
  19. 主函数执行结束后,要在执行我!
  20. >>> print("lyshark 的返回值是:",ret)
  21. lyshark() 函数的返回值是: 0

原函数带两个参数的装饰器: 接下来继续演示一下,带有两个参数的装饰器,3个4个,以此类推.

  1. >>> import os
  2. >>> import sys
  3. >>>
  4. >>>
  5. >>> def outer(function):
  6. def inner(x,y):
  7. print("主函数开始执行前,会先执行我!")
  8. ret=function(x,y)
  9. print("主函数执行结束后,要在执行我!")
  10. return ret
  11. return inner
  12. >>> @outer
  13. def lyshark(x,y):
  14. print(x,y)
  15. return 0
  16. #==调用并执行函数,结果如下==========================================
  17. >>> ret=lyshark("Hello","LyShark")
  18. 主函数开始执行前,会先执行我!
  19. Hello LyShark
  20. 主函数执行结束后,要在执行我!
  21. >>> print("lyshark() 函数的返回值是:",ret)
  22. lyshark() 函数的返回值是: 0

传递一个万能参数: 装饰器也可传递一个万能参数,通过此参数传递列表字典等.

  1. >>> import os
  2. >>> import sys
  3. >>>
  4. >>> def outer(function):
  5. def inner(*args,**kwargs):
  6. print("主函数开始执行前,会先执行我!")
  7. ret=function(*args,**kwargs)
  8. print("主函数执行结束后,要在执行我!")
  9. return ret
  10. return inner
  11. >>> @outer
  12. def lyshark(*args):
  13. print(args)
  14. return 0
  15. #==调用并执行函数,结果如下==========================================
  16. >>> num=[1,2,3,4,5]
  17. >>> ret=lyshark(num)
  18. 主函数开始执行前,会先执行我!
  19. ([1, 2, 3, 4, 5],)
  20. 主函数执行结束后,要在执行我!
  21. >>>
  22. >>> print("lyshark() 函数的返回值是:",ret)
  23. lyshark() 函数的返回值是: 0
  24. #==调用并执行函数,结果如下==========================================
  25. @outer
  26. def lyshark_kw(*args,**kwargs):
  27. print(args,kwargs)
  28. return 0
  29. num=[1,2,3,4,5]
  30. kw={"1001":"admin","1002":"guest"}
  31. ret=lyshark_kw(num,kw)

一次使用两个装饰器装饰函数: 如果一个装饰器不够用的话,我们可以使用两个装饰器,首先将函数与内层装饰器结合然后在与外层装饰器相结合,要理解使用@语法的时候到底执行了什么,是理解装饰器的关键.

  1. >>> import os
  2. >>> import sys
  3. >>>
  4. >>> def outer2(function2):
  5. def inner2(*args,**kwargs):
  6. print("装饰器2--->【开始】")
  7. ret=function2(*args,**kwargs)
  8. print("装饰器2--->【结束】")
  9. return ret
  10. return inner2
  11. >>> def outer1(function1):
  12. def inner1(*args,**kwargs):
  13. print("装饰器1--->【开始】")
  14. ret=function1(*args,**kwargs)
  15. print("装饰器1--->【结束】")
  16. return ret
  17. return inner1
  18. @outer2
  19. @outer1
  20. def lyshark():
  21. print("lyshark 函数被执行了")
  22. #==调用并执行函数,结果如下==========================================
  23. >>> lyshark()
  24. 装饰器2--->【开始】
  25. 装饰器1--->【开始】
  26. lyshark 函数执行了
  27. 装饰器1--->【结束】
  28. 装饰器2--->【结束】
  29. #==调用并执行函数,结果如下==========================================
  30. @outer1
  31. @outer2
  32. def lyshark_and():
  33. print("lyshark_and 函数被执行了")
  34. >>> lyshark_and()
  35. 装饰器1--->【开始】
  36. 装饰器2--->【开始】
  37. lyshark_and 函数执行了
  38. 装饰器2--->【结束】
  39. 装饰器1--->【结束】

◆带参装饰器◆

前面的装饰器本身没有带参数,如果要写一个带参数的装饰器怎么办,那么我们就需要写一个三层的装饰器,而且前面写的装饰器都不太规范,下面来写一个比较规范带参数的装饰器,下面来看一下代码,大家可以将下面的代码自我运行一下.

给装饰器本身添加参数: 接下来我们将给装饰器本身添加一些参数,使其能够实现参数传递.

  1. >>> import functools
  2. >>> import sys
  3. >>>
  4. >>> def lyshark(temp=""): #指定装饰器默认参数
  5. def decorator(function): #定义装饰器
  6. @functools.wraps(function) #使被装饰的装饰器的函数名不改变
  7. def wrapper(*args,**kwargs):
  8. print("主函数开始执行前,会先执行我!")
  9. print("{}:{}".format(temp,function.__name__)) #这里调用了装饰器temp变量
  10. ret=function(*args,**kwargs)
  11. print("主函数执行结束后,要在执行我!")
  12. return ret
  13. return wrapper
  14. return decorator
  15. #==调用并执行函数,结果如下==========================================
  16. >>> #如果不给装饰器加参数,那么这个装饰器将使用默认参数 temp="",来填充
  17. >>> @lyshark()
  18. def test(x):
  19. print(x+100)
  20. >>> test(100)
  21. 主函数开始执行前,会先执行我!
  22. :test #这里由于没有传递参数则第一项为空,第二项是函数名称`function.__name__`取出的
  23. 主函数执行结束后,要在执行我!
  24. #==调用并执行函数,结果如下==========================================
  25. >>> #下面是给装饰器一个参数,将不是用默认参数 temp="",将变成 temp="LyShark"
  26. >>> @lyshark("LyShark")
  27. def test(x):
  28. print(x+100)
  29. >>> test(100)
  30. 主函数开始执行前,会先执行我!
  31. LyShark:test
  32. 主函数执行结束后,要在执行我!

给装饰器本身添加参数: 接下来我们将给装饰器本身添加两个参数,使其能够传递多个参数.

  1. >>> import sys
  2. >>> import os
  3. >>>
  4. >>> def lyshark(x="Hello",y="LyShark"):
  5. def decorator(function):
  6. def wrapper():
  7. print("主函数执行前,应先执行我!")
  8. print(x,y)
  9. ret=function()
  10. print("主函数执行后,要执行我!")
  11. return ret
  12. return wrapper
  13. return decorator
  14. #==调用并执行函数,结果如下==========================================
  15. >>> #使用默认参数的装饰器:此时 x="Hello" y="LyShark"
  16. >>> @lyshark()
  17. def test():
  18. print("我是test(),主函数,装饰器在装饰我")
  19. >>> test()
  20. 主函数执行前,应先执行我!
  21. Hello LyShark
  22. 我是test(),主函数,装饰器在装饰我
  23. 主函数执行后,要执行我!
  24. #==调用并执行函数,结果如下==========================================
  25. >>> #给装饰器指定参数:此时 x="My Name Is :" y="LyShark"
  26. >>> @lyshark("My Name Is :","LyShark")
  27. def test():
  28. print("我是test(),主函数,装饰器在装饰我")
  29. >>> test()
  30. 主函数执行前,应先执行我!
  31. My Name Is : LyShark
  32. 我是test(),主函数,装饰器在装饰我
  33. 主函数执行后,要执行我!

◆装饰器实战(练习)◆

测试程序执行时间: 通过使用装饰器,给一个已存在的函数,测试函数的执行时间.

  1. import os
  2. import sys
  3. import time
  4. def showtime(func):
  5. def main():
  6. start_time=time.time()
  7. func()
  8. end_time=time.time()
  9. print("程序运行了: %s"%(end_time-start_time))
  10. return main
  11. #==调用并执行函数,结果如下==========================================
  12. @showtime
  13. def timer():
  14. time.sleep(3)
  15. print("执行程序结束....")
  16. timer()

记录登陆状态(1): 使用装饰器记录登陆状态,下次自动登录.

  1. import os
  2. import sys
  3. user_info={}
  4. user_name="admin"
  5. pass_word="1233"
  6. def check_login(func):
  7. def main():
  8. if((user_info.get("is_login",None) ==True) and (user_info.get("is_type",None)==0)):
  9. print("你已经登陆过了,不能重复登陆!")
  10. func()
  11. else:
  12. print("你没有登陆,请先登录,在进行此操作")
  13. return main
  14. def login():
  15. username=input("输入用户名:").strip()
  16. password=input("输入密码:").strip()
  17. if username==user_name and password==pass_word:
  18. user_info["is_login"]=True
  19. user_info["is_type"]=0
  20. print("你好: "+username+"登陆成功,登录状态已被记录")
  21. elif username!="" and password!="":
  22. print("您输入的用户名,或者密码不正确,请重新输入")
  23. else:
  24. print("您没有输入任何内容,错误")
  25. @check_login
  26. def home():
  27. print("用户登录成功,显示这个函数中的内容.")
  28. def main():
  29. while True:
  30. temp=input("1.登陆 2.查询状态\n")
  31. if(temp=="1"):
  32. login()
  33. elif(temp=="2"):
  34. home()
  35. else:
  36. continue
  37. main()

记录登陆状态(2): 使用装饰器记录登陆状态,下次自动登录.

  1. USER_INFO = {}
  2. def check_login(func):
  3. def inner(*args,**kwargs):
  4. if USER_INFO.get('is_login',None):
  5. ret = func()
  6. return ret
  7. else:
  8. print("请登录")
  9. return inner
  10. def check_admin(func):
  11. def inner(*args,**kwargs):
  12. if USER_INFO.get('user_type',None) == 2:
  13. ret = func()
  14. return ret
  15. else:
  16. print("无权限查看")
  17. return inner
  18. @check_login #先检查你是不是登陆了
  19. @check_admin #在检查你是不是管理员
  20. def index():
  21. """
  22. 管理员用户
  23. """
  24. print('index')
  25. @check_login
  26. def home():
  27. """
  28. 普通用户
  29. """
  30. print('home')
  31. def login():
  32. user = input("请输入用户名:")
  33. if user == 'admin':
  34. USER_INFO['is_login'] = True
  35. USER_INFO['user_type'] = 2
  36. else:
  37. USER_INFO['is_login'] = True
  38. USER_INFO['user_type'] = 1
  39. def main():
  40. while True:
  41. inp = input('1、登录;2、查看信息;3、超级管理员管理\n>:')
  42. if inp == '1':
  43. login()
  44. elif inp == '2':
  45. home()
  46. elif inp == '3':
  47. index()
  48. main()

## Python 生成器

通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,还会造成大量空间的白白浪费,如果列表元素可以按照某种算法推算出来,这样我们就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器(Generator).

生成器是一个特殊的程序,可以被用作控制循环的迭代行为,Python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器.

生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,但不同于一般的函数会一次性返回包括了所有数值的数组,生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现得却像是迭代器.

生成器的注意事项,和相关的特性:

● 当我们调用一个生成器函数时,其实返回的是一个迭代器对象

● 在Python语言中,只要表达式中使用了,yield函数,通常将此类函数称为生成器(generator)

● 运行生成器时,每次遇到yield函数,则会自动保存并暂停执行,直到使用next()方法时,才会继续迭代

● 跟普通函数不同,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器

在学习生成器之前,我们先来看一下以下两种情况的对比,第一种方法很简单,只有把一个列表生成式的[]中括号改为()小括号,就创建了一个生成器.

  1. >>> lis = [x*x for x in range(10)]
  2. >>> print(lis)
  3. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  4. >>> generator = (x*x for x in range(10))
  5. >>> print(generator)
  6. <generator object <genexpr> at 0x0000022E5C788A98>

如上的例子,第一个lis通过列表生成式,创建了一个列表,而第二个generator则打印出一个内存地址,如果我们想获取到第二个变量中的数据,则需要迭代操作,如下所示:

  1. >>> generator = (x*x for x in range(10))
  2. >>> print(next(generator))
  3. 0
  4. >>> print(next(generator))
  5. 1
  6. >>> print(next(generator))
  7. 4
  8. >>> print(next(generator))
  9. 9

以上可以看到,generator保存的是算法,每次调用next(generaotr),就计算出他的下一个元素的值,直到计算出最后一个元素,使用for循环可以简便的遍历出迭代器中的数据,因为generator也是可迭代对象.

  1. >>> generator = (x*x for x in range(10))
  2. >>>
  3. >>> for i in generator:
  4. print(i,end="")
  5. 0149162536496481

◆生成器的实例◆

实例(1): 通过函数,和yield关键字,生成几个生成器.

  1. >>> import sys
  2. >>>
  3. >>> def func():
  4. yield 1
  5. yield 2
  6. yield 3
  7. yield 4
  8. yield 5
  9. >>> temp=func()
  10. >>> temp.__next__()
  11. 1
  12. >>> temp.__next__()
  13. 2
  14. >>> temp.__next__()
  15. 3

实例(2): 使用while循环构建一个生成器,并通过for遍历打印出结果.

  1. >>> import sys
  2. >>>
  3. >>> def yieldNum(x):
  4. y=0
  5. while (y <= x):
  6. yield y
  7. y += 1
  8. >>> yie=yieldNum(5)
  9. >>> for i in yie:
  10. print(i)
  11. 0
  12. 1
  13. 2
  14. 3
  15. 4
  16. 5

实例(3): 使用生成器求1-10的平方.

  1. >>> def yieldNum():
  2. x=1
  3. while (x <=10 ):
  4. yield x ** 2
  5. x += 1
  6. >>> yie=yieldNum()
  7. >>>
  8. >>> for i in yie:
  9. print(i)
  10. 4
  11. 16
  12. 36
  13. 64
  14. 100

实例(4): 使用生成器,自定义实现range函数.

  1. >>> def xrange(num):
  2. temp=-1
  3. while True:
  4. temp=temp+1
  5. if (temp >= num):
  6. return
  7. else:
  8. yield temp
  9. >>> xrange(10)
  10. <generator object xrange at 0x038E3030>

实例(5): 通过使用生成器求斐波那契数列.

  1. >>> def fib(max):
  2. n,a,b=0,0,1
  3. while n < max:
  4. yield b
  5. a,b=b,a+b
  6. n+=1
  7. return "done"
  8. >>> f=fib(5)
  9. >>> f
  10. <generator object fib at 0x038F4A20>

实例(6): 使用生成器,在单个进程情况下实现并发效果.

  1. import time
  2. def consumer(name):
  3. print("%s 准备吃包子啦!" %name)
  4. while True:
  5. baozi = yield
  6. print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
  7. def producer(name):
  8. c = consumer('A')
  9. c2 = consumer('B')
  10. c.__next__()
  11. c2.__next__()
  12. print("老子开始准备做包子啦!")
  13. for i in range(10):
  14. time.sleep(1)
  15. print("做了2个包子!")
  16. c.send(i)
  17. c2.send(i)
  18. producer("alex")

◆生成列表解析◆

列表解析是Python迭代机制的一种应用,它常用于实现创建新的列表,因此要放置于[]中,列表解析非常灵活,可以用户快速创建一组相应规则的列表元素,且支持迭代操作.

求阶乘: 通过列表解析式,来实现列表的迭代求阶乘.

  1. >>> temp1 = [1,2,3,4,5]
  2. >>> temp2 = [ x ** 2 for x in temp1 ]
  3. >>> temp1
  4. [1, 2, 3, 4, 5]
  5. >>> temp2
  6. [1, 4, 9, 16, 25]

求阶乘: 通过列表解析式,实现迭代求阶乘,并且只打印大于2(if x>=2)的数据.

  1. >>> temp1 = [1,2,3,4,5]
  2. >>> temp2 = [ x**2 for x in temp if x>=2 ]
  3. >>> temp1
  4. [1, 2, 3, 4, 5]
  5. >>> temp2
  6. [4, 9, 16, 25]

求阶乘: 通过列表解析式,实现迭代求阶乘,并通过range函数生成相关数据.

  1. >>> temp = [ (x**2)/2 for x in range(1,10)]
  2. >>> temp
  3. [0.5, 2.0, 4.5, 8.0, 12.5, 18.0, 24.5, 32.0, 40.5]

数据合并: 通过列表解析式,实现迭代将两个列表按照规律合并.

  1. >>> temp1=["x","y","z"]
  2. >>> temp2=[1,2,3]
  3. >>> temp3=[ (i,j) for i in temp1 for j in temp2 ]
  4. >>> temp3
  5. [('x', 1), ('x', 2), ('x', 3), ('y', 1), ('y', 2), ('y', 3), ('z', 1), ('z', 2), ('z', 3)]

文件过滤: 通过使用列表解析,实现文本的过滤操作.

  1. >>> import os
  2. >>> file_list=os.listdir("/var/log")
  3. >>> file_log=[ i for i in file_list if i.endswith(".log") ]
  4. >>> print(file_log)
  5. ['boot.log', 'yum.log', 'ecs_network_optimization.log', 'ntp.log']
  6. >>> file_log=[ i for i in os.listdir("/var/log") if i.endswith(".log") ]
  7. >>> print(file_log)
  8. ['boot.log', 'yum.log', 'ecs_network_optimization.log', 'ntp.log']

◆生成器表达式◆

生成器表达式并不真正创建数字列表,而是返回一个生成器对象,此对象在每次计算出一个条目后,把这个条目"产生"(yield)出来,生成器表达式使用了"惰性计算"或称作"延迟求值"的机制序列过长,并且每次只需要获取一个元素时,应当考虑使用生成器表达式而不是列表解析.

  1. >>> import sys
  2. >>>
  3. >>> yie=( i**2 for i in range(1,10) )
  4. >>> next(yie)
  5. 1
  6. >>> next(yie)
  7. 4
  8. >>> next(yie)
  9. 9
  1. >>> for j in ( i**2 for i in range(1,10)):print(j/2)
  2. ...
  3. 0.5
  4. 2.0
  5. 4.5
  6. 8.0
  7. 12.5
  8. 18.0
  9. 24.5
  10. 32.0
  11. 40.5

## Python 迭代器

迭代器是访问集合元素的一种方式,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁.这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G文件的遍历.

关于迭代器的几个特性:

● 迭代器是一个可以记住遍历的位置的对象

● 字符串,列表或元组对象都可用于创建迭代器

● 迭代器有两个基本的方法:iter()和next()

● 迭代器便于循环比较大的数据集合,节省了内存开支

● 迭代是Python最强大的功能之一,是访问集合元素的一种方式

● next()就相当于调用__next__(),for也是iterable(可迭代)对象

● 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容

● 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退

实例(1): 迭代器的基本用法1.

  1. >>> import sys
  2. >>>
  3. >>> temp=iter([1,2,3,4,5,6,7,8,9])
  4. >>> temp
  5. <list_iterator object at 0x03BD1F90>
  6. >>> temp.__next__()
  7. 1
  8. >>> temp.__next__()
  9. 2
  10. >>> temp.__next__()
  11. 3

实例(2): 迭代器的基本用法2.

  1. >>> import sys
  2. >>>
  3. >>> temp=[1,2,3,4,5]
  4. >>> ite=temp.__iter__()
  5. >>> print(type(temp),type(ite))
  6. <class 'list'> <class 'list_iterator'>
  7. >>> next(ite)
  8. 1
  9. >>>
  10. >>> next(ite)
  11. 2
  12. >>> next(ite)
  13. 3
  14. >>> next(ite)
  15. 4

实例(3): 通过while语句遍历迭代对象.

  1. >>> ite=iter([1,2,3,4,5])
  2. >>>
  3. >>> while True:
  4. try:
  5. temp=next(ite)
  6. print(temp)
  7. except StopIteration:
  8. break
  9. 1
  10. 2
  11. 3
  12. 4
  13. 5

Python 装饰&生成&迭代器的更多相关文章

  1. python装饰器,迭代器,生成器,协程

    python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出12 ...

  2. python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器

    1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...

  3. Python装饰器、迭代器&生成器、re正则表达式、字符串格式化

    Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...

  4. Python - 三大器 迭代器,生层器,装饰器

    目录 Python - 三大器 迭代器,生层器,装饰器 一. 容器 二. 可迭代对象(iterable) 三. 迭代器 四. 生成器 五. 装饰器 1. 定义 六. 闭包 Python - 三大器 迭 ...

  5. Python 闭包、迭代器、生成器、装饰器

    Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...

  6. python基础之迭代器、生成器、装饰器

    一.列表生成式 a = [0,1,2,3,4,5,6,7,8,9] b = [] for i in a: b.append(i+1) print(b) a = b print(a) --------- ...

  7. Python基础之迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  8. python设计模式之迭代器与生成器详解(五)

    前言 迭代器是设计模式中的一种行为模式,它提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.python提倡使用生成器,生成器也是迭代器的一种. 系列文章 python设计模 ...

  9. python之路——迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

随机推荐

  1. Axure实现提示文本单击显示后自动消失的效果

    Axure实现提示文本单击显示后自动消失的效果 方法/步骤     如图所示,框出的部分为提示文本(已经命名为tooltip),希望达到的效果是默认加载时不显示,点击帮助图标后显示,且2秒后自动消失. ...

  2. geth 新建账户

    使用geth的account命令管理账户,例如创建新账户.更新账户密码.查询账户等: geth account <command> [options...] [arguments...] ...

  3. startuml 3 windows 破解教程

    1.startuml 的下载地址:http://staruml.io/download 2.下载安装之后,安装node 服务.

  4. 在阿里云上挂在/data脚本

    在阿里云上加好一块磁盘后,将他分区,挂在在/data,并且设置开机自动挂在/etc/fstab [root@ZHONG-LONG javascripts]# vim mount.sh #!/bin/b ...

  5. SQL-W3School-高级:SQL 约束(Contraints)

    ylbtech-SQL-W3School-高级:SQL 约束(Contraints) 1.返回顶部 1. SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE T ...

  6. 使用redisTemplate存储数据,出现\xAC\xED\x00\x05t\x00

    本文开发环境:SpringBoot+RedisTemplate 代码: /** * 缓存Map * * @param key * @param dataMap * @return */ @Overri ...

  7. Spring Boot连接MySQL长时间不连接后报错`com.mysql.cj.core.exceptions.ConnectionIsClosedException: No operations allowed after connection closed.`的解决办法

    报错:com.mysql.cj.core.exceptions.ConnectionIsClosedException: No operations allowed after connection ...

  8. Thinking - 一些有效阅读的方法

    有策略,忌盲目.讲方法,别蛮干! 1- 阅读方法 1.1 做好眼前事 排除其他事项干扰,营造适合阅读的状态和环境,专注地投入阅读之中. 如果被一堆乱糟糟的事情烦扰,身心处于一个疲惫的状态,必然无法保持 ...

  9. 知识点整理-mysql怎么查看优化器优化后的sql

    背景 1.新建两张表 CREATE TABLE t1 (m1 )); CREATE TABLE t2 (m2 )); 2.插入些数据 INSERT INTO t1 VALUES(, , , 'c'); ...

  10. 剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers)

    剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers) https://leetcode.com/problems/sum-of-two-in ...