zoukankan      html  css  js  c++  java
  • day11-2018-10--31 第一类对象.闭包,迭代器

    # def __():
    #     pass
    # __()
    
    # a = 10
    # b = a
    # print(b)
    
    
    # def a():
    #     print("我是可怜的a")
    #
    # b = a
    # print(b)
    #
    # b() # 可以正常的使用
    
    # def func1():
    #     print("我是可怜的func1")
    #
    # def func2():
    #     print("我是可怜的func2")
    #
    # def func3():
    #     print("我是可怜的func3")
    #
    # lst = [func1, func2, func3]
    # # print(lst)
    # for el in lst:
    #     el()
    
    #
    # def outer():
    #     def inner():
    #         print("我是可怜的inner")
    #
    #     return inner # 函数名可以作为返回值
    #
    #
    # ret = outer()
    # ret()
    
    
    # 代理模式
    # 装饰器的雏形
    # 把函数名当成变量来使用
    def chi(fn): # fn 代理了func1和func2
        print("开挂")
        fn()
        print(fn.__name__)
        print("洗包")
    
    def play_dnf():
        print("疯狂的刷")
    
    def func1():
        print("我是func1")
    
    def func2():
        print("我是func2")
    
    def he():
        print("我要喝酒")
    
    chi(he)
    
    
    
    
    # def outer():
    #     def inner():
    #         print("哈哈")
    #     return inner
    # outer()()
    if __name__ == '__main__':
        bs = b'éx9dx9e常æx8a±æxadx89ï¼x8cæxad¤æ¬¡æ´»åx8a¨é¢x86åx8fx96次æx95°å·²è¾¾æx9cx80大ï¼x8cä¸x8dèx83½é¢x86åx8fx96ï¼x81'
        print(bs.decode("gbk"))
    # 保护我们的变量
    # 必须是局部变量
    
    
    # a = 10 # 全局的东西都是不安全的
    #
    # def func1():
    #     print(a)
    #
    # def func2():
    #     print(a)
    #
    # func1()
    #
    # # 你的同事搞事情
    # def func3():
    #     global a
    #     a = 20
    #
    # func3()
    #
    # func2()
    
    # def func():
    #     a = 10 # 安全的
    #     def func2():
    #         print(a)
    #     def func3():
    #         print(a)
    #     def func4():
    #         nonlocal a
    #         a = 20
    
    #  闭包: 内层函数对外层函数的变量的使用
    #  作用:
    #     1. 保护我们的变量不受侵害
    #     2. 可以让一个变量常驻内存.
    
    # def outer():
    #     # a = 10
    #     def inner():
    #         print("哈哈")
    #     print(inner.__closure__) # (<cell at 0x000001C079677588: int object at 0x0000000054776D30>,)
    #     return inner
    #
    # ret = outer()
    # # 1800行代码...
    # ret() # 由于inner函数执行的时机是不确定的. 必须要保证innter可以正常执行. 必须把a保留到最后
    
    
    # #  爬虫 (low版本)
    # from urllib.request import urlopen # 打开一个连接用的模块
    # # 外层函数
    # def but():
    #     # 打开连接. 读取源代码
    #     content = urlopen("http://www.cctv.com/").read() # 永久驻留在内存
    #     # 内层函数
    #     def get_content():
    #             # 返回content
    #         return content
    #     return get_content # 内层函数
    #
    # fn = but() # 这里会很慢. 需要网络请求
    # print(fn()) # 不会再进行网络请求了
    # print(fn())
    
    
    # 关联的小点
    # def func(a, b):
    #     '''
    #     文档注释
    #     这个函数用来计算两个数的和并返回
    #     :param a: 第一个数
    #     :param b: 第二个数
    #     :return:  第一个数和第二个数的和
    #     author:sylar
    #     date:2018-10-31
    #     '''
    #     print("我是func")
    #     return a + b
    # print(func.__doc__) # document 文档注释
    # print(func.__name__) # name 名字 获取函数名
    
    
    def func1():
        def func2():
            def func3():
                print("嘿嘿")
            return func3
        return func2
    func1()()()
    
    # 迭代器
    def func():
        a = 10
        def aa():
            print("哈哈")
        return aa
    ret = func()
    ret()
    
    # 天行健, 君子以自强不息   ->  飞龙在天  -> 易经 -> 乾
    # 地势坤, 君子以厚德载物   ->  亢龙有悔  -> 易经 -> 坤
    # 最早的二进制
    # 百分之百准 -> 周易江湖
    # 苏武牧羊
    # 结果: 不好.
    
    # 物极必反
    # 庄子
    # 鬼谷子 -> 厚黑学
    
    # 做好人
    # print(dir(str)) # 查看str能够执行的操作. 内部的方法
    # __iter__  字符串可以被迭代. 发现了__iter__
    # print(dir(list))
    # print(dir(open("x",mode="w"))) # int中没有__iter__
    
    #  简单的下一个结论. 主要这个数据类型可以执行__iter__ 可以被迭代的数据类型
    # lst = ["汉高祖", "清高祖", "明高祖", "哈哈", "娃哈哈", "爽歪歪"]
    # it = lst.__iter__() # <list_iterator object at 0x000001ED54B17128> iterator 迭代器
    # print(it)
    # print(dir(it)) # 迭代器本身是可迭代的
    # 可以使用__next__获取数据
    # print(it.__next__()) # 汉高祖
    # print(it.__next__()) # 清高祖
    # print(it.__next__()) # 明高祖
    # print(it.__next__()) # 明高祖
    # print(it.__next__()) # 明高祖
    # print(it.__next__()) # StopIteration 迭代器中没有元素了.
    
    # for循环内部的代码
    # it = lst.__iter__() # 获取新的迭代器
    # while  1:
    #     try:
    #         el = it.__next__()
    #         print(el)
    #     except StopIteration:
    #         print("结束了")
    #         break
    
    # 三个特点:
    #   1. 节省内存 (生成器)
    #   2. 惰性机制, 必须用__next__()来获取数据
    #   3. 只能往前. 不能后退
    
    # it = lst.__iter__()
    # print(it.__next__())
    # print(it.__next__())
    # print(it.__next__())
    # print("回去")
    # it = lst.__iter__() # 重新获取迭代器
    # print(it.__next__())
    
    # list(内部有for循环)
    # for内部 迭代器
    
    # lst = [1,55,5,55,5,5,5,555,55,555]
    # ll = list(set(lst))
    # print(ll)
    #
    #
    # list(1) # 'int' object is not iterable
    
    #  如何判断一个数据是否是可迭代对象
    #  1. dir() ->  __iter__  可迭代的
    #     dir() -> __next__  迭代器
    # lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"]
    # print("__iter__" in dir(lst)) # True 可迭代的
    # print("__next__" in dir(lst)) # False 不是迭代器
    #
    # print("__iter__" in  dir(int))
    # print("__next__" in  dir(int))
    #
    # it = lst.__iter__() # 迭代器
    # print("__iter__" in dir(it)) # True  迭代器本身就是可迭代的
    # print("__next__" in dir(it)) # True
    lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"]
    
    # collections 关于集合类的相关操作
    # Iterable : 可迭代的
    # Iterator : 迭代器
    from collections import Iterable, Iterator
    print(isinstance(lst, Iterable)) # True
    print(isinstance(lst, Iterator)) # False
    
    print(isinstance({1,2,3}, Iterable)) # True, 可以使用for循环
  • 相关阅读:
    九度OJ 1035:找出直系亲属(二叉树)
    while 循环的理解
    while 循环的理解
    count 变量的使用
    count 变量的使用
    数据结构与算法的实现 —— 结点定义与数据结构的选择
    数据结构与算法的实现 —— 结点定义与数据结构的选择
    最小生成树(MST,minimum spanning tree)
    最小生成树(MST,minimum spanning tree)
    Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
  • 原文地址:https://www.cnblogs.com/VastTry/p/9883138.html
Copyright © 2011-2022 走看看