Python基础(六) 函数
本人是个新手,写下博客用于自我复习、自我总结。
如有错误之处,请各位大佬指出。
参考教材:Python编程从入门到实践
1.定义函数
例如:
def greet_user(username): #形参
print("Hello!"+username.title()+".")
greet_user('jesse') #实参
函数定义用def
2.传递实参
2.1位置实参
实参和形参的最简单的关联方式是基于实参的顺序。这种关联方式被称为位置实参。
例如:
def describe_pet(animal_type,pet_name):
print("\nI have a "+animal_type+".")
print("My "+animal_type+"'s name is "+pet_name.title()+".")
describe_pet('hamster','harry')
describe_pet('dog','willie')
2.2关键字实参
例如:
def describe_pet(animal_type,pet_name):
print("\nI have a "+animal_type+".")
print("My "+animal_type+"'s name is "+pet_name.title()+".")
describe_pet(animal_type='hamster',pet_name='harry')
关键字实参是传递给函数的名称键值对。直接在实参中将名称和值关联起来了。
这样也就不会出现混淆,而且清楚地指出了函数调用中各个值的用途。
关键字实参也会让我们不用考虑实参顺序。
2.3默认值
编写函数时,可给每个形参指定默认值。在调用函数时,给形参提供了实参后,这个默认值就会变成提供的实参;否则,如果未提供这个实参,将使用形参给定的默认值。
例如:
def describe_pet(pet_name,animal_type='dog'):
print("\nI have a "+animal_type+".")
print("My "+animal_type+"'s name is "+pet_name.title()+".")
describe_pet(pet_name='willie')
要注意的是,一定要修改形参的排列顺序,把有默认值的形参放在后面。
3.返回值
函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。
函数返回的值被称为返回值。使用return就可以。使用函数完成一系列操作,可以让主程序简化。
例如:
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()
musician=get_formatted_name('jimi','hendrix')
print(musician)
musician=get_formatted_name('john','hooker','lee')
print(musician)
有时候可以像上面这样,让实参变成可选的。因为有的人没有中间名。这样就可以区分多种情况。
函数还可以返回任何类型的值,包括列表和字典等较复杂的数据结构。
例如:
def build_person(first_name,last_name,age=''):
person={'first':first_name,'last':last_name}
if age:
person['age']=age
return person
musician=build_person('jimi','hendrix',age=27)
print (musician)
4.传递列表
你经常会发现,向函数传递列表很有用,这种列表包含的可能是名字、数字或更复杂的对象(如字典)。将列表传递给函数后,函数就能直接访问其内容。
例如:
def greet_user(names):
for name in names:
msg="Hello, "+name.title()+"!"
print(msg)
usernames=['hannah','ty','margot']
greet_user(usernames)
4.1在函数中修改列表
例如:
def print_models(unprinted_designs,completed_models):
while unprinted_designs:
current_design=unprinted_designs.pop()
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)
这个例子如果不用函数也可以。但这样更为有序,而且让主程序更容易理解,更容易扩展和维护。因为只要再次调用函数并传入下一次的实参就可,不需要改变任何东西。
4.2禁止函数修改列表
有时候,需要禁止函数修改列表,我们对函数进行一系列的操作,但还想保留原来的函数,我们只需要向函数传递列表的副本而不是原件。这样函数所作的任何修改都只影响副本,而不影响原件。
如:
print_models(unprinted_designs[:],completed_models)
虽然向函数传递列表的副本可以保留原始列表的内容,但除非有充分的理由需要传递副本,否则还是将原始列表传递给函数,因为让函数使用现成列表可避免花时间和内存创建副本,从而提高效率,在处理大型列表时尤其如此。
5.传递任意数量的实参
有时候,你预先不知道函数需要接受多少个实参,Python允许函数从调用语句中收集任意数量的实参。
例如:
def make_pizza(*toppings):
print("\nMaking a pizza with the following toppings:")
for topping in toppings:
print("-"+topping)
make_pizza('pepperoni')
make_pizza('mushrooms','green peppers','extra cheese')
形参名*toppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中。函数体内的print语句通过生成输出来证明Python能够处理使用一个值调用函数的情形,也能处理使用三个值来调用函数的情形。
5.1 结合使用位置实参和任意数量实参
例:
def make_pizza(size,*toppings):
print("\nMaking a "+str(size)+"-inch pizza with the following toppings:")
for topping in toppings:
print("-"+topping)
make_pizza(17,'pepperoni')
make_pizza(25,'mushrooms','green peppers','extra cheese')
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_profile=build_profile('albert','einstein',
location='princeton',
field='physics')
print(user_profile)
6 将函数存储在模块中
函数的优点之一是,使用它们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。当然还可以更进一步,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import语句允许在当前运行的程序文件中使用模块中的代码。通过将函数存储在独立的文件中,可隐藏程序代码的细节,将重点放在程序的高层逻辑上。这还能让你在众多不同的程序中重用函数。将函数存储在独立文件中后,可与其他程序员共享这些文件而不是整个程序。知道如何导入函数还能让你使用其他程序员编写的函数库。
6.1导入整个模块:import pizza
6.2导入特定函数:from pizza import make_pizza
导入了pizza中的特定函数make_pizza
6.3使用as给函数指定别名:from pizza import make_pizza as mp
这样一来,以后用make_pizza,直接用mp就可以了
6.4使用as给模块指定别名:import pizza as p
这样一来以后调用pizza中的函数,直接用p就可以了