python进阶,在第一期的基础上做了极大的优化,整体更加美观易懂
十三、函数进阶 (上)
内容较多(该篇幅超过4000字),分为上下两个篇幅,此篇是上
13.1、定义嵌套
def a():
def b(): # 在函数a里面再定义一个函数b,这就是函数嵌套
print()
13.2、函数的调用嵌套
def test1(): # text1()函数
print("开头")
print("中间")
print("结尾")
def test2(): # text2()函数
print("test2开头")
test1()
print("test2结尾")
test2() # 运行过程:从test2开始运行,打印test2函数内的第一行,即第一个print,然后检测到test1函数,跳到test1函数内部,打印test1里面的三个打印,test1打印完后再跳到test2里面输出test2里面的最后一个print,然后程序运行完成。
# 结果:
>>> test2开头
>>> 开头
>>> 中间
>>> 结尾
>>> test2结尾
小需求:随机输入一个数字,然后嵌套观众老爷,我错了,例如输入5,然后打印5遍观众老爷我错了(根据输入的数字打印对应的次数)
shu = int(input("请输入循环次数:"))
def wcl():
print("观众老爷,我错了")
def wcl1(a): # a为接收的数字,控制循环次数
print("_" * 30) # 打印30个_
i = 0
while i < a: # 通过传入的参数来控制循环
wcl() # 跳入wc1函数,运行打印"观众老爷,我错了"
i += 1 # 用于给循环结束提供条件
print("_" * 30)
wcl1(shu) # 到这一行函数才开始运行,shu接收输入的数字,并且传入wcll()函数中
>>> 请输入循环次数:5
>>> ______________________________
>>> 观众老爷,我错了
>>> 观众老爷,我错了
>>> 观众老爷,我错了
>>> 观众老爷,我错了
>>> 观众老爷,我错了
>>> ______________________________
13.3、函数嵌套
小需求:输入三个数,a:求三个数之和,b:求三个数平均值
num1, num2, num3 = map(int, input("请输入三个数,(中间用空格隔开):").split()) # 将输入的三个数分隔开,并分别传入num1, num2, num3
def he(a, b, c):
h = a + b + c # 对传入的参数相加求和并赋值给h,在下一行通过return返回
return h
def ave(a, b, c):
print(f"输入的数字为{a} {b} {c}")
print(f"{num1}+{num2}+{num3}的和为{he(a, b, c)}") # 从这里开始函数开始调用he函数
ave(num1, num2, num3) # 函数从这里开始,调用ave函数,并且传参
# 结果
>>> 请输入三个数,(中间用空格隔开):1 3 5
>>> 1+3+5的和为9
13.4、变量作用域
13.4.1、局部变量
小需求:定义一个函数,在函数体内部声明一个变量,函数体内部访问,函数体外部访问, 查看区别
def test3():
b = 10
print(b) # 在函数体内部,
test3()
# 结果:
>>> 10
def test4():
c = 10
test4() # 函数体内部没有print函数,所以不会有输出结果
print(c) # 在函数体外部,脱离函数体直接销毁,所以会报错
# 结果:
>>> NameError: name 'c' is not defined
# 报错:原因,b变量是局部变量,在函数体外不能访问
13.4.2、全局变量
全局变量指:在函数体内外的变量,全局变量在所有地方都能生效的变量
a1 = 100 # 全局变量,在函数体外面声名
def test3():
print(a1) # 这个时候a1=100
def test4():
test3() # 调用test3函数
# 尝试对a1赋值为200
a1 = 200 # 如果想修改a1为全局变量,直接使用关键字global:声明变量为全局变量
print(a1) # 再打印重新赋值后的a1
test4()
print(a1) # 最后在函数体外再打印一下a1,查看a1是否有变化
# 结果:
>>> 100 # test3里面a1,结果为100
>>> 200 # test4里面的a1,改变a1,在局部内对a1重新赋值,a1为200。
>>> 100 # 函数体外面,a1为全局变量,值不变,结果依旧为100
a1 = 100 # 全局变量,在函数体外面声名
def test3():
print(a1)
def test4():
test3()
global a1 # 声明变量为全局变量
a1 = 200
print(a1)
test4()
print(a1)
# 结果:
>>> 100
>>> 200 # test4里面的a1,通过global函数改变a1为全局变量,并且对a1重新赋值,a1为200。
>>> 200 # 因为global函数将a1定义为全局变量,并且为a1进行重新赋值,所以a1变成了200
13.5、lambda表达式
小需求,定义一个函数,有返回值100
正常写法
def a():
return 100 # 如果使用print(100),结果会变成,100,None
print(a())
# 结果:
>>> 100
使用lambda函数
b = lambda: 100 # 无参数列表
# print(b) # 直接打印b会得到lambda的地址<function <lambda> at 0x0000020C56BC7168>
print(b()) # 得到100返回值,通过把保存的变量当成是函数调用
# 结果:
>>> 100
def add(a, b):
return a + b
print(add(2, 5))
# 结果:
>>> 7
使用lambda函数
c = lambda a, b: a + b # 定义一个函数c,函数里面有两个参数a, b,进行相加运算,然后return返回
d = c(5, 6) # 对函数c进行传参,将数字5, 6作为参传入
print(d)
# 结果:
>>> 11