(本科)第6章 函数ppt课件.pptx

上传人:春哥&#****71; 文档编号:16398225 上传时间:2022-05-17 格式:PPTX 页数:95 大小:870.73KB
返回 下载 相关 举报
(本科)第6章 函数ppt课件.pptx_第1页
第1页 / 共95页
(本科)第6章 函数ppt课件.pptx_第2页
第2页 / 共95页
点击查看更多>>
资源描述

《(本科)第6章 函数ppt课件.pptx》由会员分享,可在线阅读,更多相关《(本科)第6章 函数ppt课件.pptx(95页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、课程主讲人:(本科)第6章 函数ppt课件Chap6 FunctionNanjing UniversityDepartment of Computer Science and TechnologyDepartment of University Basic Computer TeachingNanjing University函数3 较大规模的程序通常会被划分成一个个功能模块,这些功能模块就是函数(function)函数函数函数程序Nanjing University函数的概念4Nanjing University函数5函数是一个独立的代码块在解决大规模问题时采用“模块化”策略,将一个大而复杂

2、的原始任务分解为多个较简单的子任务,再为每个简单的子任务设计算法将描述其算法的一组语句封装为一个独立代码块,为每个独立代码块定义一个名字以及能与其他独立代码块通信的接口,这种独立的代码块定义就是函数。Nanjing University找前5个默尼森数 P是素数且M也是素数,并且满足等式M=2P-1,则称M为默尼森数 例如P=5,M=2P-1=31,5和31都是素数,因此31是默尼森数。6Nanjing University找前5个默尼森数 P是素数且M也是素数,并且满足等式M=2P-1,则称M为默尼森数 例如P=5,M=2P-1=31,5和31都是素数,因此31是默尼森数。7使用函数可以在整

3、体上简化程序结构,降低程序开发和修改的复杂度,提高程序的可读性和可复用性。Nanjing UniversityPython中的函数8内建函数01第三方库03标准库函数02用户自定义函数04Nanjing UniversityPython中的函数9内建函数内建函数指 包 含 在_builtins_模块中的函数,安装完Python后可以直接使用标准库标准库需要先导入模块再使用函数,每个库有相关的一些函数第三方库第三方库非常多,是Python重要的特征和优势用户自定义函数用户自定义函数有固定的定义、调用和参数传递方式等Nanjing University常用Python标准库函数10Nanjing

4、University常用Python标准库函数11已由系统事先定义使用时直接导入后调用:osredatetimesysrandommath模块名.函数名(参数表)函数名(参数表)Nanjing University6.2.1 os模块中的函数12Nanjing Universityos模块中常用的处理文件及目录的函数13 import os os.getcwd()C:WINDOWSsystem32 path = d:temp os.chdir(path) os.listdir(path)act.txt, awc, , web, write.exeSourcedir(os) os.getcwd(

5、)d:temp os.rename(current.txt, new.txt) os.remove(new.txt) os.mkdir(d:temptempdir) os.rmdir(d:temptempdir)SourceNanjing University6.2.2 random模块中的函数14Nanjing Universityrandom模块伪随机数生成器15 import random random.seed(100) random.random() # 生成一个0, 1.0)之间的一个随机浮点数0.1456692551041303 random.random()0.45492700

6、451402135 random.random()0.7707838056590222 random.seed(100) random.random()0.1456692551041303Sourcedir(random)Nanjing Universityrandom模块中常用函数的功能和使用方法16 import random random.choice(C+, Java, Python) Java random.randint(1, 100)37 random.randrange(0, 10, 2) 4 random.uniform(5, 10)5.776718084305783Sour

7、cedir(random)Nanjing Universityrandom模块中常用函数的功能和使用方法17 import random random.sample(range(100), 10)16, 49, 26, 6, 61, 64, 29, 28, 34, 72 nums = 1002, 1004, 1001, 1005, 1008 random.shuffle(nums) nums1002, 1008, 1001, 1005, 1004SourceNanjing University6.2.3 datetime模块中的函数18Nanjing Universitydatetime模块中

8、的函数19 from datetime import date date.today() datetime.date(2018, 6, 26) from datetime import time tm = time(23, 20, 35) print(tm)23:20:35SourceNanjing Universitydatetime模块中的函数20 from datetime import datetime dt = datetime.now() dtdatetime.datetime(2018, 6, 26, 23, 25, 4, 125366) print(dt.strftime(%a

9、, %b %d %Y %H:%M)Tue, Jun 26 2018 23:27Source形式形式1形式形式2含义含义%a%A星期%b%B本地月份%d月份%y%Y年份%H%I小时数%M分钟数Nanjing Universitytimestamp()和fromtimestamp()21 dt = datetime(2018, 6, 26, 23, 29) print(dt)2018-06-26 23:29:00 ts = dt.timestamp() ts1530026940.0 print(datetime.fromtimestamp(ts)2018-06-26 23:29:00SourceN

10、anjing University函数的定义和调用22Nanjing University函数函数调用之前必须先定义23内建函数或标准库函数自定义函数Nanjing University6.3.1 函数的定义24Nanjing University函数的定义25def 函数名函数名(参数表参数表): 文档字符串文档字符串 函数体函数体语 法 表示函数开始,在第一行书写,该行被称为函数首部,用一个冒号结束; 函数名是函数的名称,是一个标识符,取名时尽量要做到见名识义;def函数名Nanjing University函数的定义26def 函数名函数名(参数表参数表): 文档字符串文档字符串 函数体

11、函数体语 法 函数名后紧跟一对圆括号(),括号内可以有0个、1个或多个参数,参数间用逗号分隔,这里的参数称为形式参数(简称形参),形参只有被调用后才分配内存空间,调用结束后释放所分配的内存空间; 函数体需要缩进,它包含赋值语句和一些功能语句,如果想定义一个什么也不做的函数,函数体可以用pass语句表示。参数表函数体文档字符串是可选的Nanjing University自定义函数的创建#example.py def printStr(x): print the string print(x)File27一个非常简单的打印一个字符串的函数 from example import printStr

12、print (printStr._doc_)print the stringSourceNanjing University6.3.2 函数的返回28Nanjing University函数的返回29return 表达式表达式1, 表达式表达式2, , 表达式表达式n语 法 通常会通过return语句将值带回给主调函数 位置在函数体内 如果是返回多个值,则构成一个元组 如果不需要返回任何值,则不用return语句或用return None语句返回值Nanjing University函数的返回30 def foo(x, y):计算参数的和return x + ySource返回两个参数的和的函

13、数定义Nanjing University6.3.3 函数的调用31Nanjing University函数的返回32函数名函数名(参数表参数表)语 法 函数调用时括号中的参数称为实际参数(简称为实参),在函数调用时分配实际的内存空间。 如果有多个实参,实参间用逗号分隔。 可以没有实参,调用形式为:函数名() 圆括号不能省略。 调用时实参将值一一传递给形参,程序执行流程转移到被调用函数,函数调用结束后返回到之前的位置继续执行。调用Nanjing University函数的导入和调用33example.pyprintStr() from example import printStr print

14、Str(Hi, Python!)Hi, Python!SourceNanjing University34# prog6-1.pydef gcd(x, y): calculate the GCD of x and y if x import test print(test.result)9SourceNanjing UniversityPython 中的main函数(主模块)38#test.pydef foo(x): return x * x if _name_ = _main_: x = 3 result = foo(x)File import test print(test.result)

15、Traceback (most recent call last): File , line 1, in print(test.result)AttributeError: module test has no attribute result print(test.foo(3)9SourceNanjing University39Nanjing University40# prog6-3.pydef search(scores): maxScore = 0 minScore = 100 for k, v in scores.items(): aveg = (scoresk0 + scores

16、k1 + scoresk2) / 3 if aveg = maxScore: maxScore = aveg maxName = k if aveg my_add(3, 5)8lambda函数又称为匿名函数,即没有具体的函数名lambda函数的目的是让用户快速地定义单行函数,简化用户使用函数的过程。Nanjing University42def search(scores): t = sorted(scores.items(), key = lambda d : (d10 + d11 + d12) / 3) return tlen(t)-10, t00File使用lambda函数确定了排序函数

17、sorted()的参数key,确定了scores.items()的排序关键字Nanjing University43 dScores = Jerry : 87, 85, 91, Mary: 76, 83, 88, Tim: 97, 95,89, John : 77, 83, 81 a = sorted(dScores.items() , key = lambda d:d0)(Jerry, 87, 85, 91), (John, 77, 83, 81), (Mary, 76, 83, 88), (Tim, 97, 95, 89) a = sorted(dScores.items() , key

18、= lambda d:d10)(Mary, 76, 83, 88), (John, 77, 83, 81), (Jerry, 87, 85, 91), (Tim, 97, 95, 89)FileNanjing Universitylambda函数与函数式编程44 lst = 3, 2, 5, 8, 1 list(map(lambda x: x*2, lst)6, 4, 10, 16, 2 lst = 1, 2, 3, 4, 5, 6 list(filter(lambda x: x%2 = 0, lst)2, 4, 6 from functools import reduce lst = 1,

19、2, 3, 4, 5 reduce(lambda x, y: x + y, lst)15SourceNanjing University主函数调用多个功能函数def f(): def g(): if _name_ = _main_: f() g()def f(): def g(): f()g()45Nanjing University嵌套调用def f(): def g(): f()if _name_ = _main_: g()46Nanjing University例6.4 左移或右移字符串中的字符47# prog6-4.pydef moveSubstr(s, flag, n): if n

20、len(s): return -1 else: if flag = 1: return sn: + s:n else: return s-n:+ s:-nFileif _name_ = _main_: s, flag, n = input(enter the string,flag,n:).split(,) result = moveSubstr(s, int(flag), int(n) if result != -1: print(result) else: print(the n is too large)FileOutput:输入测试数据beautiful,1,3输出结果为:beauti

21、ful若输入:I love Python,2,3输出结果为:fulbeautiNanjing University例6.5 寻找数字朋友组48# prog6-5.pydef findNumFriends(s): s = s.split(,) d, result = , for num in s: # 计算每一个数字各位数之和 sumNum = 0 for ch in num: # 寻找相同数字和的数字朋友 sumNum += int(ch) if sumNum in d.keys(): dsumNum += num else: dsumNum = num lst = sorted(d.item

22、s(), key = lambda d: d0) # 基于数字和进行排序 for item in lst: itemTemp = item1 itemTemp.sort() result.append(itemTemp) return resultFileNanjing University例6.5 寻找数字朋友组49# prog6-5.py 续if _name_ = _main_: s = input(Enter the numbers: ) result = findNumFriends(s) for item in result: print(item)FileOutput:Enter

23、the numbers: 143,267,342,562,224,134,276,252134, 143, 224252, 342562267, 276Nanjing University例6.6 模拟一个简易的用户注册和登录系统50# prog6-6.pyaccount = Zhangsan: 123456# account为全局变量def sign_up(): user_name = input(Please input your user name: ) while user_name in account.keys(): user_name = input(User name exis

24、ts, please choose another one:) password = input(Please input your password: ) accountuser_name = password print(Successfully sign up!)FileNanjing University例6.6 模拟一个简易的用户注册和登录系统51def sign_in(): user_name = input(Please input your user name: ) if user_name not in account.keys(): print(User name not

25、found.) else: count = 0 password = input(Please input your password: ) while accountuser_name != password: count += 1 if count = 3 : print(Bye - bye) break password = input(Wrong password, please input again: ) if accountuser_name = password: print(Successully sign in!)FileNanjing University例6.6 模拟一

26、个简易的用户注册和登录系统52if _name_ = _main_: while True: # 注册0登陆1 cmd = input(Sign Up or Sign In? Please input 0 or 1:) while cmd != 0 and cmd != 1: print(Wrong command, please input again: ) cmd = input(Sign Up: 0, Sign in: 1) if cmd = 0: sign_up() continue if cmd = 1: sign_in() breakFileNanjing University例6

27、.6 模拟一个简易的用户注册和登录系统53Output:Sign Up or Sign In? Please input 0 or 1:0Please input your user name: LisiPlease input your password: 123456Successfully sign up!Sign Up or Sign In? Please input 0 or 1:1Please input your user name: LisiPlease input your password: 123456Successfully sign in!_main_模块调用了sig

28、n_up()和sign_in()函数。算法设计为注册部分不退出,登录成功或密码输入超过错误次数后退出Nanjing University函数的参数54Nanjing University函数参数 函数调用时将实参一一传递给形参,通常实参和形参的个数要相同,类型也要相容,否则容易发生错误。 参数在调用过程中的变化 参数可以设定默认值55Nanjing University位置参数56 def printGrade(name, stuID, grade): print(0(1)s grade is 2.format(name, stuID, grade) printGrade(Mary, 1002

29、, A)Mary(1002)s grade is A.Source实参写反会怎样? printGrade(A, 1002, Mary)A(1002)s grade is Mary.Source错误的结果Nanjing University1. 关键字参数57 def printGrade(name, stuID, grade): print(0(1)s grade is 2.format(name, stuID, grade) printGrade(name = Jerry, grade = B , stuID = 1005)Jerry(1005)s grade is B.Source关键字参

30、数是使用参数名提供的参数。有了关键字参数顺序就不会有影响,并且调用时每个参数的含义更清晰。Nanjing University2. 默认参数在定义函数时给某些参数设定默认值,默认参数以赋值语句的形式给出设定了的默认值,确定了统一的精度,调用时如果使用默认值则该位置的实参可以省略不写58 def area(r, pi = 3.14159): return pi * r *rSource area(3)28.274309999999996SourceNanjing University2. 默认参数 默认参数值在调用时可以修改 调用时也一样可以利用关键字参数改变参数顺序59 area(pi = 3

31、.14, r = 4)50.24Source area(4, 3.14)50.24SourceNanjing University2. 默认参数60 def printGrade(name, className = Courage, grade): print(0(1)s grade is 2.format(name, className, grade) printGrade(Mary, A)Source语法错误:非默认参数跟在了默认参数之后默认参数是可以修改的,如果在定义时将默认参数放在非默认参数前面的话,Python解释器无法判断给出的第二个实参A是修改了默认参数的值还是对应了后面的参数S

32、yntaxError: non-default argument follows default argumentNanjing University2. 默认参数61 def printGrade(name, grade, className = Courage): print(0(1)s grade is 2.format(name, className, grade) printGrade(Mary, A)Mary(Courage)s grade is A.Source定义函数时必须将默认参数放在非默认参数的后面。Nanjing University3. 可变长参数Python中允许传递

33、一组数据给一个形参,形参tupleArgs前有一个“*”号,是可变长位置参数的标记,用来收集其余的位置参数,将它们放到一个元组中62 def greeting(args1, *tupleArgs): print(args1) print(tupleArgs)SourceNanjing University3. 可变长参数63 def greeting(args1, *tupleArgs): print(args1) print(tupleArgs) greeting(Hello, Wangdachuan, Liuyun, Linling)Hello,(Wangdachuan, Liuyun,

34、Linling)Source实参中Hello,传递给位置参数args1,其余的三个字符串传递给可变长的位置参数tupleArgs,调用后将这组实参放到一个元组中输出。Nanjing University3. 可变长参数64 def greeting(args1, *tupleArgs): print(args1) print(tupleArgs) names = (Wangdachuan, Liuyun, Linling) greeting(Hello, *names)Hello,(Wangdachuan, Liuyun, Linling)SourceNanjing University3.

35、可变长参数可变长关键字参数65 def assignment(*dictArgs): print(dictArgs) assignment(x = 1, y = 2, z = 3)x: 1, z: 3, y: 2 data = x: 1, z: 3, y: 2 assignment(*data)x: 1, z: 3, y: 2Source用两个星号标记可变长的关键字参数。可变长关键字参数允许传入多个(可以是0个)含参数名的参数,这些参数在函数内自动组装成一个字典。也可先将参数名和参数构建成一个字典,然后作为可变长关键字参数传递给函数调用。Nanjing University3. 可变长参数可变

36、长位置参数和可变长关键字参数66 def greeting(args1, *tupleArgs, *dictArgs): print(args1) print(tupleArgs) print(dictArgs) names = Wangdachuan, Liuyun, Linling info = schoolName : NJU, City : Nanjing greeting(Hello, *names, *info)Hello,(Wangdachuan, Liuyun, Linling)City: Nanjing, schoolName: NJUSourceNanjing Univer

37、sity例6.7 实现用户信息注册登记 要求必须登记姓名,性别和手机号码,其他如年龄、职业等信息不强制登记。67Nanjing University例6.7 实现用户信息注册登记68# prog6-7.pydef register(name, gender, phonenum, *otherinfo): register users information print(name: , name, gender: , gender, phone num: , phonenum) print(other information: , otherinfo)FileNanjing University

38、例6.7 实现用户信息注册登记69 register(Chenqian, M, 11111111111)name: Chenqian gender: M phone num: 11111111111other information: SourceNanjing University例6.7 实现用户信息注册登记70 otherinfo = age: 24, city: Nanjing, job:teacher register(Limei, F, 22222222222, *otherinfo)name: Limei gender: F phone num: 2222222222other

39、information: age: 24, city: Nanjing, job: teacherSource除了name、gender、phonenum外如果没有登记额外的信息,则可变长关键字参数otherinfo收集不到任何参数,调用后输出一个空字典。如果有额外的信息登记,参数传递时这些参数被组装成一个字典。Nanjing University变量的作用域71Nanjing University变量作用域 每个变量都有自己的作用域,也就是在某个代码段内使用该变量是合法的,在此代码段外使用该变量则是非法的。除了作为全局作用域的变量外,每次函数调用都会创建一个新的作用域。72Nanjing U

40、niversity变量作用域73 def f(): x = 5 f() print(x)Traceback (most recent call last): File , line 1, in print(x)NameError: name x is not definedSourceNanjing University对不同作用域同名变量的处理74 def f(): x = 5 x = 3 f() print(x)3Source def f(): y = 5 x = 3 f() print(x)3SourceNanjing University函数内部使用全局变量75 def f(): y

41、= 5 print(x + y) x = 3 f()8Source函数内部虽然可以使用全局变量,但使用要慎重,如果在多个函数内部使用全局变量,则无法确定全局变量某一时刻的值,容易发生错误。Nanjing University局部变量和全局变量同名时76 x = 3 def f(): x = 5 print(x * 2) f()Source在局部变量(包括形参)和全局变 量 同 名 时 , 局 部 变 量 屏 蔽(Shadowing)全局变量 程序执行结果=?Nanjing University函数内部同时出现局部变量和全局变量77 x = 3 def f(): print(x * 2) x =

42、 5 print(x * 2) f()Traceback (most recent call last): File , line 1, in f() File , line 2, in f print(x *2)UnboundLocalError: local variable x referenced before assignmentSourceNanjing University函数内部同时出现局部变量和全局变量78 x = 3 def f(): global x print(x * 2) x = 5 print(x * 2) x = 3 f()925Source使用关键字global

43、声明将使用全局变量Nanjing University递归79Nanjing University递归80生成斐波那契数列的方法循环递归递归是最能表现计算思维的算法之一Nanjing University函数的嵌套调用81f1()mainEndf2()f1()f2()EndEnd 函数间可以相互调用,如果在_main_模块中调用了f1函数,在函数f1中又调用了函数f2,就形成了函数的嵌套调用。Nanjing University直接递归和间接递归82f2()f1()f1()f2()(a)间接递归调用f1()f1()(b)直接递归调用递归是特殊的嵌套调用,是对函数自身的调用Nanjing Uni

44、versity正确的递归调用的要求 有一个比原始调用规模小的函数副本; 有基本情况即递归终止条件。83def f(): f()Source无穷递归(infinite recursion)Nanjing University正确的递归调用的要求84有一个比原始调用有一个比原始调用规模小的函数副本规模小的函数副本要求要求1 1有基本情况,即递有基本情况,即递归终止条件归终止条件要求要求2 2Nanjing University递归调用的过程每一次递归调用要解决的问题都要比上一次的调用简单,规模较大的问题可以往下分解为若干个规模较小的问题,规模越来越小最终达到最小规模的递归终止条件(基本情况)解决完

45、基本情况后函数沿着调用顺序逐级返回上次调用,直到函数的原始调用处结束一般会包含一个选择结构,条件为真时计算基本情况结束递归调用后返回,条件为假时简化问题执行副本继续递归调用。85Nanjing University递归的特点86系统资源消耗比 循 环大逐层返回调用至最初层03遇 到 边 界 条件 停 止 递 归逐层递归调用0201Nanjing University87n的阶乘的定义是一种递归定义n! 1 (当n=1) n(n-1)! (当n1)Nanjing University88# prog6-8.pydef fac(n): if n = 1: return 1 else: return

46、 n * fac(n1)File递归必须要有边界条件,即停止递归的条件Nanjing University89fac(3)fac(3):if n = 1: return 1else: return 3*fac(3-1)fac(2):if n = 1: return 1else: return 2*fac(2-1)fac(1):if n = 1: return 1else: return 1*fac (1-1)递归函数的每次调用时系统都为函数的局部变量(包括形参)分配本次调用使用的存储空间,直到本次调用结束返回主调程序时方才释放。Nanjing University递归和迭代求n的阶乘斐波那契数

47、列用二分法求方程的根90经典的Hanoi(汉诺塔)游戏八皇后有明显的迭代方式,一般不推荐使用递归实现适合用递归实现Nanjing University例6.9 Hanoi塔问题91ABCHanoi塔问题的描述是:有3个底座(分别标记为A、B和C)各有一根针,A座的针上已从下往上从大到小依次叠放了64个(简单起见用3个盘子表示)大小不同的盘子,要求将A座针上的盘子全部搬到C座的针上。在搬运过程中可以借助于B座的针,每次只能搬一个盘子,任何时候每根针上的盘子都必须保持大盘子在下小盘子在上的叠放顺序。Nanjing University例6.9 Hanoi塔问题64个盘子需要搬运264-1次。当A座

48、的针上只有一个盘子时(即n=1)数据规模最小,依据搬运要求和搬运规则可以很容易搬运这个盘子,因此直接输出搬运该盘子的操作指令后返回。当A座针上有多个盘子时(即n1),可以将这n个盘子的搬运操作分解为三部分: (1)输出将A座针上的前n-1个盘子借助C座针搬到B座针的搬运指令; (2)输出将A座针上剩下的最后一个盘子(编号为n)直接从A座针搬到C座针的搬运指令; (3)输出将B座针上的n-1个盘子借助A座针搬到C座针的搬运指令。92Nanjing University例6.9 Hanoi塔问题93Output:input the number of plates: 3a - ca - bc -

49、ba - cb - ab - ca - c# prog6-9.pydef hanoi(a, b, c, n): if n=1: print(a, -,c) else: hanoi(a, c, b, n-1) print(a, -, c) hanoi(b, a, c, n-1)n = int(input(input the number of plates: )hanoi(a, b, c, n)FileNanjing University递归深度的设定 查看递归深度 import sys sys. getrecursionlimit()1000 手工修改默认值 sys.setrecursionlimit(20000)94Nanjing University小结 函数的概念 常用Python标准库函数 函数的定义和调用 函数的参数 变量的作用域 递归函数95

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com