python
书接上回,这次我们讲函数
函数
# def welcome():# print("欢迎来到麻雀课堂")# welcome()参数:参数可以让函数接收外部传入的数据,能让函数更具通用性和灵活性
def order(food):print(f"{food}很好吃")order("水煮肉")
关键字参数:函数调用时通过形参名 = 值的形式传递的参数,就是关键字参数。 关键字参数的优势是:不受顺序限制。
def order(food):print(f"{food}很好吃")order(food='水煮肉')限制传参方式
前面只能用『位置参数』,*后面只能用『关键字参数』
def greet(name,/,gender,*,age):print(f'{name}是{gender}年龄{age}')greet("李易峰",'男',age=12)greet("李易峰",gender='男',age=12)默认值
def greet(name,/,gender,*,age=12):print(f'{name}是{gender}年龄{age}')greet("李易峰",'男',age=13)greet("李易峰",gender='男',age=12)可变参数
在定义函数时,如果不确定会传入多少个参数,那就可以使用可变参数,具体写法有两种:
使用*形参名来接收任意数量的『位置参数』,多个位置参数最终会被打包成一个『元组』。
使用**形参名来接收任意数量的『关键字参数』,多个关键字参数最终会被打包成一个『字典』。
可变位置参数』和『可变关键字参数』,可以同时使用,但必须要先写『可变位置参数』。
# 定义函数(同时使用:可变位置参数、可变关键字参数)def test3(a,b,*args,c="麻雀",**kwargs):print(a,b,c,args,kwargs)//a b c ('抽烟', '惊蛰', 'c') {'name': '以父之名'}test3("a","b","抽烟","惊蛰",'c',c='c',name="以父之名")None是一个空的字面量
msg=Noneprint(type(msg)) #<class 'NoneType'>print(bool(msg)) # falseif not msg:print('你好')返回值
什么是返回值:函数执行完毕后,会把执行结果交给调用者,这个执行结果就是函数的返回值。
def add(n1,n2):return n1+n2result= add(100,100)print(result)全局作用域vs局部作用域
global关键字
用于将变量声明为全局变量
a=100b=200def count(): global c c=100print(c) //100count()print(a,b,c) //100 200 100测试
请说出如下代码的输出结果,如果全部正确说明这节知识点你掌握了
a = 100b = 200def test(): c = '麻雀' d = '你好啊' global a a = 300print('函数中的打印(a)', a)#300print('函数中的打印(b)', b)#200print('函数中的打印(c)', c)#麻雀print('函数中的打印(d)', d)#你好啊test()print('***************')print('全局的打印(a)', a)#300print('全局的打印(b)', b)#200# print(c) #未定义# print(d) #未定义# 局部作用域 和 局部变量,会在函数调用时创建,在函数执行结束后自动销毁def test2(): m = 100 m += 1print(f'我是test2函数中打印的m:{m}')test2()#101test2()#101test2()#101# 全局作用域 与 全局变量,会在程序开始时创建,在程序结束后销毁n = 100def test3(): global n n += 1print(f'我是test3函数中打印的n:{n}')test3()#101test3()#102test3()#103print(n)#103函数嵌套
在一个函数执行的过程中,调用了另外一个函数
def test1(name,msg):print(name) test2(msg)def test2(msg):print(msg)test1("张若昀","千里江山图杀青")递归调用
顾名思义:函数自己调自己
def welcome(n):print(f'你好啊{n}')if n > 1: welcome(n - 1)# 调用函数welcome(5)#使用递归求阶乘def factorial(num):if num==0:return 1else:return num*factorial(num-1)print(factorial(5))案例:
完成一个健身挑战赛程序

输入每天的运动量,如果达成目标,则挑战成功,否则失败
def experience(day,goal): all = 0for n in range(day): num = int(input(f"请输入第{n+1}天的数量")) all += num avg = all / day res=""if all>goal: res='挑战成功'else:res='挑战失败'print(f'{day}天总数{all},平均{avg}')print(f'{res}')experience(7,40)练习: 定义一个函数,根据传入的分数,计算对应的分数等级并返回。
def setscore(): score=int(input("请输入成绩"))if score>=90:return'A'elif score>=75:return'B'elif score>=60:return'C'else:return'D'print(setscore())需求2:定义一个函数,用于判断一个字符串是否是回文串,返回bool值。 把字符串反转,如果和原字符串相同,就是回文串。(如:"level","radar","黄山落叶松叶落山黄")
def ishuiwen(str): str_list=list(str) str_list.reverse() str_new="".join(str_list)if str_new==str:return"是回文"else:return"不是回文"print(ishuiwen("level"))print(ishuiwen("liyifeng"))需求3:定义一个函数:完成时间转换功能,将传入的秒转换为小时、分钟、秒。
def settime(seconds):if(seconds<60):return seconds+'秒'elif(seconds<3600):return f'{seconds//60}分种{seconds%60}秒'else: hours=seconds//3600 minMax=seconds%3600 minutes=0 second=0if(minMax>60): minutes=minMax//60 second=minMax%60return f'{hours}小时{minutes}分钟{second}秒'print(settime(3700))定义一个函数:根据传入的三角形三个边的边长,判定三角形的类型(等边、等腰、普通,或者不能构成三角形)。
def trangle(a, b, c):if (a + b > c and a + c > b and b + c > a):if (a == b == c):return"等边三角形"elif ((a == b or a == c or b == c)):return"等腰三角形"elif (a + b > c and a + c > b and b + c > a):return"普通三角形"else:return"不是三角形"print(trangle(3, 4, 5))print(trangle(3, 3, 5))print(trangle(3, 4, 6))print(trangle(3, 5, 6))print(trangle(3, 4, 7))print(trangle(8, 8, 8))上面的练习都会做了就代表今天的函数知识过关了~


