8.1 定义函数
定义一个简单函数:
def greet_user():
"""显示简单的问候语"""
print("Hello!")
调用greet_user()
函数:
>>> greet_user()
Hello!
8.1.1 向函数传递信息
稍作修改,让函数用用户的名字做抬头,向greet_user()
函数传递一个字符串参数:
>>> def greet_user(username):
... print("Hello,"+username.title()+"!")
...
>>> greet_user("jiayu")
Hello,Jiayu!
8.1.2 实参和形参
在函数greet_user()
的定义中,变量username
是一个形参
——函数完成其工作时所需的一项信息。在代码greet_user("jiayu")
中,值”jiayu“
是一个实参
,实参是调用函数时传递给函数的信息。调用函数时,将实参”jiayu“传递给函数greet_user(),这个值被存储在形参username中。
8.2 传递实参
向函数传递实参的方式很多,可使用位置实参,要求实参的顺序与形参的顺序相同;也可使用关键字实参,其中每个实参都由变量名和值组成;还可以使用列表和字典。
8.2.1 位置实参
调用函数时,将函数调用的每个实参都关联到函数定义中的一个形参,最简单的关联方式是基于实参的顺序,称为位置实参。
>>> def describe_pet(animal_type,pet_name):
... print("\nI have a" + animal_type + ".")
... print("The name is " + pet_name.title() + ".")
...
>>> describe_pet("dog","jack")
I have adog.
The name is Jack.
8.2.2 关键字实参
关键字实参是传递给函数的名称-值对,直接在实参中将名称和值关联起来了。关键字实参无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。
>>> describe_pet(pet_name = "jack",animal_type = "dog")
I have adog.
The name is Jack.
8.2.3 默认值
编写函数时,可给每个形参指定默认值,使用默认值可简化函数调用。
>>> def descirbe_pet(pet_name,animal_type = "dog"):
... print("\nI have a" + animal_type + ".")
... print("The name is " + pet_name.title() + ".")
>>> descirbe_pet("Mary")
I have adog.
The name is Mary.
>>> descirbe_pet("Mary","cat")
I have acat.
The name is Mary.
8.2.4 等效的函数调用
指定实参时,可以使用位置方式,也可以使用关键字方式。
8.2.5 避免实参错误
>>> describe_pet("dog")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: describe_pet() missing 1 required positional argument: 'pet_name'
8.3 返回值
8.3.1 返回简单值
>>> def add(a,b):
... return a+b
...
>>> add(3,5)
8
8.3.2 让实参变成可选的
为了给用户提供灵活的选项,可以给某个实参设置默认值,用户觉得必要时才输入。
8.3.3 返回字典
函数可返回任何类型的值,包括列表和字典等教复杂的数据结构。
>>> def build_person(first_name,last_name):
... person = {'first':first_name,'last':last_name}
... return person
...
>>> you = build_person("karty","sun")
>>> you
{'first': 'karty', 'last': 'sun'}
8.3.4 结合使用函数和While循环
略。
8.4 传递列表
>>> def greet_users(names):
... for name in names:
... msg = "Hello, " + name.title() + "!"
... print(msg)
...
>>> greet_users(usernames)
Hello, H!
Hello, E!
Hello, L!
8.4.1 在函数中修改列表
>>> def delete_one(arr):
... while 1 in arr:
... arr.remove(1)
...
>>> arr = [1,1,2,3,1]
>>> delete_one(arr)
>>> arr
[2, 3]
8.4.2 防止函数修改列表
为防止函数修改原有列表,可将列表的副本传递给函数。
>>> delete_one(arr[:])
8.5 传递任意数量的实参
>>> def make_pizza(*toppings):
... for item in toppings:
... print(item)
...
>>> make_pizza("one")
one
>>> make_pizza("one","two","three")
one
two
three
8.5.1 结合使用位置实参和任意数量实参
必须将函数中接纳任意数量实参的形参放在最后
,Python先匹配位置实参和关键字实参,再将其余的实参都收集到最后一个形参中。
8.5.2 使用任意数量的关键字实参
>>> 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 = build_profile("jiayu","zhang",age = 24,sex = "male")
>>> user
{'first_name': 'jiayu', 'last_name': 'zhang', 'age': 24, 'sex': 'male'}
8.6 将函数存储在模块中
可将函数存储在被称为模块
的独立文件中,再将模块导入
到主程序中,import
语句允许在当前运行的程序文件中使用模块中的代码。
8.6.1 导入整个模块
模块是扩展名为.py
的文件,创建文件名为pizza.py
的模块,里面只有函数make_pizza()
。在pizza.py所在的目录
中创建另外一个文件,导入模块:
import pizza
pizza.make_pizza()
8.6.2 导入特定的函数
导入模块中的特定函数,语法是:
from module_name import function_0,function_1,function_2
8.6.3 使用as给函数指定别名
from pizza import make_pizza as mp
mp()
8.6.4 使用as给模块指定别名
import pizza as p
p.make_pizza()
8.6.5 导入模块中的所有函数
from pizza import *
make_pizza()