深入Python流程控制,哪些你经常犯错的知识

if 语句

也许最有名的是 if 语句。例如:

可能会有零到多个 elif 部分,else 是可选的。关键字 ‘elif‘ 是 ’else if’ 的缩写,这个可以有效地避免过深的缩进。if ... elif ... elif ... 序列用于替代其它语言中的 switch或case语句。小编为大家推荐一个学习交流群:308754087,群里有好多人了~大家遇到啥问题都可以在里面交流!是一个非常好的学习交流地方~欲进从速欧~各种PDF等你来下载,全部免费,只为帮助大家快速入门。

while语句

while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空(null)的值均为true。当判断条件假false时,循环结束。

运行结果:

while 语句时还有另外两个重要的命令 continue,break 来跳过循环,continue 用于跳过该次循环,break 则是用于退出循环,此外"判断条件"还可以是个常值,表示循环必定成立

无限循环

如果条件判断语句永远为 true,循环将会无限的执行下去,如下实例:

请点击此处输入图片描述

以上的无限循环你可以使用 CTRL+C 来中断循环。

循环使用 else 语句

在 python 中,while … else 在循环条件为 false 时执行 else 语句块:

for 语句

Python 中的 for 语句和 C 或 Pascal 中的略有不同。通常的循环可能会依据一个等差数值步进过程(如 Pascal),或由用户来定义迭代步骤和中止条件(如 C ),Python 的 for 语句依据任意序列(链表或字符串)中的子项,按它们在序列中的顺序来进行迭代。例如(没有暗指):

在迭代过程中修改迭代序列不安全(只有在使用链表这样的可变序列时才会有这样的情况)。如果你想要修改你迭代的序列(例如,复制选择项),你可以迭代它的复本。使用切割标识就可以很方便的做到这一点:

range() 函数

如果你需要一个数值序列,内置函数 range() 会很方便,它生成一个等差级数链表:

range(10) 生成了一个包含 10 个值的链表,它用链表的索引值填充了这个长度为 10 的列表,所生成的链表中不包括范围中的结束值。也可以让 range() 操作从另一个数值开始,或者可以指定一个不同的步进值(甚至是负数,有时这也被称为 “步长”):

需要迭代链表索引的话,如下所示结合使 用 range() 和 len()

不过,这种场合可以方便的使用 enumerate()。

如果你只是打印一个序列的话会发生奇怪的事情

在不同方面 range() 函数返回的对象表现为它是一个列表,但事实上它并不是。当你迭代它时,它是一个能够像期望的序列返回连续项的对象;但为了节省空间,它并不真正构造列表。

我们称此类对象是 可迭代的,即适合作为那些期望从某些东西中获得连续项直到结束的函数或结构的一个目标(参数)。我们已经见过的 for 语句就是这样一个迭代器。list() 函数是另外一个( 迭代器 ),它从可迭代(对象)中创建列表:

稍后我们会看到更多返回可迭代(对象)和以可迭代(对象)作为参数的函数。

break 和 continue 语句, 以及循环中的 else 子句

break 语句和 C 中的类似,用于跳出最近的一级 for 或 while 循环。循环可以有一个 else 子句;它在循环迭代完整个列表(对于 for )或执行条件为 false (对于 while )时执行,但循环被 break 中止的情况下不会执行。以下搜索素数的示例程序演示了这个子句

(Yes, 这是正确的代码。看仔细:else 语句是属于 for 循环之中, 不是 if 语句。)

与循环一起使用时,else 子句与 try 语句的 else 子句比与 if 语句的具有更多的共 同点:try 语句的 else 子句在未出现异常时运行,循环的 else 子句在未出现 break 时运行。更多关于 try 语句和异常的内容,请参见 异常处理。

continue 语句是从 C 中借鉴来的,它表示循环继续执行下一次迭代

pass 语句

pass 语句什么也不做。它用于那些语法上必须要有什么语句,但程序什么也不做的场合,例如:

这通常用于创建最小结构的类

另一方面,pass 可以在创建新代码时用来做函数或控制体的占位符。可以让你在更抽象的级别上思考。pass 可以默默的被忽视

定义函数

我们可以创建一个用来生成指定边界的斐波那契数列的函数

