1、15.1 函数定义与调用 在数学中,函数(function)表示从自变量到因变量之间的一种映射或对应关系。软件开发中的函数也具有相似的含义,即将输入经过一定的变换和处理后得到预定的输出。从外部来看,函数就像一个黑盒子,使用者不需要了解其内部原理,只需要了解其接口或使用方法即可。2函数输入输出5.1 函数定义与调用 在Python中,定义函数的语法如下:def 函数名(参数列表):注释 函数体35.1 函数定义与调用 定义函数时注意事项:不需要声明函数形参的类型,形参类型是在函数调用时由传递的实参类型确定的。即使函数不需要接收任何参数,也必须保留一对空的圆括号。括号后面的冒号必不可少。函数体相对
2、于 def 关键字必须保持一定的缩进。在定义函数时开头部分的注释并不是必需的,但如果为函数的定义加上一段注释的话,那么可以为用户提供友好的提示和使用帮助。在 Python 中,在定义函数时也不需要声明函数的返回值类型,而是使用 return 语句结束函数的同时返回任意类型的值,函数返回值类型与 return 语句返回表达式的类型一致。如果函数没有 return 语句,或有 return 语句但是没有执行,又或者执行了不返回任何值的 return 语句,那么 Python 解释器都会认为该函数以 return None 结束,即返回空值。45.1 函数定义与调用 例例 6-1 定义函数,接收参数
3、 n,计算斐波那契数列中小于参数 n 的所有值。def fib(n):#定义函数,括号里的n是形参 accept an integer n.return the numbers less than n in Fibonacci sequence.a,b=1,1#数列前两项 while a def addOne(a):a+=1#这条语句会得到一个新的变量a a=3 addOne(a)a#实参的值没有受到影响375.2 函数参数 当列表、字典、集合等可变数据类型作为函数参数时,如果在函数内部通过列表、字典或集合对象自身的方法修改其中的元素,那么同样的作用会立刻体现到实参上。85.2 函数参数 de
4、f modify(v):#修改列表元素值 v0=v0+1 a=3 modify(a)a4 def modify(v,item):#为列表增加元素 v.append(item)a=2 modify(a,5)a2,595.2 函数参数 def modify(d,key):#修改字典元素值或为字典增加元素 dkey=38 a=name:Dong,age:37,sex:Male modify(a,age)aage:38,name:Dong,sex:Male def modify(s,v):#为集合添加元素 s.add(v)s=1,2,3 modify(s,4)s1,2,3,4105.2.1位置参数 例
5、例 6-2 定义一个函数,接收 3 个整数参数,返回 3 个整数的和。def add(a,b,c):#函数接收3个参数 return a+b+cprint(add(3,5,7)#调用函数时传递3个参数print(add(1,2,4)115.2.2默认值参数 例例 6-3 编写函数,接收两个或三个整数(第三个参数默认为 0)作为参数,返回它们的和。def add(a,b,c=0):#第三个参数有默认值 return a+b+cprint(add(3,5)#调用函数时可以不给第三个参数传递实参print(add(1,2,4)#也可以给带默认值的参数传递实参125.2.3关键参数 例例 6-4 编写
6、函数,接收三个整数作为参数,返回它们的和。再调用该函数,并且使用关键参数的形式传递参数。def add(a,b,c):return a+b+cprint(add(a=5,c=6,b=7)#调用函数时明确指定哪个值给哪个参数135.3 变量作用域 变量起作用的代码范围称为变量的作用域,不同作用域内同名变量之间互不影响,就像不同文件夹中可以有相同的文件名一样。如果一个变量不属于任何函数,那么它是全局变量,其作用域从第一次赋值开始到该程序文件尾部结束。在函数内直接定义的普通变量是局部变量,只可以在该函数内使用,当函数运行结束后,在其内部定义的所有局部变量将被自动删除从而不可访问。145.3 变量作用
7、域 在函数内部也可以通过 global 关键字声明或定义全局变量,分为两种情况:一个全局变量已在函数外定义,如果在函数内需要修改这个变量的值,并将修改的结果反映到函数之外,那么可以在函数内用 global 关键字明确声明要使用已定义的全局变量。在函数内部直接使用 global 关键字将一个变量声明为全局变量,如果在函数外没有定义该全局变量,那么在调用这个函数后,会创建新的全局变量。155.3 变量作用域 def demo():global x#声明或创建全局变量,必须在使用x之前执行该语句 x=3#修改全局变量的值 y=4#局部变量 print(x,y)x=5#在函数外部定义了全局变量x de
8、mo()#本次调用修改了全局变量x的值3 4 x#全局变量x的值被修改了3 y#局部变量在函数运行结束之后自动删除,不再存在NameError:name y is not defined del x#删除全局变量x xNameError:name x is not defined demo()#本次调用创建了全局变量x3 4 x3165.3 变量作用域 如果局部变量与全局变量具有相同的名字,那么该局部变量会在自己的作用域内暂时隐藏同名的全局变量。def demo():x=3#创建了局部变量,自动隐藏了同名的全局变量 print(x)x=5#创建全局变量 x5 demo()#在函数内访问的是局部
9、变量x3 x#函数调用结束后,全局变量x的值不变5175.4 函数递归调用 在一个函数中直接或间接地调用了该函数自身,称为递归调用。函数的递归调用是函数调用的一种特殊情况,函数调用自己,自己再调用自己,自己再调用自己直到当某个条件得到满足时就不再调用了,最后一层一层地返回,一直回到该函数被第一次调用的位置。18.函数A函数B函数B函数B函数B函数B调 用返 回调 用返 回调 用返 回调 用返 回调 用返 回调 用返 回5.4 函数递归调用 例例 6-5 编写函数,使用递归调用计算整数列表中所有整数之和。def recursiveSum(lst):if len(lst)=1:return lst
10、0 return lst0+recursiveSum(lst1:)print(recursiveSum(1,2,3,4)195.4 函数递归调用 例例 6-6 编写递归函数,判断一个字符串是否为回文。def isPalindrome(text):if len(text)f=lambda x,y,z:x+y+z#可以给lambda表达式起个名字 print(f(1,2,3)#把lambda表达式当做函数使用6 g=lambda x,y=2,z=3:x+y+z#含有默认值参数 print(g(1)6 print(g(2,z=4,y=5)#调用时使用关键参数11 L=1,2,3,4,5 list(m
11、ap(lambda x:x+10,L)#lambda表达式作为函数参数11,12,13,14,15 data=list(range(20)import random random.shuffle(data)#打乱列表中的元素顺序 data15,17,0,7,12,18,11,3,9,8,16,10,6,2,1,4,19,13,14,5 data.sort(key=lambda x:len(str(x)#按转换成字符串后的长度进行排序 data0,7,3,9,8,6,2,1,4,5,15,17,12,18,11,16,10,19,13,14225.6 精彩例题分析与解答 例 6-7 编写函数,接
12、收整数或实数参数作为圆的半径,输出圆的面积。from math import pi as PIdef circleArea(r):if isinstance(r,(int,float):#确保接收的参数为数值 return PI*r*r else:return You must give me an integer or float as radius.print(circleArea(3)235.6 精彩例题分析与解答 例 6-8 编写程序,模拟转盘抽奖游戏。from random import randomdef lottery(number):for k,v in grades.item
13、s():if v0=numberv1:return k#各奖项在轮盘上所占比例grades=一等奖:(0,0.1),二等奖:(0.1,0.3),三等奖:(0.3,1.0)number=random()print(您本次中奖为:,lottery(number)245.6 精彩例题分析与解答 例例 6-9 编写程序,模拟蒙蒂霍尔悖论游戏。假设你正参加一个有奖游戏节目,有 3 道门可选:其中一个门后面是汽车,另两个门后面是山羊。你先选择一个门,如 1 号门,主持人知道每个门后面是什么并且打开了另一个门,如 3 号门,后面是一只山羊。然后主持人问:“你想改选 2 号门吗?”最后根据你的最终选择打开门,牵走门后的山羊或者开走门后的汽车。代码见配套资源。255.6 精彩例题分析与解答 例例 6-10 编写程序,模拟聪明的尼姆游戏。尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。在聪明模式中,计算机玩家每次拿走一定数量的物品使得堆的大小是 2 的幂次方减 1,如 3、7、15、31 或 63 等。如果堆的大小已经是 2的幂次方减 1,计算机玩家就随机拿走一些。代码见配套资源。26
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。