A Coder is a Poet

Kaiyuan Blog

Python 常用模块记录

什么是常用函数?经常使用又经常忘记的函数就是常用函数。

下图中展示了本文内容的脉络。本文仅仅作为 Python 的使用笔记,不涉及 python 虚拟机的内部实现。

itertools – 控制迭代的模块

有句话说,当你想针对迭代器做某些操作的时候,你就应该去看看 itertools 模块中是不是有你想用的功能。如果有也相应的功能,就不要重复造轮子了,因为你实现的百分之99.99没有 itertools 的效率高。itertools 模块内的函数(或者类)都非常常用,这里只是介绍几个作为代表:

  • chain(iter1, iter2, ...):将多个迭代器连接起来,生成一个大的迭代器(使用 yield from 也可以实现类似的功能)
  • dropwhile(callable, iter):该函数从迭代器 iter 头反复调用 callable 函数,丢弃掉所有满足条件的元素,直到遇到第一个不满足条件的元素。
继续阅读 >>

2016年下半年学习目标

Stay strong. Focus on the ultimate goal!

学习目标

技能目标

Python

继续阅读 >>

生成器和协程

在学习 Python 的过程中,总会遇到与其他语言不太相同的元素,yield 关键字就是其中之一。随着 Python 2.5 加入 yield,一直到 PEP 380 为 Python 3.3 加入 yield from,这个关键字的能力在 Python 中不断地增强。今天就介绍一下强大的 yield 究竟是什么,为什么使用以及究竟该怎么用。

生成器

提到 yield 就不得不首先讲到生成器。生成器的概念在 Python 2.2 中首次出现,之所以引入生成器,是为了实现一个在计算下一个值时不需要浪费空间的结构。这么说可能不好理解,但是我们可以通过一个例子来说明问题。

假如你需要返回一个从 1 到 $N$ 的列表,从而将其作为自己的 range 函数,那么你在 Python 中很可能会这么写:

def my_range(N):
    index = 0
    my_list = []
    while index < N:
        my_list.append(index)
        index += 1
    return my_list

当然,上面这段代码看起来毫无问题也能满足要求。但是,如果你需要一个非常非常大的列表,使得 $N$ 值设定的非常大。使用上面的 my_range 返回的结果可能会超出计算机的内存,从而使其不能成功运行。

为了避免超出内存的问题,我们需要一个更加智能的 return 功能,它能够每次返回一个结果,并且在函数的内部记录返回结果时的状态,使得下一次能够在此基础上运行。这样的话,我们就可以在节省内存的前提下实现上述的 my_range 函数。yield 关键字的引入正是为了解决这种问题。

继续阅读 >>

Python 定义迭代器

在大部分的编程语言中,我们都要接触迭代器的概念。迭代器(iterator)有时又称游标(cursor),它提供了一种遍历容器的接口,使得使用者无需关心容器的内部实现。在 Python 中,凡是可以使用 for 遍历的结构(例如 list, dict, str, tuple),全部都提供了迭代器接口。然而,我们经常需要创建一些新的类型或者结构,并让它支持 for 语句的遍历。这时候我们需要为新的类型实现一个自定义的迭代器接口。

定义迭代器

在 Python 中为一个类添加迭代器共需三个步骤:

  1. 为新类添加一个__iter__() 方法,该方法返回迭代器本身。
  2. 为新类添加一个 next()(在 python3 中是__next__())方法,该方法返回容器中的下一个元素,并且在超出下标范围时抛出 StopIteration 异常。
继续阅读 >>

Python 中 struct 模块的用法

Python 为了保持语言的简洁,仅仅为用户提供了几种简单的数据结构:int, float, str, list, dicttuple。不同于编译型语言 C/C++,在 Python 中,我们往往不需要关心不同类型的变量在解释器内部的实现方式。例如,对于一个长整形数据,我们在 Python 2 中可以直接写成 a=123456789012345L,而不用去考虑变量 a 占了几个字节。这种抽象的方式为程序的编写提供了足够的支持,但是在某些情况下(比如读写二进制文件,进行网络 Raw Socket 编程)的时候,我们需要一些其他模块来实现我们关于变量长度控制的需求。

struct 模块

当我们在 Python 中跟二进制数据打交道的时候,就要用到 struct 这个模块了。struct 模块为 Python 与 C 的混合编程,处理二进制文件以及进行网络协议交互提供了便利。理解这个模块主要需要理解三个函数:

struct.pack(fmt, v1, v2, ...)
struct.unpack(fmt, string)
struct.calcsize(fmt)

第一个函数 pack 负责将不同的变量打包在一起,成为一个字节字符串,即类似于 C 语言中的字节流。第二个函数 unpack 将字节字符串解包成为变量。第三个函数 calsize 计算按照格式 fmt 打包的结果有多少个字节。这里打包格式 fmt 确定了将变量按照什么方式打包成字节流,其包含了一系列的格式字符串。这里就不再给出不同格式字符串的含义了,详细细节可以参照 Python Doc (struct).

继续阅读 >>

(Zz)C++中的成员函数指针是多少个字节呢?

下面的代码在64位机器上会输出多少呢?

# include <iostream>
struct Foo {
	void bar() const { }
};

int main() {
	std::cout << sizeof(&Foo::bar) << std::endl;
}

我想如果你没关注过这个问题,你一定会毫不犹豫的回答8。 如果这是你的回答,这篇文章你可以继续读下去了。

首先郑重声明一下,这篇文章转载自这里

继续阅读 >>