day11 闭包和迭代器

# 今日主要内容
# 1. 第一类对象, 函数名的使用
#
# 函数名就是变量名, 函数名存储的是函数的内存地址
#     函数名的作用
      1. 直接打印函数名, 不执行, 可以查看内存地址(print(func) )
      2. 可以把函数当成一个变量赋值给另一个变量 (例如: a=func a() )
      3. 可以做容器类元素 (例如:lst=[func1(), func2(), func3()])
      4. 可以做函数的参数
def chi(fn):  #fn 代理了func1 和func2
    print('开挂')
    fn()
    print('洗包')
def func1():
    print('我是func1')

def func2():
    print("我是func2")

chi(func2)
View Code

      5. 可以做函数的返回值

def outer():
    def inner():
        print("我是可怜的inner")
    return inner # 函数名可以作为返回值
ret = outer()
ret()
View Code

# 变量的命名规范:
# 1. 由数字, 字母, 下划线组成
# 2. 不能是数字开头, 更不能是纯数字
# 3. 不能用关键字
# 4. 不要太长
# 5. 要有意义
# 6. 不要用中文
# 7. 区分大小写
# 8. 驼峰或者下滑线
# 2. 闭包
# 闭包: 在内层函数中引入外层函数的变量(变量不在全局作用域)
# 作用:
# 1. 保护变量不受侵害(javascript有重要用途)
# 2. 让一个变量常驻内存
      检测是否是闭包:
def func1():
    name = "alex"
    def func2():
        print(name) # 闭包
    func2()
    print(func2.__closure__) # (<cell at 0x10c2e20a8: str object at0x10c3fc650>,)
func1()
# 如果返回None 则不是闭包
View Code
#     3. 迭代器
# dir() 查看变量能够执行的方法(函数)
# Iterator: 迭代器(本身可迭代), __iter__(), __next__()
# Iterable: 可迭代的, __iter__()
#     判断是否可迭代方法
# collections 关于集合类的相关操作
# Iterable : 可迭代的
# Iterator : 迭代器
from collections import Iterable, Iterator
lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"]

print(isinstance(lst, Iterable))  # True
print(isinstance(lst, Iterator))  #False
View Code

# for循环的流程:
# it = lst.__iter__() #迭代器 一次性的,如果放入循环体,每次将启用新的迭代器
# while 1:
# try:
# el = it.__next__()
# for循环的循环体
# except StopIteration:
# break
# 从迭代器中获取数据的唯一方法: __next__()
#
# 三个特征:
# 1. 省内存
# 2. 惰性机制
# 3. 只能往前. 不能后退
原文地址:https://www.cnblogs.com/Knight-huang/p/9883891.html