zoukankan      html  css  js  c++  java
  • 函数名的使用-闭包-迭代器

    函数名的使用及第一类对象
    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
  • 相关阅读:
    七 使用list和tuple
    python 操作RabbitMQ
    python 操作Memcached
    python 操作SQLAlchemy
    Scrapy 分布式爬虫
    Django 测试驱动开发
    Flask 页面缓存逻辑,jinja2 过滤器,测试器
    Flask Markup 上下文,request
    Flask 学习 十六 部署
    Flask 学习 十五 性能
  • 原文地址:https://www.cnblogs.com/sandy-123/p/10256909.html
Copyright © 2011-2022 走看看