一、定义函数
1、定义函数
示例:
def greet_user(): #定义含函数
"""显示简单问候语""" #文档字符串,用三引号括起,python使用它来生成有关程序中函数的文档
print('您好') #函数体,执行语句
greet_user() #调用函数
执行结果:
您好
---------------------------------------------------------------------
2、向函数传递信息
示例:
def greet_userp(uname):
"""显示简单问候语"""
print('您好: ' + uname + '!')
greet_userp('沈巍伟')
执行结果:
您好: 沈巍伟!
---------------------------------------------------------------------------------------
3、实参和形参
下面的示例中,uname即为 形参
'袁凌'即为 实参
示例:
def greet_userp(uname):
"""显示简单问候语"""
print('您好: ' + uname + '!')
greet_userp('袁凌')
执行结果:
您好: 袁凌!
=====================================================
=====================================================
=====================================================
=====================================================
二、传递实参
函数定义中可能包括多个形参,因此函数调用中也可能包含多个实参。
向函数传递实参的方式很多,可使用位置实参,这要求实参的顺序与形参的顺序相同;
也可使用关键字实参,其中的每个实参都由变量名和值组成;
还可以使用列表和字典;
1、位置实参
调用函数时,python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此,
最简单的关联方式是基于实参的顺序。这种关联方式称为位置实参。
示例:
def describe_pet(animal_type,animal_name):
"""显示动物类型和名字"""
print("\n动物类型是: "+animal_type)
print('动物名字是: '+animal_name)
describe_pet('宠物猫','橘猫')
describe_pet('宠物狗','哈士奇')
执行结果:
动物类型是: 宠物猫
动物名字是: 橘猫
动物类型是: 宠物狗
动物名字是: 哈士奇
-------------------------------------------------------------------
2、关键字实参
关键字实参是传递给函数的名称——值对。直接在实参中将名称和值关联起来了;
关键字实参无需让你考虑调用的实参的顺序,还清楚的指出了函数调用中各个值的用途;
示例:
def describe_pet(animal_type,animal_name):
"""显示动物类型和名字"""
print("\n动物类型是: "+animal_type)
print('动物名字是: '+animal_name)
describe_pet(animal_type='宠物猫',animal_name='橘猫')
describe_pet(animal_name='哈士奇',animal_type='宠物狗')
执行结果:
动物类型是: 宠物猫
动物名字是: 橘猫
动物类型是: 宠物狗
动物名字是: 哈士奇
------------------------------------------------------------
3、默认值
编写函数时,可给每个形参指定默认值,在调用函数中如果给形参提供了实参时,python将使用
指定的实参值;否则,将使用形参的默认值;
在使用默认值时,在形参列表中必须先列出没有默认值的形参;再列出有默认值的形参;
示例:
def describe_pet(animal_type,animal_name='神龙'):
"""显示动物类型和名字"""
print("\n动物类型是: "+animal_type)
print('动物名字是: '+animal_name)
describe_pet(animal_type='宠物猫',animal_name='橘猫')
describe_pet(animal_name='哈士奇',animal_type='宠物狗')
describe_pet(animal_type='宠物天使')
describe_pet('宠物魔鬼')
执行结果:
动物类型是: 宠物猫
动物名字是: 橘猫
动物类型是: 宠物狗
动物名字是: 哈士奇
动物类型是: 宠物天使
动物名字是: 神龙
动物类型是: 宠物魔鬼
动物名字是: 神龙
---------------------------------------------------------------------
4、等效的函数调用
即几种函数调用方式都可以,可以混合使用
示例:
def describe_pet(animal_type,animal_name='神龙'):
"""显示动物类型和名字"""
print("\n动物类型是: "+animal_type)
print('动物名字是: '+animal_name)
describe_pet(animal_type='宠物猫',animal_name='橘猫')
describe_pet(animal_name='哈士奇',animal_type='宠物狗')
describe_pet(animal_type='宠物天使')
describe_pet('宠物魔鬼')
describe_pet('宠物魔鬼','鬼')
执行结果:
动物类型是: 宠物猫
动物名字是: 橘猫
动物类型是: 宠物狗
动物名字是: 哈士奇
动物类型是: 宠物天使
动物名字是: 神龙
动物类型是: 宠物魔鬼
动物名字是: 神龙
动物类型是: 宠物魔鬼
动物名字是: 鬼
===============================================================
===============================================================
===============================================================
===============================================================
三、返回值
示例:
def get_formatted_name(first_name,last_name):
"""返回整洁的姓名"""
full_name = first_name + ' ' + last_name
return full_name
musician = get_formatted_name('巍伟','沈')
print(musician)
执行结果:
巍伟 沈
---------------------------------------------------------------
2、让实参变成可选的
有时候,需要让实参变成可选的,这样使用函数的人就只需要在必要时才提供额外的信息
python将非空字符串解读为true,因此函数提供了中间名,则if middle_name = true
示例:
def get_formatted_name(first_name,middle_name,last_name):
"""返回整洁的姓名"""
full_name = first_name + ' '+ middle_name + ' ' + last_name
return full_name
musician = get_formatted_name('巍','伟','沈')
print(musician)
执行结果:
巍 伟 沈
--------------------------------------------------------------------------
示例:
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
musician = get_formatted_name('wei','wei','shen')
print(musician)
musician = get_formatted_name('ling','yuan')
print(musician)
执行结果:
wei shen wei
ling yuan
--------------------------------------------------------------------
3、返回字典
示例:
def person(first_name,last_name):
"""返回一个字典,其中包含有关一个人的信息"""
person = { 'first_name': first_name,'last_name':last_name}
return person
musician = person('wei','shen')
print(musician)
musician = person('ling','yuan')
print(musician)
执行结果:
{'first_name': 'wei', 'last_name': 'shen'}
{'first_name': 'ling', 'last_name': 'yuan'}
--------------------------------------------------------------
示例:
def person(first_name,last_name,age=''):
"""返回一个字典,其中包含有关一个人的信息"""
person = { 'first_name': first_name,'last_name':last_name}
if age :
person['age'] = age
return person
musician = person('wei','shen')
print(musician)
musician = person('ling','yuan',27)
print(musician)
执行结果:
{'first_name': 'wei', 'last_name': 'shen'}
{'first_name': 'ling', 'last_name': 'yuan', 'age': 27}
--------------------------------------------------------------
4、结合使用函数和while循环
示例:
def get_formatted_name(first_name,last_name) :
"""返回整洁的姓名"""
full_name = first_name+' '+last_name
return full_name
while True :
print('\n请输入您的姓名; ')
print("输入'q'退出")
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("您好,全名是: "+formatted_name)
执行结果:
请输入您的姓名;
输入'q'退出
first_name : wei
last_name : shen
您好,全名是: wei shen
请输入您的姓名;
输入'q'退出
first_name : q
==============================================================
==============================================================
==============================================================
==============================================================
四、传递列表
将列表传递给函数后,函数就能访问其内容。
示例:
def greet_users(names):
"""向列表中的每一位用户发出问候"""
for name in names :
msg = 'hello ' + name.title() + ' !'
print(msg)
usernames = ['shen','yuan','ling']
greet_users(usernames)
执行结果:
hello Shen !
hello Yuan !
hello Ling !
----------------------------------------------
2、在函数中修改列表
示例:
unprinted_designs = ['iphone case','robot pendant','dodecahedron']
completed_models = []
while unprinted_designs:
current_design = unprinted_designs.pop()
print('模拟3D打印过程: '+' '+current_design)
completed_models.append(current_design)
print('\n显示所有打印好的模型: ')
for completed_model in completed_models :
print(completed_model)
执行结果:
模拟3D打印过程: dodecahedron
模拟3D打印过程: robot pendant
模拟3D打印过程: iphone case
显示所有打印好的模型:
dodecahedron
robot pendant
iphone case
-------------------------------------------------------------
示例:
def print_models(unprinted_designs,completed_models) :
"""模拟打印每一个设计,直到没有未打印的设计为止"""
while unprinted_designs :
current_design = unprinted_designs.pop()
print('模拟3D打印过程: '+' '+current_design)
completed_models.append(current_design)
def show_completed_models(completed_models) :
"""显示打印好的所有模型"""
print('\n显示所有打印好的模型: ')
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)
执行结果:
模拟3D打印过程: dodecahedron
模拟3D打印过程: robot pendant
模拟3D打印过程: iphone case
显示所有打印好的模型:
dodecahedron
robot pendant
iphone case
------------------------------------------------------------------------
4、禁止函数修改列表
使用切片以及列表副本
=================================================================
=================================================================
=================================================================
=================================================================
五、传递任意数量的实参
预先不知道函数需要接受多少个实参;
形参名*toppings中的*号,让python创建一个名为toppings的空元组,将收到的所有值封装到这个元组中。
示例:
def make_pizza(*toppings):
"""打印顾客点的所有配料"""
print(toppings)
make_pizza('甜酱')
make_pizza('盐','油','酒','醋')
执行结果:
('甜酱',)
('盐', '油', '酒', '醋')
------------------------------------------------------------
示例:
def make_pizza(*toppings):
"""打印顾客点的所有配料"""
print(toppings)
for topping in toppings:
print(' '+ topping)
make_pizza('甜酱')
make_pizza('盐','油','酒','醋')
执行结果:
('甜酱',)
甜酱
('盐', '油', '酒', '醋')
盐
油
酒
醋
------------------------------------------------------------
2、结合使用位置实参和任意数量实参
要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后;
python先匹配位置实参和关键字实参,再将剩余的实参都收集到最后一个形参中;
示例:
def make_pizza(size,*toppings):
"""打印顾客点的所有配料"""
print('制作披萨的大小是: '+str(size)+' 所需配料如下: ')
for topping in toppings:
print(' '+ topping)
make_pizza(12,'甜酱')
make_pizza(16,'盐份','油份','酒份','醋份')
执行结果:
制作披萨的大小是: 12 所需配料如下:
甜酱
制作披萨的大小是: 16 所需配料如下:
盐份
油份
酒份
醋份
------------------------------------------------------------
3、使用任意数量的关键字实参
将函数编写成能否接受任意数量的键——值对,调用语句提供多少就接受多少;
示例:
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 ( '巍伟','沈',location='princeton',field='physics' )
print(user_profile)
执行结果:
{'first_name': '巍伟', 'last_name': '沈', 'location': 'princeton', 'field': 'physics'}
=============================================================================================
=============================================================================================
=============================================================================================
=============================================================================================
六、将函数存储在模块中
比如将函数存储在独立的模块中,再讲模块导入到主程序中。
import语句允许在当前运行的程序中使用模块中的代码;
1、导入整个模块
要让函数时可以导入的,得先创建模块。模块是扩展名为.py的文件;包含要导入到程序中的代码;
pizza.py
def make_pizza(size,*toppings):
"""打印顾客点的所有配料"""
print('制作披萨的大小是: '+str(size)+' 所需配料如下: ')
for topping in toppings:
print(' '+ topping)
-----------------
import make_pizza
make_pizza(12,'甜酱')
make_pizza(16,'盐份','油份','酒份','醋份')
2、导入特定的函数
多个函数之间用逗号分隔;
import pizza import make_pizza
3、使用as给函数指定别名
import pizza import make_pizza as mp
mp(12,'甜酱')
mp(16,'盐份','油份','酒份','醋份')
4、使用as给模块指定别名
import pizza as p
p.make_pizza(12,'甜酱')
p.make_pizza(16,'盐份','油份','酒份','醋份')
5、导入函数中的所有函数
from pizza import *
make_pizza(12,'甜酱')
make_pizza(16,'盐份','油份','酒份','醋份')
注意:给形参指定默认值时,等号两边不要有空格。