Python3基础:05_函数的创建与调用

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 = ***

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


3.自定义函数参数

函数的参数可以是任何类型的数据,包括字符串、列表、元组、字典和集合。 函数的参数分为:必需参数、关键字参数、默认参数、不定长参数
1.必须参数:调用带参数的函数时,参数的数量必须和声明时的一样。
def text(str_a, int_b):
    print(str_a * int_b)
    return


text('*', 5)

运行结果:
*****

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


2.关键字参数:函数调用使用关键字参数来确定传入的参数值,可以不用指定传入顺序。
def text(name, age):
    print("姓名:%s" % name)
    print("年龄:%d" % age)

    return


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

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

  PS:这个函数的关键字为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

  PS:可以看出,定义函数时,可以指定参数的值,调用函数时也能修改参数。当没有指定参数时,函数就会使用声明时定义的默认参数。

若未给参数设定初值,则必须传入参数,否则会报错。


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

例子1:带(*)号的参数

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


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

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

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

例子2:带(**)双星号的参数

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


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

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

  PS:带(**)的参数将传入字典类型,传入参数的形式应该是(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}

  PS:刚刚试了一下,貌似普通参数只能放在(**)参数之前,可以放在(*)参数之后,但传入的时必须用关键字参数的方法传入,不然会报错的。

当多种类型参数混搭时,要注意参数的顺序问题,不能混插。



  暂时这么多知识够用了,关于匿名函数以后用到再补充。


时间:2019年5月1日18:07:44


猜你喜欢

转载自blog.csdn.net/qq_44713454/article/details/89738098