Tenth 函数名/闭包/迭代器/

1、函数名:

    1)函数名是一个特殊的变量

    2)函数名可以当作变量赋值

    3)函数名可以当作容器数据类型的元素

    4)函数名可以当作函数的参数

    5)函数名可以当作函数的返回值

2、闭包:

      1)内层函数对外层函数(非全局)变量的引用

    2)闭包只存于内层函数中

    3)函数都要逐层返回,最终返回给最外层函数

  闭包:解释器执行程序时,如果遇到函数,随着函数的结束而关闭临时名称空间,但是!

如果遇到闭包,那么闭包的空间不会随着函数的结束而关闭

# 闭包模板
def wrapper(step):
    num = 1
    def inner():
        nonlocal num
        num += step
        print(num)
    return inner
f = wrapper(3)
j = 0
while j < 5:
    f()
    j+=1
# 输出结果为 4 7 10 13 16 

    闭包就是在内存中开一个空间,常贮存一些内容,以便后续程序调用

3、迭代器(iterable:可迭代对象)节省内存、惰性机制、一条路走到黑

    可迭代对象:

      1)内部含有__iter__方法的就是可迭代对象,遵循可迭代协议

      2)可迭代对象不能直接取值

      判断一个对象是否是可迭代对象方法一:

# 模板
s1 = 'abcd'
print('__iter__' in dir(s1))    # dir 是显示以字典形式的所有方法

      方法二:

# 模板
from collections import Iterable
print(isinstance(obj,Iterable))

    迭代器:内部含有'__iter__' 并含有'__next__'方法的就是迭代器,遵循迭代器协议

      可迭代对象转换成迭代器:

# 可迭代对象.__iter__() 或者iter(可迭代对象)
s1 = 'abcd'
obj = s1.__iter__()

obj = iter(s1)
print(obj.__next__())
print(obj.__next__())
# 一个next 对应一个值,一一对应

      判断是否为迭代器方法一:

print('__iter__' in dir(obj) and '__next__' in dir(obj)) #判断两个方法是否在obj中

      判断是否为迭代器方法二:

from collections import Iterator
print(isinstance(obj, Iterator))

4、type() 与 isinstance()的区别  

    type()只是判断该对象的数据类型

    isinstance()不仅可以判断该对象的数据类型,而且可以判断其他很多。

5、while 循环模拟 for 循环机制

l1 = [print(i) for i in rang(20)]    # 此为 for 循环

s1 = '12345'
obj = iter(s1)
while 1:
    try:
        print(next(obj))
    except StopIteration:
        break

 

posted @ 2019-01-02 14:56  pythonernoob  阅读(118)  评论(0)    收藏  举报