python 函数

1.要执行函数定义的特定任务,可调用函数,需要在程序中多次执行同一任务时,你无需反复编写该任务的代码,而只需要执行该任务的函数,让python运行其中的代码,你将发现,通过使用函数,程序的编写、阅读、测试和修复都将更容易.

2.定义函数
下面简单打印问候信息,名为Hello world!!!

这个示列演示简单的函数结构,代码使用def来告诉python定义一个函数,这是函数定义,向python指出了函数名,还可能在扩号内指出函数为完成其任务徐涛什么样的信息,在这里,函数名为hello_user(),它不需要任何信息就能够完成其工作,即使括号内空的,也不能把少.定义后以冒号结尾.

print(“Hello world!!!”),是函数体内唯一一行代码,greet_user()只能做一项工作:打印Hello world!!!.
在这里插入图片描述
3.向函数传递信息
只要稍作修改,就可以让函数hello_user()不仅向用户显示Hello world!,还将用户的名字用作抬头,为此,可在函数定义def hello_user()的括号内添加username,通过在这里添加username,就可以让函数接受你给的username指定的任何值,现在,这个函数要求你调用它时给他username指定一个值,调用hello_user()时,可将一个名字传递给它,如下所示:

代码hello_user(‘healthy’)调用函数hello_user(),并向它提供print语句所需要的信息,这个函数接受你传递给它的名字,并向这个人发出问候.

你可以根据需要调用函数hello_use()任意次,调用时无论传入什么样的名字,都会生成相应的输出.
在这里插入图片描述

4.实参和形参
前面定义函数hello_world时,要求给变量username指定一个值,调用这个函数并提供这种信息(人名)时,并将它打印相应的问候语.

在函数hello_world()的定义中,变量username是一个形参----函数完成其工作所需的一项信息,在代码hello_world(‘healthy’)中,值’'是一个实参,实参是调用函数时传递给函数的信息,我们调用函数时,将要让函数使用的信息放在括号内,在hello_world(‘healthy’)中,将实参’healthy’传递了函数hello_world(),这个值被存储在形参useername中.

注意 大家有时候会形参、实参不分,因此如果你看到有人将函数定义中的变量称为实参或将函数调用中的变量称为形参.

5.传递实参
鉴于函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参.向函数传递实参的方式很多,可是使用位置实参,这要求实参的顺序与形参的顺序相同;也可以使用关键字实参,其中每个实参都由变量名和值组成;还可以使用列表和字典.

6.位置实参
你调用函数时,python必须将函数调用中的每个实参都关联到函数定义中的一个形参,为此,最简单的关联方式是基于实参的顺序,这种关联方式被称为位置实参.

我们来显示宠物的信息函数,这个函数指出一个宠物以及它叫什么名字.

这个函数的定义表明,它需要一种动物类型和一个目标关注,调用describle_pet()时,需要按顺序提供一种动物类型和一个名字,列如,在前面的函数调用中,实参’jiyi’存储在形参animal_type中,而实参’cole’存储在形参pet_name中,在函数体内,使用了这两个形参来显示宠物信息.
在这里插入图片描述

7.调用多次
你可以更具需要调用函数任意次,要描述一个宠物,只需再次调用describe_pet()即可:

第二调用参数传递了dog和、zhongba,与第一次调用时一样,python将实参’dog’关联到形参animal_type,并将实参’zhongba’关联到pet_name.与前面一样,这个函数完成其任务,但是打印一条名为dog的zhongba的信息,至此,我们有一只名为jiyi的cat和名为zhongba的dog.
在这里插入图片描述
调用函数多次是一种效率极高的工作方式,我们只需要在函数中描述宠物的代码一次,然后每当需要描述新宠物时,都可以调用这个函数,并向它提供新宠物的信息,即使描述宠物的代码增加到10行,你依然只需要任意数量的位置实参,python将按顺序将函数调用中的实参关联到函数定义中相应的形参.

在函数中,可根据需要使用任意数量的位置实参,python将按顺序将函数调用中的实参关联到函数定义中相应的形参.

8.位置实参的顺序很重要
在使用位置实参来调用函数时,如果实参的顺序不正确,结果会出乎意外.

在这里插入图片描述
9.关键字实参
关键字实参是传递给函数的名称—值对,你直接在实参中将名称和值关联起来,因此向函数传递实参时不会混淆(不会的到名为cat的jiyi这样的结果),关键字实参让你无需考虑函数调用中的实参顺序,还清楚指出了函数调用中各个值的用途.

重新编写文件,在其中使用关键字实参来调用describle_pet():

