Python day_6

1.定义函数

def name():

 def greet_user(): 
	"""显示简单的问候语""" 
	 print("Hello!") 
 
	 greet_user()
Hello!

1:使用关键字def来告诉Python你要定义一个函数。这是函数定义,向Python指出了函数名,还可能在括号内指出函数为完成其任务需要什么样的信息。
2:处的文本是被称为文档字符串的注释,描述了函数是做什么的。文档字符串用三引号括起,Python使用它们来生成有关程序的文档。

2,向函数传递信息
def greet_user(username): 
 	"""显示简单的问候语"""
 	print("Hello, " + username.title() + "!") 
 
greet_user('jesse') 
Hello,Jesse!

通过在这里添加username,就可让函数接受你给username指定的任何值。

在函数greet_user()的定义中,变量username是一个形参——函数完成其工作所需的一项信息。在代码greet_user(‘jesse’)中,值’jesse’是一个实参。实参是调用函数时传递给函数的信息。我们调用函数时,将要让函数使用的信息放在括号内。在greet_user(‘jesse’)中,将实参’jesse’传递给了函greet_user(),这个值被存储在形参username中。

3.位置实参
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')
I have a hamster. 
My hamster's name is Harry. 

I have a dog. 
My dog's name is Willie. 

在函数中,可根据需要使用任意数量的位置实参,Python将按顺序将函数调用中的实参关联到函数定义中相应的形参。

4.关键字实参

关键字实参是传递给函数的名称—值对。关键字实参让你无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。

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') 

函数describe_pet()还是原来那样,但调用这个函数时,我们向Python明确地指出了各个实参对应的形参。看到这个函数调用时,Python知道应该将实参’hamster’和’harry’分别存储在形参animal_type和pet_name中。输出正确无误,它指出我们有一只名为Harry的仓鼠。

注意 使用关键字实参时,务必准确地指定函数定义中的形参名

5.默认值

编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,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() + ".") 
  
describle_pet(pet_name = 'willie')
I have a dog. 
My dog's name is Willie. 

这个默认了也是位置参数,所以,还可以直接这样写:describe_pet(‘willie’)

注意 使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的实参。这让Python依然能够正确地解读位置实参。

6.等效的函数调用
def describe_pet(pet_name, animal_type='dog'): 
	# 一条名为Willie的小狗
	describe_pet('willie') 
	describe_pet(pet_name='willie') 
	# 一只名为Harry的仓鼠
	describe_pet('harry', 'hamster') 
	describe_pet(pet_name='harry', animal_type='hamster') 
	describe_pet(animal_type='hamster', pet_name='harry') 

这些函数调用的输出与前面的示例相同

7.返回简单值

函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。在函数中,可使用return语句将值返回到调用函数的代码行。返回值让你能
够将程序的大部分繁重工作移到函数中去完成,从而简化主程序。

 def get_formatted_name(first_name, last_name): 
	 """返回整洁的姓名""" 
	full_name = first_name + ' ' + last_name 
	return full_name.title() 
	
musician = get_formatted_name('jimi', 'hendrix') 
print(musician) 
Jimi Hendrix 
8.返回字典
def build_person(first_name, last_name): 
 	"""返回一个字典,其中包含有关一个人的信息""" 
	person = {'first': first_name, 'last': last_name} 
	return person
	 
musician = build_person('jimi', 'hendrix') 
print(musician)
{'first': 'jimi', 'last': 'hendrix'} 
9.结合while循环
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 + "!") 
Please tell me your name: 
(enter 'q' at any time to quit) 
First name: eric 
Last name: matthes 

Hello, Eric Matthes! 

Please tell me your name: 
(enter 'q' at any time to quit) 
First name: q 
10.传递列表
def greet_users(names): 
	 """向列表中的每位用户都发出简单的问候""" 
 	for name in names: 
	msg = "Hello, " + name.title() + "!" 
 	print(msg) 
 	
usernames = ['hannah', 'ty', 'margot'] 
greet_users(usernames) 
Hello, Hannah! 
Hello, Ty! 
Hello, Margot! 
11.在函数中修改列表

将列表传递给函数后,函数就可对其进行修改。在函数中对这个列表所做的任何修改都是永久性的,这让你能够高效地处理大量的数据。

unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron'] 
completed_models = [] 

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) 
Printing model: dodecahedron 
Printing model: robot pendant 
Printing model: iphone case 

The following models have been printed: 
dodecahedron 
robot pendant 
iphone case 

在这里插入图片描述

12.禁止函数修改列表
function_name(list_name[:])
print_models(unprinted_designs[:], completed_models) 

这样函数print_models()依然能够完成其工作,因为它获得了所有未打印的设计的名称,但它使用的是列表unprinted_designs的副本,而不是列表unprinted_designs本身。像以前一样,列
表completed_models也将包含打印好的模型的名称,但函数所做的修改不会影响到列表unprinted_designs。虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由需要传递副本,否则还是应该将原始列表传递给函数,因为让函数使用现成列表可避免花时间和内存创建副本,从而提高效率,在处理大型列表时尤其如此。

13.传递任意数量的实参
def make_pizza(*toppings): 
 	"""打印顾客点的所有配料""" 
	 print(toppings) 
 
make_pizza('pepperoni') 
make_pizza('mushrooms', 'green peppers', 'extra cheese') 

形参名*toppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中。函数体内的print语句通过生成输出来证明Python能够处理使用一个值调用函数的情形,也能处理使用三个值来调用函数的情形。

('pepperoni',) 
('mushrooms', 'green peppers', 'extra cheese') 

如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。

14.使用任意数量的关键实参

有时候,需要接受任意数量的实参,但预先不知道传递给函数的会是什么样的信息。在这种情况下,可将函数编写成能够接受任意数量的键—值对——调用语句提供了多少就接受多少。

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) 
{'first_name': 'albert', 'last_name': 'einstein', 'location': 'princeton', 'field': 'physics'} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值