def关键字告诉python你要定义一个函数。接下来是函数名,括号必不可少,即使没有任何参数。后面的所有缩进行构成了函数体。注释的文本是被称为文档字符串 (docstring),描述了函数是做什么的。
greeter.py
def greet_user(username):
'''显示简单的问候语'''
print("Hello, "+username+'!')
greet_user('jesse')
关键字实参 是传递给函数的名称—值对。你直接在实参中将名称和值关联起来了,因此向函数传递实参时不会混淆。
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(pet_name='harry' , animal_type='hamster')
函数默认值:编写函数时可给每个形参指定默认值。这里修改了函数describe_pet() 的定义,在其中给形参animal_type 指定了默认值'dog' 。这样,调用这个函数时,如果没有给animal_type 指定值,Python将把这个形参设置为'dog'
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')
如果参数是列表,不想被函数修改,可以传递列表的副本:
function_name(list_name[:])
传递任意数量的实参。有时候,你预先不知道函数需要接受多少个实参。形参名*toppings 中的星号让Python创建一个名为toppings 的空元组,并将收到的所有值都封装到这个元组中。
pizza.py
def make_pizza(*toppings):
'''打印顾客的所有配料'''
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms','green peppers','extra cheese')
使用任意数量的关键字实参。形参**user_info 中的两个星号让Python创建一个名为user_info 的空字典,并将收到的所有名称—值对都封装到这个字典中。
user_profile.py
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','einstein',
location='princeton',
field='physics' )
print(user_profile)
函数返回值:不再赘述。
将函数存储在模块中
函数的优点之一是代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解的多。更进一步,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import语句允许你在当前运行的程序文件中使用模块中的代码。
模块 是扩展名为.py的文件,包含要导入到程序中的代码。下面来创建一个包含函数make_pizza() 的模块。
pizza.py
def make_pizza(size,*toppings):
'''概述要制作的pizza'''
print('\nMaking a ' + str(size) +
'-inch pizza with the following toppings:')
for topping in toppings:
print("- " + topping)
导入模块的方法很多:
- 导入整个模块
import pizza - 导入特定的函数
from pizza import function_0, function_1, function_2 - 使用as给函数指定别名
from pizza import make_pizza as mp - 使用as给模块指定别名
import pizza as p - 导入模块中的所有函数
from pizza import *
函数编写指南
给函数指定描述性名称,且只在其中使用小写字母和下划线。
每个函数都应该包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。文档良好的函数让其他程序员只需阅读文档字符串中的描述就能够使用它:他们完全可以相信代码如描述的那样运行;只要知道函数的名称、需要的实参以及返回值的类型,就能在自己的程序中使用它。
给形参指定默认值时,等号两边不要有空格:对于函数调用中的关键字实参,也应遵循这种约定:
def function_name(parameter_0, parameter_1='default value')
PEP 8(https://www.python.org/dev/peps/pep-0008/ )建议代码行的长度不要超过79字符,这样只要编辑器窗口适中,就能看到整行代码。如果形参很多,导致函数定义的长度超过了79字符,可在函数定义中输入左括号后按回车键,并在下一行按两次Tab键,从而将形参列表和只缩进一层的函数体区分开来。
def function_name(
parameter_0, parameter_1, parameter_2,
parameter_3, parameter_4, parameter_5):
function body...