zoukankan      html  css  js  c++  java
  • 13 Python之第一类对象闭包和迭代器

     
    def fn():
        print("我叫fn")
    fn()
    print(fn)## <function fn at 0x0000000001D12E18>
    fn()
    gn = fn #函数名可以进行赋值
    print(gn)# <function fn at 0x0000000001D12E18>
    gn()
     
    fn = 666
    print(fn) #666
     
    def func1()
        print("朱祁镇")
    def func2()
        print("徐杰")
    def func3():
        print("王阳明")
    def func4():
        print("魏忠贤")
     
    lst = [func1,func2,func3,func4]#函数+() 就是调用
    print(lst)
     
    lst[0]()
    for el in lst:  #el是列表中的每一项
        el() #拿到的是函数.  执行函数
    def wrapper():
        def inner():
            print("哈哈哈")
        return inner#函数名可以像返回值一样返回
    ret = wrapper()  #接收的是inner函数
    ret() #调用函数inner  在函数外面访问了函数内部的函数
    函数可以作为参数进行传递
    def func1():
        print("谢晋")
     
    def func2():
        print('杨士奇')
     
    def func3():
        print('徐渭')
     
    def func4():
        print("柳如是")
    #代理.装饰器的雏形
    de proxy(a)
        print("我是代理")
        a()
        print("代理执行完毕")
    proxy(func1)
    proxy(func2)  #将函数当做参数进行传参
     
     
    闭包
     
    闭包的优点
    1.可以保持变量不被其他人侵害
    2.保持一个常量常驻与内存
    def wrapper():
        a = "哈哈" #如果把a放到全局作用域是不安全的一种写法,因为好多内容用着同一个变量,则把它放到一个局部作用域中
        name = "周杰伦"
        def inner
            print(name)#在内层函数中使用了外层的函数的局部变量 
            print(a)
        return inner  #返回函数名
     
    ret = wrapper()  #ret是inner函数
    ret()  #调用函数
     
    def wrapper():
        name = "周杰伦"  #局部变量常驻与内存
        def inner():
            print(name) #在内层函数中使用外层函数的局部变量
        return inner  #返回函数名
            #inner()
    ret = wrapper()  #ret是一个内层函数
    ret()  #ret是inner,执行的时机是不确定的,必须保证里边的name是存在的
     
    #超级简单的爬虫
    from urllib.request import urlopen  #导入一个模块
     
    def func():
            #获取到网页中的内容,当网速很慢的时候.反复的打开这个网站 很慢
        content = urloppen("https://www.dytt8.net/").read()
        def inner():
            return  content.decode("gbk")  #网页内容
        return inner
    print("开始网络请求")
    ret = func()  #网络请求已经关闭
    print("网络请求完毕")
    print("第一次",ret())
    print("第二次",ret()) #加载到内存  不用每次都进行网络请求 直接进行内存的调用  但是变量多的话  内存可能撑不下 
     
     
    def wrapper():
        name = "alex"
        def inner():
            print("name")
        print(inner.__closure__)  #查看是否闭包.有内容就是闭包,没有内容就不是闭包
        inner()
    wrappe()
     
    迭代 
     
    s = "今天下午考试,你们还要睡觉吗 "
    for c in s: #字符串是一个可迭代对象
        print (c)
     
    for i in 123: # 'int' object is not iterable整型是不可以迭代的
        print(i)
    dir(对象)  #可以帮我们查看xxx数据能够执行的操作
    print(dir(str))  #__iter__  
    字符串 列表 字典 元组 集合 是可以迭代的  
    int 和 bool 是不可以迭代的
    共性:所有带有__iter__的东西可以进行for循环,带有__iter__的东西就是可以迭代的
    lst = ["贾樟柯", "李安", "杨德昌", "王家卫"]
    it = lst.__iter__() #拿到的是迭代器 
    print(it.__next__()) #下一个
    print(it.__next__()) #下一个
    print(it.__next__()) #下一个
    print(it.__next__()) #下一个
    print(it.__next__()) #下一个 会报错  stopinteration  停止迭代
    ##想回去只能重新获得迭代器
    1.只能项下执行,不能反复
    2.结束的时候会扔给我们一个错误  stopiteration
    3.整合所有的数据类型进行遍历 (int,bool除外)
    用while循环来模拟for循环
    it = list.__iter__()
    while 1:
            try:
                el = it.__next__:  #拿数据
                print(el)
            except stopiteration:  #出现错误说明数据拿完了 
                break  #退出循环
     
    官方通过代码判断是否是迭代器
    借助于两个模块  Iteration 迭代器,iterable 可迭代的
    from collections import iterable,iterator
    lst = [1,2,3]
    print(lst.__next__())
    print(isinstance(lst, Iterable)) # xxx是否是xxx类型的. True
    print(isinstance(lst, Iterator)) # False
     
    迭代器一定是可迭代的,可迭代的东西不一定是迭代器
    isinstens(参数,iterable)  判断xxx是不是某某类型 
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    mysql 主从配置
    doGet和doPost的区别
    我的第一个MVC项目
    c3p0xml配置详解
    c3p0连接数据库
    java加载资源文件
    Windows上部署Python
    Windows上部署Python
    NagiosQL安装
    Nagios Windows客户端NSClient++ 0.4.x安装配置
  • 原文地址:https://www.cnblogs.com/a2534786642/p/10099037.html
Copyright © 2011-2022 走看看