7.函数的使用--《Python编程:从入门到实践》
7.1 python 中函数的定义
python 中函数使用 def 定义: def greet_user():
7.2 传参的传递
普通实参的传毒,可以与 C++ 相同,即按顺序传递。
7.2.1 关键字实参 -- 无需考虑传参顺序
关键字实参是传递给函数的名称—值对。关键字实参让你无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。
def describe_pet(animal_type, pet_name):
print(animal_type,pet_name)
# ... ...
# 关键字实参传参,以下两行代码等效
describe_pet(animal_type='hamster', pet_name='harry')
describe_pet(pet_name='harry', animal_type='hamster')
7.2.2 默认值
同 C++。注意:使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的实参,这也与 C++ 相同。
def describe_pet(pet_name, animal_type='dog'):
print(pet_name,animal_type)
describe_pet('www')
7.2.3 让参数变成可选择的
可给能选择是否输入的实参指定一个默认值——空字符串,并在不输入这个参数值时不使用这个实参。
例如函数是要输入姓氏,中间名,名称三个参数,但是有的人不存在中间名,这时就需要参数可选。
# 可选择是否输入的参数给予空白的默认值
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('john', 'hooker', 'lee')
print(musician)
7.3 在函数中修改列表
将列表作为参数传递给函数后,函数就可以对其进行修改,而这种修改对于列表来说是永久性的。
def print_models(unprinted_designs, completed_models):
"""
模拟打印每个设计,直到没有未打印的设计为止
打印每个设计后,都将其移到列表completed_models中
"""
while unprinted_designs:
current_design = unprinted_designs.pop()
# 模拟根据设计制作3D打印模型的过程
print("Printing model: " + current_design)
completed_models.append(current_design)
def show_completed_models(completed_models):
"""显示打印好的所有模型"""
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_model)
# 未打印的列表
unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
# 打印完成的列表
completed_models = []
# 打印完成列表++,未打印列表--
print_models(unprinted_designs, completed_models)
# 输出打印完成的列表
show_completed_models(completed_models)
7.3.1 禁止函数修改列表
要禁止函数修改列表,可以将列表的副本(列表[:])传给函数,这样即使修改也是修改的列表的副本,对列表本身没有影响。
function_name(list_name[:]) # 要将列表的副本传递给函数
7.4 传递任意数量的实参
形参形式形如 *形参名,即可接收任意数量的实参。即创建了一个元组,而任意数量的实参封装到了这个元组中。
注意:如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中
# pizzas 接收多个参数
def make_pizza(custom,*pizzas):
"""概述要制作的比萨"""
print(custom,"buy these pizza:")
for pizza in pizzas:
print("- " + pizza)
print("\n")
make_pizza('张三','pepperoni')
make_pizza('李四','mushrooms', 'green peppers', 'extra cheese')
7.5 将函数存储在模块中
将一整个模块导入,以模块名.函数名的形式调用函数。
pizza.py:
def make_pizza(custom,*pizzas):
"""概述要制作的比萨"""
print(custom,"buy these pizza:")
for pizza in pizzas:
print("- " + pizza)
print("\n")
main.py:
import pizza
pizza.make_pizza('张三','pepperoni')
pizza.make_pizza('李四','mushrooms', 'green peppers', 'extra cheese')
7.5.1 导入特定模块的特定函数
pizza.py:
def make_pizza(custom,*pizzas):
"""概述要制作的比萨"""
print(custom,"buy these pizza:")
for pizza in pizzas:
print("- " + pizza)
print("\n")
main.py:
from pizza import make_pizza # 来自 pizza 模块的导入
make_pizza('张三','pepperoni')
make_pizza('李四','mushrooms', 'green peppers', 'extra cheese')
7.5.2 使用 as 给函数指定别名/给模块指定别名
如果要导入的函数的名称可能与程序中现有的名称冲突,或者函数的名称太长,可使用 as 指定别名。
from pizza import make_pizza as mp
mp(16, 'pepperoni')
mp(12, 'mushrooms', 'green peppers', 'extra cheese')
我们还可以给模块指定别名。
import pizza as p
p.make_pizza(16, 'pepperoni')
p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
7.5.3 导入模块的全部函数
from 模块名 import *
注意:最好不要采取这种方式,避免函数名相同带来不好的结果。