关键字 def 引入了一个函数 定义。在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。

函数体的第一行语句可以是可选的字符串文本,这个字符串是函数的文档字符串,或者称为 docstring。(更多关于 docstrings 的信息请参考 文档字符串) 有些工具通过 docstrings 自动生成在线的或可打印的文档,或者让用户通过代码交互浏览;在你的代码中包含 docstrings 是一个好的实践,让它成为习惯吧。

函数 调用 会为函数局部变量生成一个新的符号表。确切的说,所有函数中的变量赋值都是将值存储在局部符号表。变量引用首先在局部符号表中查找,然后是包含函数的局部符号表,然后是全局符号表,最后是内置名字表。因此,全局变量不能在函数中直接赋值(除非用 global 语句命名),尽管他们可以被引用。

函数引用的实际参数在函数调用时引入局部符号表,因此,实参总是 传值调用(这里的 值 总是一个对象 引用 ,而不是该对象的值)。[1] 一个函数被另一个函数调用时,一个新的局部符号表在调用过程中被创建。

一个函数定义会在当前符号表内引入函数名。函数名指代的值(即函数体)有一个被 Python 解释器认定为 用户自定义函数 的类型。 这个值可以赋予其他的名字(即变量名),然后它也可以被当做函数使用。这可以作为通用的重命名机制:

如果你使用过其他语言,你可能会反对说: fib 不是一个函数,而是一个方法,因 为它并不返回任何值。事实上,没有 return 语句的函数确实会返回一个值,虽然是一个相当令人厌烦的值(指 None )。这个值被称为 None (这是一个内建名称)。如果 None 值是唯一被书写的值,那么在写的时候通常会被解释器忽略(即 不输出任何内容)。如果你确实想看到这个值的输出内容,请使用 print() 函数:

定义一个返回斐波那契数列数字列表的函数,而不是打印它,是很简单的

和以前一样,这个例子演示了一些新的 Python 功能:

return 语句从函数中返回一个值,不带表达式的 return 返回 None 。 过程结束后也会返回 None 。

语句 result.append(b) 称为链表对象 result 的一个 方法。方法是一个“属于”某个对象的函数,它被命名为 obj.methodename ,这里的 obj 是某个对象(可能是 一个表达式), methodename 是某个在该对象类型定义中的方法的命名。

不同的类型定义不同的方法。不同类型可能有同样名字的方法,但不会混淆。(当你定义自己的对象类型和方法时,可能会出现这种情况,class 的定义方法详见 类 )。示例中演示的 append() 方法由链表对象定义,它向链表中加入一 个新元素。在示例中它等同于 result = result + [a] ,不过效率更高。

编码风格

此时你已经可以写一些更长更复杂的 Python 程序,是时候讨论一下 编码风格 了。大多数语言可以写(或者更明白的说, 格式化 )作几种不同的风格。有些比其它的更好读。让你的代码对别人更易读是个好想法,养成良好的编码风格对此很有帮助。

对于 Python,PEP 8 引入了大多数项目遵循的风格指导。它给出了一个高度可读,视觉友好的编码风格。每个 Python 开发者都应该读一下,大多数要点都会对你有帮助:

使用 4 空格缩进,而非 TAB 在小缩进(可以嵌套更深)和大缩进(更易读)之间,4空格是一个很好的折中。

TAB 引发了一些混乱,最好弃用

折行以确保其不会超过 79 个字符 这有助于小显示器用户阅读,也可以让大显示器能并排显示几个代码文件

使用空行分隔函数和类,以及函数中的大块代码

可能的话,注释独占一行

使用文档字符串

把空格放到操作符两边,以及逗号后面,但是括号里侧不加空格:a = f(1, 2) + g(3, 4)

统一函数和类命名,推荐类名用 驼峰命名 , 函数和方法名用 小写_和_下划线 。总是用 self 作为方法 的第一个参数

不要使用花哨的编码,如果你的代码的目的是要在国际化环境。Python 的默认情况下,UTF-8,甚至普通的 ASCII 总是工作的最好

同样,也不要使用非 ASCII 字符的标识符,除非是不同语种的会阅读或者维护代码。

请点击此处输入图片描述

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180130A1A51900?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区