本节目录

  • 4.1 if 语句

  • 4.2 for 语句

  • 4.3 range() 函数

  • 4.4 breakcontinue 语句,以及 Loops 中的 else 子句

  • 4.5 pass 语句

  • 4.6 定义函数

  • 4.7 深入函数定义

    • 4.7.1 参数默认值

    • 4.7.2 参数关键字

    • 4.7.3 可变参数表

    • 4.7.4 Lambda 形式

    • 4.7.5 文档字符串

?
4. 其它流程控制工具

除了前面介绍的 while 语句,Python 还从别的语言中借鉴了一些流程控制功能,并有所改变。

?
4.1 if 语句

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

可能会有 0 或很多个 elif 部分,else 是可选的。关键字“elif ” 是“ else if ”的缩写,这个可以有效避免过深的缩进。if ... elif ... elif ... 序列用于替代其它语言中的 switch 或 case 语句。

?
4.2 for 语句

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

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

?
4.3 range() 函数

如果你需要一个数值序列,内置函数range()可能会很有用,它生成一个等差级数链表。

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

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

?
4.4 breakcontinue 语句, 以及循环中的 else 子句

break语句和C中的类似,用于跳出最近的一级for或while循环。

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

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

?
4.5 pass 语句

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


?
4.6 定义函数

我们可以编写一个函数来生成有给定上界的菲波那契数列:

关键字def 引入了一个函数定义。在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。函数体的第一行可以是一个字符串值,这个字符串是该函数的?文档字符串,也可称作docstring。?

有些文档字符串工具可以在线处理或打印文档,或让用户交互的浏览代码;在你的代码中加入文档字符串是一个好的作法,应该养成习惯。

调用函数时会为局部变量引入一个新的符号表。所有的局部变量都存储在这个局部符号表中。引用参数时,会先从局部符号表中查找,然后是全局符号表,然后是内置命名表。因此,全局参数虽然可以被引用,但它们不能在函数中直接赋值(除非它们用global语句命名)。

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

函数定义在当前符号表中引入函数名。作为用户定义函数,函数名有一个为解释器认可的类型值。这个值可以赋给其它命名,使其能句做为一个函数来使用。这就像一个重命名机制:

你可能认为fib不是一个函数(function),而是一个过程(procedure)。Python和C一样,过程只是一个没有返回值的函数。实际上,从技术上讲,过程也有一个返回值,虽然是一个不讨人喜欢的。这个值被称为 None (这是一个内置命名)。如果一个值只是None的话,通常解释器不会写一个None出来,如果你真想要看它的话,可以这样做:

以下示列演示了如何从函数中返回一个包含菲波那契数列的数值链表,而不是打印它:

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

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

  • 语句result.append(b)称为链表对象result的一个方法(method)。方法是一个“属于”某个对象的函数,它被命名为obj.methodename,这里的obj是某个对象(可能是一个表达式),methodename是某个在该对象类型定义中的方法的命名。 不同的类型定义不同的方法。不同类型可能有同样名字的方法,但不会混淆。(当你定义自己的对象类型和方法时,可能会出现这种情况,本指南后面的章节会介绍如何使用)。示例中演示的append()方法由链表对象定义,它向链表中加入一个新元素。在示例中它等同于"result = result + [b]",不过效率更高。

?
4.7 深入函数定义

有时需要定义参数个数可变的函数。有三个方法可以做到,我们可以组合使用它们。

?
4.7.1 参数默认值

最有用的形式是给一个或多个参数指定默认值。这样创建的函数可以在调用时使用更少的参数。

    

这个函数还可以用以下的方式调用:ask_ok('Do you really want to quit?'),或者像这样:ask_ok('OK to overwrite the file?', 2)

默认值在函数定义段被解析,如下所示:

will print 5.

重要警告:默认值只会解析一次。当默认值是一个可变对象,诸如链表、字典或大部分类实例时,会产生一些差异。例如,以下函数在后继的调用中会积累它的参数值:

    

