Python程序设计(含视频分析) 课件 第4章 函数和模块_第1页
Python程序设计(含视频分析) 课件 第4章 函数和模块_第2页
Python程序设计(含视频分析) 课件 第4章 函数和模块_第3页
Python程序设计(含视频分析) 课件 第4章 函数和模块_第4页
Python程序设计(含视频分析) 课件 第4章 函数和模块_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python程序设计第4章函数和模块第4章函数和模块4.1引言4.2函数的基本概念4.3参数传递4.4参数类型4.5返回值4.6结构化程序设计4.7命名空间与作用域4.8匿名函数4.9内置函数4.10模块4.11递归4.12在turtle中使用函数第4章函数和模块4.1引言4.1引言函数是程序中执行特定任务的一组语句。使用函数封装每个任务所编写的程序称为模块化程序。使用函数模块化程序的好处:可读性好代码重用易于测试便于团队合作Python中的函数包括:内置函数标准库函数自定义函数第4章函数和模块4.2函数的基本概念4.2函数的基本概念4.2.1函数的定义函数三要素:输入、输出和处理函数定义的一般形式:函数体中的所有语句具有相同的缩进。def函数名(参数表):

函数体4.2函数的基本概念4.2.2函数的调用调用函数时,解释器跳转到该函数,并执行对应语句块中的语句。当到达语句块的末尾时,解释器跳回到当初调用该函数的位置,并在该处恢复执行。第4章函数和模块4.3参数传递4.3参数传递形参:定义函数时,函数名后面的小括号内的变量实参:调用函数时,函数名后面提供的值或变量不可变类型参数:字符串、元组和数值。如果在函数内部修改参数的值,则会生成一个新的对象,并不会影响到函数外变量的值。defchange(a):#这里a是形参,是不可变类型参数print(id(a))#指向的是同一个对象a=10print(id(a))#一个新对象a=1print(id(a))change(a)#这里a是实参###################################程序输出4379369136437936913643793691244.3参数传递可变类型参数:列表和字典。在函数内修改可变类型参数,函数外的对应变量也会受影响。defchangeme(mylist):mylist.append([1,2,3,4])print("函数内取值:",mylist)mylist=[10,20,30]changeme(mylist)print("函数外取值:",mylist)###################################程序输出函数内取值:[10,20,30,[1,2,3,4]]函数外取值:[10,20,30,[1,2,3,4]]第4章函数和模块4.4参数类型4.4参数类型调用函数时,可使用的参数类型有:位置参数关键字参数默认参数不定长参数4.4参数类型4.4.1位置参数也称必须参数,指参数必须以正确顺序传入函数,调用时数量必须和声明的数量一致。如果不一致,执行后会出错。例如:defprintme(str):print(str)#调用printme函数,不加参数会报错printme()###################################程序输出Traceback(mostrecentcalllast):File"C:\programming\Python\test.py",line6,in<module>printme()TypeError:printme()missing1requiredpositionalargument:'str'4.4参数类型4.4.2关键字参数指在函数调用时通过传递参数名=传递参数值的形式来传入参数。使用关键字参数允许函数调用时参数顺序与声明时不一致。defprintinfo(name,age):print("名字:",name)print("年龄:",age)printinfo(age=50,name="小明")###################################程序输出名字:小明年龄:504.4参数类型4.4.3默认参数定义函数时给参数赋默认值,这个参数就成了默认参数。调用函数时,默认参数可以不写,此时默认参数会使用默认值。defprintinfo(name,age=35):print("名字:",name)print("年龄:",age)#调用printinfo函数printinfo(age=50,name="lsy")print("------------------------")printinfo(name="lsy")###################################输出结果名字:lsy年龄:50------------------------名字:lsy年龄:354.4参数类型可以将参数值变化小的设置为默认参数。默认参数一般是不可变对象。如果是可变对象,在多次调用函数时,默认参数都指向同一对象。如果在函数内改变了默认参数的值,会在下次调用时使用上次默认参数的结果。4.4参数类型4.4.4不定长参数如果一个函数能处理比声明时更多的参数,这些参数就叫做不定长参数。不定长参数在声明时不会命名。不定长参数有两种导入类型:元组形式:加一个*号的参数会以元组的形式导入,存放所有未命名的参数。例如:defprintinfo(arg1,*vartuple):print("输出:")print(arg1)print(vartuple)#调用printinfo函数printinfo(70,60,50)###################################输出结果70(60,50)4.4参数类型字典形式:加了两个星号**的参数会以字典的形式导入。例如:defprintinfo(arg1,**vardict):print("输出:")print(arg1)print(vardict)#调用printinfo函数printinfo(1,a=2,b=3)###################################输出结果1{‘a’:2,’b’:3}4.4参数类型4.4.5命名关键字参数声明函数时,参数中*可以单独出现。若单独出现*,*右侧参数必须用关键字传入。此时这些参数也叫命名关键字参数。例如:>>>deff(a,b,*,c):...returna+b+c...>>>f(1,2,3)#报错Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:f()takes2positionalargumentsbut3weregiven>>>f(1,2,c=3)#正常6>>>4.4参数类型4.4.5命名关键字参数声明函数时,参数中*可以单独出现。若单独出现*,*右侧参数必须用关键字传入。此时这些参数也叫命名关键字参数。例如:>>>deff(a,b,*,c):...returna+b+c...>>>f(1,2,3)#报错Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:f()takes2positionalargumentsbut3weregiven>>>f(1,2,c=3)#正常6>>>4.4参数类型4.4.5命名关键字参数声明函数时,参数中*可以单独出现。若单独出现*,*右侧参数必须用关键字传入。此时这些参数也叫命名关键字参数。例如:>>>deff(a,b,*,c):...returna+b+c...>>>f(1,2,3)#报错 Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> TypeError:f()takes2positionalargumentsbut3weregiven>>>f(1,2,c=3)#正常6>>>第4章函数和模块4.5返回值4.5返回值有返回值的函数必须有一个return语句来将值返回到调用它的程序部分。return语句形式如下:returnexpression其中expression可以是任意值、变量或具有值的表达式。例如:defis_odd(n):returnn%2==0print(is_odd(7))###################################False4.5返回值在Python中,函数并不局限于返回一个值,可以在return语句后使用逗号分隔的多个表达式返回多个值。形式如下:returnexpression1,expression2,…举例如下:调用返回多个值的函数时,赋值号左边的变量的个数和顺序必须和函数返回值的个数和顺序相同。defget_name():first=input(‘Enteryourfirstname:’)last=input(‘Enteryourlastname:’)returnfirst,last###################################first_name,last_name=get_name()print('Yourname:',first_name,last_name)4.5返回值IPO图是程序员用来设计和注释函数的一种简单有效的工具。IPO分别代表了Input、Processing和Output,描述了函数的输入、处理和输出三个要素。例如:函数is_odd输入处理输出一个整数判断输入整数是否偶数返回判断结果,是返回True,不是返回False第4章函数和模块4.6结构化程序设计4.6结构化程序设计结构化程序设计由著名计算机科学家E.W.Dijkstra于1969年提出,它强调程序设计的风格和程序结构的规范化,其基本思路是将一个复杂问题的求解过程划分为若干阶段,每个阶段要处理的问题都易于理解和处理。它包含以下三个步骤:自顶向下问题分析方法模块化设计结构化编码后续的讲解基于以下的例子:开发一个学生成绩统计程序,输入一批学生的5门课程的成绩,要求输出每个学生的平均分和每门课程的平均分,找出平均分最高的学生。4.6结构化程序设计4.6.1自顶向下问题分析方法面对一个复杂的问题,首先进行上层整体分析,按组织或功能将问题分解成子问题,如果子问题仍然十分复杂,再做进一步分解,直到处理对象相对简单、容易解决为止。当所有子问题都得到了解决,整个问题也就解决了。在这个过程中,每一次的分解都是对上一层问题进行细化和逐步求精,最终形成一种类似树形的层次结构来描述分析的过程。上述例子用自顶向下方法分析后,层次结构图如下所示:4.6结构化程序设计4.6.2模块化设计在这个阶段,需要将模块组织成良好的层次系统,顶层模块调用下层模块以实现程序的完整功能,每个下层模块再调用更下层的模块,最下层的模块完成最具体的功能。模块化设计时要遵循模块独立性的原则,模块之间的联系应尽量简单。模块化设计使程序结构清晰,易于设计和理解。有利于大型软件的开发,程序员可以分工编写不同的模块。在Python中,这里的模块一般通过函数来实现,一个模块对应一个函数。函数中包含的语句一般不要超过50行。4.6结构化程序设计对上述例子进行模块化设计:defmain():input_stu()calc_data()highest()output_stu()definput_stu():passdefcalc_data():avr_stu()avr_cor()defhighest():passdefoutput_stu():passdefavr_stu():passdefavr_cor():passmain()4.6结构化程序设计4.6.3结构化编码结构化编码主要原则:1)经模块化设计后,每个模块都可以独立编码。编程时应选择顺序、选择和循环3种控制结构。对于复杂问题则可以通过这3种结构的组合嵌套实现。2)对变量、函数等命名时,要见名知义,有助于对变量含义或函数功能的理解。3)在程序中添加必要的注释,增加程序可读性。4)要有良好的程序视觉组织,利用好缩进格式,一行写一条语句。5)程序要清晰易懂,语句结构要简单直接。在效率要求不太高的场合,在不影响功能的前提下,做到结构清晰第一,效率第二。6)有良好交互性,尽量采取统一整齐的格式。第4章函数和模块4.7命名空间和作用域4.7命名空间和作用域4.7.1命名空间命名空间(namespace)是从名称到对象的映射。大部分命名空间通过字典来实现,它提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,在一个命名空间中不能有重名,但不同命名空间可以重名。一般有三种命名空间:1)内置命名空间(built-innamespace):python语言内置的名称;2)全局命名空间(globalnamespace):模块中定义的名称,包括函数、类、其他导入的模块、模块级的变量和常量;3)局部命名空间(localnamespace):函数中定义的名称,包括函数参数和局部定义的变量,类中定义的也是。Python查找变量a的顺序:局部命名空间-》全局命名空间-》内置命名空间4.7命名空间和作用域4.7.2作用域作用域是Python程序可以直接访问命名空间的正文区域。共有四种作用域:Local:最内层,包含局部变量。比如一个函数/方法内部;Enclosing:包含非局部(non-local)也非全局(non-global)的变量。比如函数A中包含了函数B,对于B中的名称来说A中的作用域就是non-local;Global:当前脚本的最外层。比如当前模块的全局变量;Built-in:包含了内建的变量/关键字等;查找顺序:L->E->G->B。4.7命名空间和作用域内置作用域通过一个名为builtin的标准模块来实现的,但这个变量名自身并没有放入内置作用域内,必须导入这个文件才能使用它。Python中只有模块、类以及函数才会引入新的作用域,其他的代码块(如if-elif-else、try-except、for/while等)不会引入新的作用域,也就是说这些语句内定义的变量,外部也可以访问。4.7命名空间和作用域4.7.3全局变量和局部变量定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,全局变量可以在整个程序范围内访问。局部变量和全局变量都不能被函数中出现在它之前的代码访问。函数内部的局部变量会覆盖同名的函数外的全局变量。如果要在内部作用域修改外部作用域的变量,要用到global和nonlocal关键字。第4章函数和模块4.8匿名函数4.8匿名函数所谓匿名,即不使用def语句这样标准的形式定义函数。在Python中使用lambda表达式创建匿名函数。lambda只是一个表达式,看起来只能写一行,不是一个代码块,只能在表达式中封装有限的逻辑;lambda有自己的命名空间,不能访问自己参数列表之外或全局命名空间中的参数;lambda函数的语法只包含一个语句:lambda[arg1[,arg2,...,argn]]:expressionsum=lambdaarg1,arg2:arg1+arg2#调用sum函数print("相加后的值为:",sum(10,20))print("相加后的值为:",sum(20,20))###################################输出结果:相加后的值为:30相加后的值为:40第4章函数和模块4.9内置函数4.9内置函数内置函数就是Python提供的可以直接使用的函数,一般使用频率比较频繁或者是元操作,比如print()、input()等。截止Python3.6.2,一共提供了68个内置函数。分类如下表所示。4.9内置函数1.

