函数名, 闭包, 迭代器
一. 函数名
函数名是一个特殊变量, 加了()可以执行函数.
函数名的命名规范和变量是一样的.
函数名可以赋值给其他变量, 其它变量加上()也可以运行函数, 其他变量也可以赋值给函数名, 打应函数名会输出其他变量名
函数名可以存在列表中lst = [func1, func2], 可作为参数传递给函数func1(func2), 作为函数的返回值return func2, 可以被重新赋值def func(): pass func = 1 print(func) => 3.
func()()先运行func()再在返回值上加()
二. 闭包
闭包: 在内层函数中访问外层函数的局部变量
好处: 保护变量不受外界影响, 可以让变量常驻内存
def outer():
a = 10
def inner():
print(a)
return inner
def outer(): a = 10 def inner(): print(a) return 5 return inner
a = 20
fun = outer() print(fun()) print(a) # 10 # 5 # 20
from urllib.request import urlopen def outer(): s = urlopen("http://www.xiaohua100.cn/index.html").read() def getContent(): return s return getContent print("爬取内容.....") qwe = outer() asd = 1 while 1: print(outer()()) print(asd) asd += 1
经过尝试: 在while1: print(outer()())时, 用第一层函数的变量s被爬虫爬取网页内容赋值时, 且在后面写了qwe = outer()时, 当拔取网线, 会停止输出. 判断为print(outer()())并没有用常驻内存的变量的值, 而是重新获取了变量的值. 与qwe = outer() print(qwe())时, 直接使用常驻内存的fun = outer()的变量不同. print(outer()())每次运行都会每次都给s赋一次值, 而print(qwe())是执行函数里面的getContent, s的赋值已经在之前的qwe = outer()赋值完了, 执行print(qwe())时, 并没有再给s赋值.
三.迭代器
使用dir来查看该数据包含了哪些方法
lst = []
print(dir(lst))
用来遍历列表, 字符串, 元组...可迭代对象
可迭代对象: Iterable, 有__Iter__获取迭代器, 没有__next__
迭代器: Iterator, 有__Iter__获取迭代器, 有__next__
特点:
只能向前
惰性机制
省内存
it = lst.__iter__()
while 1:
try:
data = it.__next__()
print(data)
except StopIteration:
break
判断数据是否可迭代:
print('__iter__' in dir(lst.__iter__()))
print('__next__' in dir(lst.__iter__()))
官方方案:
from collections import Iterable # 可迭代对象
from collections import Iterator # 迭代器
print(isinstance(lst, Iterable))
print(isinstance(lst, Iterator))
print(isinstance(lst.__iter__(), Iterable))
print(isinstance(lst.__iter__(), Iterator))
lst.__iter__().__next__()只能一次迭代一个