六、函数(一)
一、函数介绍、定义和调用
1、函数介绍
在编程过程中,总有那么一些代码会被重复使用,这些代码少的几行多的很多行。如果用一次写一次实在是浪费时间的很。而且代码里面好几段段代码一样一样的,重复率太高,专业名词叫代码冗余。而且读起来还费力费神费事。为了解决这些事情,大佬们开始使用函数。函数,我将之理解为代码块。
只要在代码中定义好函数,并写好相关功能,然后当我们需要用到的时候给它打call就能使用它,专业名词叫做函数的调用,就很方便。省时省力。就像我们经常使用到的print()和input()。
2、定义函数
定义函数非常的简单。下面定义一个简单的函数:
def func(): print('hello world')
上面的示例中,我定义了一个最简单的函数,他的功能是打印 hello world。现在,我们说你好世界的方式又更加高级了呢。
代码中,def 是定义函数的关键字。func是函数的名字(函数名)。print语句是函数体。括号是用来设置参数的,当然这里没有用到参数。将在第三节中讲参数的设置和传参。
3、调用函数
调用函数也特别简单。函数名+(),并在括号内传入相应的参数就行了。这里,我们调用上面的func函数。
func()
二、函数的返回值
上面的例子只让输出,我们能看见效果,这个效果也就是函数的反馈。但是如果是让函数进行一些其他的不会输出信息的工作,我们是不能做到它工作完没完的。为了让让我们知道他的状态,同时也是为了能得到函数整型过程中产生的某些数据,我们需要函数给我们一些东西,这些就是返回值。
函数中能够通过return关键字给调用的地方返回数据,可以是一个也可以是多个。下面将先行讨论只返回一个的情况。
返回一个数据的情况下,可以返回一个字符,一个字符串,一个数字,一个元祖等,简而言之就是return后面参数写完一个之后不再加逗号隔开,再添加另一个数据。
这里实现一个计算连加的函数,返回结果;
def sums(start,end): i = 0 for number in range(start,end+1): i += number return i ret = sums(1,3) print(ret) #运行输出6
我们看到,函数实现了连加的功能,而且通过return将结果i返回给调用的地方,并把相应的值赋给ret,最后进行打印。另外,为了使函数更加灵活,我给函数设置了参数:start,end。这里,定义函数使设置的参数称之为形式参数,简称形参。形参实际上不存在,不占用内存空间;
而调用函数时传入的参数(1和3)称之为实际参数,简称实参。实参是存在的,作用内存空间的。
在第三节中讲详细讲述函数参数的设置。接下来我们讨论返回多个数据。我将上面的连加代码稍微改进了一下,做成了乘法和连加一起;
def sumAndRide(start,end): r_ret = start*end i = 0 for number in range(start,end+1): i += number return i,r_ret sret, rret = sumAndRide(1,3) print(sret,rret) #运行输出6 3
可以看到,函数返回两个值,加法结果i和乘法结果r_ret。接收返回值的时候用了两个变量sret和rret。注意,这里需要按顺序接收。
如果只使用一个变量接收多个返回值,那么你将得到一个元祖。
三、函数的参数
在第二节中,已经使用了参数,而且说了实参和形参的概念。这一节将详细讲解函数参数的设置和给参数传值的注意事项。
1、位置参数
在定义函数的时候简单地设置的不赋予默认值的参数。比如第二节中的start和end。给位置参数传参有两种方式:
1)按位置传参:按形参的先后顺序传入参数。
2)按关键字传参:以形参=实参的格式传参。
当然,也可以两种方式混合使用只是必须先位置传参,然后关键字传参,否则将会出错。
def func(name,id): print('你的姓名是',name,'你的id是',id) func('Darius',10000) func(id=10000,name='Darius') func('Darius',id='10000') """输出结果 你的姓名是 Darius 你的id是 10000 你的姓名是 Darius 你的id是 10000 你的姓名是 Darius 你的id是 10000 """
2、默认参数
在设置参数时立即赋给参数值,这种参数便是默认参数了,默认参数设置在位置参数的后面。因为默认参数有默认值,使用时我们可以不给它传参。
默认参数在现实生活中是有很大的用处的。想象一下,一个理工类的班级统计学生信息,班级男女失衡,男生很多,以至于输入性别的时候输入男会输如很多次。这时候我们可以把性别默认值设置为男,这样我们输入的时候性别一项只需要输入几次女就行了。而且即使男女一样多,设置了这样的默认参数也可以省下许多功夫。
接下来我们展示一个简单的使用了默认函数的统计信息的函数。
def count_students(name,stu_id,sex='男',): dict = {} dict['姓名'] = name dict['性别'] = sex dict['学号'] = stu_id print(dict) count_students('Daruis',10000) count_students('小欢儿',10001,sex='女') """输出结果 {'姓名': 'Daruis', '性别': '男', '学号': 10000} {'姓名': '小欢儿', '性别': '女', '学号': 10001} """
另外需要注意的是,如果默认参数设置成一个可变数据类型(列表,字典什么的),当你多次调用函数,并且在函数里改变这个默认参数,这个默认参数的最终结果会是在所有调用语句的共同作用的结果。比如说:
def func(name,times,name_list=[]): name_list.append(name) print("第%s次调用函数,列表内容为%s"%(times,name_list)) func('xiaoming',1,) func('xiaoming',2,) func('xiaoming',3,) func('xiaoming',4,) func('xiaoming',5,) """输出结果 第1次调用函数,列表内容为['xiaoming'] 第2次调用函数,列表内容为['xiaoming', 'xiaoming'] 第3次调用函数,列表内容为['xiaoming', 'xiaoming', 'xiaoming'] 第4次调用函数,列表内容为['xiaoming', 'xiaoming', 'xiaoming', 'xiaoming'] 第5次调用函数,列表内容为['xiaoming', 'xiaoming', 'xiaoming', 'xiaoming', 'xiaoming']"""
3、动态参数
当需求太多,要传入的参数太多,我们又懒得一个一个地设置参数,这个时候就可以使用动态参数。动态参数有两种:*args(arguments)和**kwargs(key word arguments);
*args是按照位置传参时使用的。传入的多个实参会被组织成一个元祖交给函数处理。
def argsUse(*args): for item in args: print(item,end='|-|') argsUse(1,2,3,4,5,6,7,8,'a','啊') """输出结果 1|-|2|-|3|-|4|-|5|-|6|-|7|-|8|-|a|-|啊|-| """
可以看到,我传入了那么多个实参。如果我想还可以加,但我不想。另外,看见print函数里的end参数了吗?他就是一个默认参数,默认值为一个换行符。
**kwargs是按照关键字传参时使用的,传入的实参会被组织成字典交给函数处理,传参时的关键字接收字典中的key值。
def kwargsUse(**kwargs): print(kwargs) kwargsUse(name = 'xcj',sex = '男',id = 10000) """输出结果 {'name': 'xcj', 'sex': '男', 'id': 10000} """