一、定义函数 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,'盐份','油份','酒份','醋份') 注意:给形参指定默认值时,等号两边不要有空格。