函数describe_pet()还是原来那样,但调用函数时,我们向python明确地指出了各个实参对于参数,看到这个函数调用时,python知道应该将实参’cat’和’jiyi’分别存储在形参animal_type和pet_name中,输出正确无误,他指出我们有一只为jiyi的猫.
在这里插入图片描述
关键字实参的顺序无关紧要,因为python知道各个值该存储到那个形参中,下面两个函数是等价的:

使用关键字的顺序无关紧要,因为python知道各个值应该存储到那个形参中,下面是两个函数调用是等价的.
在这里插入图片描述

10.默认值
编写函数你可以给每个形参指定默认值,在调用函数中给形参提供了实参,python将使用指定的实参值;否则,将使用形参的默认值,因此,给形参指定默认参数后,可在函数调用中省略相应的实参,使默认值可简化函数调用,还可清楚地指出函数的典型用法.

这里修改了函数describle_pet()的定义,给其中的animal_type指定了默认值’dog’,这样,调用这个函数时,如果没有给animal_type指定值,python将把这个形参设置为dog.

注意:这个函数定义中,修改了形参的排序顺序,由于给了animal_type指定默认值,无需通过实参来指定动物的类型,因此在函数调用中只包含一个实参—宠物的名字,然而,python依然将这个实参视为位置参数,因此如果函数中只包含宠物的名字,这个实参将关联到函数定义中的第一个形参,这就是需要将pet_name放在形参列表开头的原因.
在这里插入图片描述
注意:使用默认值时,在形参列表中必须先列出没有默认值的形参,在列出有默认值的实参,让python依然能够正确的解读位置实参.

11.等效的函数调用.
鉴于可混合使用的位置实参、关键字实参和默认值,通常有多种等效的函数调用方式,请看下面的函数describle_pets()的定义,其中给一个形参提供了默认值:
在这里插入图片描述
基于这种定义,在任何情况都必须给pet_name提供实参,指定该实参时可以使用位置方式,也可以使用关键字方式,如果要描述的动物不是小狗,还必须在函数调用中给animal_type提供实参,同样,指定该实参时可以使用位置方式,也可以使用关键字方式.
在这里插入图片描述
注意:使用哪种调用方式都无所谓,只要函数能生成你希望输出就好,使用最为简单的方式来输出即可.

12.避免实参错误.
等你开始使用函数后,如果遇到实参不匹配错误,不要奇怪,你提供的实参多余或少于函数完成其工作所需的信息时,将出现实参不匹配错误,列如,如果调用函数describle_pet()时没有指定任何实参,结果如何呢?
在这里插入图片描述
python发现该函数缺少必要的信息,而trace指出了这一点:
指出了问题在什么地方,让我们回过头去找出函数调用的错误,导致问题的代码.
在这里插入图片描述

13.函数返回值
函数并非总是直接显示输出信息,相反,他可以处理一些数据,并返回一个或一组数据,函数返回的值被称为返回值.在函数中,可使用return语句将值返回到调用函数的代码行.返回值让你能够将程序的大部分繁重工作移到函数中去完成,从而简化主程序.

13.1返回简单值
下面来看一个函数,它接受名和姓并返回整洁的姓名
在这里插入图片描述
函数get_url_name的定义通过形参接受名和姓.将姓和名合二为一,在他们之间加上空格,并将存储在变量full_name中,然后将full_name的值转换为首字母大写格式,并将结果返回到函数调用行.

调用返回值函数时,需要提供一个变量,用于存储返回的值,在这里,将返回的值存储在变量musician中.输出为整洁的姓名:
在这里插入图片描述

13.2.让实参变成可选的
有时候,需要让实参变成可选的,这样使用函数的人就只需要必要时才提供额外的信息,可以使用默认值来让实参变成可选的.

列如:
假设我们需要扩展函数get_url_name(),使其还处理中间名,为此,可将其修改成类似于下面这样:
在这里插入图片描述
然而,并非所有的人都有中间名,但是如果你调用这个函数时只提供了名和姓,它将不能正确运行,为了让中间名变成可选的,可给实参middle_name指定一个默认值----空字符串,并在用户提供中间名时不使用这个实参,为了get_url_name()在没有提供中间名时依然可行,可给实参middle_name指定一个默认值------空字符串,并将其移到形参列表的末尾.

在这个示列中,姓名是根据三个可能提供的部分创建的,由于人都有名和姓,因此在函数定义中首先列出这两个形参.中间名是可选的,因此在函数定义中最后列出该参数,并将其默认值设置为空字符串.

调用这个函数时,如果只指定名和姓,调用起来非常简单,如果还要指定中间名,就必须确保它是最后一个实参.只有python才能正确的将实参关联到形参.
在这里插入图片描述13.3 返回字典
函数可返回任何类型的值,包括列表和字典较复杂的数据结构,列如,下面的函数将接受姓名的组成部分,并返回一个表示人的字典.

