# 函数
# 1、定义函数
# 1.1 函数的定义
# 定义函数是使用def关键字来定义的
# 调用函数,可指定函数名以及用括号括起的参数信息
def say_hello():# 定义一个函数
print("Hello World!");
say_hello();# 调用函数
# 1.2 向函数传递信息
# 可以在函数定义的函数名括号中定义参数信息,参数信息是在函数调用时传入
# 在下面的例子中username是一个形参(函数完成其功能的一项信息),在括号内
# 在下面的例子中"张三"是一个实参(调用函数时传递给函数的信息)
def say_name(username):# 定义一个带参数的函数
print(username+"说:Hello World!");
say_name("张三");# 调用函数
# 2、传递实参
# 在函数定义中可以有多个形参,因此函数调用中也可能包含多个实参。
# 向函数传递实参的方式有位置实参、关键字实参、列表和字典等
# 2.1 位置实参
# 调用函数时,函数调用中的每一个实参都将关联到函数定义中的一个形参,最简单的关联方式就是基于实参的顺序,这种关联方式称之为位置实参。
# 函数可以被调用任意多次
# 必须注意函数调用中实参的顺序要与函数定义中形参的顺序一致
def say_message(username,message):# 定义了一个包含两个参数的函数
print(username+"说:"+message);
say_message("张三","我喜欢python!");# 调用函数
# 2.2 关键字实参
# 关键字实参是传递给函数的名称-值对,直接在实参中将名称和值关联起来,因此向函数传递实参时不会混淆。
# 关键字实参可以让你不需要考虑函数调用中实参的顺序,还指出了函数调用各个值的用途
# 关键字实参的顺序不重要,python只需要各个值存储到哪个形参就行了。
def say_message2(username,message):# 定义了一个包含两个参数的函数
print(username+"说:"+message);
say_message2(username="李四",message="我是一名程序员!");# 调用函数
say_message2(message="我是一名程序员!",username="李四");# 注意这次的参数顺序不一样,但是结果一致
# 2.3 指定默认值
# 在编写函数时,可以为每个形参指定默认值。
# 因此在调用函数中给形参提供了实参时,python将使用指定的实参值,否则将使用形参的默认值。
# 给形参指定默认值后,可以在函数调用中省略相应的实参。
def say_message3(username,message="Hello World!"):# 定义了一个包含两个参数的函数,其中一个参数指定默认值
print(username+"说:"+message);
say_message3("王五");# 调用自带默认值的函数
say_message3("王五","我不想要你指定的默认值!");# 调用函数不使用指定的默认值,自己传参数
# 3、返回值
# 函数可以得到返回值,返回一个值或一组值,因此函数返回的值称之为返回值。
# 在函数中,可使用return语句将值返回到调用函数的代码行。
# 返回值可以简化主程序,使大部分工作在函数中完成。
# 3.1 返回简单值
def get_message(username,message):# 定义一个带有返回值的函数
return username+"说:"+message;
print(get_message("张三","Hello World!"));# 调用函数并打印返回值
# 3.2 返回字典
# 函数可返回任何类型的值,包括列表和字典等复杂的数据结构
def get_user(username,password):
user={"username":username,"password":password};
return user;# 返回一个字典
print(get_user("张三","123456"));#调用函数并打印返回的字典
# 4、传递其他参数
# 4.1 传递列表
# 可以向函数传递列表作为形参
def say_hellos(users):
for user in users:
print(user+"说:Hello World!");
users=["唐僧","孙悟空","猪八戒","沙僧","小白龙"];
say_hellos(users);# 调用函数,传递一个列表作为实参
# 4.2 传递任意数量的实参
# python允许函数从调用语句中收集任意数量的实参
# 在传递任意参数中是使用星(*)号来标记要传的形参。
# 传入的任意数量参数是处理为一个元组,如('abc','def','ghi'),即使只有一个值也是处理为一个元组
def say_hellos2(*users):
print(users);
say_hellos2("唐僧");# 传递一个参数
say_hellos2("唐僧","孙悟空","猪八戒","沙僧","小白龙")# 传递多个参数
# 4.3 结合使用位置实参和任意数量实参
# 如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。
# Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
def say_groups(group_name,*group_people):# 定义函数
print("团队名称:"+group_name);
print("团队成员:");
print(group_people);
say_groups("西游取经团队","唐僧","孙悟空","猪八戒","沙僧","小白龙");# 调用函数
say_groups("天龙八部团队","乔峰","段誉","虚竹");
# 4.4 使用任意数量的关键字实参
# 有时候,需要接受任意数量的实参,但预先不知道传递给函数的会是什么样的信息。
# 在这种情况下,可将函数编写成能够接受任意数量的键 — 值对——调用语句提供了多少就接受多少。
# 将在函数中使用标志两个星号(**)来标记参数
# 在下面例子中**user_info被处理为python创建了一个名为user_info的空字典,并将所有接收到的名称-值对都封装到这个字典中.
def build_group(username,password,**user_info):
user={};# 定义一个空字典,用来包含用户信息
user["username"]=username;
user["password"]=password;
for key,value in user_info.items():
user[key]=value;
return user;
user_group1=build_group("唐僧","123",title="金蝉子",status="师傅");# 调用函数,注意传递的参数的格式
print(user_group1);# 打印字典
user_group2=build_group("孙悟空","abc",title="齐天大圣",status="徒弟",job="弼马温");
print(user_group2);