六、函数(一)

一、函数介绍、定义和调用

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}
"""
posted @ 2019-03-06 10:58  Darius-xiong  阅读(153)  评论(0编辑  收藏  举报