函数
关于函数的好处相比大家都知道,这里不再累赘。下面分别介绍Python和C语言函数,以及两者之间的区别。
Python函数
定义函数, 先写def关键字,然后是函数名,然后是一对圆括号,再是一个冒号,最后是一段带有缩进的代码块。格式如下:
def function_name():
”’此处说明函数的功能
input: 参数名1(类型)含义
参数名2(类型)含义
output:返回值(类型)含义
”’
code_block
三引号内第一行简要说明函数的功能,另起一行写形参及其类型,简要说明其含义,如果不止一个形参,则在下一行说明。最后一部分写返回值,同样,如果不止一个返回值,也要分行写。三引号内的这一部分称之为文档字符串,必须将其写在函数的第一行,当然也可以不写,但写注释是个好习惯,另外,在IDLE调用某个函数时,文档字符串就会以交互式文档的形式显示出来。
code block部分则是函数功能的具体部分,注意保持一致缩进。下面具体实现
def BMI(weight, hight):
'''计算体质指数
input: weight(float) 体重,单位kg
hight(float) 身高,单位m
output:bmi(float) 体质指数
'''
bmi = weight / (hight**2)
return bmi
weight,hight=map(float,input("输入体重,身高,用空格隔开").split())
print("你的BMI指数为: {0:.2f}".format(BMI(weight,hight)))
运行结果:
- 输入体重,身高,用空格隔开70 1.75
- 你的BMI指数为: 22.86
除了像C一样的定义参数之外,还可以定义关键字参数和默认参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,Python能用参数名匹配参数值。如:
def BMI(weight, hight):
'''计算体质指数
input: weight(float) 体重,单位kg
hight(float) 身高,单位m
output:bmi(float) 体质指数
'''
bmi = weight / (hight**2)
return bmi
w,h=map(float,input("输入体重,身高,用空格隔开").split())
print("你的BMI指数为: {0:.2f}".format(BMI(hight=h,weight=w)))
输出结果
- 输入体重,身高,用空格隔开70 1.75
- 你的BMI指数为: 22.86
可以看到,调换了实参的位置,但结果不变,因为用等号已经给定了实参的值,所以结果不变。
默认参数:调用函数时,如果没有传递参数,则会使用默认参数。前提在于你已经指定了默认值。
def BMI(hight,weight=70):
'''计算体质指数
input: weight(float) 体重,单位kg
hight(float) 身高,单位m
output:bmi(float) 体质指数
'''
bmi = weight / (hight**2)
return bmi
w,h=map(float,input("输入体重,身高,用空格隔开").split())
print("你的BMI指数为: {0:.2f}".format(BMI(h,)))
输入 2 1.75,结果为
- 输入体重,身高,用空格隔开2 1.75
- 你的BMI指数为: 22.86
虽然输入为2 1.75,但结果依然同70 1.75时的结果一样,这就是默认关键字的作用了,在定义函数时,把带默认值的参数写在最后面,如果在调用函数时没有输入时,就使用提供的默认值。
如果发现某个函数经常使用同样的参数值进行调用,就应该考虑使用默认参数值。
值得一提的是,Python中可以嵌套定义函数,这在C中是不可以的,另外,Python中的函数可以有多个返回值,相应的,在调用时也就需要多个值来接收函数的返回值,否则可能报错。下面再说说C语言中的函数。
函数定义,一般格式如下
- 返回值类型 函数名(形参列表){
- 函数主体
- }
如果没有返回值,则返回值类型为void,函数的形参列表可选,没有就空下。函数主体就是函数功能具体实现的代码块。
具体实现如下:
#include <stdio.h>
//////////计算体质指数/////////////////
// input: weight(float) 体重,单位kg
// hight(float) 身高,单位m
// output:bmi(float) 体质指数
////////////////////////////////////////
float BMI(float weight, float hight){
float bmi;
bmi = weight / (hight*hight);
return bmi;
}
int main(){
float w, h;
printf( "分别输入体重,身高,用空格隔开");
scanf( "%f%f", &w,&h);
printf("\n你的BMI指数为%.3f",BMI(w,h));
return 0;
}
输入 70 1.75
输出结果为
- 分别输入体重,身高,用空格隔开 70 1.75
- 你的BMI指数为22.857
补充前面 传递数组给函数的坑。
首先推荐这篇博文,讲的很详细https://www.cnblogs.com/DarrenChan/p/5778318.html
下面说下我的个人理解,由于电脑上没有C语言环境,就不上代码了,只说心得。有不对的地方还请指出了。
数组名就是数组的首地址,当数组名作为参数传递给函数时,实际上传递的是数组的首地址,相当于指针操作,当在子函数中修改数组时,就会真的改变原始数组的值,因为这是对同一块内存的操作。普通的传参,编译器会开辟一块新的内存来进行运算,等结果出来后只把返回值给调用的对象,之前开辟的内存空间就销毁回收了。为什么对数组不开辟新的空间,因为对数组的备份开销可能会很大,C的一个最大的优点就是效率,总之,以数组名作为函数参数相当于指向数组首地址的常量指针作为函数参数。