Go 指南 -- 练习:Web 爬虫 练习:Web 爬虫在这个练习中,我们将会使用 Go 的并发特性来并行化一个 Web 爬虫。修改 Crawl 函数来并行地抓取 URL,并且保证不重复。提示:你可以用一个 map 来缓存已经获取的 URL,但是要注意 map 本身并不是并发安全的!在网络上已经能找到好几种答案了,有的甚至用上了信道(channel)来帮助实现。我在这里提供的是一种简单明了的实现:package ...
Python类与对象学习心得-10:简化数据结构的初始化 __init__() 你写了很多仅仅用作数据结构的类,这时定义大量的 __init__() 函数变成了一件很烦人的工作。为了简化,我们可以在一个基类中写一个公用的 __init__() 函数:import mathclass Structure1: # Class variable that specifies expected fields _fields = [] def __i...
Python类与对象学习心得-8:处理属性的重要属性和函数 1. 影响属性处理方式的 3 种特殊属性__class__对象所属类的引用(即 obj.__class__,与 type(obj) 的作用相同)。Python 的某些特殊方法,例如 __getattr__,只在对象的类中寻找,而不在对象实例中寻找。__dict__一个字典(映射),存储对象或类的可写属性。有 __dict__ 属性的对象,任何时候都能随意设置新属性。如果类有 __s...
Python类与对象学习心得-9:使用延迟计算属性 延迟计算属性是一种只读属性,只在访问的时候才会计算结果。但是一旦被访问后,结果值就被缓存起来,不用每次都去计算了。定义一个延迟属性的一种高效方法是使用一种特殊的描述符类(descriptor),如下所示:class lazyproperty: def __init__(self, func): self.func = func def __g...
Python类与对象学习心得-7:创建一种新的类属性或实例属性(descriptor) 如果想创建一种全新的实例属性,自带一些额外功能(比如类型检查),你可以通过一个描述符类(descriptor)的形式来定义它的功能。描述符是对多个属性运用相同存取逻辑的一种方式,它是实现了特定协议的类,这个协议包括 __get__,__set__ 和 __delete__ 方法。特性(property)类实现了完整的描述符协议。通常,一个描述符类可以只实现其中部分协议。其实,我们在真实的代码中见到...
Python类与对象学习心得-6:在子类中扩展 property 前面已经介绍了在 Python 中特性(property)的用法。这里介绍下在子类中如何扩展定义在父类中的特性(property)的功能。考虑如下的代码,它定义了一个特性(property):class Person: def __init__(self, name): self.name = name # Getter function @pr...
Python类与对象学习心得-5:子类中调用父类的某个方法 如果要在子类定义中调用某个父类(超类)定义的方法,可以使用 super() 函数,比如:class A: def spam(self): print('A.spam')class B(A): def spam(self): print('B.spam') super().spam() # Call parent spam()...
Python类与对象学习心得-4:创建可管理的属性 - 特性(property) 有时你想给某个实例属性增加除访问与修改之外的其他处理逻辑,比如类型检查或合法性验证。一种简单方法是将它定义为一个特性(property)。例如,下面的代码定义了一个特性,对一个属性做简单的类型检查:class Person: def __init__(self, first_name): self.first_name = first_name # Gett...
Python类与对象学习心得-3:类的访问控制 Python 程序员并不依赖语言特性去封装数据,而是通过遵循一定的属性和方法命名规范来达到这个效果。第一个约定是任何以单下划线 _ 开头的名字都应该被认定为内部实现。比如:class A: def __init__(self): self._internal = 0 # 一个内部属性 self.public = 1 # 一个公共属性 d...
Python类与对象学习心得-2:创建大量对象时节省内存的方法 如果你的程序要创建大量(可能上百万) 的对象,可能导致占用很大的内存,因为每个对象实例都保存自己专有的 __dict__ 字典。由于 Python 的字典采用散列表存储(类似于稀疏数组),它必然需要消耗额外的内存空间。对于主要是用来当成简单的数据结构的类而言,你可以通过给类添加 __slots__ 属性来极大地减少对象实例所占的内存。比如:class Date: __slots_...
Python类与对象学习心得-1:让对象支持上下文管理协议 为了让一个对象兼容with 语句,你需要实现它的__enter__() 和__exit__() 方法。例如,考虑如下的一个类,它能为我们创建一个网络连接:from socket import socket, AF_INET, SOCK_STREAMclass LazyConnection: def __init__(self, address, family=AF_INET, ...
Effective Python 读书笔记 - 第27条:多用public属性,少用private属性 与C++和Java不同的是,对Python类来说,其属性的可见度只有两种,也就是public和private。class MyObject(object): def __init__(self): self.public_field = 5 self.__private_field = 10 def get_private_field(sel...
Effective Python 读书笔记 - 第26条:只在使用 Mix-in组件制作工具类时进行多重继承 Python是面向对象的编程语言,它提供了多重继承的代码复用机制。但是,我们应该尽量避免使用多重继承。如果一定要利用多重继承所带来的便利及封装性,那就考虑用它来编写mix-in类。mix-in是一种小型的类,它只定义了其他类可能需要提供的一套附加方法,而不定义自己的实例属性。此外,它也不要求使用者调用自己的__init__()构造器。由于Python程序可以方便地查看各类对象的当前状态,所...
算法导论 - 2.3-7 确定集合S中是否存在两个其和刚好为x的元素 描述一个运行时间为O(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素。这里给出两种算法,都要求先用归并排序算法(merge sort)把集合S中元素从小到大排好序,这一步运行时间为O(nlgn)第一种算法比较简单,即对集合S中每一个整数a,利用二分搜索法(Binary Search)在排好序的集合S中搜索(x - a)是否存在,如果存在...
算法:墙上的门 墙上的门你面前是一堵朝两个方向无限延伸的墙。墙上有一扇门,但你不知道离你有多远,也不知道门位于哪个方向。你只有走到这扇门前才能看到它。假设从当前位置走到门前要走n步(事先并不知道n的大小),请设计一个算法,使你最多走O(n)步就能遇到门。([Par95])解法:首先,以当前位置为原点,门距离原点有n步(n未知),而且门位于哪个方向也不知道,所以不能只朝一个方向去找,万一选错方向就永远找...
算法:带锁的门 带锁的门在走廊上有n个带锁的门,从1到n依次编号。最初所有的门都是关着的。我们从门前经过n次,每次都从1号门开始。在第i次经过时(i = 1,2,..., n)我们改变i的整数倍号锁的状态;如果门是关的,就打开它;如果门是打开的,就关上它。在最后一次经过后,哪些门是打开的,哪些门是关上的?有多少打开的门?解法:这道题需要统计从1到n每个数的因子个数(包括1和自身),每个数的因子个数决定...