python第八章——函数

一、定义函数

函数定义:使用关键字def告诉python要定义一个函数。向python指定函数名,后有一个括号,里面可以有函数未完成其任务需要什么样的信息,也可以不需要任何信息就完成任务,虽然没有但是也不能省略括号,定义以冒号结尾,后面所有的缩进构成函数体。

文档字符串:用三个括号引起,可以描述函数是干什么的。也需要在第一行加入# _*_ coding:gb2312 _*_

要调用函数,可依次指定函数名以及括号括起的必要信息。如下面的例子:

# _*_ coding:gb2312 _*_
def greet_user(username):
	"""显示简单的问候语"""
	print("Hello, "+username.title()+"!")
	
greet_user('maling')

形参:函数完成其工作需要的一项信息,如例子中的username

实参:调用函数是传递给函数的信息,如maling。将实参传递给函数,这个值将被储存形参中。

二、传递实参

 向函数传递实参的方式有很多,比如位置实参、关键字实参,还可以使用列表和字典。

1、位置实参

再调用函数时,python必须将函数调用中的每个实参都关联到函数定义中的一个形参。最简单的方法是基于实参的顺序,这种方法被称为位置实参。即实参的顺序和形参的顺序相同。

可以根据需要多次调用函数。

# _*_ coding:gb2312 _*_
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('cat','maliao')

2、关键字实参

关键字实参是传递黑函数的名称-值对,这种方法传递实参时不会混淆。实参顺序无关紧要,因为python知道各个值该储存在那个形参中。

扫描二维码关注公众号,回复: 3430650 查看本文章

也可以给形参中指定默认值,这样在相应的函数调用中省略实参。

# _*_ coding:gb2312 _*_
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('harry')


给定默认值,只有一个实参,然而python将这个实参视为位置实参,所以修改了形参的顺序。如果在函数调用中给定实参,则python将会忽略这个形参的默认值。

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

鉴于可混合使用位置实参、关键字实参和默认值,通常有多种等效的函数调用方法。

# _*_ coding:gb2312 _*_
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='harry',animal_type='cat')
describe_pet(animal_type='cat',pet_name='harry') 
describe_pet('harry')
describe_pet(pet_name='harry')
describe_pet('harry','cat')

三、返回值

函数并非只显示输出,也可以处理一些数据,并返回一个或一组值,函数返回的值称为返回值。使用return语句将值返回到调用函数的代码行。

看下面一个简单的例子:

# _*_ coding:gb2312 _*_
def get_formatted_name(first_name,last_name):
	"""返回整洁的姓名"""
	full_name=first_name+' '+last_name
	return full_name.title()

musician=get_formatted_name('ma','ling')
print(musician)

调用返回值的函数时,需要提供一个变量,用于储存返回的值。

1、让实参变得可选

为让使用函数的人只在必要时才提供额外的信息,可使用默认值让实参变得可选。

下面的例子中时输入人的名字,包括名、姓、有时候还有中间名,但不是所有人都有中间名,我们可以给形参middle_name制定一个默认值——空字符串,并将其放在形参的末尾。在有中间名时在实参中提供即可,没有中间名依然可行。

# _*_ coding:gb2312 _*_
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('ma','ling')
print(musician)
	
musician=get_formatted_name('ma','ling','yang')
print(musician)


python将空字符串解读为False,导致if测试未通过,进而执行else代码块。

2、返回字典

# _*_ coding:gb2312 _*_
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('ma','ling',age=24)
print(musician)

函数build_person接收名和姓并将值封装在字典中,增加了一个可选形参,并将默认值设置为空字符串。。

3、结合使用函数和while循环

结合使用get_formatted_name()和while循环,我们添加一条信息来告诉用户如何退出,然后在每次提示用户输入时,都检查他输入的是否是退出值,是就退出循环。

# _*_ coding:gb2312 _*_
def get_formatted_name(first_name,last_name):
	"""返回整洁的姓名"""
	full_name=first_name+' '+last_name
	return full_name.title()
	
while True:
	print("\nPlease tell me your name:")
	print("(enter 'q' at any time 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("\nHello, "+formatted_name+"!")

四、传递参数

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_designs[:],completed_models)

五、传递任意数量的实参

一个星号*加形参名可创建一个空元组,两个星号**加形参名表示创建一个空字典。如果让函数接受不同类型的实参,必须将函数定义中接纳任意数量实参的形参放在最后,即先匹配位置实参和关键字实参,最后将余下的实参都收集到最后一个形参中。

# _*_ coding:gb2312 _*_
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)


六、将函数储存在模块中

将函数储存在称为模块的独立文件中,再将模块导入到主程序中,import语句可使当前的程序文件使用模块中的代码。

1、导入整个模块

例如在上一个程序中使用import,结果是一样的。

import profile
profile.build_profile(
		'albert','einstein',
		location='princeton',
		field='physics')

要调用被导入模块中的函数,可指定导入的模块的名称和函数名,它两之间用句号隔开。

2、导入特定的函数

例如在前面模型3D打印的例子中有两个函数,导入时可用逗号隔开。其结果一样

from printing_models import print_models,show_completed_models
unprinted_designs=['iphone case','robot pendant','dodecahedron']
completed_models=[]

3、使用as

在导入函数和模块的名称与程序中现有的名称冲突或名称过于复杂时,使用as可简化名称,相当于起一个别名。

给函数指定别名:

from profile import build_profile as bp
bp('albert','einstein',
   location='princeton',
   field='physics')

给模块指定别名:

import profile as p
p.build_profile('albert','einstein',
		location='princeton',
		field='physics')

4、导入模块中所有函数

使用*运算符

from printing_models import *
unprinted_designs=['iphone case','robot pendant','dodecahedron']
completed_models=[]

七、函数编写指南

编写函数时,需要注意以下几个细节:

1、给形参指定默认值、对于函数调用中的关键字实参,等号两边不要有空格。

2、函数定义过长时,再输入左括号后按回车键,并在下一行按两次Tab键。

3、如果程序或模块中包含多个函数时,使用两个空行将相邻的函数隔开。

4、所有的import语句放在文件开头,除非文件开头使用了注释。




猜你喜欢

转载自blog.csdn.net/IMWTJ123/article/details/80138834