首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Python——迭代器

当扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器模式(Iterator pattern)。C/C++这种语言并没有在语法层面直接实现迭代器模式,需要手动实现。python直接内置了迭代器模式。 python2.3中正式引入yield关键字,该关键字用来构建生成器(generator),其作用和迭代器一样。 所有生成器都是迭代器,因为生成器完全实现了迭代器接口。 迭代器用于从集合中取出元素;而生成器用于“凭空”生成元素。 不过在python中,大多数时候把迭代器和生成器视为同一个概念。在python3中,现在range()函数返回的是类似生成器的对象,而不在是列表。

02

[PHP] PHP7.4.2安全和修复版本的更改日志

核心: Windows上的预加载支持已被禁用。 修复了错误#79022(对于尚未准备好使用的类,class_exists返回True)。 修复了错误#78929(Cookie值中的加号转换为空格)。 修复了错误#78973(CV释放期间的析构函数如果从未保存opline会导致段错误)。 修复了错误#78776(来自trait的Abstract方法实现不检查“静态”)。 修复了错误#78999(将函数结果用作临时结果时发生循环泄漏)。 修复了错误#79008(在Windows上使用PHP 7.4进行常规性能回归)。 修复了错误#79002(使用__sleep序列化未初始化的类型属性会导致未序列化的问题)。 CURL: 修复了错误#79033(具有特定url和post的超时错误)。 修复了错误#79063(curl openssl不遵守PKG_CONFIG_PATH)。 Date: 修复了错误#79015(php_date.c中的未定义行为)。 DBA: 修复了错误#78808([LMDB] MDB_MAP_FULL:达到环境mapsize限制)。 Exif: 修复了错误#79046(NaN将int转换为exif中的未定义行为)。 文件信息: 修复了错误#74170(在mime_content_type之后更改语言环境信息)。 GD: 修复了错误#79067(gdTransformAffineCopy()可能使用单位化的值)。 修复了错误#79068(gdTransformAffineCopy()更改了插值方法)。 Libxml: 修复了错误#79029(在XMLReader / XMLWriter中免费使用)。 Mbstring: 修复了错误#79037(mbfl_filt_conv_big5_wchar中的全局缓冲区溢出)。 (CVE-2020-7060) OPcache: 修复了错误#78961(错误优化了重新分配的$ GLOBALS)。 修复了错误#78950(使用静态变量预加载特征方法)。 修复了错误#78903(RTD密钥冲突导致关闭导致崩溃)。 修复了错误#78986(当将ctor从不可变继承到可变类时,会发生Opcache segfaults)。 修复了错误#79040(由于ASLR,警告操作码处理程序无法使用)。 修复了错误#79055(OPcache文件缓存中的Typed属性变得未知)。 Pcntl: 修复了错误#78402(错误消息中将null转换为字符串是错误的DX)。 PDO_PgSQL: 修复了错误#78983(pdo_pgsql config.w32无法找到libpq-fe.h)。 修复了错误#78980(pgsqlGetNotify()忽略了无效连接)。 修复了错误#78982(pdo_pgsql返回无效的持久连接)。 Session: 修复了错误#79091(session_create_id()中的堆使用后释放)。 修复了错误#79031(会话反序列化问题)。 Shmop: 修复了错误#78538(shmop内存泄漏)。 SQLite3: 修复了错误#79056(sqlite在编译过程中不遵守PKG_CONFIG_PATH)。 Spl: 修复了错误#78976(SplFileObject :: fputcsv失败时返回-1)。 标准: 修复了错误#79099(OOB读取php_strip_tags_ex)。 (CVE-2020-7059) 修复了错误79000(非阻塞套接字流将EAGAIN报告为错误)。 修复了错误#54298(使用空的extra_header添加无关的CRLF)。

02

CgLib ,NCgLib 和AOP (之一)

广大关心编程前沿的程序员已经对AOP的感念耳熟能详了。无论是基于.NET的实现还是基于Java的实现都有很多开源的项目可供参考。 对AOP不了解的读者可以到我得AOP专栏,熟悉一下AOP的基本概念。     回顾AOP的历史可以看出,AOP并不是最近几年才冒出的“新”概念,据说历史可以追溯到施乐公司的一个实验室的项目。        从汇编语言,面向过程的编程,在到现在被广泛接受的OOP的编程思想,人们逐步抽象出对现实世界的描述。这每一步的进步,都使得我们对大规模的软件编程更容易控制和实现。     那么为什么到了现在AOP才受到业界广泛关注呢?     一方面OOP的编程思想相对成熟,也逐步显露出了其不能有效解决的领域,这部分需要新的思想来填充。另一方面就是程序语言的进步。     大家知道AOP的特点之一是Interception,就是拦截。比如在方法执行前,执行中,执行后动态插入一些额外的方法,典型的就是日志,权限和事务控制。     在基于虚拟机java 和 CLR 的.net 出现以前实现方法拦截,几乎不可能。 单单从Interception上说,珊瑚虫  和 木子版本的 QQ 就是一个 具有AOP特性的实现。大家有兴趣可以了解一下 珊瑚虫 或者 木子 版本的QQ的实现方式,可以说是呕心沥血,经历了无数次的重新启动和汇编测试,才实现了对QQ相关方法的拦截。     因为无论是java的字节代码,还是.net的伪编译,他们生成的都不是最终的机器代码,而是平台无关的代码,这些代码在具体执行的时候还需要翻译成机器代码才可以执行。中间语言的出现使我们对执行前的代码有了更多的控制。     正因为如此AOP的理论有了实现的可能,这个时候出现可谓水到渠成。     一般来讲AOP的实现有3种途径:     1 在编译成中间代码前就让代码具有AOP的特性,比如AspectWikez;     2 使用语言特性,从设计方法出发,实现AOP,比如基于Java 的动态代理实现AOP。(见我得南宁系列文章);     3 在中间代码运行时,动态修改中间代码,使其具有AOP特性。     上面3种方法的有缺点我认为有几下几点:     采用的一种方法,一般需要编译器的扩充支持,如同C编译器的出现代替汇编一样,需要长时间的验证其稳定性和效率。另外对于最终开发人员来说也需要学习这些编译器,或者新的语法指令完成这些功能,当然功能也最强大。     第2种方法,我认为是一种轻量级别的实现,比如Nanning 和 DynAOP 等,一般这样的实现需要在设计上下功夫。比如需要基于接口编程。对于已有的项目来说,改动量非常大。     第3种方法,介于1,2种方法之间。采用第3种方法实现AOP,不需要每个类都有一个接口,也没有什么编译器的更改。他的缺点是需要高超的编程技巧。正因为如此,才有很多项目用第3种方法包装后,给最终开发人员使用比如:Spring。     实际上Spring 的AOP实现种第1,2种方法都采用了。     我认为目前的项目种,大规模的采用AOP还不适合,一方面AOP还在发展之中,另一方面支持AOP的框架还没有被广泛的接受。     正因为如此我们不妨直接操作中间代码,在项目的一些关键地方实现一些AOP的特性。     那在Java的世界中可以用cglib,Javassist 等     在.net的世界中可以用ncglib。     下文我们来给出一些代码例子。     (待续)

04
领券