0.前言

  这篇文章将介绍Python中的函数构造及调用,包括一些细节上需要注意的问题。



1.函数的基本概念

1.函数的特点:

  • ①函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
  • ②函数能提高应用的模块性,和代码的重复利用率。
  • ③函数分为库函数(如print等)和自定义函数

2.自定义函数定义规则:

  • ①函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
  • ②任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • ③函数的第一行语句可以选择性地使用文档字符串用于存放函数说明。
  • ④函数内容以冒号起始,并且缩进。
  • ⑤return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。


2.定义一个函数并调用它

基本语法:
def 函数名(参数列表):
  函数体


实例:创建一个求积函数,并使用它。

def multiply(a, b):
    print("a * b =", a*b)
    return 


multiply(2, 3)
multiply('*', 3)

运行结果:
a * b = 6
a * b = ***

注意:
  函数体与其他代码之间应有两个空行,从上面代码可以看出参数可以是任意类型的。



3.自定义函数参数

  • 函数的参数可以是任何类型的数据,包括字符串、列表、元组、字典和集合。
  • 函数的参数分为:必需参数、关键字参数、默认参数、不定长参数

1.必须参数:调用带参数的函数时,参数的数量必须和声明时的一样。

def text(str_a, int_b):
    print(str_a * int_b)
    return


text('*', 5)

运行结果:
*****

注意:
  创建函数时,声明了str_a和int_b两个参数,所以调用text函数的时候,也应该传入两个参数。


2.关键字参数:函数调用使用关键字参数来确定传入的参数值,可以不用指定传入顺序。

def text(name, age):
    print("姓名:%s" % name)
    print("年龄:%d" % age)

    return


text(age=18, name='CainCary')

运行结果:
姓名:CainCary
年龄:18

注意:
  这个函数的关键字为name和age,当用关键字确定传入值时,可以不用考虑顺序。


3.默认参数:调用函数时,如果没有传递参数,则会使用默认参数。

def text(name, age=15):
    print("姓名:%s" % name, end=" ")
    print("年龄:%d" % age)

    return


text(age=18, name='CainCary')
text(name='Cain')

运行结果:
姓名:CainCary 年龄:18
姓名:Cain 年龄:15

注意:
  可以看出,定义函数时,可以指定参数的值,调用函数时也能修改参数。当没有指定参数时,函数就会使用声明时定义的默认参数。
  若未给参数设定初值,则必须传入参数,否则会报错。


4.不定长参数:当需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。

看下面实例:带(*)号的参数

def stu(*student):
    print(student)
    print(type(student))
    return


stu('Cain', 5320, 18, 'man')

运行结果:
(‘Cain’, 5320, 18, ‘man’)
<class ‘tuple’>

注意:
  加了星号(*) 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。


看下面实例:带(**)双星号的参数

def stu(**student):
    del student["年龄"]
    print(student)
    print(type(student))
    return


stu(姓名='Cain', 年龄=18, 性别='男')

运行结果
{‘姓名’: ‘Cain’, ‘性别’: ‘男’}
<class ‘dict’>

注意:
  带(**)的参数将传入字典类型,传入参数的形式应该是(key=value,…),函数体可以使用字典相关的处理操作,前提是你传入的参数中要带这个键,否则会报错。


对比带(*)和(**)的参数

参数类型

*argument

**argument

传入数据类型

元组

字典

调用函数格式

可以是任意的基础类型,用逗号隔开

必须是赋值形式,表示键值对

例子

stu(‘Cain’, 5320, 18, ‘man’)

stu(姓名=‘Cain’, 年龄=18, 性别=‘男’)

相同之处:
  每个函数最多只允许存在一个带(*)或(**)的参数,但它们可以同时存在,并且都能进行相关数据类型的处理,单星参数可直接看成元组,双星参数可直接看成字典。

def stu(*stut, **student):
    print(stut)
    print(stut[0]*stut[1])
    print(student)
    return


stu('*', 10, 姓名='Cain', 年龄=18, 性别='男')

运行结果:
(’*’, 10)
**********
{‘姓名’: ‘Cain’, ‘年龄’: 18, ‘性别’: ‘男’}


如果是多种类型参数混合,又是怎么处理的呢?看下面例子:

def stu(a, *st1, b, **st2):
    print("a传入的值:", a)
    print("*st1传入的值:", st1)
    print("b传入的值:", b)
    print("**st2传入的值:", st2)
    return


stu('a', 1, 2, 3, b=2, name='cain', age=18)

运行结果:
a传入的值: a
*st1传入的值: (1, 2, 3)
b传入的值: 2
**st2传入的值: {‘name’: ‘cain’, ‘age’: 18}

注意:
  普通参数只能放在(**)参数之前,可以放在(*)参数之后,若放在(*)参数之后,必须用关键字参数的方法传入。
  当多种类型参数混搭时,要注意参数的顺序问题,不能混插。