1, 函数名的应用,第一类对象
函数名可以像变量一样进行使用
1.赋值
2.作为list元素
3.作为参数
4.作为返回值
2, 闭包
内部函数访问外部函数的局部变量.
好处:
1.安全
2.常驻内存. 提高效率
# name = "wusir" # 变量写在全局是不安全的
#
# def abc():
# global name
# name ="呵呵"
# abc()
#
# def func():
# name = "alex" # 常驻内存 防止其他程序改变这个变量
# def inner():
# print(name) # 在内层函数中调用了外层函数的变量,叫闭包, 可以让一个局部变量常驻内存
# return inner
#
#
# ret = func()
# ret() # 执行的是inner()
# ret()
# ret()
# ret()
# ret()
# 闭包的好处
from urllib.request import urlopen
def but():
content = urlopen("http://www.h3c.com/cn/").read()
def inner():
print("你好啊")
# return content # 在函数内部使用了外部的变量 . 闭包
print(inner.__closure__) # 查看inner是否是闭包, 如果有东西就是闭包, 没东西就不是闭包
return inner
print("加载中........")
fn = but() # 这个时候就开始加载校花100 的内容
# 后⾯需要⽤到这⾥⾯的内容就不需要在执⾏⾮常耗时的⽹络连接操作了
content = fn() # 获取内容
print(content)
content2 = fn() # 重新获取内容
print(content2)
闭包基础结构
3, 迭代器
可迭代对象(Iterable):内部包含__iter__().
str, list, tuple, (set, dict) 字典和集合是无序的 可以迭代,但每次迭代结果的顺序都不一样
迭代器(Iterator): 内部含有__iter__() __next__()
f, range
迭代器的特点:
1.省内存
2.惰性机制
3.只能向前.
两种迭代方式:
1.for循环:
lis=['阿猫','阿狗','阿牛']
for i in lis:
print(i)
2.迭代器+异常处理机制:
lis=['阿猫','阿狗','阿牛']
it=lis.__iter__()
while True:
try:
name=it.__next__()
print(name)
except StopIteration:
break