一, 定义函数
形参: 函数完成一项工作所需要的信息, 在函数定义时完成
实参: 调用函数时传递给函数的信息
二, 传递实参
1. 位置实参: 每个实参都关联到函数定义中的一个形参
示例: def describe_pet(animal_type,pet_name):
- print("My"+ animal_type+"'s is"+pet_name.title()+".")
- describe_pet('hamster','harry')
2. 关键字实参是传递给函数的名称 - 值对 (直接在实参中将名称和值关联起来, 这样无需考虑函数调用中的实参顺序)
- def describe_pet(animal_type,pet_name):
- print("My"+ animal_type+"'s is"+pet_name.title()+".")
- describe_pet(animal_type='hamster',pet_name='harry')
3. 默认值: 编写函数时, 可给每个形参指定默认值. 在调用函数时给形参指定了实参值时, python 将使用指定实参值; 否则, 将使用形参的默认值.
- def describe_pet(pet_name,animal_type='dog'):
- print("My"+ animal_type+"'s is"+pet_name.title()+".")
调用式 1: describe_pet('hamster') 使用形参默认值
调用式 2: describe_pet(pet_name='harry',animal_type='hamster')
显示的给 animal_type 提供了实参, 因此 python 忽略了形参的默认值
注意: 使用默认值时, 在形参列表中必须先列出没有默认值的形参, 在列出有默认值得形参, 这让 python 能正确解读位置实参
4. 等效的函数调用: 指定实参时可以使用位置方式, 也可以使用关键字方式
- def describe_pet(pet_name,animal_type='dog'):
- print("My"+ animal_type+"'s is"+pet_name.title()+".")
- # 一条命为 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')
三, 返回值: return 语句将值返回到调用函数的代码行
1. 返回简单的值
2. 让实参变成可选的
- 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
- reutn full_name
- musician=get_formatted_name('zilong','zhou')
- print(musician)
- musician=get_formatted_name('xifeng','wang','lee')
- print(musician)
为让中间名变成可选, 可给形参 middle_name 一个默认值 - 空字符串, 并在用户没有提供中间名时不使用这个实参
3. 返回字典: 函数可返回任何类型的值, 包括列表和字典等较为复杂的数据结构
- def build_person(first_name,last_name,age='')
- person={'first_name':first_name,'last_name':last_name}
- if age:
- age=32
- retun person
- musician=build('yufang','ke',20)
- print(musician)
4. 将函数与 while 循环结合使用
- def get_formatted_name(first_name,last_name)
- full_name=first_name+' '+last_name
- retun full_name
- while true:
- print("please tell me your name|enter q to quit")
- first_name=input("first name:")
- if first_name == 'q':
- break;
- last_name=input("last name:")
- if last_name == 'q':
- break;
- formatted_named=get_formatted_name(first_name,last_name)
- print(formatted_named)
四, 传递列表
1. 在函数中修改列表: 3D 打印模型公司需要打印的设计存储在一个列表中, 打印后移到另一个列表中
- def print_models(unprinted_designs,completed_models):
- while unprinted_designs:
- current_design=unprinted_designs.pop()
- completed_models.append(current_design)
- def show_completed_models(completed_models):
- print("the 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)
2. 禁止函数列表修改 (源代码参 -- 在函数中修改列表)
print_models(unprinted_designs[:],completed_models)
unprinted_designs[:] 获得列表 unprinted_designs 的副本, 而不是列表 unprinted_designs 的本身, 列表 completed_models 也将打印包含打印好的列表名称, 但函数所做的修改不会影响到列表 unprinted_designs
五, 传递任意数量的实参
1. 简单示例
制作比萨时需要接受很多配料, 但无法预先确定顾客要多少配料, 下面形参 toppings 能够接受任意多个实参
- def make_pizza(*toppings):
- print(toppings)
- make_pizza('peper')
- make_pizza('peper','extra cheese')
2. 结合使用位置实参和任意数量实参
- def make_pizza(size,*toppings):
- print("making a"+str(size)+"-inch pizza with the following toppings:")
- for topping in toppings:
- print("-"+topping)
- make_pizza(16,'peper')
- make_pizza(15,'peper','extra cheese')
3. 使用任意数量的关键字实参: 将函数编写能够接受任意数量的键 - 值对 -- 调用语句提供多少就接受多少
build_profile() 函数接受名和姓, 同事还接受任意数量的关键字实参
- def build_profile(first,last,**user_infos):
- profile={}
- profile['first_name']=first
- profile['last_name']=last
- for key,value in user_infos:
- profile[key]=value
- retun profile
- user_profile=build_profile('albert','eisnst',location='princeton',field='physics')
- print(user_profile)
六, 将函数存储灾模块中
return 语句将值返回到调用函数的代码行
来源: http://www.bubuko.com/infodetail-2990929.html