12 函数名的应用 闭包 迭代器

主要内容:

1. 函数名的应用,第一类对象

  函数名可以像变量一样使用

  a . 函数名的内存地址

# 1.函数名的内存地址
def func():
    print("呵呵")
print(func)
# 结果: <function func at 0x1101e4ea0>

  b. 函数名可以赋值给其他变量 

#2函数名可以赋值给其他变量
def func():
    print("呵呵")
a = func    # 把函数当成⼀个变量赋值给另一个变量
a()         # 函数调用 func()

  c. 作为list元素

def f1():
    print("我是马化腾")
def f2():
    print("我是马云")
def f3():
    print("我是马赛克")
lst = [f1(),f2(),f3()]
print(lst) 
'''我是马化腾        #调用f1的结果
我是马云             #调用f2的结果
我是马赛克           #调用f3的结果
[None, None, None]   #因为函数没有返回值,返回none

    可以用for循环遍历列表中的元素

def f1():
    print("我是马化腾")
def f2():
    print("我是马云")
def f3():
    print("我是马赛克")
lst = [f1,f2,f3]    #循环遍历列表
for c in lst:
    c()             #调用每一个函数
''' 我是马化腾
    我是马云
    我是马赛克
'''

   函数名可以当作函数的参数.

# 函数名可以当作函数的参数
def func():
    print("吃了么")
def func2(fn):
    print("我是func2")
    fn()    # 执⾏行行传递过来的fn    #
    print("我是func2")
func2(func)     # 把函数func当成参数传递给func2的参数fn.

   作为返回值

# def func():
#     def inner():
#         print("火锅不让吃了. 吃了上火")
#     return inner
# ret = func()    # 这里func()执行之后获取到的是inner函数
# ret()   # 这里是让inner函数执行

2. 闭包:内部函数访问外部函数的局部变量

def func():
    name = "alex"   # 常驻内存  防止其他程序改变这个变量
    def inner():
        print(name) # 在内层函数中调用了外层函数的变量,叫闭包, 可以让一个局部变量常驻内存
    return inner
ret = func()
ret() # 执行的是inner()

  使用__closure__来检测函数是不是闭包,使用函数名.__closure__,返回cell是闭包,返回none就不是闭包.

def func1():
    name = "alex"
    def func2():
        print(name)     # 闭包
    func2()
    print(func2.__closure__)    # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,)
func1()
# alex
# (<cell at 0x0000019CE3567588: str object at 0x0000019CE35F8148>

  好处:

   安全

   常住内存,提高效率

3. 迭代器

  dir()来查看一个对象,数据类型中包含了哪些东西

lst = [1,2,3]
print(dir(lst))
s = '王尼玛'
print('__iter__'in dir(s))
print('__iter__'in dir(lst))
print('__iter__'in dir(123))

  isinstance(对象,类型)                  判断什么对象是否是什么类型

lst = [1,2,3]
from collections import Iterable     #可迭代的
from collections import Iterator     #迭代器
print(isinstance(lst,Iterable))
print(isinstance(lst,Iterator))

  

lst = [1,2,3]
from collections import Iterable     #k可迭代的
from collections import Iterator     #迭代器
it = lst.__iter__()
print(isinstance(it,Iterable))   #判断是否是可迭代的,迭代器一定是可迭代的
print(isinstance(it,Iterator))   #迭代器里面一定有__next__(),__iter__()
print('__iter__'in dir(lst))    #确定是可迭代的
print('__next__'in dir(lst))    #确定不是一个迭代器  

  可迭代对象(iterable):内部包含__iter__().

  迭代器(iterator):内部含有__iter__和__next__

  可迭代对象: str  list  tuple  set  dict  range

  迭代器:   f(句柄)  

  模拟for循环

lst = ["皇阿玛", "皇额娘", "容嬷嬷", "紫薇"]
# 模拟for循环
it = lst.__iter__()               #获取迭代器
while True:
    try:
        name = it.__next__()      #迭代器往外拿元素
        print(name)
    except StopIteration: # 拿完了
        break

  迭代器的特点:

    省内存

    惰性机制

    只能向前

  

原文地址:https://www.cnblogs.com/gyh412724/p/9325424.html