a-如何创建函数。

b-给出一些指导原则,帮助思考如何创建和组织程序以使用函数。

c-如何编写函数,使随后可以询问它们的工作方式和实现的功能。

2.1将程序放在单独的文件里

为了更加方便,从现在开始,应当在python的代码编辑器中输入正在使用的程序,并将本书的事例放在一个文件中,以便以后引用和运行这个事例。一个可行的建议是将该目录命名为“Learning Python”,之后能够以程序出现的章节命名他们。

2.2函数:在一个名称下聚集代码

现代程序语言中提供来讲代码聚集在一个名称下的功能,无论何时使用,只要调用他们就行了。

为了创建一个包含代码的命名函数,可以使用def,它可以定义一个代码功能块。

我们定义一个函数:

defin_fridge():try:

count=fridge[wanted_food]exceptKeyError:

count=0return count

当调用ch5.py时,如果其中只定义了in_fridge函数,这不会看到任何输出,然而,该函数将被定义,并且可以从已创建的交互式python会话中调用。

为了使用in_fridge函数,必须确保有一个包含各种食物名称的fridge字典,另外,必须有个名为wanted_food的字符串。使用in_fridge时,可以通过该字符串询问是否是有某种事物。

>>>fridge = {'apples':10,'orange':3,'milk':2}>>>wanted_food = 'apples'

>>>in_fridge()10

>>>wanted_food = 'orange'

>>>in_fridge()3

这样可以减少工作量。在编写程序时,函数可以看作是一个一问一答的过程。因为当它们被调用的时候,经常会问它们一个问题,有多少个,什么时候,这个存在吗,这个可以改变吗等等。作为响应,函数会返回包含答案的值。

选择名称,给函数取好的名字,有利于回忆起他们的功能,即便是忘记代码实现,也没多大关系。

函数中描述函数

在选定函数名称后可以对函数添加一个描述,python可以用简单并且有意义的方式来完成这件事情。如果见一个字符串作为函数的第一部分内容,而没用名称引用它,python将他存储在函数中,以便以后引用。这个字符串通常叫做docstring(documentation string)。

函数的文档字符串用于描述函数,很少有计算机软件做了良好的说明。python提供了简单的文档字符串特性,相对于用缺乏友好和有帮助的约定的其他语言编写程序,python程序中有更多可用信息。

如:

文档字符通过函数中的名称引用,仿佛函数是字典一样。这个名称是_doc_。

函数还有其他信息(它保存的这组信息可以使用内置函数dir查看),dir显示你感兴趣的对象(例如函数)的所有属性,包括python内部使用的属性

不同位置相同名称:

(1)注意全局作用域。

(2)#注释

调用带参数的函数(不详细介绍)

检查参数

打算使用的参数类型可能与函数被调用时提供的类型不同,例如可能编写一个函数,期待一个字典参数,但是偶尔传进来一个列表,此时函数将一直运行,直到需要访问字典特有的运算。程序因为产生异常而退出。

python并不检查哪种类型的数据与函数的参数名称关联,大多数情况下,这不是问题,因为在给定的数据上的操作都是某个类型所特定的,如果名称引用的数据类型不正确,程序就不能正常工作了。

python在尝试将数值当作字典访问时,将引发一个except:捕捉不到错误。产生的typeerror错误表明python试图操作的类型做不了python期望它做的事情。

为了确认某些数据的类型,可以使用内置函数type,可以在函数开头部分验证变量类型。

defmake_omelet(omelet_type):if type(omelet_type) ==type({}):print("omelet_type is a dictionary with ingredients")return make_food(omelet_type,"omelet")elif type(omelet_type) == type(""):

omelet_ingredients=get_omelet_ingredients(omelet_type)returnmake_food(omelet_ingredients,omelet_type)else:print("I dont think I can make this kind of omelet:%$"% omelet_type)

现在make_omelet的定义不能工作,因为它还依赖于其他几个没有编写的函数。

使用字符串比较类型

python中许多对象可以表示成字符串,许多对象内置的方法可以将他们转换成字符串

例如:

