函数本质上就是一个封装后可以重复利用的代码片段,需要使用的时候直接调用就可以,比如前面所使用的 type 函数,print 函数。这些都是 Python 的内置函数,Python 官方的开发者底层封装好后,我们可以拿过来直接使用,不用关心底层是如何实现的。
为了提升代码的可复用性和结构性,函数的封装是一种思想,可以不用函数也能完成,但是效率低,代码重复量大!
在 Python 中,函数的定义需要使用到 def ,def 后面跟上函数的名称、括号,括号里面是参数,后面跟着冒号,然后在缩进的语句块中用 return ,返回函数执行的结果,也可以不用 return ,默认返回 None。
代码示例:
# 定义函数的格式:
def 函数名称(参数):# 参数可写可不写
函数内的代码块
return 结果
# 函数必须调用才能执行
函数名称()
# 定义一个函数输入我是世界上最美丽的人
def print_text():
print('我是世界上最美丽的人')
# 调用函数
print_text()
# 输出结果:我是世界上最美丽的人
函数在被调用之前必须声明,否则无法调用。print、type 等函数已经在 Python 底层中定义好了,所以我们可以直接调用,无需关心内部如何实现。
代码示例:
# 定义一个函数输入我是世界上最美丽的人
def print_text():
print('我是世界上最美丽的人!')
# 调用这个函数
print_text()
'''
输出结果:
我是世界上最美丽的人
'''
在 Python 程序中,程序从上到下执行,如果遇到函数的定义(def print_text():),编译器会自动跳过,不执行该函数,执行函数结束之后的代码,再往下执行程序,即不会执行(print('我是世界上最美丽的人!'))这里的程序,如果想调用函数,直接调用即可,当程序执行到第二行,发现这是一个函数声明,直接调用函数末尾,到第六行调用这个函数,再进入这个函数体之内执行代码。直到结束,这就是代码的运行过程。
函数可以通过外部传递参数,参数分为形参和实参:
代码示例:
# 带参函数格式
def 函数名(形式参数):
代码块
# 调用函数
函数名(实参)# 参数没有个数限制
# 没有参数, 固定值没有办法动态改变
def sum_num():
a = 10
b = 20
sum = a + b
print('%d+%d=%d' % (a, b, sum))
sum_num()
# 输出结果:10+20=30
# 计算输入两个数值的和
def sum_numb(a,b):
print('{}+{}={}'.format(a,b,a+b))
sum_numb(1,2)
# 输出结果:1+2=3
# 带参数版本
def sum_num(a, b):
sum = a + b
print('%d+%d=%d' % (a, b, sum))
num1 = int(input('请输入第一个数字'))
num2 = int(input('请输入第二个数字'))
sum_num(num1, num2)
常规而言,函数默认有几个形式参数,在外部调用时,就需要传递多少个实参。
为什么需要返回值(return)?
如果你希望这个值可以被外界获取,就可以定义返回值;
如果没有定义返回值,函数内的变量只能在函数内使用。
代码示例:
# 将摄氏度转换成华氏度
# 获取摄氏度
def get_noun():
# 这里假装有一大堆代码最后获取到了摄氏度
nuoun = 25
return nuoun # 返回值
# 将摄氏度转换成华氏度
huashi = get_noun() + 273.5
print(huashi)
# 输出结果:298.5
综合来说函数有以下几种类型:
1、函数无参数,有返回值
2、函数无参数,无返回值
3、函数有参数,有返回值
4、函数有参数,无返回值
例如,字典.getkeys 返回值就是所有的key
在网址的访问中,返回值就是告诉我们访问有没有成功。
代码示例:
# 导入requests库,即导入别人的代码
import requests
# 建立网络链接
data = requests.get('http://www.baidu.com')
print(data)
# 输出结果:<Response [200]>
# 这就是get的返回值,200在网络请求当中,就是正常响应的意思。就是这个网站是可以访问的。
# 获取源代码
data = requests.get('http://www.baidu.com').text
print(data)
返回多给值
1、return 是一次性只能返回一个元素,如果代码写的是多个元素,那么默认会将这些元素封装成一个元组。
代码示例:
def num():
a = 10
b = 20
c = 30
return a,b,c
print(num())
# 输出结果:(10, 20, 30)
所以,如果你想要返回多给元素,可以将内容以列表,字典,元组的方式进行封装返回
代码示例:
# 返回列表
def num():
a = 10
b = 20
c = 30
return [a,b,c]
print(num())
# 输出结果:[10, 20, 30]
# 返回字典
def num():
a = 10
b = 20
c = 30
return {a,b,c}
print(num())
# 输出结果:{10, 20, 30}
运用场景:通过一个方法获取到今天的天气 {'日期':value,'温度':value....}
代码示例:
def num():
data = '3月26日'
temp = 20
hum = 30
return {'日期':data,'温度':temp,'湿度':hum}
print(num())
# 输出结果:{'日期': '3月26日', '温度': 20, '湿度': 30}
函数的嵌套即在一个函数中,调用了另外一个函数。
在作用域内,函数名称不能重复。
代码示例:
def test1():
print('*'*50)
test2()
def test2():
print('-'*50)
def test3():
print('='*50)
test1()
test3()
# 输出结果:
# ==================================================
# **************************************************
# --------------------------------------------------
程序的执行逻辑:
1、程序从上往下执行。
第一步,def test1()定义了个函数test1,不执行,直接跳到封装函数后;
第二步,def test2()又定义了个函数test2,不执行,直接跳过该函数;
第三步,def test3()又定义了个函数test3,不执行,直接跳到函数后;
第四步,test3(),执行test3函数内的代码,执行print('='*50)代码;
第五步,test1(),调用了test1,程序回到test1函数内的代码,执行print(''50)代码;
第六步,test2(),调用了test2,程序回到test2函数内的代码,执行print('-'*50)代码;
程序执行完毕
需求:求三个数的平均值
代码示例:
# 用户输入
num1 = int(input('请输入第一个值'))
num2 = int(input('请输入第二个值'))
num3 = int(input('请输入第三个值'))
# 定义求和的函数
def sum_numb(n1,n2,n3):
result = n1+n2+n3
return result
# 定义求平均值的函数
def average_number(n1,n2,n3):
result = sum_numb(n1,n2,n3)/3
return result
#调用函数
print('平均值:',average_number(num1,num2,num3))
程序的执行逻辑:
1、程序从上往下执行;
2、用户输入第一个值、第二个值、第三个值;
3、def sum_numb(n1,n2,n3),发现是个函数,不执行,程序跳到函数后;
4、def average_number(n1,n2,n3),又是个函数,不执行,程序跳到函数后;
5、print('平均值:',average_number(num1,num2,num3)),调用了average_number函数,程序回到average_number函数内的代码;
6、把num1,num2,num3三个数值往n1,n2,n3这三个参数按顺序套用;
7、执行程序result = sum_numb(n1,n2,n3)/3,这里又调用了sum_numb函数,程序回到sum_numb函数内的代码;
8、又把num1,num2,num3三个数值往n1,n2,n3这三个参数按顺序套用;
9、得出sum_numb(n1,n2,n3)函数的结果,即num1,num2,num3这三个数的和,再计算result = sum_numb(n1,n2,n3)/3;三个数的和除以3,结果得出平均值;
联系客服