一、嵌套函数
嵌套函数:在函数内部定义的函数,一般用于封装-隐藏数据(外部无法访问“嵌套函数”),嵌套函数可以让我们子函数内部避免重复的代码。
操作:
1、嵌套函数的定义
#测试嵌套函数的定义 def outer(): print("outer running") def inner():#inner函数体包含在outer函数体中,属于嵌套函数 print("inner running") inner() outer()
运行结果:
2、使用嵌套函数避免重复代码
#测试使用嵌套函数避免重复代码 def printChinsename(name,familyname): print("{0}{1}".format(familyname,name)) def pritEngelishname(name,familyname): print("{0}{1}".format(name,familyname,)) printChinsename("小五","赵") pritEngelishname("six","seven") #使用嵌套函数代替上面的两个函数 def printName(isChinese,name,familyname): def inner_print(a,b): print("{0}{1}".format(a,b)) if isChinese:#加入一个判断条件isChinese inner_print(familyname,name) else: inner_print(name,familyname) printName(True,"小五","赵") printName(False,"six","seven")
运行结果:
二、nonlocal关键字
nonlocal 用来声明外层的局部变量,在被嵌套的函数内对外层变量进行修改需要用nonlocal 进行声明。
global 用来声明全局变量。在函数内改变全局变量的值,使用global 关键字进行声明。
操作:测试使用nonlocal和global 声明参数更改
#测试nonlocal、global关键字 a=100#全局变量 def outer(): b=200#外层局部变量 def inner(): nonlocal b#声明外部局部变量b print("inner b:",b) b=20 global a#声明全局变量a a=300 inner() print("outer b:",b)#对外部函数局部变量做出了修改 outer() print("a:",a)
运行结果:
三、LEBG规则
python 在查找“名称”时,是按照LEBG规则进行查找的
Local—Enclosed—Global—Built in
Loca 指的是函数或者是类的方法内部
Enclosed 指的是嵌套函数(一个函数包含另一个函数,闭包)
Global 指的是模块中的全局变量
Built in 指的是python为自己保留的特殊名称。
操作:测试查找“名称”的LEBG规则
依次将几个“str"注释掉,观察打印输出的内容,可以体会LEBG的搜索顺序。
#测试LEBG,一次注释掉str,观察打印台的位置,可以体会到LEBG的搜索顺序 str="global"#第三次输出位置 def outer(): str="outer"#第二次输出的位置 def inner(): str="inner"#第一次输出位置 print(str) inner() outer()
最后一次运行结果是python为自己保留的特殊名称,如下:
四、实操作业
1、定义一个函数实现反向输出一个整数,比如:输入2345,输出5432.
分析:定义函数后,用str()内置函数将输入整数改为字符串格式,再利用切片的概念对输入的整数进行倒叙输出。
def f1(n): a=str(n) b=a[::-1]#字符串切片 print(a) print(b) f1(2345)
运行结果:
2、编写一个函数,计算下面的数列:m(n)=1/2+2/3+3/4+…n/n+1.
分析:可使用递归函数达到计算此项数列。
n=int(input("请输入一个整数:")) def f1(n): s=n/(n+1) if n==0: return 0 else: return s+f1(n-1)#调用自己的函数成为递归函数 n=n-1 print(f1(n))
运算结果:
3、输入三角形三个顶点的坐标,若有效则计算三角形的面积;若无效则给出提示。
import math def isvalid(a=0.0, b=0.0, c=0.0): """判断三条边长是否符合三角形的定义:任意两边之和大于第三边或者任意两边之差小于第三边""" side = [a, b, c] side.sort() if side[0] + side[1] > side[2] or side[2] - side[1] < side[0]: return True else: return False def calculate_area(): """获取三角形的三个顶点坐标并计算该三角形的面积""" x1, y1 = map(int, input('请输入第一个顶点坐标:').split()) x2, y2 = map(int, input('请输入第一个顶点坐标:').split()) x3, y3 = map(int, input('请输入第一个顶点坐标:').split()) # 计算三条边长 side1 = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) side2 = math.sqrt((x1 - x3) ** 2 + (y1 - y3) ** 2) side3 = math.sqrt((x2 - x3) ** 2 + (y2 - y3) ** 2) # 调用 isvalid() 函数,判断是否能够构成三角形 if isvalid(side1, side2, side3): # 计算半周长 s = (side1 + side2 + side3) / 2 # 计算面积 area = (s * (s - side1) * (s - side2) * (s - side3)) ** 0.5 print('三角形的面积为:{:.2f}'.format(area)) else: print('坐标无效,无法构成三角形') if __name__ == '__main__': calculate_area()
运行结果:
4、输入一个毫秒数,将该数换成小时数、分钟数,秒数。
ms=int(input("请输入一个毫秒数:")) def Time(): s=ms/1000 m=s/60 h=m/60 print("{0}秒,{1}分钟,{2}小时".format(s,m,h)) Time()
运行结果:
python基础学习函数内容总结完成,学习python的第七天,加油!