由于事先可以知道一个类型的字符串表示是什么样子,可以将那个字符串与一个通过str函数转换成字符串的对象进行比较。

在函数中调用其它函数

在顶层或者全局作用域声明的函数可以被其他函数以及其他包含的函数使用。全局作用域的名称可在任何地方使用,因为最有用的函数需要在其他函数中可用。

为了使make_omelet函数能像之前看到的那样工作,它依赖的其他函数应当可用,以便被make_omerlet使用。

它的工作方式是L一个函数扮演了一个食谱的角色,它被给予一个指定煎蛋卷类型的字符串,并且返回一个包含所有成分及其分量的字典,该函数将被叫做get_omelet_ingredients,他需要一个参数,即为煎蛋卷的名称:

defget_omelet_ingredients(omelet_name):

ingredients= {"eggs":2,"milk":1}if omelet_name == "cheese":

ingredients["cheddar"] = 2

elif omelet_name == "westren":

ingredients["jack_cheese"] = 2ingredients["ham"] =1ingredients["pepper"] =1ingredients["onion"] =1

elif omelet_name == "greek":

ingredients["feta_cheese"] =2ingredients["spinach"] =2

else:print("thats not on the menu,sorry!")returnNonereturn ingredients

做煎蛋卷所需的第二个函数叫做make_food,它需要两个参数,第一个参数是包含所需成分的列表,这些成分完全从get_omelet_ingredients函数得来。第二个参数是食物名称,它应当是一种煎蛋卷的类型:

defmake_food(ingredients_needed,food_name):for ingredient iningredients_needed.keys():print("adding %d of %s to make a %s"%(ingredients_needed[ingredient],ingredient,food_name))print("made %s"%food_name)return food_name

现在可以使用make_omelet函数,他需要调用函数get_omelet_ingredients和make_food来完成工作。每个函数都提供了制作一个煎蛋卷的部分过程。

调用已完成的函数

所有函数已经就绪,可以被逐个调用,所以只需要指定希望制作的煎蛋卷的名称,然后就可以使用make_omelet了。

函数嵌套函数

使用函数之前定义函数非常重要,如果试图在定义一个函数之前就调用它,那么在调用时python不知道函数的存在,因此不能调用它!当然,这将导致一个错误并引起一个异常。因此,在文件开始定义函数,这样可以一直用到最后。

2.3函数的层次

我们来考虑它们的调用方式以及python如何记录调用层次非常有用。

当程序调用函数时,或者一个函数调用一个函数时,python在其内部创建一个叫做栈的列表,有时叫做调用栈。

当调用函数时,python将停止片刻,记住程序调用函数时所处的位置,之后将该信息贮藏在它的内部列表。之后进入函数并且执行它。下面这段代码记录如何进入和离开函数的:

在最上层python从第一行开始记录,之后当函数make_omelet在第64行被调用时对其进行记录,然后make_food被make_omelet调用,当make_food函数结束时,python确定它在第64行,于是返回第64行并继续执行,这个事例中的函数都是虚构的,但是您可以了解其中的意思。这个列表叫做栈,形象地表示出了进入函数的方式。可以想象直到退出时,一个函数位于栈顶部,当去掉它时,栈的长度缩减1.

如何解读深层的错误

假设传递一个包含列表而不是数值的字典,这将导致一个如下错误:

当文件进入一个函数后python将指出您在栈中的位置,(这意味着错误发生时有多少层以及栈中的每层在程序的哪一行被调用),因此可以打开有问题的文件来确认发生什么。

当调用更多的函数或者使用函数调用其它函数,创建了深层的栈时,就获得了使用栈跟踪(这是引发一个异常或者是一个错误时,python对输出使用的通用名称)的经验。前面的栈跟踪深度为3,可以看到在第45行,当调用make_food时,参数类型有问题。栈跟踪是栈的可读形式,可以检查他们来确认问题所在。

