《Python编程从入门到实践》学习笔记7(第8章:函数)
1、关键字def用来定义函数,指出函数名,括号内指出函数为完成其任务需要什么样的信,(括号必不可少),定义以冒号结尾。
文档字符串描述了函数是做什么的,用三引号括起,Python使用它们来生成有关程序中函数的文档。
调用函数,可依次指定函数名以及括号括起的必要信息。
2、形参是完成其工作所需的一项信息。 实参是调用函数时传递给函数的信息。(函数调用过程中,将实参传递给形参)
向函数传递实参的方式有很多,可使用位置实参,这要求实参的顺序与形参的顺序相同;也可使用关键字实参,其中每个实参都由变量名和值组成,要求准确地指定函数定义中的形参名;还可使用列表和字典。
3、编写函数时,可给每个形参指定默认值。使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。这让Python依然能够正确地解读位置实参。
4、提供的实参多于或少于函数完成其工作所需的信息时,将出现实参不匹配错误。
5、函数并非总是直接显示输出,它可以处理一些数据,并返回一个或一组值。函数返回的值称为返回值。可使用return语句将值返回到调用函数的代码行。
6、让实参变成可选的。
def get_formatted_name(first_name,last_name,middle_name=''): """返回整洁的姓名""" if middle_name: full_name = first_name + ' ' + middle_name + ' ' +last_name else: full_name = first_name +' ' + last_name return full_name.title() musician = get_formatted_name('jimi','hendrix') print(musician) musician = get_formatted_name('join','hooker','lee') print(musician)
为了让中间名变成可选的,给形参middle_name指定了一个默认值——空字符串,并在用户没有提供中间名时不使用这个形参。输出结果如下:
Jimi Hendrix
Join Lee Hooker
7、函数可返回任何类型的值。
下面的函数接受姓名的组成部分,并返回一个表示人的字典,其中age是可选形参。
def build_person(first_name, last_name, age=''): """返回一个字典,其中包含有关一个人的信息""" person = {'first': first_name, 'last': last_name} if age: person['age'] = age return person musician = build_person('jimi', 'hendrix', age=27) print(musician)
此时原来的两项文本信息存储在一个字典中:
{'first': 'jimi', 'last': 'hendrix', 'age': 27}
8、将列表传递给函数后,函数就可以对其进行修改。在函数中对这个列表所做的任何修改都是永久性的。
有时候,需要禁止函数修改原来的列表。可以向函数传递列表的副本而不是原件。function_name(list_name[:]) ,切片表示法[:]创建列表的副本。
9、p129 8-9~8-11魔术师列表的操作。
def show_magicians(magicians): for magician in magicians: print(magician) def make_great(magicians): great_magicians = [] while magicians: magician = magicians.pop() great_magician = magician+' the Great' great_magicians.append(great_magician) for great_magician in great_magicians: magicians.append(great_magician) return ( magicians) magicians = ['john','hanny','mary'] show_magicians(magicians) print("\nGreat magicians:") great_magicians = make_great(magicians[:]) show_magicians(great_magicians) print("\nOriginal magicians:") show_magicians(magicians)
笔者因为一个字母敲错,找了半小时,终于得到想要的输出。输出结果:
john
hanny
mary
Great magicians:
mary the Great
hanny the Great
john the Great
Original magicians:
john
hanny
mary
10、传递任意数量的实参。
def make_pizza(*toppings): """打印顾客点的所有配料""" print(toppings) make_pizza('pepperoni') make_pizza('mushrooms','green peppers','exter cheese')
*tpppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中。注意,Python将实参封装到一个元组中,即便函数只收到一个值也如此:
('pepperoni',) ('mushrooms', 'green peppers', 'exter cheese')
如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参放在最后。
def make_pizza(size,*toppings): """概述要制作的披萨""" print("\nMaking a " + str(size) + "-inch pizza with the following toppings:") for topping in toppings: print("- " + topping) make_pizza(16,'pepperoni') make_pizza(32,'mushrooms','green peppers','exter cheese'
输出结果:
Making a 16-inch pizza with the following toppings: - pepperoni Making a 32-inch pizza with the following toppings: - mushrooms - green peppers - exter cheese
11、使用任意数量的关键字实参。
def build_profile(first,last,**user_info): """创建一个字典,其中包含我们知道的有关用户的一切""" profile = {} profile['first_name'] = first profile['last_name'] = last for key,value in user_info.items(): profile[key] = value return profile user_profile = build_profile('albert','estein', location='princeton', field='physics') print(user_profile)
形参**user_info的两个星号让Python创建一个名为user_info的空字典,并将收到的所有名称-值对都封装在这个字典中。
12、将函数存储在模块中,再将模块导入到主程序中。import语句允许在当前允许的程序文件中使用模块代码。
(1)导入整个模块。
首先建立一个pizza.py文件。
再创建另一个文件making_pizza.py
import pizza pizza.make_pizza(16,'pepperoni') pizza.make_pizza(32,'mushrooms','green peppers','exter cheese')
这就是一种导入方法:只需要编写一条import语句并在其中指定模块名,就可以在程序中使用该模块中的所有函数。module_name.function_name()
(2)导入特定的函数
导入语法如下:
from module_name import function_name
通过逗号分隔函数名,可根据需要从模块中导入任意数量的函数:
from module_name import function_0,function_1,function_2
对于前面的making_pizza.py示例,如果只想导入要使用的函数,代码类似与下面这样:
from pizza import make_pizza make_pizza(16,'pepperoni') make_pizza(32,'mushrooms','green peppers','exter cheese')
(3) 使用as给函数指定别名,如果要导入的名称可能与程序中现有的名称冲突,或者函数名称太长,可指定简短而独一无二的别名。
下面给函数make_pizza()指定了别名mp()。
from pizza import make_pizza as mp
指定别名的通用语法: from module_name import function_name as fn
as还可以给模块指定别名,通用语法:import module_name as mn
(4)导入模块中的所有函数,可以使用星号(*)运算符。
from pizza import *
make_pizza(16,'pepperoni')
make_pizza(32,'mushrooms','green peppers','exter cheese')
由于导入每个函数,可通过名称直接调用每个函数,而无需用句点表示方法。然而,使用并非自己编写的大型模块时,最好不要采用这种导入方法:如果模块中有函数名称与你的项目中使用的名称相同,可能导致意想不到的结果:Python可能遇到多个名称相同的函数或变量,进而覆盖函数,而不是分别导入所有的函数。
最佳的做法是,要么导入你需要使用的函数,要么导入整个模块并使用句点表示法。这能使得代码更清晰。
13、每个函数都应该包含简要地阐述其功能的注释,该注释应紧跟函数定义后面,并采用文档字符串格式。给形参指定默认值时,等号两边不要有空格。对于函数的调用中的关键字实参,也遵循这种约定。
14、如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样将更容易知道前一个函数在什么地方结束,下一个函数从什么地方开始。
所有的import语句都应该放在文件的开头,唯一例外的情形是,在文件开头使用了注释描述整个程序。