python 学习笔记(8)高级迭代器

来源:互联网 发布:淘宝答题器 编辑:程序博客网 时间:2024/06/08 05:42

 

声明:本文系本人学习python3总结,如有侵权等,请及时告知;

                       欢迎转载:请保留 http://blog.csdn.net/kevinx_xu/article/details/8909583

一,补充内容

         1.  re 模块是正则表达式的Python实现。它有一个漂亮的函数findall()接受一个正则表达式和一个字符串作为参数,然后找出字符串中出现该模式的所有地方。

         eg:re.findall('a','abc')

         2assert 语句后面跟任何合法的Python 表达式,结果为 True, 所以 assert 语句不做任何事情,然而如果Python 表达式求值结果为 False, assert 语句会抛出一个 AssertionError.可以提供一个人类可读的消息,AssertionError异常被抛出的时候它可以被用于打印输出。用作提示。

         eg:assert True ,"This is flase"不会打印任何,程序正常进行

            assert Flase,"This is a assert teststatement"程序终止,并且打印出This is a assert test statement

         3、生成器表达式类似一个yield值的匿名函数。表达式本身看来像列表解析但不是用方括号而是用圆括号包围起来  

         4、使用生成器表达式取代列表解析可以同时节省CPU  内存(RAM)。如果你构造一个列表的目的仅仅是传递给别的函数,(比如 传递给tuple() 或者 set()), 用生成器表达式替代吧!  

二、迭代器 itertools 模块

 

1. itertools 模块里有各种各样的有趣的东西,包括permutations()函数,它把查找排列的所有辛苦的工作的做了。  

2. permutations() 函数接受一个序列和一个表示你要的排列的元素的数目的数字。函数返回迭代器,你可以在for 循环或其他老地方使用它。

3permutations()函数并不一定要接受列表。它接受任何序列、甚至是字符串 (排列)

4itertools.product()函数返回包含两个序列的笛卡尔乘积的迭代器。(各元素22相乘)

5. itertools.combinations()函数返回包含给定序列的给定长度的所有组合的迭代器。这和itertools.permutations()函数很类似,除了不包含因为只有顺序不同而重复的情况。(组合)

         eg

                   >>>list (itertools.permutations([1,2,3],2))

                            [(1,2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

                   >>>list (itertools.combinations([1,2,3],2))

                            [(1,2), (1, 3), (2, 3)]

6、使用rstrip() 字符串方法移除每一行尾部的空白。(right strip

         字符串也有一个lstrip()方法移除头部的空白。(leftstrip)

         以及strip()方法头尾都移除。

         split()方法,按某一指定标志分割字符串;

         sorted() 函数接受一个列表并将它排序后返回。默认情况下,它按字母序排序。  

         sorted()函数也接受一个函数作为key 参数并且使用key来排序。排序函数可以是len(),所以它按len(each item)来排序。

7itertools.groupby()函数接受一个序列和一个key 函数并且返回一个生成二元组的迭代器。每一个二元组包含key_function(each item)的结果和另一个包含着所有共享这个key结果的元素的迭代器。 

8调用list() 函数会“耗尽”这个迭代器也就是说 你生成了迭代器中所有元素才创造了这个列表。迭代器没有“重置”按钮。你一旦耗尽了它,你没法重新开始。如果你想要再循环一次你得调用itertools.groupby()来创建一个新的迭代器。  

9itertools.groupby()只有当输入序列已经按分组函数排过序才能正常工作。在上面的例子里面,你用len() 函数分组了名字列表。这能工作是因为输入列表已经按长度排过序了。  

10itertools.chain()函数接受n个迭代器,返回一个迭代器,它包含第一个迭代器的所有内容,以及跟在后面的来自所有迭代器的所有内容。

11zip()函数的作用不是很常见,结果它却非常有用它接受任何数目的序列然后返回一个迭代器,其第一个元素是每个序列的第一个元素组成的元组,然后是每个序列的第二个元素(组成的元组),以此类推。  

12zip() 在到达最短的序列结尾的时候停止。range(10, 14) 有四个元素(10, 11, 12,  13), 但是 range(0, 3)只有3所以 zip()函数返回包含3个元素的迭代器。

         zip()中传递几个序列为参数,则就会生成几元的迭代器;

13、相反,itertools.zip_longest()函数在到达最长的序列的结尾的时候才停止对短序列结尾之后的元素填入None.

         itertools.zip_longest()中传递几个序列为参数,则就会生成几元的迭代器;

二、字符串特殊操作方法

         一个强大但鲜为人知的操作字符串的技术: translate() 方法。(翻译)

        eg:

        1

         >>>translate_table = {ord('A'):ord('O'),ord('O'):ord('A')}

         >>>translate_table

         {65:79, 79: 65}

         >>>type(translate_table)

         <class'dict'>

         >>>'TOTAL'.translate(translate_table)

         'TATOL'

         即是从字典中去查找字典键值,然后进行替换;

         注意:不要用这种方式做单个字母或者单词的转换来处理语句,会根据所有出现的字符进行全部替换;

         >>>translate_table = {ord('A'):ord('O'), ord('O'):ord('A')}

         >>>'TOTAL COMMAND'.translate(translate_table)             

         'TATOLCAMMOND

 

三、eval()通用求值工具

         eval(...)

    eval(source[, globals[, locals]]) ->value

        第一个参数为表达式,第二个参数是全局变量,第三个参数为局部变量;

        全局变量,局部变量必须是字典的类型

         能处理任何 Python 表达式并且返回任何数据类型。

         1.  eval()接受的表达式可以引用在eval()之外定义的全局变量。如果(eval())在函数内被调用它也可以引用局部变量以及函数以及模块。  

         2.传给eval()函数的第二和第三个函数担当了求值表达式是的全局和局部名字空间的角色。

         3、即使你传入空的字典作为全局和局部名字空间,所有的Python 内建函数在求值时还是可用的。

         4  为了安全的求值不受信任的表达式你需要定义一个将"__builtins__映射为 None(Python 的空值)的全局名字空间字典在内部“内建” 函数包含在一个叫做"__builtins__"的伪模块内。这个伪模块( 内建函数的集合在没有被你显式的覆盖的情况下对被求值的表达式是总是可用的。  

         5  请确保你覆盖的是__builtins__ 不是__builtin__, __builtins__, 或者其它某个变量,否则程序还是可以运行但是会有巨大的风险。  

四、 subprocess 模块

         importsubprocess

         1.  subprocess 模块允许你执行任何shell命令并以字符串形式获

得输出。  

         2.  执行任意的shell命令可能会导致永久的(不好的)后果。  

         __import__('PackName')

         sys.module('PackName')