数字相关bool()int()float()complex()

bin()otc()hex()max()min()abs()divmode()round()pow()sum()2.

数据结构相关list()tuple()reversed()slice()str()format()bytes()ord()chr()ascii()repr()dict()set()frozenset()len()sorted()enumerate()all()any()zip()filter()map()bytearray()

3.

面向对象相关object()classmethod()staticmethod()isinstance()issubclass()property()setattr()getattr()hasattr()delattr()super()vars()type()

4.

作用域相关locals()globals()

5.

迭代器/生成器相关range()next()iter()

6.

字符串类型代码执行eval()exec()compile()

7.

输入输出input()print()

8.

内存相关hash()id()

9.

其他open()__import__()help()callable()dir()memoryview()

第4章函数和模块4.10模块4.10模块模块是一个包含所有定义的函数和变量的文件,其后缀名是.py。要使用模块中的函数,需要事先用import导入。4.10.1导入模块和函数语法如下:不管执行多少次import,一个模块只会被导入一次。这样可以防止模块被重复导入。如果经常使用一个函数,可以赋一个本地的名称:importmodule1[,module2[,...moduleN]print_f=support.print_funcprint_f("lsy")4.10模块4.10.2指定别名如果模块名字太长,可以用as指定简短的别名。其语法为:例如:from语句可以导入指定部分到当前命名空间。语法如下:例如:importmodule_nameasnew_nameimportcatascc.eat(‘fish’)frommodulenameimportname1[,name2,…,nameN]fromcatimport*eat(‘fish’)4.10模块4.10.3常用模块介绍序号模块名描述1os对操作系统进行处理,包括文件目录操作,文件操作的时间及系统环境变量的存取2glob提供了一个函数用于从目录通配符搜索中生成文件列表3sys有关python运行环境的变量和函数4time提供与时间相关的函数5datetime重新封装了time模块,提供更多接口6re为高级字符串处理提供了正则表达式工具7math为浮点运算提供了对底层C函数库的访问8random用来获得随机数9json和pickle专门处理json格式的模块10ElementTreepython的XML处理模块,它提供了一个轻量级的对象模型。在Python2.5以后成为Python标准库的一部分11hashlib提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1,sha224,sha256,sha384,sha512等算法12urllib.request用于处理从urls接收的数据13smtplib用于发送电子邮件14zlib,gzip,bz2,zipfile,以及tarfile数据压缩15logging内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等16subprocessPython2.4中新增的一个模块,它允许你生成新的进程,连接到它们的input/output/error管道,并获取它们的返回码17configparser用来解析配置文件的模块,并且内置方法和字典非常接近18shutil对os中文件操作的补充,高级的文件、文件夹、压缩包处理

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论