这会打印出:


如果你不想在不同的函数调用之间共享参数默认值,可以如下面的实例一样编写函数:

    

?
4.7.2 参数关键字

函数可以通过参数关键字的形式来调用,形如“keyword = value”。例如,以下的函数:

    

可以用以下的任一方法调用:

不过以下几种调用是无效的:

(缺少必要参数)
(在关键字后面有非关键字参数)
(对参数进行了重复赋值)
(未知关键字)

通常,参数列表中的每一个关键字都必须来自于形式参数,每个参数都有对应的关键字。形式参数有没有默认值并不重要。实际参数不能一次赋多个值--形式参数不能在同一次调用中同时使用位置和关键字绑定值。这里有一个例子演示了在这种约束下所出现的失败情况:

引入一个形如 **name 的参数时,它接收一个字典,该字典包含了所有未出现在形式参数列表中的关键字参数。这里可能还会组合使用一个形如 *name 的形式参数,它接收一个拓扑(下一节中会详细介绍),包含了所有没有出现在形式参数列表中的参数值。(*name 必须在 **name 之前出现) 例如,我们这样定义一个函数:

    

它可以像这样调用:

           

当然它会按如下内容打印:

注意sort()方法在关键字字典内容打印前被调用,否则的话,打印参数时的顺序是未定义的。

?
4.7.3 可变参数表

最后,一个最不常用的选择是可以让函数调用可变个数的参数。这些参数被包装进一个拓扑。在这些可变个数的参数之前,可以有零到多个普通的参数:

    

?
4.7.4 Lambda 形式

出于适当的需要,有几种通常在函数语言和Lisp中出现的功能加入到了Python。通过lambda关键字,可以创建很小的匿名函数(谁能告诉我,这个anonymous functions还可以怎么讲?--译者)这里有一个函数返回它的两个参数的和:“lambda a, b: a+b” Lambda 形式可以用于任何需要的函数对象。出于语法限制,它们只能有一个单独的表达式。语义上讲,它们只是普通函数定义中的一个语法技巧。类似于嵌套函数定义,lambda形式可以从包含范围内引用变量:

?
4.7.5 文档字符串

这里介绍文档字符串的概念和格式。

第一行应该是关于对象用途的简介。简短起见,不用明确的陈述对象名或类型,因为它们可以从别的途径了解到(除非这个名字碰巧就是描述这个函数操作的动词)。这一行应该以大写字母开头,以句号结尾。

如果文档字符串有多行,第二行应该空出来,与接下来的详细描述明确分隔。接下来的文档应该有一或多段描述对象的调用约定、边界效应等。

Python的解释器不会从多行的文档字符串中去除缩进,所以必要的时候应当自己清除缩进。这符合通常的习惯。第一行之后的第一个非空行决定了整个文档的缩进格式。(我们不用第一行是因为它通常紧靠着起始的引号,缩进格式显示的不清楚。)留白“相当于”是字符串的起始缩进。每一行都不应该有缩进,如果有缩进的话,所有的留白都应该清除掉。相当于留白就是验证后的制表符扩展(通常是8个空格)。(这一段译得不通,有疑问的读者请参见原文--译者)

以下是一个多行文档字符串的示例:


脚注

... 对象)。4.1
实际上,说是调用对象引用更合适,因为如果传入一个可变对象,调用者可以得到被调用者产生的任何改变(如链表中插入了子项)。

转载于:https://www.cnblogs.com/it20120227/archive/2003/10/08/2370870.html

