Python基础编程——函数(一)
点击蓝字关注这个神奇的公众号~
(红点1)的代码行使用关键字def来告诉Python你要定义一个函数。这是函数定义,向Python指出了函数名,还可能在括号内指出函数为完成其任务需要什么样的信息。函数名为:greet_user(),不需要任何信息就能完成其工作,因此括号是空的(即便如此,括号也必不可少)。最后,定义以冒号结尾;
def greet_user():后面的所有所进行构成了函数体。文本是被称为文档字符串的注释。
代码行print("Hello!")(红点3)是函数体内的唯一一行代码,greet_user()只做一项工作:打印Hello!。
要使用这个函数,可调用它。函数调用让Python执行函数的代码。要调用函数,可依次指定函数名以及用括号括起的必要信息(红点5)所示。
只需稍作修改,就可以让函数greet_user()不仅向用户显示Hello!还将用户的名字用作抬头。为此,可在函数定义def greet_user()的括号内添加username。就可以让函数接受你给username指定的任何值。
代码greet_user(‘Jake’)调用函数greet_user(),并提供print执行后的信息;
在函数greet_user()的定义中,变量username是一个形参——函数完成其工作所需的一项信息。在greet_user('Jake')中,值'Jake'是一个实参。
实参是调用函数时传递给函数的信息。在调用函数时,将要让函数使用的信息放在括号内。在greet_user('Jake')中,将实参'Jake'传递给函数greet_user(),这个值被存储在形参username中。
鉴于函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多,可使用位置实参,实参的顺序与形参的顺序相同;也可以使用关键字实参,其中每个实参都由变量名和值组成;还可以使用列表和字典。
在调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此,最简单的关联方式是基于实参的顺序。这种关联方式被称为位置实参。
这个函数表明,它需要一种动物类型和一个名字(红点1)。调用describe_pet()时,需要按顺序提供一种动物类型和一个名字。在前面的函数调用时,实参'hamster'存储在形参animal_type中,而实参'harry'存储在形参pet_name中(红点6)。
调用函数多次(你可以根据需要调用函数任意次,只需调用describe_pet() )
第二次调用describe_pet()时,我们向它传递了实参'dog'和'willie'。Python将实参'dog'关联到形参animal_type,并将实参'whillie'关联到形参pet_name。
位置实参的顺序很重要
这个函数中,我们先指定名字,在指定动物类型。由于实参'harry'在前,这个值将存储到形象animal_type中;同理,'hamster'将存储到形参pet_name中。(输出结果如下)结果一样搞笑,函数调用中实参的顺序与函数定义中形参的顺序一致。
关键字实参是传递给函数的名称-值对。无需考虑函数调用中的实参顺序,清楚地指出了函数调用中各个值得用途。
函数describe_pet()还是原来那样,但调用这个函数时,我们向Python明确指出各个实参对应的形参。看到这个函数调用时,Python知道应该将实参'hamster'和'harry'分别存储在形参animal_type和pet_name中。
关键字实参的顺序无关紧要,因为Python知道各个值该存储到哪个形参中。
注意:使用关键字实参是,务必准确地指定函数定义中的形参名。
编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,Python将使用指定的实参值;否则,将使用的形参的默认值。给形参指定默认值后,可在函数调用中省略相应的实参。使用默认值可简化函数调用,清楚的指出函数的典型用法。
修改了函数describe_pet()的定义,在其中给形参animal_type指定了默认值'dog',这样调用函数时,如果没有给animal_type指定值,Python将把这个形参设置为'dog'。
注意:使用默认值时,在形参列表中必须先列出没有默认值的形参,在列出有默认值的形参。
鉴于可混合使用位置实参、关键字实参和默认值,通常有多种等有效的函数调用方式。
注意:使用哪种方式无关紧要。只要韩式调用能生成你希望的输出就行。
开始使用函数时,如果遇到实参不匹配错误,不要大惊小怪。提供的多于或少于函数完成其工作所需的信息时,将出现实参不匹配错误。
Python发现该函数用缺少必要的信息,而traceback指出了这一点:
traceback指出了问题出在什么地方,让我们能够找出函数调用中错误。指出了导致问题的函数调用。traceback指出该函数调用少两个实参,并指出了相应形参的名称。
函数并非总是直接显示输出、相反、它可以处理数据,并返回一个或一组值。函数返回的值被称为返回值。
在函数中,可使用return语句将值返回到调用函数的代码行。
函数get_formatted_name()的定义通过形参接受名和姓(红点1)。将姓和名合二为一,在它们之间加上一个空格,并将结果存储在变量full_name(红点3)。然后,将full_name的值转换为首字母大写格式,并将结果返回到函数调用行(红点4)。
调用返回值的函数时,需要提供一个变量,用于存储返回的值。(红点6)
有时候,需要让实参变成可选的,这样使用函数的人就只需在必要时才提供额外的信息。可使用默认值来让实参变成可选的。
只要同时提供名、中间名和姓,这个函数就能正确的运行;
函数可返回任何类型的值,包含列表和字典等较复杂的数据结构。
函数build_person()接受名和姓,并将这些值封装在字典中(红点3)。存储first_name的值时,使用的键为'first',而存储last_name的值时,使用的键为'last'。最后,返回表示人的整个字典(红点4)。(红点7),打印这个返回的值,此时原来的两项文本信息存储在一个字典中;
以上示例中,我们使用的是get_formatted_name()的简单版本,不涉及中间名。其中的while循环让用户输入姓名:依次提示用户输入名和姓(红点8)。但这个while循环存在一个问题:没有定义退出条件。我们要让用户能够尽可能地退出,因此每次提示用户输入时,都应提供退出途径。每次提示用户输入时,都使用break语句提供了退出循环的简单途径;
添加了一条消息来告诉用户如何退出,然后在每次提示用户输入时,都检查他输入的是否是退出值,如果是,就退出循环。
现在,这个程序将不断的问候,直到用户输入的姓或名为'q'为止:
其他相关精选文章