python入门学习:7.函数
关键点:函数
7.1 定义函数7.2 传递实参7.3 返回值7.4 传递列表7.5 传递任意数量的实参7.6 将函数存储在模块中
7.1 定义函数
使用关键字def告诉python要定义一个函数,紧接着跟着函数名,冒号。后面的缩进构成函数体.例如:
1def func_name():
2 函数体
3
4def greet_user():
5 """显示简单问候语"""
6 print("hello!")
7
8greet_user() #函数调用
7.1.1 向函数传递信息
在定义函数市可以给函数传递一个参数
1def func_name(param):
2 函数体
3
4def greet_user(username):
5 """显示简单问候语"""
6 print("hello!"+ username.title()+"!")
7greet_user('jessue')
7.1.2 实参和形参
在函数greet_user()的定义中,变量username是一个形参--函数完成工作所需的一项信息。在代码greet_user('jessue')中,值'jessue'是一个实参。实参是调用函数时传递给函数的信息,我们调用函数时,实际上将实参'jessue'传递给了函数greet_user()的形参username中,然后进行操作。
7.2 传递实参
7.2.1 位置实参
调用函数时,python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此,最简单的方式是基于实参的顺序。这种关联方式被称为位置实参。
1def describe_pet(animal_type,pet_name):
2 print("\nI have a " + animal_type + ".")
3 print("My " + animal_type + "'s name is " + pet_name.title() + ".")
4
5describe_pet('hamster','harry')
6#注意:位置实参的顺序很重要,如果顺序错误可能结果出乎意料
7.2.2 关键字实参
关键字实参是传递给函数的名称-值对。你直接在实参中将名称和值关联起来了,因此向函数传递实参时不会混淆。关键字实参让你无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。
1def describe_pet(animal_type,pet_name):
2 print("\nI have a " + animal_type + ".")
3 print("My " + animal_type + "'s name is " + pet_name.title() + ".")
4
5#describe_pet(animal_type='hamster',pet_name='harry')
6describe_pet(pet_name='harry',animal_type='hamster')
7#关键字实参于顺序无关
7.2.3 默认值
编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,python将使用指定的实参值;否则将使用形参默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参
1def describe_pet(pet_name,animal_type='dog'):
2 print("\nI have a " + animal_type + ".")
3 print("My " + animal_type + "'s name is " + pet_name.title() + ".")
4
5#describe_pet(pet_name='wille')
6describe_pet(pet_name='wille',animal_type='cat')
注意:在这个函数中修改了形参的顺序。由于animal_type指定了默认值,无需要通过实参来指定动物类型,因此函数调用中只包含了一个实参--宠物的名字。然而python依然将这个实参视为位置实参,因此函数调用中只包含宠物的名字,这个实参将关联到函数定义的第一个形参。
使用默认值时,在形参列表中必须先列出没有默认值的形参,在列出有默认值的形参,这让python依然能够正确地解读位置实参。
7.3 返回值
函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。
7.3.1 返回简单值
如下返回一个字符串
1def get_formatted_name(first_name,last_name):
2 full_name = first_name + ' ' + last_name
3 return full_name.title() #返回值
4
5musician = get_formatted_name('jimi','hendrix')
6print(musician)
7.3.2 让实参变成可选择的
有时候,需要让实参变成可选择的,这样使用函数的人就只用在必要时才提供额外信息。可使用默认值来让实参变成可选择的。
1def get_formatted_name(first_name,last_name,middle_name=''):
2 if middle_name:
3 full_name = first_name + ' ' + middle_name + ' ' + last_name
4 else:
5 full_name = first_name + ' ' + last_name
6 return full_name.title()
7
8musician = get_formatted_name('jimi','hendrix')
9print(musician)
10
11musician = get_formatted_name('jimi','hendrix','lee')
12print(musician)
7.3.3 返回字典
函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。下面定义一个函数,返回一个字典
1def build_person(frist_name,last_name):
2 person = {'frist':frist_name,'last':last_name}
3 return person #返回一个字典
4musician = build_person('jimi','hendrix')
5print(musician)
7.3.4 结合使用函数和while循环
1def get_formatted_name(first_name,last_name):
2 full_name = first_name + ' ' + last_name
3 return full_name.title()
4
5while True:
6 print("\nPlease tell mme your name:")
7 print("(enter 'q' at any time to quit)")
8 f_name = input("Frist name: ")
9 if f_name == 'q':
10 break
11 l_name = input("Last name: ")
12 if l_name == 'q':
13 break
14
15 formatted_name = get_formatted_name(f_name,l_name)
16 print("\nHello, "+ formatted_name+"!")
7.4 传递列表
向函数传递一个列表
1def greet_users(names):
2 for name in names:
3 msg = "Hello, " + name.title()+"!"
4 print(msg)
5
6user_names = ['hannah','ty','margot']
7greet_users(user_names)
7.4.1 在函数中修改列表
将列表传递给函数后,可对列表进行修改
1def print_models(unprinted_designs,completed_models):
2 while unprinted_designs:
3 current_design = unprinted_designs.pop()
4
5 print("Printing model: "+ current_design)
6 completed_models.append(current_design)
7
8def show_complete_models(completed_models):
9 print("\nThe following models have been printed:")
10 for completed_model in completed_models:
11 print(completed_model)
12
13unprinted_designs = ['iphone case','robot pendant','dodecadron']
14completed_models = []
15print_models(unprinted_designs,completed_models)
16show_complete_models(completed_models)
7.4.2 禁止函数修改列表
有时候需要禁止函数修改列表,可以向函数传递一个列表的副本而不是原件,这样就可以避免列表被修改。
1fuc_name(list_name[:])
2print(unprinted_designs[:],completed_models)
7.5 传递任意数量的实参
有时候,你预先不知道函数要接受多少个实参,不过python支持传递任意数量的实参。
1def make_pizaa(*topping)
2 print(topping)
3make_pizaa('pepperoni')
4make_pizaa('mushroom','green pepers','extra chesse')
5
6('pepperoni',)
7('mushroom', 'green pepers', 'extra chesse')
7.5.1 结合使用位置实参和任意数量实参
如果让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
1def make_pizaa(size,*toppings): #*toppings 传递一系列字符串
2 print("\nMaking a "+str(size) + "-inch pizza with the following toppings:")
3
4 for topping in toppings:
5 print("- " + topping)
6make_pizaa(16,'pepperoni')
7make_pizaa(12,'mushroom','green pepers','extra chesse')
8
9Making a 16-inch pizza with the following toppings:
10- pepperoni
11
12Making a 12-inch pizza with the following toppings:
13- mushroom
14- green pepers
15- extra chesse
7.5.2 使用任意数量的关键字实参
有时候,需要接受任意数量的实参,但预先不知道传递函数的会是什么样的信息。再这种情况下,可将函数编写成能够接受任意数量的键-值对--调用语句提供了多少就接受多少。
1def build_profile(first,last,**user_info): #**user_info传递一系列键-值对
2 profile = {}
3 profile['first_name'] = first
4 profile['last_name'] = last
5 for key,value in user_info.items():
6 profile['key'] = value
7 return profile
8
9user_profile = build_profile('albert','einstein',location='princeton',field = 'physics')
10print(user_profile)
7.6 将函数存储在模块中
函数的优点之一是,使用它们可将代码块与主程序分离。你还可以更进一步,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import语句允许当前运行的程序文件中使用模块中的代码。
7.6.1 导入整个模块
要让函数是可导入的,得先创建模块。模块是扩展名为.py的文件,包含要导入到程序中的代码。下面创建一个包含函数make_pizza()的模块。
1#在pizza.py中定义make_pizza()函数
2def make_pizza(size,*toppings):
3 """概述要制作的pizza"""
4 print("\nMaking a " + str(size)+ "-inch pizza with the following toppings:")
5 for topping in toppings:
6 print("- "+topping)
7
8#在主程序中import pizza
9import pizza
10pizza.make_pizza(16,'pepperoni')
11pizza.make_pizza(12,'mushroom','green pepers','extra chesse')
12
13
14Making a 16-inch pizza with the following toppings:
15- pepperoni
16
17Making a 12-inch pizza with the following toppings:
18- mushroom
19- green pepers
20- extra chesse
只需要编写一条import语句并在其中指出模块名,就可以在程序中使用该模块的所有函数。
1import module_name #module_name.py模块
2module_name.function_name()
7.6.2 导入特定函数
你还可以导入模块的特定函数
1from module_name import function_name
2#通过逗号分割函数名
3from module_name import function_name1,function_name2
4#对于前面的pizza模块可以使用如下导入
5from pizza import make_pizza
6make_pizaa(16,'pepperoni') #直接调用函数即可
7make_pizaa(12,'mushroom','green pepers','extra chesse')
7.6.3 使用as给函数指定别名
如果要导入的函数名称可能与程序中现有名称冲突,或者函数的名称太长,可指定简短而独一无二的别名。导入时通过as实现
1from module_name import function_name as new_function_name
2from pizza import make_pizza as mp
3mp(16,'pepperoni') #直接调用mp
4mp(12,'mushroom','green pepers','extra chesse')
7.6.4 使用as给模块指定别名
使用as还可以给模块指定别名
1import pizza as p
2p.make_pizaa(16,'pepperoni') #直接调用函数即可
3p.make_pizaa(12,'mushroom','green pepers','extra chesse')
7.6.5 导入模块中的所有函数
使用星号(*)可导入模块中的所有函数。一般不建议这样做,容易发送函数名冲突
from pizza import *
make_pizaa(16,'pepperoni') #直接调用函数即可
make_pizaa(12,'mushroom','green pepers','extra chesse')