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就可以了

6.5导入模块中的所有函数:from pizza import *

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只爭朝夕不負韶華

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值