1.说明
◆ “yield” 暂停一个函数。 “next()” 从其暂停处恢复其运行。
◆ Python 中的 pass 就像 Java 或 C 中的空大括号对({}),表示没有定义任何方法和属性;
2.__INIT__() 方法
◆ 类实例创建后, __init__() 方法被立即调用,__init__()方法调用时,对象已经创建了,每个方法的第一个参数,包括 __init__() 方法,永远指向当前的类对象。 习惯上,该参数叫 self。self 不是 Python 的保留字, 仅仅是个命名习惯;
3.实例化
◆ 每个类实例具有一个内建属性, __class__, 它是该对象的类;
◆ 可访问对象的 docstring ,就像函数或模块中的一样。 类的所有实例共享一份 docstring;
4.迭代器
◆ 迭代器就是一个定义了 __iter__() 方法的类。 这些类的所有三种方法,__init__, __iter__, 和 __next__;
◆ _字符,表示“特殊方法,这些方法不是直接调用,而是使用类或实例的某些语法时, Python会自动调用;
◆ 当 __next__() 方法抛出 StopIteration 异常, 表示迭代用完了。它是正常情况,仅表示迭代器没有值可产生了;
5.生成器表达式
◆ 使用生成器表达式取代列表解析可以同时节省 CPU 和 内存(RAM)。如果构造一个列表的目的仅仅是传递给别的函数(比如 传递给 tuple() 或者 set()), 可用生成器表达式替代;
gen = (ord(c) for c in unique_characters)
def ord_map(a_string):
for c in a_string:
yield ord(c)
gen = ord_map(unique_characters)
6.itertools模块和其它高级函数
◆ permutations,计算排列,返回迭代器;
perms = itertools.permutations([1, 2, 3], 2)
next(perms)
perms = itertools.permutations('ABC', 3)
next(perms)
◆ combinations,返回包含给定序列的给定长度的所有组合的迭代器,不包含因为只有顺序不同而重复的情况;
◆ product,返回包含两个序列的笛卡尔乘积的迭代器;
itertools.product('ABC', '123')
◆ groupby,itertools.groupby()函数接受一个序列和一个 key 函数, 并且返回一个生成二元组的迭代器。每一个二元组包含key_function(each item)的结果和另一个包含着所有共享这个key 结果的元素的迭代器。itertools.groupby()只有当输入序列已经按分组函数排过序才能正常工作;
groups = itertools.groupby(names, len)
◆ chain,接受任何数目的迭代器,并把它们按传入顺序串在一起;
itertools.chain(range(0, 3), range(10, 13))
◆ zip(),它接受任何数目的序列然后返回一个迭代器,其第一个元素是每个序列的第一个元素组成的元组,然后是每个序列的第二个元素(组成的元组),以此类推,在到达最短的序列结尾的时候停止;
zip(range(0, 3), range(10, 13))
◆ zip_longest,同zip,在到达最长的序列的结尾的时候才停止, 对短序列结尾之后的元素填入 None 值;
◆ 一个字符串的 translate(),接收一个转换表,并用它来转换该字符串。换句话说,它将出现在转换表的键中的字节替换为该键对应的值;
translation_table = {ord('A'): ord('O')}
'MARK'.translate(translation_table)
◆ eval:将任何字符串作为PYTHON表达式求值;
安全的使用:定义一个将"__builtins__" 映射为 None(Python 的空值)的全局名字空间字典,
eval("__import__('math').sqrt(5)",
{"__builtins__":None}, {})