Python之函数【Python从入门到实践】

区分实参和形参

def greet_user(username):
 print("Hello, " + username.title() + "!")
greet_user('jesse')

形参是函数完成其工作所需的一项信息,实参是调用函数时传递给函数的信息。在greet_user('jesse') 中, 将实参'jesse' 传递给了函数greet_user() , 这个值被存储在形参username 中。
传递实参:

<1>位置实参

def describe_pets(animal_type,pet_name):
    print("my"+" "+animal_type+"'s"+" "+"name"+" "+"is"+ " "+pet_name )

describe_pets("dog","球球")

顺序很重要,请确认函数调用中实参的顺序与函数定义中形参的顺序一致。

<2>关键字实参
关键字实参 是传递给函数的名称—值对。 你直接在实参中将名称和值关联起来了, 因此向函数传递实参时不会混淆(不会得到名为Hamster的harry这样的结果) 。 关键字实参让你无需考虑函数调用中的实参顺序, 还清楚地指出了函数调用中各个值的用途。

在上个例子的基础上 ,调用的时候  语句:

describe_pet(animal_type='hamster', pet_name='harry')

关键字实参的顺序无关紧要, 因为Python知道各个值该存储到哪个形参中。

<3>默认值
编写函数时, 可给每个形参指定默认值 。 在调用函数中给形参提供了实参时, Python将使用指定的实参值; 否则, 将使用形参的默认值。 因此, 给形参指定默认值后, 可在函数调用中省略相应的实参。 使用默认值可简化函数调用, 还可清楚地指出函数的典型用法。

def describe_pets(animal_type,pet_name="球球"):
    print("my"+" "+animal_type+"'s"+" "+"name"+" "+"is"+ " "+pet_name )

describe_pets("dog")

如果要描述的动物的名字不是球球, 可使用类似于下面的函数调用:
describe_pet(pet_name='harry', animal_type='dog')
由于显式地给animal_type 提供了实参, 因此Python将忽略这个形参的默认值。
 

返回值

def get_formatted_name(first_name,last_name):
    full_name=first_name+" "+"last_name"
    return full_name.title()

musition=get_formatted_name("gao","xiaohei")
print(musition)

调用返回值的函数时, 需要提供一个变量, 用于存储返回的值。
【让实参变成可选的】

def get_formatted_name(first_name,last_name,middle_name=''):
    full_name=first_name+" "+middle_name+" "+last_name
    return full_name.title()

musition=get_formatted_name("gao","xiaohei","er")
print(musition)

musition=get_formatted_name("gao","xiaohei")
print(musition)

可给实参middle_name 指定一个默认值——空字符串, 并在用户没有提供中间名时不使用这个实参。 为让get_formatted_name() 在没有提供中间名时依然可行, 可给实参middle_name 指定一个默认值——空字符串,并将其移到形参列表的末尾

【返回字典】

函数可返回任何类型的值, 包括列表和字典等较复杂的数据结构。 例如, 下面的函数接受姓名的组成部分, 并返回一个表示人的字典:

def build_person(name,age,sex=''):
    person={'name':name,'age':age}
    if sex:
        person['sex']=sex
    return person

person1=build_person("高小二黑","24")
print(person1)

person2=build_person("高小二黑","24","女")
print(person2)

运行结果:


结合使用函数和while 循环

# 格式化姓名的函数
def getformatted_name(first_name,last_name):
    full_name=first_name+last_name
    return full_name.title()

# 写一个无限循环
while True:
    print("请输入您的名字:")
    print("请输入q退出!")
    first_name=input("FirstName:")
    if first_name=="q":
        break
    last_name=input("LastName:")
    if last_name=="q":
        break
    formatted_name=getformatted_name(first_name,last_name)
    print(formatted_name)

传递列表

def getNames(usernames):
    for name in usernames:
        msg="hello"+" "+name+"!"
        print(msg)

usernames=['高','韩','康']
getNames(usernames)

在函数中修改列表

将列表传递给函数后, 函数就可对其进行修改。 在函数中对这个列表所做的任何修改都是永久性的, 这让你能够高效地处理大量的数据

# 首先创建一个列表, 其中包含一些要打印的设计
unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
completed_models = []
# 模拟打印每个设计, 直到没有未打印的设计为止
# 打印每个设计后, 都将其移到列表completed_models中
while unprinted_designs:
current_design = unprinted_designs.pop()
#模拟根据设计制作3D打印模型的过程
print("Printing model: " + current_design)
completed_models.append(current_design)
# 显示打印好的所有模型
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_model)

这个程序首先创建一个需要打印的设计列表, 还创建一个名为completed_models 的空列表, 每个设计打印都将移到这个列表中。 只要列表unprinted_designs 中还有设计, while 循环就模拟打印设计的过程: 从该列表末尾删除一个设计, 将其存储到变量current_design 中, 并显示一条消息, 指出正在打印当前的设计, 再将该设计加入到列表completed_models 中。 循环结束后, 显示已打印的所有设计。

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)

我们定义了函数print_models() , 它包含两个形参: 一个需要打印的设计列表和一个打印好的模型列表。 给定这两个列表, 这个函数模拟打印每个设计的过程: 将设计逐个地从未打印的设计列表中取出, 并加入到打印好的模型列表中。 在❷处, 我们定义了函数show_completed_models() , 它包含一个形参: 打印好的模型列表。 给定这个列表, 函数show_completed_models() 显示打印出来的每个模型的名称。
禁止函数修改列表
切片表示法[:] 创建列表的副本。 在print_models.py中, 如果不想清空未打印的设计列表, 可像下面这样调用print_models() :
print_models(unprinted_designs[:], completed_models)
传递任意数量的实参
例如, 来看一个制作比萨的函数, 它需要接受很多配料, 但你无法预先确定顾客要多少种配料。 下面的函数只有一个形参*toppings , 但不管调用语句提供了多少实参, 这个形参都将它们统统收入囊中。