Python指南--深入流程控制相关推荐

  1. 好好学python·运算符和流程控制

    运算符和流程控制 运算符类型 Python算术运算符 Python比较运算符 Python赋值运算符 Python位运算符 Python逻辑运算符 Python成员运算符 Python身份运算符 Py ...

  2. Python基础之:Python中的流程控制

    文章目录 简介 while语句 if 语句 for语句 Break Continue pass 简介 流程控制无非就是if else之类的控制语句,今天我们来看一下Python中的流程控制会有什么不太 ...

  3. python和控制流程_Python基础之:Python中的流程控制

    简介 流程控制无非就是if else之类的控制语句,今天我们来看一下Python中的流程控制会有什么不太一样的地方. while语句 python中的while语句和其他语言没有什么不一样,我使用wh ...

  4. python if else格式_【Python基础】流程控制-if..else

    [Python基础]流程控制-if..else ''' 基本的使用 if 条件: 满足条件执行的代码 else: 不满足条件执行的代码 ''' # age = input("Please i ...

  5. Python实验1 流程控制

    Python实验1 流程控制 编写程序实现输入成绩,判断是否通过考试. 代码 grade = int(input("请输入成绩:")) if 60 <= grade < ...

  6. python流程控制语句-python语言的流程控制

    流程控制 1.python语句的分类 2.流程控制相关的分类 3.顺序结构 4.分支结构 5.循环结构 6.其他流程控制语句 1.python语句的分类 1.单行代码 一行的python代码 2.代码 ...

  7. Python学习(七) 流程控制if语句

    在Python中流程控制if语句采用如下格式: if expression : statement elif expression : statement elif expression : stat ...

  8. python中的流程控制

    流程控制 流程: 计算机执行代码的顺序,就是流程. 流程控制: 对计算机代码执行顺序的控制,就是流程控制. 流程分类: 流程控制一共分为三类,分别是 顺序结构.分支(选择)结构.循环结构. 顺序结构 ...

  9. 现代控制会用到python嘛_Python 流程控制

    Python流程控制 1.顺序结构我们写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构. 2.分支结构(if.elif.else语句)然而仅有顺序结构并不能解决所有的问题, ...

  10. python 运算符与流程控制

    运算符与流程控制 运算符 赋值运算 用'='表示,'='的左边只能是变量 算术运算 +.-.*:加.减.乘 /:除法运算,运算结果为浮点数 //:除法运算,运算结果为整数(商) %:求余 **:求幂 ...

最新文章

  1. 全球安全行业融资收购简报(2016年2月)
  2. 减速电机JGA25-370的控制电路
  3. DSOframer注册使用说明
  4. Oracle 11gR2 RAC 中的 Grid Plug and Play(GPnP) 是什么?
  5. 你,的寒假作业写多少了?
  6. struts基本概念(1)
  7. php集成环境、基础标记符
  8. idea使用activiti插件
  9. [WPF]有Focus(), 那Unfocus()呢?
  10. cpu渲染测试软件,CPU多核项目大比拼 Corona渲染器测试
  11. NI视觉视觉软件简介
  12. 国产芯片WiFi物联网智能插座—电源功能设计
  13. 搭建php常用的集成软件包,常见php集成环境安装包_PHP
  14. 计算机矩阵入门(eigen)0XC000041D
  15. Qt实现图片的简单压缩
  16. 随机效应估算与固定效应估算_面板工具变量法学习手册(固定效应与随机效应方法、过度识别检验、预测等)...
  17. 几个简单规则改进你的SEO效果
  18. nvme1.3 Feature - Telemetry
  19. On persistence in mutual fund performance 1997翻译
  20. 十年老程序员开始新事业

热门文章

  1. 技术不是大数据第一生产力,数据交易才能带来应用爆发
  2. NodeJS是用来做什么的
  3. 解决Ubuntu中无法连接wifi的方法
  4. PHP Session可能会引起并发问题
  5. CentOS 6.5+Nagios4.0.2+Msmtp+Mutt邮箱报警
  6. 借助acs来实现telnet、ssh的远程认证
  7. 想成为软件架构师,你的举止够优雅吗?
  8. oracle 学习笔记 Flashback drop
  9. 移动端框架如雨后春笋,你该如何选择?
  10. Linux系统巡检shell脚本