Python核心2(迭代器、闭包、装饰器、生成器)

一、迭代器

  能用next()函数进行迭代的对象,可以被称为迭代器

  1.迭代:

  Iterable(可迭代的)
  list、tuple、dic、generator、str、包含yield关键字的func
  迭代:
  使用for循环进行遍历
  isinstance(obj,cls)
  Iterator(迭代器)
  iter()可以完成转换
# 判断列表、元组...是否具备可迭代性,还可以使用isinstance(目标对象,Iterable)
from collections import Iterable
print(isinstance([],Iterable))
print(isinstance((),Iterable))
print(isinstance("",Iterable))
print(isinstance({},Iterable))

def test():
    print('1')
    yield None
g = test()
# print(isinstance(test(),Iterable))
next(g)
next(test())
# 'list' object is not an iterator  列表不是迭代器
# next([1,2,3])
# 引入迭代器
# iter()函数,可以让[],{}等,转换成对应的迭代器
from collections import Iterator
# 查看iter([])是否为迭代器
print(isinstance(iter([]),Iterator))
# 查看iter([])的类型
print(type(iter([])))
print(isinstance({},Iterator))
print(isinstance(iter({}),Iterator))
print(type(iter({})))
print(isinstance((),Iterator))
print(isinstance("",Iterator))
print(isinstance(g,Iterator))
print(isinstance(test(),Iterator))

二、闭包

  1.构成的条件

      1.函数嵌套定义

          def funcout(num1)
       def funin(num2)
    #2. 内部函数使用外部的函数的变量
   result = num1 + num2
    # 3.外部函数的返回值为内部函数名
    return funin
def funcount(num1):
    print("funcout start")
    def funin(num2):
        print("funcin start")
        result = num1 + num2
        print("funcin end")
        return result
    print("funcout end")
    return funin
# funcin1 存储的是函数funin的地址
funcin1 = funcount(100)
print(type(funcin1))
# 调用内部函数
result1 = funcin1(200)
print(result1)
resunt2 = funcin1(1)
print(resunt2)

  2.闭包练习:   

    需求:求两个点之间的距离
  x1,y1
  x2,y2
    import math
    from math import *
    (x2-x1)**2 + (y2-y1)**2
    求a的n次幂
    pow(a,n)

    求x的平方根
    sqrt(x)
  
#from math import pow,sqrt
from math import *
# 封装函数,完成求两个点之间的距离
def getdistance(x1,y1,x2,y2):
    dis = sqrt( pow((x2-x1),2)+pow((y2-y1),2))
    return dis
print(getdistance(0,0,10,10))
print(getdistance(0,0,20,20))

# 使用闭包求两个点之间的距离
def getdisout(x1,y1):
    def getdisin(x2,y2):
        return sqrt( pow((x2-x1),2)+pow((y2-y1),2))
    return getdisin
# 得到指向内部函数的闭包
funcdis = getdisout(0,0)
# 调用闭包得到点(10,10) 距原点(0,0)的距离
print(funcdis(10,10))
print(funcdis(20,20))

  3.

  装饰器:本质闭包
  v1.0
  def func1()
  print('完成功能1')
  def func2()
  print('完成功能2')
  def func3()
  print('完成功能3')
  v2.0
  需求:使用3个功能之前,分别添加权限验证
  def func1()
  print('权限验证')
  print('完成功能1')
  def func2()
  print('权限验证')
  print('完成功能2')
  def func3()
  print('权限验证')
  print('完成功能3')
# v3.0  使用闭包进行解决
def verification():
    print("个人信息访问")
    print("权限验证")
# 使用闭包实现
def funcout(func):
    print("out start")
    def funcin():
        # 调用权限验证
        verification()
        # 掉的方法为谁?取决于参数给的谁
        func()
    print("out end")
    return  funcin
@funcout
def func1():
    print("使用功能1")
# func2 = funcout(func2)
@funcout
def func2():
    print("使用功能2")
@funcout
def func3():
    print("使用功能3")
# 封装方法,抽离出验证

# 特殊:将函数引用(函数名)做参数,来完成的闭包
# func1 = funcout(func1)
# func1()
func1()
func2()
func3()

  4.多个修饰器

  @funcout1
  @funcout2
  def test()
  return " "
def funcout1(func):
    print("开始装饰1")
    def funcin():
        return ""+func()+""
    return funcin

# 添加*的闭包
def funcout2(func):
    print("开始装饰2")
    def funcin():
        return "*"+func()+"*"
    return funcin

# 《 xxx 》
# getBookName = funcout(getBookName)
@funcout2
@funcout1
def getBookName():
    # return "105个男人与3个女人的故事"
    return "水浒传"

print(getBookName()

  5.对有参数的函数进行装饰

    固定个数的参数

def funcout(func):
    def funcin(x,y):
        print("funin start")
        func(x,y)
        print("funin end")
    return funcin

@funcout
def test(a,b):
    print("a = %d,b = %d"%(a,b))
test(1,2)

    不固定个数的参数

def funcout(func):
    # *args:表示 0,1,2,3列表都好用,**kwargs:  a=1,b=2
    def funcin(*args,**kwargs):
        print("funcin start")
        func(*args,**kwargs)
        print("funcin end")
    return funcin
@funcout
def test(a,b,c):
    print("a=%d,b=%d,c=%d"%(a,b,c))
# test(1,2,3)
@funcout
def test1(a,b):
    print("a=%d,b=%d" % (a, b))
test1(1,2)

 

 
posted @ 2018-04-12 20:43  TiAmo_yu  阅读(241)  评论(0编辑  收藏  举报