函数名的使用-闭包-迭代器

函数名的使用及第一类对象
def func():

  pass

print(func())     调用

print(func)       查看函数的内存地址

函数名的使用:

1.函数名可以当做值赋值给变量

def func():
  print(1)
a=func    
a()
func() 

结果:
1
1

2.函数名可以当做参数去传递   注意传递函数名的时候不能加(),如果加了()就是在传递这个函数的返回值

def func():
  pass
def func2(msg):
    print(msg)
func2(func)

结果:
<function func at 0x0000023EBD721E18>   #func的内存地址

3.函数名可以当做返回值被返回     注意当返回值的时候不能加括号

def foo():
    print(2)
def func(msg):
    print(1)
    return msg    
print(func(foo)) 

结果:
1
<function foo at 0x00000135B65F1E18>

#将foo传参给msg,return msg就是返回foo的内存地址 结


4.函数名可以当做元素存放在一个容器当中

def foo():
    print(1)
def func():
    print(2)
def func2():
    print(3)
print(func2())
lst = [foo,func,func2] 
print(lst)

结果:
3
None
[<function foo at 0x000001EFF0F91E18>, <function func at 0x000001EFF11688C8>, <function func2 at 0x000001EFF1168950>]

闭包

闭包:在嵌套函数里,并且内部函数使用外部变量(非全局变量)就是闭包.

使用函数名.__closure__ 获取的内容   不是None,就说明是闭包

一般在函数调用完后,内存空间就会消失

闭包好处:

1.保护变量不被外界修改

2.生命周期延长

3.节省开辟空间和销毁空间的时间差,提高效率

应用场景:
爬虫             import requests

迭代器

可迭代对象:

1.遵守可迭代对象的协议

2.具有__iter__方法

除去整型和布尔值,剩下现已知的数据类型都是

print(dir(str)            dir : 查看这个类型中有什么功能

迭代器:
1.遵守迭代器协议

2.具有__iter__()方法和__next__()方法

创建一个迭代器 :  可迭代对象.__iter__()

使用迭代器 :          迭代器.__next__()

l1 = lst.__iter__().__next__()

for循环就是一个迭代器

for循环的机制

lst = [1,2,3,4,5]
count = 0
l = lst.__iter__()
while count < len(lst):
    print(l.__next__())
    count += 1

特点:

1.迭代器不能回退

2.迭代器是惰性的

3.迭代器是一次性的

查看是迭代器还是可迭代对象:

from collection inport Iterator,Iterable

print(isinstance('查看的内容',Iterator))     查看是不是迭代器

print(isinstance('查看的内容',Iterable))     查看是不是可迭代的

迭代器一定是可迭代的,但是可迭代的不一定是迭代器

try:                         异常捕获 捕捉错误

except   

lst = [1,2,3,4,5]
l = lst.__iter__()
while True:
    try:    
    print(l.__next__())
    except    StopIteration
原文地址:https://www.cnblogs.com/sandy-123/p/10256909.html