python语句和语法(三)——编写循环技巧和文档

循环编写技巧

for循环包括多数计数器式的循环。一般而言,for比while容易写,执行时也比较快。

如果你需要在列表中每个一个元素访问或者在过程中修改列表?如果在同一个for循环内,并行遍历一个以上的序列?

你可以使用while循环以及手动索引运算编写这类独特的循环,但是python提供了两个内置函数,在for循环内定制迭代:

(1)内置range函数返回一系列连续增加的整数吗,可作为for中的索引

(2)内置zip函数返回并行元素的元组的列表,可用作for中内遍历数个序列

1) 循环计数器:range

虽然range常用在for循环中产生索引,但也可以在任何需要整数列表的地方。

range会产生从零算起的整数列表,但其中不包括参数的值,如果传入三个参数,第一个将视为下边界,第三个选用的参数可以提供步进值(默认值为1)。range也可以是非正数或非递增的。

>>> list(range(5)),list(range(2,5)),list(range(0, 10, 2))
([0, 1, 2, 3, 4], [2, 3, 4], [0, 2, 4, 6, 8])
>>> list(range(-5, 5))
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
>>> list(range(5, -5, -1))
[5, 4, 3, 2, 1, 0, -1, -2, -3, -4]

2)while , for和range

range常用来间接地迭代一个序列。遍历序列最简单最快的方式是使用简单的for,让python为你处理大多数细节。

如果想明确掌握索引逻辑,可以使用while循环实现。

>>> for i in x: print(i, end = ' ')
...
s p a m >>>
>>> i = 0
>>> while i < len(x):
...     print(x[i], end = ' ')
...     i += 1
...
s p a m >>>

但是想在for循环中手动索引,则可用range产生用于迭代索引的列表,但这是一个多余的步骤

>>> for i in range(len(x)): print(x[i], end = ' ')
...
s p a m >>>

除非你有特殊需求,不然在可能的情况下,最好使用python中的简单for循环,不要使用while,并且不要在for循环中使用range调用,并将视为最后的手段。 

3)range和分片

>>> s = 'abcdefghijkl'
>>> for i in range(0, len(s), 2): print(s[i], end = ' ')
...
a c e g i k >>>

上面代码并不是最理想的实现技术,用分片表达式也可以实现

>>> s = 'abcdefghijkl'
>>> for c in s[::2]: print(c, end = ' ')
...
a c e g i k >>>

当然,这里使用range的唯一真正的优点是它没有复制字符串

4) 修改列表range

可以使用range和for组合来在循环中遍历列表时并对其进行修改。

假如给列表中每个元素加1,但下面代码并不能完成任务,原因是修改的是循环变量x,而不是列表L,而x每次经过循环都会引用列表中下一个元素。

>>> L = [1, 2, 3, 4, 5]
>>> for x in L:
...     x += 1
...
>>> L
[1, 2, 3, 4, 5]
>>> x
6

需要使用索引,在遍历时每一个位置赋一个更新的值,而range/len组合可以产生索引 

>>> L = [1, 2, 3, 4, 5]
>>> for i in range(len(L)):
...     L[i] += 1
...
>>> L
[2, 3, 4, 5, 6]

5) 并行遍历:zip和map

内置的zip函数可以在for循环中并行使用多个序列,zip会得到一个或多个序列为参数,然后返回元组的列表,将这些序列中的并排的元素匹配。和range一样,zip也是一个可迭代对象,需要将其包含在一个list调用中以便一次性显示所有结果。

>>> L1 = [1, 2, 3, 4]
>>> L2 = [5, 6, 7, 8]
>>> list(zip(L1, L2))
[(1, 5), (2, 6), (3, 7), (4, 8)]
>>> for (x, y) in zip(L1, L2):
...     print(x, y)
...
1 5
2 6
3 7
4 8
>>>

当zip的参数长度不同时,ta会以最短序列的长度为准来截断所得到的元组

6)使用zip构造字典

