python:入门到实践书籍学习(六)
第8章
函数是带名字的代码块,用于完成具体的工作。
函数结构:
''' 第一行的代码行使用关键字def来告诉Python你要定义一个函数。这是函数定义向Python指出了函数名,还可能在括号内指出函数为完成其任务需要什么样的信息。在这里,函数名为greet_user() ,它不需要任何信息就能完成其工作,因此括号是空的(即便如此,括号也必不可少)。最后,定义以冒号结尾。 紧跟在def greet_user(): 后面的所有缩进行构成了函数体。第二行的文本是被称为文档字符串 (docstring)的注释,描述了函数是做什么的。文档字符串用三引号括起,Python使用它们来生成有关程序中函数的文档。 代码行print("Hello!")是函数体内的唯一一行代码, greet_user() 只做一项工作:打印Hello! 。 要使用这个函数,可调用它。函数调用让Python执行函数的代码。要调用函数,可依次指定函数名以及用括号括起的必要信息 ''' def greet_user(): """显示简单的问候语""" print("Hello!") greet_user()
函数参数
参数传递:
def greet_user(username): """显示简单的问候语""" print("Hello!"+username.title()+"!") greet_user('Lisa')
形参实参
在函数greet_user() 的定义中,变量username 是一个形参——函数完成其工作所需的一项信息。
在代码greet_user('jesse') 中,值'jesse' 是一个实参 。
实参是调用函数时传递给函数的信息。我们调用函数时,将要让函数使用的信息放在括号内。在greet_user('jesse') 中,将实参'jesse' 传递给了函数greet_user() ,这个值被存储在形参username 中。
注意 大家有时候会形参、实参不分,因此如果看到有人将函数定义中的变量称为实参或将函数调用中的变量称为形参,不要大惊小怪。(书中对的话)
位置参数:
最简单的关联方式是基于参数的顺序。这种关联方式被称为位置参数
def describe_pet(animal_type, pet_name): """显示宠物的信息""" print("\nI have a " + animal_type + ".") print("My " + animal_type + "'s name is " + pet_name.title() + ".") describe_pet('hamster', 'harry')
关键字参数:
关键字参数传递给函数是名称—值对。直接在实参中将名称和值关联起来了,因此向函数传递实参时不会混淆。关键字参数无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。
def describe_pet(animal_type, pet_name): """显示宠物的信息""" print("\nI have a " + animal_type + ".") print("My " + animal_type + "'s name is " + pet_name.title() + ".") describe_pet(animal_type='hamster', pet_name='harry')
默认参数:
关键字参数传递给函数是名称—值对。直接在实参中将名称和值关联起来了,因此向函数传递实参时不会混淆。关键字参数无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。
注意:使用默认值时,在参数表中必须先列出没有默认值的参数,再列出有默认值的参数。这让Python依然能够正确地解读位置参数。
def describe_pet(pet_name, animal_type='dog'): """显示宠物的信息""" print("\nI have a " + animal_type + ".") print("My " + animal_type + "'s name is " + pet_name.title() + ".") describe_pet(pet_name='willie')
返回值:
函数并非总是直接显示输出,相反它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值 。
def get_formatted_name(first_name, last_name): """返回整洁的姓名""" full_name = first_name + ' ' + last_name return full_name.title() musician = get_formatted_name('jimi', 'hendrix') print(musician)
函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。
def build_person(first_name, last_name): """返回一个字典,其中包含有关一个人的信息""" person = {'first': first_name, 'last': last_name} return person musician = build_person('jimi', 'hendrix') print(musician)
while和函数应用
def get_formatted_name(first_name, last_name): """返回整洁的姓名""" full_name = first_name + ' ' + last_name return full_name.title() while True: print("\nPlease tell me your name:") print("(enter 'q' at any time to quit)") f_name = input("First name: ") if f_name == 'q': break l_name = input("Last name: ") if l_name == 'q': break formatted_name = get_formatted_name(f_name, l_name) print("\nHello, " + formatted_name + "!")
将列表传递给函数后,函数就可对其进行修改。在函数中对这个列表所做的任何修改都是永久性的。
有时候,需要禁止函数修改列表。为解决这个问题,可向函数传递列表的副本而不是原件;这样函数所做的任何修改都只影响副本,而丝毫不影响原件。
function_name(list_name[:])
虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由需要传递副本,否则还是应该将原始列表传递给函数,因为让函数使用现成列表可避免花时间和内存创 建副本,从而提高效率,在处理大型列表时尤其如此。
任意数量的参数
*args
**kwargs
函数的优点之一是,使用它们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。你还可以更进一步,将函数存储在被称为模块的独立文件中, 再将模块导入到主程序中。import 语句允许在当前运行的程序文件中使用模块中的代码。
# 导入整个模块 # import 模块名 # 导入模块的某个功能 # from 模块名 import 功能名 # 别名使用as关键字 # import 模块名 as 别名 # 导入模块所有功能 # from 模块名 import *
'''编写函数时,需要牢记几个细节。应给函数指定描述性名称,且只在其中使用小写字母和下划线。描述性名称可帮助你和别人明白代码想要做什么。给模块命名时也应遵循上述 约定。 每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。文档良好的函数让其他程序员只需阅读文档字符串中的描述就能够使用 它:他们完全可以相信代码如描述的那样运行;只要知道函数的名称、需要的实参以及返回值的类型,就能在自己的程序中使用它。'''