def make_pizza(*toppings):
"""打印顾客点的所有配料"""
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')

结合使用位置实参和任意数量实参

def make_pizza(size, *toppings):
#概述要制作的比萨
print("\nMaking a " + str(size) +
"-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

将函数存储在模块中
要让函数是可导入的, 得先创建模块。 模块 是扩展名为.py的文件, 包含要导入到程序中的代码。 下面来创建一个包含函数make_pizza() 的模块。 为此, 我们将文件pizza.py中
除函数make_pizza() 之外的其他代码都删除:
pizza.py:

def make_pizza(size, *toppings):
"""概述要制作的比萨"""
print("\nMaking a " + str(size) +"-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)

使用时只需导入即可:
import pizza
pizza.make_pizza(16, 'pepperoni')
pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

导入特定的函数
from module_name import function_0, function_1, function_2
导入模块中的所有函数
from module_name import *
 

小试牛刀  检验一下吧!

8-1 消息 : 编写一个名为display_message() 的函数, 它打印一个句子, 指出你在本章学的是什么。 调用这个函数, 确认显示的消息正确无误。
8-2 喜欢的图书 : 编写一个名为favorite_book() 的函数, 其中包含一个名为title 的形参。 这个函数打印一条消息, 如One of my favorite books isAlice in Wonderland 。 调用这个函数, 并将一本图书的名称作为实参传递给它。

8-3 T恤 : 编写一个名为make_shirt() 的函数, 它接受一个尺码以及要印到T恤上的字样。 这个函数应打印一个句子, 概要地说明T恤的尺码和字样。
使用位置实参调用这个函数来制作一件T恤; 再使用关键字实参来调用这个函数。
8-4 大号T恤 : 修改函数make_shirt() , 使其在默认情况下制作一件印有字样“I love Python”的大号T恤。 调用这个函数来制作如下T恤: 一件印有默认字样的大号T恤、 一件印有默认字样的中号T恤和一件印有其他字样的T恤(尺码无关紧要) 。
8-5 城市 : 编写一个名为describe_city() 的函数, 它接受一座城市的名字以及该城市所属的国家。 这个函数应打印一个简单的句子, 如Reykjavik is inIceland 。 给用于存储国家的形参指定默认值。 为三座不同的城市调用这个函数, 且其中至少有一座城市不属于默认国家。
8-6 城市名 : 编写一个名为city_country() 的函数, 它接受城市的名称及其所属的国家。 这个函数应返回一个格式类似于下面这样的字符串:
"Santiago, Chile"
至少使用三个城市-国家对调用这个函数, 并打印它返回的值。
8-7 专辑 : 编写一个名为make_album() 的函数, 它创建一个描述音乐专辑的字典。 这个函数应接受歌手的名字和专辑名, 并返回一个包含这两项信息的字典。 使用这个函数创建三个表示不同专辑的字典, 并打印每个返回的值, 以核实字典正确地存储了专辑的信息。
给函数make_album() 添加一个可选形参, 以便能够存储专辑包含的歌曲数。 如果调用这个函数时指定了歌曲数, 就将这个值添加到表示专辑的字典中。 调用这个函数, 并至少在一次调用中指定专辑包含的歌曲数。
8-8 用户的专辑 : 在为完成练习8-7编写的程序中, 编写一个while 循环, 让用户输入一个专辑的歌手和名称。 获取这些信息后, 使用它们来调用函数make_album() , 并将创建的字典打印出来。 在这个while 循环中, 务必要提供退出途径
8-9 魔术师 : 创建一个包含魔术师名字的列表, 并将其传递给一个名为show_magicians() 的函数, 这个函数打印列表中每个魔术师的名字。
8-10 了不起的魔术师 : 在你为完成练习8-9而编写的程序中, 编写一个名为make_great() 的函数, 对魔术师列表进行修改, 在每个魔术师的名字中都加入字样“theGreat”。 调用函数show_magicians() , 确认魔术师列表确实变了。
8-11 不变的魔术师 : 修改你为完成练习8-10而编写的程序, 在调用函数make_great() 时, 向它传递魔术师列表的副本。 由于不想修改原始列表, 请返回修改后的列表, 并将其存储到另一个列表中。 分别使用这两个列表来调用show_magicians() , 确认一个列表包含的是原来的魔术师名字, 而另一个列表包含的是添加了字样“the Great”的魔术师名字。
8-12 三明治 : 编写一个函数, 它接受顾客要在三明治中添加的一系列食材。 这个函数只有一个形参(它收集函数调用中提供的所有食材) , 并打印一条消息, 对顾客点的三明治进行概述。 调用这个函数三次, 每次都提供不同数量的实参。
8-13 用户简介 : 复制前面的程序user_profile.py, 在其中调用build_profile() 来创建有关你的简介; 调用这个函数时, 指定你的名和姓, 以及三个描述你的键-值对。
8-14 汽车 : 编写一个函数, 将一辆汽车的信息存储在一个字典中。 这个函数总是接受制造商和型号, 还接受任意数量的关键字实参。 这样调用这个函数: 提供必不可少的信息, 以及两个名称—值对, 如颜色和选装配件。 这个函数必须能够像下面这样进行调用:
car = make_car('subaru', 'outback', color='blue', tow_package=True)


 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值