函数get_url_name()接受名和姓,并将这些信息封装到字典中,存储first_name的值时,使用关键字’first’,二存储last_name的值时,使用关键字’last’,最后,返回表示人的整个字典.打印这个返回值,此时原来的两项文本信息存储在一个字典中.
在这里插入图片描述
13.4 结合使用函数和while循环
结合使用函数get_url_name和while循环,以更正规的方式问候用户,下面尝试使用用户名和姓跟用户打招呼.
在这里插入图片描述
14.传递列表
你会发现,向函数传递列表很有用,这种列表包含的可能是名字、数字或更为复杂的对象(如字典).将列表传递给函数后,函数就能直接访问其内容,下面使用函数来提高处理列表的效率.

假设有一个用户列表,我们要问候其中的每位用户,下面的示列将一个名字列表传递给一个名为greet_users()的函数,这个函数问候列表中的每个人:
我们将greet_users()定义成接受一个名字的列表,并将其存储在形参names中,这个函数遍历收到的列表,并将对其中每位用户都打印一条问候语,我们定义了一个用户列表----usernames,然后调用greet_users(),并将这个列表传递给他:
在这里插入图片描述
14.1 在函数中修改列表
将列表传递给函数之后,函数就可以对其进行修改,在函数中对这个列表所做的任何修改都是永久性地,这能够高效处理大量的数据.

下面看为用户提交的设计师之多打印,需要打印的设计存储在一个列表中,打印后移到另一个列表,下面是不使用函数模拟这个过程.
在这里插入图片描述

我们可以编写两个函数,每个都做一件具体的工作,大部分代码都与原来相同,只是效率更高,第一函数将负责打印设计的工作,而第二个将概述打印了那些设计:

在这里插入图片描述

14.2禁止函数修改列表
有时候需要禁止函数修改列表,不改变原来的列表,只传递列表的副本而不是原件,这样函数做的任何修改只影响副本,而不影响原件.

要将列表的副本传递给函数,可以向下面这样:

function_name(list_name[:])

切片表示法[:]创建列表的副本,在上面中,如果不想清空为打印的设计列表,可像下面这样调用print_models():

print_models(unprinted_designs[ : ],completed_models)

这样函数print_models()依然能够完成其工作,因为它获得了所有为打印的设计的名称,他使用的是列表unprinted_designs的副本,而不是列表unprinted_designs本身.

15.传递任意数量的实参
有时候,不预先不知道函数要接受多少个实参,好在python允许函数从调用语句中来手机任意数量的实参.

列如,我们制作一个披萨的函数,他需要接受很多配料,但你无法预先确定顾客需要多少配料,下面函数只有一个形参*arg,但不管调用语句提供多少实参,这个形参都将他们统统收入囊中:

形参名*args中的星号让python创建一个名为args的空元组,并将所有的值封装到这个元组中,函数体内的print()语句通过生成输出来证明python能够处理使用一个值调用函数的情形,也能处理三个值调用函数的情形,它类似的方式处理不同的调用,注意:python将实参封装到一个元组中,即便函数只收到一个值也如此.
在这里插入图片描述
现在,我们可以将这条print语句替换成一个循环,对配料列表进行遍历,并对顾客点的披萨进行描述:
不管是一个值还是三个值,函数都能妥善处理:
在这里插入图片描述

15.1结合使用位置实参和任意实参
如果让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后,python先匹配位置实参和关键实参,在将余下的实参都收集到最后一个形参中.

如果前面的函数还需要表示比萨尺寸的实参,必须将该形参放在形参*args的前面.
j基于上述的函数的定义,python将受到第一个值存储在形参size,并将其他所有的值存储在元祖args中,在函数调用中,首先指定表示比萨的实参,然后根据需要指定任意数量的配料.
在这里插入图片描述
15.2.使用任意数量的关键字实参
需要接受任意数量的实参,但语言不知道传递给函数的会是什么样的消息,可将函数编写成能够接受任意数量的键值对-----调用语句提供多少就接受多少,一个这样的示列是创建用户简介,你知道将收到有关用户的信息,但不确定会是什么样的信息,下面函数bulil_profile()接受名和姓,同时还接受任意数量的关键字实参:

函数build_profile()的定义要求提供名和姓,同时允许用户根据需要提供任意数量的名称–值对,形参**user_info中的两个星号让python创建一个名为user_info的空字典,并将收到所有名称——值对都封装到这个字典中,在这个函数中,可以访问其他字典那样访问user_info中的名称——值对.
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值