本节主要内容: 1.函数名的使用以及第一类对象 2.闭包 3.迭代器
一.函数名的运用. 函数名是一个变量,但是它是一个特殊的变量,与括号配合可以执行函数的变量.
1.函数名的内存地址
1 def func():
2 print("呵呵")
3 print(func) 结果:<function func at 0x000001A2B5D61F28>
2.函数名可以赋值给其他变量
def func():
print("呵呵")
print(func)
a=func #把函数当成一个变量赋值给另一个变变量
a()
3.函数名可以当做容器类的元素
def func1():
print("呵呵")
def func2():
print("呵呵")
def func3():
print("呵呵")
def func4():
print("呵呵")
lst=[func1,func2,func3]
for i in lst:
i()
4.函数名可以当做函数的参数
def func():
print("吃了么")
def func2(fn):
print("我是func2")
fn()
print("我是func2")
func2(func) #把函数func当成参数传递给func2的参数fn.
5.函数名可以作为函数的返回值
def func_1():
print("这里是函数1")
def func_2():
print("这里是函数2")
print("这里是函数1")
return func_2
fn=func_1() #执行函数1.函数1返回的是函数2,这是fn指向的就是上面函数2
fn() #执行上面返回的函数
二.闭包 什么是闭包?闭包就是内层函数,对外层函数(非全局)的变量的引用.叫闭包
def func1():
name="alex"
def func2():
print(name)
func2()
func1() #结果:alex
我们可以使用__closuer__来检测函数是否是闭包.使用函数名.__closure__返回cell就是
闭包.返回NOne就不是闭包
def func1():
name="alex"
def func2():
print(name) #闭包
func2()
print(func2.__closure__) #(<cell at 0x00000240416D8588: str object at 0x00000240417670D8>,)
func1()
问题,如何在函数外边 调用内部函数呢?
def outer():
name="alex"
# 内部函数
def inner():
print(name)
return inner
fn=outer() #访问外部函数,获取到内部函数的函数地址
fn() #访问外部函数
那如果多层嵌套呢?很简单,只需要一层一层的往外层返回就行了
def func1():
def func2():
def func3():
print("嘿嘿")
return func3
return func2
func1()()()
from urllib.request import urlopen
def but():
content=urlopen("heep://www.xiaohua100.cn/index.html").resd()
def get_content():
return content
return get_content()
fn=but() #这个时候就开始加载校花100的内容
后面需要用到这里面的内容就不需要在执行非常耗时的网络连接操作了
content=fn() #获取内容
print(content)
content2=fn() #重新获取内容
print(content2)
综上,闭包的作用就是让一个变量能够常驻内存.供后面的程序使用.
三.迭代器
s="abc"
for c in s:
print(c)
for i in 123:
print(i) 结果:TypeError: 'int' object is not iterable
翻译过来就是整数类型对象是不可迭代的.iterable表示可迭代的.表示可迭代协议.那么如何验证符合可迭代协议.我们可以通过dir函数来查看类中定义好的所有方法.
s="我的哈哈哈"
print(dir(s))
print(dir(str))
在打印 结果中,寻找__iter__如果能找到.那么这个类的对象就是一个可迭代对象
我们发现在字符串可以找到__iter__.继续看一下list,tuple,dict,set
print(dir(tuple))
print(dir(list))
print(dir(open("护士少妇嫩模.txt")))#文件对象
print(dir(set))
print(dir(dict))
我们可以通过isinstance()函数来查看一下对象是什么类型
l=[1,2,3]
l__iter__=l.__iter__()
from collections import Iterable
from collections import Iterator
print(isinstance(l,Iterable))# True
print(isinstance(l,Iterator))#False
print(isinstance(l__iter__,Iterator))#True
print(isinstance(l__iter__,Iterator))#True
如果对象中有__iter__函数.那么我们认为这个对象是遵守可迭代协议.就可以获取到相应的迭代器
s="我爱天安门"
# c=s.__iter__() #获取迭代器
# print(c.__next__()) #使用迭代器进行迭代.获取一个元素
# print(c.__next__())
# print(c.__next__())
# print(c.__next__())
# print(c.__next__())
# print(c.__next__()) #StopIteration
for i in [1,2,3]:
print(i)
lst=[1,2,3]
lst_iter=lst.__iter__()
while True:
try:
i=lst_iter.__next__()
print(i)
except StopIteration:
break