一、定义函数
def greet_user(username):
"""显示简单的问候语"""
print("Hello, " + username.title() + "!")
greet_user('tom')
注:三引号引起来的文本被称为文档字符串的注释,描述了函数是做什么的,Python使用它们来生成有关的程序中函数的文档。
二、传递实参
1、位置实参
调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。最简单的关联方式就是基于实参的顺序,称为位置实参。
def describe_pet(animal_type,pet_name):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + "."
deccribe_pet('dog','harry')
2、关键字实参
关键字实参是传递给函数的名称—值对。
def describe_pet(animal_type,pet_name):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + "."
deccribe_pet(animal_type='dog',pet_name='harry')
注:关键字实参等号两边不要有空格。
3、默认值
编写函数时,可给每个形参指定默认值。在调用函数时给形参提供了实参的话,Python将使用指定的实参值,否则,将使用形参的默认值。
def describe_pet(pet_name,animal_type='dog'):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + "."
deccribe_pet('harry')
deccribe_pet('haha','cat')
注:
- 使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。
- 给形参指定默认值时,等号两边不要有空格。
总:三种方式可混合使用。
三、返回值
使用return语句将值返回到调用函数的代码行。返回值让你能够将程序的大部分繁重的工作移到函数中去完成,从而简化主程序。
def build_persion(first_name,last_name):
"""返回一个字典,其中包含有关一个人的信息"""
persion = {'first':first_name,'last':last_name}
return persion
musician = build_persion('jimi','hendrix')
print(msician)
四、传递列表
想函数传递列表是很有用的,这种列表包含的可能是名字、数字或更复杂的对象(如字典)。将列表传递给函数后,函数就能直接访问其内容了。
1、在函数中修改列表
在函数中对这个列表所做的任何修改都是永久性的,这让你能够高效地处理大量的数据。
unconfirmed_users = ['alice','brian','candace']
confirmed_users = []
while unconfirmed_users:
current_user = unconfirmed_users.pop()
print("Verifying user: " + current_user.title())
confirmed_users.append(current_user)
print(\nThe confirmed_users are: ")
for user in confirmed_users:
print(user)
为重新组织这些代码,可编写两个函数,每个都做一件具体的工作。大部分代码都与原来相同,只是效率更高了。
def confirmed_users(unconfirmed_users,confirmed_users):
"""将未验证的用户一一验证"""
while unconfirmed_users:
current_user = unconfirmed_users.pop()
print("Verifying user: " + current_user.title())
confirmed_users.append(current_user)
def show_confirmed_users(confirmed_users):
"""显示验证好的用户"""
print(\nThe confirmed_users are: ")
for user in confirmed_users:
print(user)
unconfirmed_users = ['alice','brian','candace']
confirmed_users = []
confirmed_users(unconfirmed_users,confirmed_users)
show_confirmed_users(confirmed_users)
2、禁止函数修改列表
可向函数传递列表的副本而不是原件,这样函数所做的任何修改都只影响副本,为丝毫不影响原件。
function_name(list_name[:])
注:切片表示法[ : ] 创建列表的副本。
虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由需要传递副本,否则还是应该将原始列表传递给函数,因为让函数使用现成列表可避免花时间和内容创建副本,从而提高效率,在处理大型列表时尤其如此。
五、传递任意数量的实参
有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参。
1、结合使用位置实参和任意数量实参
如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
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,'peppers')
make_pizza(10,'peppers','cheese')
注:toppings中的星号让Python创建一个名为toppings的空元组*,并将收集到的所有值都封装到这个元组中。
2、使用任意数量的关键字实参
def bulid_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_profile = build_profile('albert','einstein',
location = 'princeton',
field = 'physice')
print(user_profile)
注:形参**user_info中的两个星号让Python创建一个名为user_info的空字典,并将收集到的所有名称—值对都封装到这个字典中。
六、将函数存储在模块中
函数的优点之一是,使用它们可将代码块和主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。还可更进一步,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中,import语句运行在当前运行的程序文件中使用模块中的代码。
通过将函数存储在独立文件中,可隐藏代码的细节,将重点放在程序的高层逻辑上,这还能让你在众多不同的程序中重用函数。
1、导入整个模块
import module_name
module_name.function_name()
2、导入特定的函数
from module_name import function_name
function_name()
from module_name import function_0,function_1,function_2
function_0()
function_1()
function_2()
3、使用as给函数指定别名
from module_name import function_name as fn
fn()
4、使用as给模块指定别名
import module_name as mn
mn.function_name()
5、导入模块中的所有函数
from module_name import *
function_name()
注:由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。
但是,使用并非自己编写的大型模块时,最好不要采用这种导入发方法,如果模块中有函数的名称与你的项目中国使用的名称相同,可能导致意想不到的后果。Python可能遇到多个名称相同的函数或变量,进而覆盖函数。而不是分别导入所有的函数。
最佳做法:
- 只导入所需要的函数
- 导入整个模块并使用句点表示法
编写建议:
- 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样更容易知道前一个函数在什么地方结束,下一个函数此从什么地方开始。
- 所有的import语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。
网友评论