- 定义函数
# 定义函数,函数名为greet_user,形参是username
def greet_user(username):
'''文档字符串,描述函数是做什么的,用三引号括起'''
print(f"Hello,{username}!")
greet_user('jesse') #调用函数,jesse是实参
- 传递实参
调用函数时,Python 必须将函数调用中的每个实参都关联到函数定义中的一个形参。
位置实参:按照顺序将函数调用中的实参关联到定义中相应的形参。
def describe_pet(animal_type, pet_name):
'''显示宠物信息'''
print(f'I have a {animal_type}.')
print(f"My {animal_type}'s name is {pet_name}.")
describe_pet('cat', 'white')
关键字实参:传递给函数的名称值对时,直接在实参中将名称和值关联起来。无需考虑函数调用中实参顺序。
def describe_pet(animal_type, pet_name):
'''显示宠物信息'''
print(f'I have a {animal_type}.')
print(f"My {animal_type}'s name is {pet_name}.")
#以下两个函数调用是等效的
describe_pet(animal_type='cat', pet_name='white')
describe_pet(pet_name='white', animal_type='cat')
默认值:在编写函数时,可给每个形参指定默认值。则在调用函数时可以省略相应的实参。
#使用默认值时,必须先在形参列表中列出没有默认值的形参,再列出有默认值的形参。
def describe_pet(pet_name, animal_type='cat'):
'''显示宠物信息'''
print(f'I have a {animal_type}.')
print(f"My {animal_type}'s name is {pet_name}.")
describe_pet('white')
- 返回值
使用return语句,可以将值返回到调用函数的代码行,可以返回一个或一组值。还可以返回任何类型的值,包括列表和字典等较复杂的数据结构
- 传递列表
将列表传递给函数后,函数就可对其进行修改。在函数中对这个列表所作的任何修改都是永久性的。
def print_models(unprinted_designs,completed_models):
'''
模拟打印每个设计,直到没有未打印的设计为止
打印每个设计后,都将其移到列表completed_models中
'''
while unprinted_designes:
current_design = unprinted_designs.pop()
print(f"Printing model:{current_design}")
completed_models.append(current_design)
def show_completed_models(completed_models):
'''
显示打印好的所有模型
'''
for completed_model in completed_models:
print(completed_model)
unprinted_design = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []
print_models(unprinted_design, completed_models)
show_completed_models(completed_models)
每个函数都应只负责一项具体的工作。编写函数的时候,如果发现它执行的任务太多,请尝试将这些代码分别划分到两个函数中。
当有时需要禁止函数修改列表,可使用切片法创建列表的副本,向函数传递列表的副本,则函数所作的任何修改都只影响副本,而不会影响到原件
print_models(unprinted_design[:], completed_models)
- 传递任意数量的实参
在函数定义中要将接纳任意数量的形参放在最后,Python 先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
#形参名*toppings中的星号让python 创建一个名为topping的空元祖,收集除位置实参和关键字实参外的参数
def make_pizza(size, *toppings):
'''
概述要制作的披萨
'''
print(f"\nMaking a {size}-inch pizza with the following toppings:")
for topping intoppings:
print(f"-{topping}")
make_piza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
- 传递任意数量的关键字实参
def build_profile(first, last, **user_info):
'''
创建一个字典,其中包含我们知道的有关客户的一切
'''
user_info['first_name'] = first
user_info['last_name'] = last
return user_info
user_profile = build_profile('albert', 'einstein', location='princeton',fild='physics')
print(user_profile)
- 将函数存储在模块中
导入模块
#导入pizza.py这个模块,让Python 打开文件pizza.py,并将其中的所有函数都复制到这个程序中。但人们看不到赋值的代码
import pizza
#调用pizza中的函数make_pizza(),调用函数时要指定被导入模块的名称和函数名,并用句点分隔
pizza.make_pizza(16, 'pepperoni')
导入特定函数
#导入模块中的特定函数
from module_name import function_0, function_1
#从pizza.py模块导入make_pizza这个特定函数
from pizza import make_pizza
#调用函数时,无需使用句点,只需指定其名称
make_pizza(16, 'pepperoni')
使用as给函数指定别名
from pizza import make_pizza as mp
#调用函数
mp(16, 'pepperoni')
使用as给模块指定别名
import pizza as p
#调用函数
p.make_pizza(16, 'pepperoni')
导入模块中的所有函数
from pizza import*
make_pizza(16, 'pepperoni')
在导入函数时,要么只导入需要使用的函数,要么导入整个模块并且使用句点表示法。这让代码更清晰,更容易阅读和理解。
- 函数编写指南
在编写函数时,应该函数指定描述性名称,且只在其中使用小写字母和下划线。
每个函数都应包含简要概述其功能的注释,采用文档字符串格式。
给形参指定默认值时,等号两边不要有空格。
对于函数调用中的关键字实参,等号两边也不要空格。
代码行的长度不超过79字符。如果函数定义超过79字符,可再函数定义中输入左括号后按回车键,并在下一行按两次tab键,从而将形参列表和只缩进1层的函数体区分开来。
如果程序或模块包好多个函数,那么可以使用两个空行将相邻的函数分开。
所有Import 语句都应该放在文件开头,除非在文件开头使用注释描述整个程序。