python中函数包括标准库函数吗_Python语言和标准库(第二章:函数)相关推荐

  1. python中连续两个小于号_Python语言描述最大连续子序列和

    求最大连续子序列的和是一个很经典很古老的面试题了,记得在刚毕业找工作面试那会也遇到过同款问题.今儿突然想起来,正好快到毕业季,又该是苦逼的应届生们各种面试的时候到了,就给写了一些小代码解决这个问题.也 ...

  2. 关于python中字典描述正确的是_python总结七

    1.lpython是python语言的lisp前端,它类似于普通的lisp语言,他会被直接编译成字节码. 2.python中的变量只在哪里需要设置内部变量,在__init__函数中. 3.map()会 ...

  3. c语言程序设计函数6,C语言程序设计》第6章函数-XiamenUniversity.PDF

    厦门大学非计算机专业本科生公共课 (2012-2013第2学期) <C语言程序设计> 第6章 函数 林子雨 厦门大学计算机科学系 E-mail: ziyulin@ 个人主页:/linziy ...

  4. 基于python的界面自动化测试-基于Python语言的自动化测试实战第二章(上)

    原标题:基于Python语言的自动化测试实战第二章(上) 测试环境搭建 2.1 Windows 下的环境搭建 如果想要学习一门编程语言,对于新手来说只需到其官方网站上去下载最新版本安装即可,但对于想要 ...

  5. C语言windows.h库的常用函数(三)

    SetCursorPos函数 用途 SetCursorPos函数是windows.h库中用来设置指针位置的函数,使用该函数鼠标指针将会直接跳至指定坐标位置 参数 SetCursorPos函数拥有x和y ...

  6. python中的super用法详解_Python中super函数用法实例分析

    本文实例讲述了python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简 ...

  7. python中的object是什么意思_Python函数是所谓的第一类对象(First-Class Object)是什么鬼?...

    之前写过一篇关于装饰器的文章,虽然写得还算不错,但是也有不少同学表示没看懂,我大概分析了其中的原因,主要问题是他们不理解函数,因为Python中的函数不同于其它语言. 正确理解 Python函数,能够 ...

  8. python中标识符下划线用作开头_python python中那些双下划线开头的那些函数都是干啥用用的...

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

  9. python中的zip是什么意思_Python的zip()函数是什么

    zip() 函数可以把两个列表"压缩"成一个 zip 对象(可迭代对象),这样就可以使用一个循环并行遍历两个列表.为了测试 zip() 函数的功能,我们可以先在交互式解释器中&qu ...

最新文章

  1. R语言plotly可视化:plotly可视化分组归一化直方图(historgram)并在直方图中添加密度曲线kde、并在直方图的底部部边缘使用geom_rug函数添加边缘轴须图
  2. python 面向对象实现CNN(四)
  3. 游戏中的物理与数学(一):物体运动算法的实现
  4. python面向对象(part1)--类和对象
  5. 用纯CSS禁止鼠标点击事件以及禁止鼠标样式
  6. java中Map遍历的四种方法
  7. VISIO—如何打开?及安装教程
  8. 利用原生node.js连接sql数据库
  9. VS.NET(C#)-3.13_Panel控件
  10. HTML5的结构元素
  11. android倒计时dialog,倒计时 Dialog
  12. 转载于掘金的vue3学习笔记
  13. 简单BFS 紫书 UVA 1600 巡逻机器人(Patrol Robot)
  14. 关于whl,你想知道的
  15. SparkStreaming之Offset管理、胖包和瘦包提交
  16. LP love tensorflow spark
  17. android蓝牙开发 蓝牙设备的查找和连接
  18. 基于大数据的英语学习利器
  19. (二十五)struts2.x中的转换器
  20. 企业订单管理软件|移讯云订货宝系统功能介绍

热门文章

  1. C++ 函数模板和排序的函数模板——学习笔记
  2. 关于owner group others的测试
  3. 学习JS面向对象成果,借国庆发布个最新作品与大家交流
  4. 申请 Let's Encrypt 通配符 HTTPS 证书
  5. 德州仪器Q2净利7.79亿美元 营收32.7亿美元
  6. WhatsApp用户数突破10亿 每天发送消息420亿条
  7. Java之内存模型的基础、重排序、顺序一致性、volatile、锁、final
  8. zabbix监控activemq队列脚本
  9. Eclipse和intellij idea 快捷键对比
  10. SCSI协议与存储的发展