函数
形参和实参
- 函数语句块中第一句是函数的说明
- username是形参
- liyihang是实参
In [1]:
def greet_hello(username):
"""显示简单的问候语"""
print("hello," + username.title() + "!")
greet_hello("liyihang")
传递实参
位置实参
- 基于实参的顺序来关联
- 如下一个显示宠物信息的函数
In [4]:
def pet(type, name):
"""显示宠物信息"""
print("我有一只" + type + ",它的名字叫" + name.title())
pet("狗", "小黄")
- 使用位置实参传递,如果顺序不对可能会导致意想不到的结果
In [3]:
def pet(type, name):
"""显示宠物信息"""
print("我有一只" + type + ",它的名字叫" + name.title())
pet("小黄", "狗")
关键字实参
- 关键字实参是在实参中将参数和值关联起来了,因此不会混淆
- 关键字实参无需考虑函数调用中的实参顺序
In [5]:
def pet(type, name):
"""显示宠物信息"""
print("我有一只" + type + ",它的名字叫" + name.title())
pet(name="小黄", type="狗狗")
默认值
- 给函数形参指定默认值
- 调用函数时指定了新实参值就使用新值
- 未指定新值就使用默认值
- 注意:定义函数时,需要把没有有默认值的形参放到有默认值形参前面
In [8]:
def pet(name, type="狗"):
"""显示宠物信息"""
print("我有一只" + type + ",它的名字叫" + name.title())
pet(name="小黄", type="猫")
返回值
返回简单值
In [9]:
def get_formatted_name(first_name, last_name):
"""返回整洁的姓名(姓和名首字母大写,并在中间加上一个空格)"""
full_name = first_name + " " + last_name
return full_name.title()
liyihang = get_formatted_name(‘li‘, ‘yihang‘)
print(liyihang)
可选实参
- 升级上面的返回简单姓名函数
- 当调用该函数时,实参中姓名出现三个部分,怎么处理?
- 首先定义函数时增加一个middle_name,然后给middle_name指定一个默认值
- 在函数主体中判断实参中是否给出了middle_name
In [23]:
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()
a = get_formatted_name(‘li‘, ‘yihang‘)
print(a)
b = get_formatted_name(first_name=‘li‘, middle_name=‘yi‘, last_name=‘hang‘)
print(b)
返回字典
- 函数可返回任何类型的值
- 包括列表和字典等数据结构
In [ ]:
def get_person(name, sex, age):
"""返回一个包含人信息的字典"""
person = {‘name‘:name, ‘sex‘:sex, ‘age‘:age}
return person
zhangsan = get_person(‘zhangsan‘, ‘man‘, 18)
print(zhangsan)
函数结合while循环使用
- 定义一个函数,获取用户输入的姓名,并格式化输出他们
- 使用while循环无限重复操作,直到输入q退出
In [4]:
def get_formatted_name(first_name, last_name):
full_name = first_name + ‘ ‘ + last_name
return full_name.title()
while True:
print(‘input your name:‘)
print(‘enter q to quit‘)
f_name = input("first name:")
if f_name == ‘q‘:
break
l_name = input("last_name:")
if l_name == ‘q‘:
break
formatted_name = get_formatted_name(f_name, l_name)
print("hello, " + formatted_name + "!")
传递列表实参
- 定义一个函数,调用它并传递一个列表作为实参
In [5]:
def greet_user(names):
"""想列表中的每一位用户发出问候"""
for name in names:
msg = "Hello," + name.title() + "!"
print(msg)
names = [‘liyihang‘, ‘caijiasheng‘, ‘jieer‘]
greet_user(names)
在函数中修改列表
- 一家3D打印公司,需要打印的设计储存在一个列表中,打印完以后储存在另一个列表中
- 定义两个函数,一个打印功能,一个显示打印了那些设计功能
In [15]:
def print_models(unprinted_designs, completed_models):
"""
打印每个设计,知道打印完为止
每个设计打印完成后,都添加到completed列表中
"""
while unprinted_designs:
current_designs = unprinted_designs.pop()
print("正在打印设计:" + current_designs)
completed_models.append(current_designs)
def show_completed_models(completed_models):
"""显示所有打印好的设计"""
print(‘\n‘)
print("这些设计已经被打印好了:")
for completed_model in completed_models:
print(completed_model)
unprinted_designs = [‘iphone‘, ‘ipad‘, ‘itouch‘, ‘ipod‘]
completed_models = []
print_models(unprinted_designs, completed_models)
show_completed_models(completed_models)
禁止函数修改列表
- 在上面的函数中,每打印一次设计,就会删除掉unprinted列表中的元素
- 如果想保留unprinted列表中的内容,不对其做修改
- 可以使用切片方法在实参中传递列表的副本
- 注意:如果没有必要,直接传入列表而不是它的副本
- 因为创建副本需要时间,特别是大数据处理的时候,影响效率
In [ ]:
print_models(unprinted_designs[:], completed_models)
传递任意数量的实参
- 预先不知道有多少个实参的情况下
- 制作一个披萨,预先不知道要多少种配料
In [19]:
def make_pizza(*toppings):
"""制作披萨"""
print("\n用以下配料制作披萨:")
for topping in toppings:
print(topping)
make_pizza("面饼")
make_pizza("面饼", "芝士", "牛肉")
导入函数
- 导入函数时,最好清晰明了的写出导入了什么模块的什么函数
In [ ]:
from xxx.py import xxx
- 导入函数时,可以自定义导入函数名,避免出现同名函数导致程序出错
In [ ]:
from xxx.py import xxx as xxx