马一特 阅读(22) 评论(0)

在了解函数参数之前,我们先来回顾一下,上次讲解过的内容

函数的作用

1 函数可以使代码组织结构清楚,结构性强,便于阅读

2 遇到重复内容,可以用函数代替,避免代码冗余

3 当程序功能需要修改时,我们只需要对函数内功能模块进行修改即可,便于维护

函数的种类

定义一个函数很简单,函数的种类也很简单,这里分成三类,是为了便于我们记忆函数的特征,函数有三个特种,分别是作用,种类,返回值,三个特征下又分别对应三种特点

1 无参函数 def func():

比如用户输入功能模块会用到,请看如下代码演示

1 def interaction():
2 """
3 一个让用户输入用户名和密码的交互功能
4 """
5     name = input("user name>>:")
6     password = input("password>>:")
7     print(name,password)
8     return name,password
9 interaction()

2 有参函数 def func(x,y):

最常用的函数类型之一,请看如下代码演示

def function(x,y):
    if x > y:
        print(x)
    else:
        print(y)
function(1,2)

3 空函数 def func():

                   pass

一般用于组织代码结构,用多个空函数定义出,程序员写代码所需要用的功能模块,就是想 先把工具列好,准备一个清单,按照这个清单去找工具,提高写代码效率

def modification():
    pass
def interaction():
    pass
def function():
    pass

函数的返回值

函数用return接受其返回值,与print不同,

return接受返回值有三种形式

1 return = None  或者 不写return,就代表该函数没有返回值,也不需要再用 其返回值

2 return = 1,2,3  return后面可以接多个返回值,以元组形式输出返回

3 同一个函数,可以有多个 return,但是 只有执行一个return,该函数即结束,不在继续执行,就像做爱,只要射了,就不能在做了

关于函数的参数

函数的参数是我们学习函数知识的重点,也是难点,因此我们会花比较大的时间来对这一部分内容进行讲解

十年前,python刚开始有人用的时候,我当时就提出这么一个观点 :

函数即变量,形参是变量名,实参是变量值,当函数调用时,将值绑定到变量名上面,函数调用结束时,解除绑定

虽然这句话只是一个类比的说法,并不是正确的,但是对于帮助一些小白理解函数很有帮助,因此现在网上面很多都有这种说法,我要告诉你的是,“”函数即变量“”,这句话,是十年前我提出来的

函数的参数有两种,一种是形参,就是形式上的参数,是写在定时的函数时括号里面的,另外一种是实参,也就是实际的参数,是在调用函数时,括号里面传入的实际的值

参数有 四种 写作形式

1 位置参数

按照从左往右的顺序,依次对应往后写,‘如果形参是这么写的,那么请你猜一下,实参应该怎么写?

没错,实参也是应该这么写,位置参数,形参与实参应该是一一对应的关系,这样的是实参也就叫做位置实参,请看如下代码演示

def function(x,y):
    if x > y:
        print(x)
    else:
        print(y)
function(1,2)

2 关键字参数

需要注意的是

位置参数和关键字参数,可以联合使用,遵循的原则是位置参数要写在关键字参数的左边,原因自己体会,不写几个bug,你一定理解不了

上面的形参写作是一一对应的,其实根据我们的经验判断,关键词参数应该类似于字典的那种表达方式,没错,这也正是我们关键字参数的由来,看来你已经跟上了我的博客思路,关键字参数,函数写形参的时候还是不变的,def func(x,y,z):  ,调用函数时 func(x=1,y=2,z=3),对于同一个形参不能重复传值,当然一般也没人这么做,这种方式又很像format的第三种用法的那种写作形式,python就是这么神奇,万变不离其宗,总会有一个本源,真的就像是一门语言,英语里面很多词的用法不是也是这样吗?机智的你是不是早就发现了,请看如下代码演示

def function(x,y):
    if x > y:
        print(x)
    else:
        print(y)
function(y=1,x=2)

3 默认参数

默认参数的,按道理讲,前面两种参数可以够用了,默认参数出现是为了让我们的对参数进行传值的时候有些实参经常变化,而有些参数基本不怎么需要变化,为了减少代码量我们有了默认参数,需要注意的是:

(1)默认参数应该在位置参数的右边

(2)默认参数通常应该定义成不可变类型

请看如下代码演示:

def info(name,age,gender=female)
    """
我们对一所大学外语系的学生信息进行统计,大部分学生都是女生"""
    print(name,age,gender)
info('Jerry',21)
info('Lisa',19)
info('Sara',22)
info('Albert',20,‘male’)

以上代码输出结果

Jerry,21,female

Lisa,19,female

Sara,22,female

Albert,20,male

4 可变长参数

当我们在写函数时,很多情况下并不知道实参需要传多少个值,为了能够使程序正常运行,我们的可变长参数就是针对位置参数也好,关键字参数也好,可以有对应的,可变长参数来辅助,分别是*args 和**kwagrs,*后面的几个字母龟叔并没有要求我们必须这样写,一方面是为了我们写的代码和硅谷哪些人写的一样,另外一方面是让了我们写的代码更好理解(argument 参数,keyword 关键字),所以统一这样写就好了,如果你想做一个野生程序员,我的博客不适合你读,请看如下代码演示

位置参数与*args联用

def function(x,y,*args)
    print(x,y)
    print(args)
    print(*args)
function(1,2,3,4,5,6,7,8,)

以上代码输出结果

(1,2)

3 4 5 6 7 8 

(3,4,5,6,7,8)

从结果中看,和你预想的运行结果一样吗?

*的作用是‘’打散‘’,print(args),会把多余的实参汇聚成一个元祖的输出,而print(*args),会把这个元祖打散,就是这么简单

关键字参数与**kwargs 联用

def foo(x, y, z, **kwargs):
    print(x, y, z)
    print(*kwargs)
    print(kwargs)
foo(y=1, z=2, x=3, m=[4, 5, 6,],k=22)

以上代码输出结果

3 1 2
m k
{'m': [4, 5, 6], 'k': 22}