函数名的使用,闭包函数和迭代器

1. 函数名的应用(第一类对象)
  函数名的命名规范和变量是一样的,函数名其实就是变量名,他是一个特殊的变量,与()配合可以执行函数的变量

def func():
    print("我是一个小小的函数")
a = func        #把函数名名赋值给变量a
print(a)        #<function func at 0x000000AE20BB1E18>    此处打印的是内存地址

func()        #我是一个小小的函数    与括号使用,调用函数
a()            #我是一个小小的函数

func = 3    #也可以赋值,但是结果就变成3了
print(func)        

  可以作为列表中的元素进行存储.

def func1():
  pass
def func2():
  pass
lst = [func1, func2]  #把函数名存在列表里
for el in lst:
el()  #调用函数

  可以作为参数传递给函数.

def func():
    pass
def proxy(fn):
    fn()
proxy(func)  ## 把函数名作为参数传递给另一个函数

  可以作为函数的返回值

def func():
    def inner():
        pass
    return inner
func()()            #调用inner函数,在外部调用内部inner函数!


2. 闭包
  闭包:在内层函数中访问外层函数的局部变量
  好处:
    1. 保护你的变量不受外界影响

a = 10 
def outer():
    global a
    a = 20
def outer_2():
    global a
    a = 30
outer_2()
outer()
print(a)  #a的值一直在改变,非常不安全,调用的顺序不一样,结果也不一样
def outer():
    a = 10
        def inner():
            print(a)
    return inner                #而函数里的变量a,除了在函数内部可以改变,外界是无法改变的.

    2. 可以让变量常驻内存

def f1():
    a=10
    def f2():
        print(a)  #a是外层f1中的变量
    return f2
b=f1()    #把值赋值给b,因为不知道b什么时候用,所以上面的变量a要常驻内存,为了f2执行的时候有值.
b()        #调用内部函数,

3. 迭代器
  使用dir来查看该数据包含了那些方法

print(dir(str)) #有__iter__  
print(dir(int)) # 没有__iter__
#所有的带__iter__可以使用for循环的, 可迭代对象

  可迭代对象可以使用__iter__()来获取到迭代器
      可迭代对象: Iterable, 里面有__iter__()可以获取迭代器, 没有__next__()
      迭代器: Iterator, 里面有__iter__()可以获取迭代器, 还有__next__()

a='我想吃花甲粉,但是贫穷限制了我都购买力'
b=a.__iter__()
print(b.__next__())    #我
print(b.__next__())    #想
print(b.__next__())    #吃

  迭代器特点:
    1. 只能向前.  #下一个,下一个,找上一个
    2. 惰性机制.  #print一回往前去一个值
    3. 省内存(生成器)

for循环的内部机制.
  1. 首先获取到迭代器.
  2. 使用while循环获取数据
  3. it.__next__()来获取数据
  4. 处理异常 try:xxx except StopIteration:

a='该吃饭了,晚上吃啥?'
it=a.__iter__()     # 获取迭代器
while 1:
    try:            # 尝试执行
        b=it.__next__()  #获取下一个元素
        print(b)
    except StopIteration:   #处理错误
        break

isinstance()是否是某个类型的实例

from collections import Iterable  # 可迭代对象
from collections import Iterator    # 迭代器

print(isinstance(it, Iterable))  #True
print(isinstance(it, Iterator))  #True
print(isinstance('123',str)  #True

  

 

猜你喜欢

转载自www.cnblogs.com/amber-liu/p/9456518.html