>>> keys = ['spam', 'eggs', 'toast']
>>> vals = [1, 3, 5]
>>> D1 = {}
>>> for (k, v) in zip(keys, vals): D1[k] = v
...
>>> D1
{'spam': 1, 'eggs': 3, 'toast': 5}
>>> D2 = {}
>>> D2 = dict(zip(keys, vals))
>>> D2
{'spam': 1, 'eggs': 3, 'toast': 5}

7) 产生偏移和元素:enumerate

虽然range能产生字符串中的元素的偏移值,但必须先要知道字符串的长度。在有些时候,我们都需要元素和偏移量,有个enumerate内置函数可以轻松帮我们完成。

>>> S = 'spam'
>>> for (offset, item) in enumerate(S):
...     print(item, 'appears at offset', offset)
...
s appears at offset 0
p appears at offset 1
a appears at offset 2
m appears at offset 3

enumerate函数返回一个生成器对象,这个对象有一个__next__方法,由下一个内置函数调用它,并且循环中每次迭代的时候它会返回一个(index, value)的元组。

文档

python包含了可以使文档编写变得更简单的语法和工具。

1)# 注释和dir函数

# 注释,用于较小功能的文档。文档字符串适用大型功能的文档。

dir函数:抓取对象内可用所有属性列表的简单方式,能够调用任何有属性的对象。任何内置类型的dir结果都包含一组属性,这些属性和该类型的实现相关。他们的开头和结果都是双下划线,从而保证独特性。

str和list曾经是类型转换器,现在是python的类型名称。调用它,会启动其构造函数,从而产生该类型的实例。

>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> dir('')
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>>

2)文档字符串:__doc__

除了#注释外,python支持可自动附加在对象的文档,并且在运行时可保存查看。从语法上看,这类注释写成字符串,放在模块文件、函数以及类语句的顶端,就是在任何可执行代码前。python会自动封装这个字符串,也就是文档字符串,使其成为相应对象的__doc__属性。

在script1.py文件下有如下代码

>>> import script1
16

        function documentation
        can we have your liver then?

>>> print(script1.__doc__)

Module documentation
Words Go here

>>> print(script1.square.__doc__)

        function documentation
        can we have your liver then?

>>> print(script1.Employee.__doc__)
 class documentation

如果要取模块中类的方法函数中文档字符串,可以通过路径访问类:module.class.method.__doc__

python中的内置模块和对象都使用类似的技术,在dir返回的属性列表前后加上文档。 如要查看内置模块的可读说明,可将其导入并打印__doc__字符串。内置模块的函数、类、方法都可以这么用。

3)Pydoc:help函数和HTML报表

help函数会启动PyDoc从而产生简答的文字报表。这个报表的信息有些是文档字符串,而有些是PyDoc自动查看对象内部而收集的结构化信息。你也可以对内置函数、方法以及类型(比如字典为dict,字符串为str,列表为list)使用help,help函数也能用在模块上。

>>> import sys
>>> help(sys)
Help on built-in module sys:

NAME
    sys

MODULE REFERENCE
    https://docs.python.org/3.6/library/sys

    The following documentation is automatically generated from the Python
    source files.  It may be incomplete, incorrect or include features that
    are considered implementation detail and may vary between Python
    implementations.  When in doubt, consult the module reference at the
    location listed above.

DESCRIPTION
    This module provides access to some objects used or maintained by the
    interpreter and to functions that interact strongly with the interpreter.

    Dynamic objects:

    argv -- command line arguments; argv[0] is the script pathname if known
    path -- module search path; path[0] is the script directory, else ''
    modules -- dictionary of loaded modules

    displayhook -- called to show results in an interactive session
    excepthook -- called to handle any uncaught exception other than SystemExit
      To customize printing in an interactive session or to install a custom
      top-level exception handler, assign other functions to replace these.

-- More  --

 PyDoc提供GUI接口,可以将其报表通过HTML网页格式来呈现,可通过浏览器查看。在“开始”菜单中,打开Python 3.X Module Docs即可。内容包含python标准库模块、已安装的第三方扩展模块、位于导入搜索路径上的用户自定义模块以及静态或或动态连接的c程序模块。

4)标准的手册

在开始菜单中,将Python 3.X Manuals打开或者在IDLE中“help”菜单中开启。手册中最重要的两个项目是“Library Reference”和“Language Reference”

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页