8 函数
8.1 定义函数
-
Python用def关键字来定义一个函数,并向它指定函数名;
def greet_user(name: str): # 定义一个函数,并且向其中传递一个字符串参数 """显示简单的问候语句""" # 文档字符串的注释,用于描述函数是做了什么。用三个引号括起,Python可以用他们来生成有关程序中函数的文档 print("Hello word " + name) return # 返回一个值,这里不返回什么 greet_user("Bob") # 调用这个函数
8.1.1 向函数传递参数
-
可以在定义的函数内添加参数,将信息传递给函数
def greet_user(name): # 定义一个函数 """显示简单的问候语句""" # 文档字符串的注释,用于描述函数是做了什么。用三个引号括起,Python可以用他们来生成有关程序中函数的文档 print("Hello word " + str(name)) # 使用str()函数,将数值型变量转变为字符型变量 return # 返回一个值,这里不返回什么 greet_user('Bob') # 调用这个函数 greet_user(112)
8.2 实参和形参
向函数传递实参的方式有很多种,主要有以下两种:
- 位置实参:要求实参的顺序与形参的顺序相同
- 关键字实参:要求每个实参都由变量名和值组成
8.2.1 位置实参
def greet_user(name: str, age: int, country: str): # 定义一个函数
"""显示简单的问候语句""" # 文档字符串的注释,用于描述函数是做了什么。用三个引号括起,Python可以用他们来生成有关程序中函数的文档
print("Hello " + str(name) + " 你今年" + str(age) + "岁,来自" + str(country))
return # 返回一个值,这里不返回什么
greet_user('Bob', 17, '美国') # 调用这个函数,使用位置实参来传递参数
greet_user(17, 'Bob', '美国') # 当位置实参的顺序错误时
8.2.2 关键字实参
def greet_user(name: str, age: int, country: str): # 定义一个函数
"""显示简单的问候语句""" # 文档字符串的注释,用于描述函数是做了什么。用三个引号括起,Python可以用他们来生成有关程序中函数的文档
print("Hello " + str(name) + " 你今年" + str(age) + "岁,来自" + str(country))
return # 返回一个值,这里不返回什么
greet_user(country='美国', age=17, name='Tom') # 使用关键字实参,可以不用考虑传参的位置
8.2.3 默认值
-
编写函数时,可给每个形参指定默认值。在调用函数中形参提供了实参时,将使用指定的实参,否则将使用形参的默认值
def greet_user(name: str, age: int, country: str = '中国'): # 定义一个函数,最后一个形参定义了一个默认值 # def greet_user(name, age, country='中国'): """显示简单的问候语句""" # 文档字符串的注释,用于描述函数是做了什么。用三个引号括起,Python可以用他们来生成有关程序中函数的文档 print("Hello " + str(name) + " 你今年" + str(age) + "岁,来自" + str(country)) return # 返回一个值,这里不返回什么 greet_user('Tom', 17)
8.3 返回值
函数并非总是直接显示输出,也可以处理一些数据,并返回一个或者一组值。函数返回的值称为返回值
8.3.1 返回简单值
def get_name(fist_name, last_name): # 定义一个函数,返回一个整洁的姓名
full_name = fist_name + ' ' + last_name
return full_name.title() # 返回每个单词首字母大写的名字
print(get_name('li', 'ping'))
8.3.2 让实参变成可选的
-
有时候需要让实参变成可选的,在使用函数的时候只需要在必要的时候才提供额外信息,可以使用默认值来让实参变成可选的。
-
给可选的实参设置一个默认值——一个空字符串,并在没有提供参数传递时不使用,并且必须将这个参数放在形参列表的末尾。
def get_name(fist_name, last_name, middle_name=''): # 定义一个函数,返回一个整洁的姓名 """返回一个整洁的名字,无论有没有中间姓名,如果要传递中间名,中间名放在最后一个位置""" if middle_name: # 如果中间名存在 full_name = fist_name + ' ' + middle_name + ' ' + last_name else: # 如果不存在 full_name = fist_name + ' ' + last_name return full_name.title() # 返回每个单词首字母大写的名字 print(get_name('john', 'hooker', 'lee')) # 有中间名 print('li', 'ping') # 没有中间名
8.3.3 返回字典
def build_name(first_name: str, last_name: str, age: str = ''):
"""返回一个字典,其中包含一个人的信息"""
person = {'first_name': first_name.title(), 'last_name': last_name.title()}
if age:
person['age'] = age # 添加年龄信息
return person
li_ping = build_name('li', 'ping', '12') # 建立一个字典,包含一个名为liping的人的一些信息
print(li_ping) # 打印这个字典
8.4 传递列表
- 将列表传递给函数后,函数就可以直接访问其内容。
8.4.1 在函数中修改列表
numbers = list(range(1, 6)) # 生成一个1~6的数字列表
print(numbers)
def change_number(my_list: list):
"""将列表的第一个元素删除"""
my_list.pop(0)
return my_list
print(change_number(numbers))
8.4.2 禁止函数修改列表
-
有时要用到列表,但又不希望修改原列表,可以使用列表切片法
numbers = list(range(1, 6)) # 生成一个1~6的数字列表 print(numbers) def change_number(my_list: list): """将列表的第一个元素删除""" my_list.pop(0) return my_list print("函数处理后的列表" + str(change_number(numbers[:]))) # 切片表示法[:]创建列表的副本 print("原列表仍为:" + str(numbers))
8.5 传递任意数量的实参
-
如果预先不知道函数需要接受多少个实参,可以使用星号-""来创建一个空的元组,如top并将所收到的值都封装到这个元组中。
def build_info(*tops): # 用星号建立一个空的元组 """打印所有传递的值""" print("传递的值为:" + str(tops)) # 输出这个元组 return build_info("湖南", "长沙", "株洲")
8.5.1 结合使用位置实参和任意数量实参
-
如果要接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后面。Python会先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
def build_info(country: str, *tops): # 用星号建立一个空的元组,将位置实参放在任意数量实参的前面 """打印所有传递的值""" print(str(country) + " 传递的额外参数为:" + str(tops)) # 输出这个元组 return build_info("中国", "湖南", "长沙", "株洲") # 参数“中国”传递的是一个位置实参,后面的参数是任意实参
8.5.2 使用任意数量的关键字实参
-
如果需要接受任意数量的参数,但预先不知道传递给函数的会是什么样的信息,在这种情况下,可将函数编写成能够接受任意数量的键-值对
def build_profile(first_name: str, last_name: str, **user_info): # 形参列表的最后一个形参,建立了一个名为user_info的空字典,用来存储额外的健-值对 """创建一个字典,其中包含用户的一切信息""" profile = {} profile['first_name'] = first_name # 将相关健-值存储在字典中 profile['last_name'] = last_name for key, value in user_info.items(): # 遍历字典user_info,并且将键和值取出,存储到profile中 profile[key] = value return profile user_liping = build_profile('Li', 'Ping', age=12, sex='女') print(user_liping)8.6 将函数存储在模块中
-
可以将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。
8.6 模块导入
8.6.1 导入整个模块
先建立一个.py的文件
Function.py
def function_1(): print("This is function 1") return def function_2(): print("This is function 2") return def function_3(): print("This is function 3") return
在main.py中,通过import来导入
import Function as Fct # 导入模块,并用as给这个模块重命名为Fct Fct.function_1() Fct.function_2()
8.6.2 导入特定的函数
使用from-import 来导入特定的某个函数,也可以用as来重命名这个函数
from Function import function_1 # 导入Function模块中的function_1函数 function_1()
8.6.3 导入模块中的所有函数
from Function import * # 用星号来省略函数名,不推荐这种写法,如果模块中有函数名称和项目中使用的名称相同,可能导致不同的结果 function_1() function_2() function_3()
-