# 今日主要内容
# 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)
5. 可以做函数的返回值
def outer(): def inner(): print("我是可怜的inner") return inner # 函数名可以作为返回值 ret = outer() ret()
# 变量的命名规范:
# 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 则不是闭包
# 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
# for循环的流程:
# it = lst.__iter__() #迭代器 一次性的,如果放入循环体,每次将启用新的迭代器
# while 1:
# try:
# el = it.__next__()
# for循环的循环体
# except StopIteration:
# break
# 从迭代器中获取数据的唯一方法: __next__()
#
# 三个特征:
# 1. 省内存
# 2. 惰性机制
# 3. 只能往前. 不能后退