函数与模块
目录
1.函数
1.1.函数概念
1.2.函数定义
1.3.函数分类
1.4.函数参数类型
1.4.1.位置参数
1.4.2.关键字参数
1.4.3.默认值参数
1.4.4.可变参数
1.5.匿名函数
1.6.参数传递问题
2.冒泡排序
2.1.冒泡排序规则
2.2.冒泡排序实现
3.math 模块
4.random 模块
5.datetime 模块
6.re 模块
6.1.正则表达式语法
6.1.1.字符匹配
6.1.2.数量词匹配
6.1.3.特殊字符匹配
6.1.4.边界字符
6.2.python 正则表达式常用函数
7.json 模块
1.函数
1.1.函数概念
在 Python 中,函数(Function)是一段可重用的代码块,用于执行特定的任务或完成特定的功能。函数可以接受输入参数(也称为参数或形参)并返回一个结果。通过函数,可以将程序划分为较小的模块,使代码更加有组织、可读性更好,并且可以提高代码的重用性。
函数的定义通常包括以下几个部分:
- 函数名:用于标识函数的名称,以便在程序中调用它。(命令规则和变量名一样)
- 参数:函数可以接受零个或多个参数作为输入。参数是可选的,可以根据需要定义。
- 函数体:函数体是一组执行特定任务的语句块。它是函数的实际代码逻辑。
- 返回值:函数可以返回一个值作为结果。使用 return 语句指定函数的返回值。
1.2.函数定义
返回值类型提醒最好写,不写也行。
参数列表可有可无,根据需求灵活而定。
1.3.函数分类
- 无参无返回值
- 无参有返回值
- 有参无返回值
- 有参有返回值
当有无法确定的数据就需要传入参数 , 函数结果需要参加其他操作就需要返回值。
1.4.函数参数类型
- 位置参数
- 关键字参数
- 默认值参数
- 可变参数(不定长参数)
- 其他(使用不多)
1.4.1.位置参数
位置参数(Positional Arguments):位置参数是按照参数定义的顺序进行传递的参数。调用函数时,需要按照参数定义的顺序依次传递参数值。
1.4.2.关键字参数
关键字参数(Keyword Arguments):关键字参数是通过参数名称进行传递的参数,与位置无关。在函数调用时,可以使用参数名称来指定参数值。
print() 函数源码:
1.4.3.默认值参数
默认参数(Default Arguments):默认参数是在函数定义时为参数指定的默认值。如果在函数调用时没有传递相应参数的值,将使用默认值。
1.4.4.可变参数
可变参数(Variable Arguments):可变参数允许函数接受任意数量的参数。在函数定义时,
- 在参数名前加上 *,表示这是一个可变参数。可变参数将被视为元组(tuple)类型。
- 在参数名前加上 **,表示这是一个可变参数。可变参数将被视为字典(dict)类型。
input_util.py文件:
# 封装 2 个函数
# 输入任意正确范围的整数
# 参数:提示语句,不定长参数(约束范围)
# 返回值:需要
def input_int(msg: str = '请输入一个整数:', *args: int) -> int:
while 1:
n = input(msg)
if n.isdigit() if n[0] != '-' else n[1: ].isdigit():
n = int(n)
if len(args) == 0:
return n
elif len(args) == 1:
if n >= args[0]:
return n
else:
print(f'请输入大于等于{args[0]}的整数')
else:
if args[0] <= n <= args[1]:
return n
else:
print(f'请输入{args[0]} - {args[1]}的整数')
else:
print('输入的不是数字')
pass
# 判断整数部分&小数部分是不是数字
def fun(n: str) -> bool:
if n.find('.') == -1 and n.isdigit(): # 没有 .
return True
elif n.find('.') == 0: # . 在开头
if n[1:].isdigit():
return True
elif n.find('.') == len(n) - 1: # . 在最后
if n[: -1].isdigit():
return True
# 传范围
def fun2(n: float, *args: float) -> float:
if len(args) == 0:
return n
elif len(args) == 1:
if n >= args[0]:
return n
else:
print(f'请输入大于等于{args[0]}的小数')
else:
if args[0] <= n <= args[1]:
return n
else:
print(f'请输入{args[0]} - {args[1]}的小数')
# 输入任意正确范围的小数
def input_float(msg: str = '请输入一个小数:', *args: float) -> float:
while 1:
n = input(msg)
t = n[1: ] if n[0] == '-' else n
if t.count('.') == 1 and t.find('.') > 0 and t.find('.') != len(t) - 1:
t1 = t[: t.find('.')]
t2 = t[t.find('.') + 1: ]
if fun(t1) and fun(t2) and fun2(float(n), *args) is not None:
return float(n)
elif t.count('.') <= 1 and fun(t) and fun2(float(n), *args) is not None:
return float(n)
else:
print('输入的不是小数')
pass
pass
input_util_test.py文件:
# 使用其他文件的函数必须导入
from input_util import *
n = input_int()
print(n)
n = input_int('请输入一个正整数:', 0)
print(n)
n = input_int('请输入一个 1 - 10 的整数:', 1, 10)
print(n)
# 使用其他文件的函数必须导入
from input_util import *
n = input_float()
print(n)
1.5.匿名函数
python 使用 lambda 来创建匿名函数。所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
- 虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。(匿名函数的作用主要是节省内存,因为没有名字,用完之后在内存中就销毁了。如果有名字,啥时候释放才会销毁。)
sorted() 函数源码:
1.6.参数传递问题
在 Python 中,参数传递可以是通过值传递(传递对象的副本)或引用传递(传递对象的引用,即对象在内存中的地址)进行的,具体取决于传递的对象类型和如何在函数中处理参数。
- 不可变类型:当传递不可变对象(如数字、字符串、元组等)作为参数时,实际上是通过值传递进行的。这意味着函数内部的操作不会影响原始对象。
- 可变类型:当传递可变对象(如列表、字典、集合等)作为参数时,实际上是通过引用传递进行的。这意味着函数内部的操作可能会修改原始对象。
2.冒泡排序
2.1.冒泡排序规则
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
算法描述:
- 比较相邻的元素,如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 重复步骤1~3,直到排序完成。
2.2.冒泡排序实现
3.math 模块
math 模块是 Python 的标准库之一,提供了各种数学运算和函数。通过导入 math 模块,可以使用其中的函数和常量来进行数学计算和操作。
4.random 模块
random 是 Python 标准库中的一个模块,提供了生成伪随机数的功能。通过导入 random 模块,可以使用其中的函数来进行随机数生成、随机序列操作等。
5.datetime 模块
datetime 是 Python 标准库中的一个模块,提供了处理日期和时间的功能。通过导入 datetime 模块,可以使用其中的类和函数来操作日期、时间、时间间隔等。
datetime — Basic date and time types — Python 3.13.0 documentation
# 作业1
import math
from input_util import *
s = '''200
388
123
456
987
342
767
234
124
345
123
234'''
vals = [int(i) for i in s.split('\n')]
print(vals)
data = {i + 1 : vals[i] for i in range(len(vals))}
print(data)
# 设计函数
# 函数:起止月份
# 返回值:需要
def get_avg_number(start: int, end: int, data: dict = data) -> int: # data: dict = data 第一个 data 是形参,第二个 data 是实参,dict 是字典类型
sum_ = 0
for i in range(start, end + 1):
sum_ += data[i]
return math.ceil(sum_ / (end - start + 1)) # return 结束函数并返回结果
start = input_int('请输入开始的月份:', 1)
end = input_int('请输入结束的月份:', start, 12)
avg_ = get_avg_number(start = start, end = end)
print(avg_)
# input_util
# 封装 2 个函数
# 输入任意正确范围的整数
# 参数:提示语句,不定长参数(约束范围)
# 返回值:需要
def input_int(msg: str = '请输入一个整数:', *args: int) -> int:
while 1:
n = input(msg)
if n.isdigit() if n[0] != '-' else n[1: ].isdigit():
n = int(n)
if len(args) == 0:
return n
elif len(args) == 1:
if n >= args[0]:
return n
else:
print(f'请输入大于等于{args[0]}的整数')
else:
if args[0] <= n <= args[1]:
return n
else:
print(f'请输入{args[0]} - {args[1]}的整数')
else:
print('输入的不是数字')
pass
# 判断整数部分&小数部分是不是数字
def fun(n: str) -> bool:
if n.find('.') == -1 and n.isdigit(): # 没有 .
return True
elif n.find('.') == 0: # . 在开头
if n[1:].isdigit():
return True
elif n.find('.') == len(n) - 1: # . 在最后
if n[: -1].isdigit():
return True
# 传范围
def fun2(n: float, *args: float) -> float:
if len(args) == 0:
return n
elif len(args) == 1:
if n >= args[0]:
return n
else:
print(f'请输入大于等于{args[0]}的小数')
else:
if args[0] <= n <= args[1]:
return n
else:
print(f'请输入{args[0]} - {args[1]}的小数')
# 输入任意正确范围的小数
def input_float(msg: str = '请输入一个小数:', *args: float) -> float:
while 1:
n = input(msg)
t = n[1: ] if n[0] == '-' else n
if t.count('.') == 1 and t.find('.') > 0 and t.find('.') != len(t) - 1:
t1 = t[: t.find('.')]
t2 = t[t.find('.') + 1: ]
if fun(t1) and fun(t2) and fun2(float(n), *args) is not None:
return float(n)
elif t.count('.') <= 1 and fun(t) and fun2(float(n), *args) is not None:
return float(n)
else:
print('输入的不是小数')
pass
pass
6.re 模块
6.1.正则表达式语法
re 是 Python 标准库中的正则表达式模块,提供了对字符串进行正则表达式匹配和操作的功能。通过导入 re 模块,可以使用其中的函数和方法来执行正则表达式的匹配、替换和查找等操作。
6.1.1.字符匹配
6.1.2.数量词匹配
6.1.3.特殊字符匹配
6.1.4.边界字符
6.2.python 正则表达式常用函数
# 联系人 curd 正则优化
# 联系人的信息
# 姓名
# 电话
# 邮箱
# 地址
# 需要把 4 条信息保存在字典中
# key: 姓名
# val: 其他
from input_util import input_int
import re
# 定义初始化的数据
data = {
'泽': ['13012345678', 'qiuzemiao@163.com', '北京市海淀区'],
'海': ['13012345679', 'xinhaikuan@163.com', '北京市海淀区'],
'杰': ['13012345688', 'songyingjie@163.com', '北京市海淀区'],
'帅': ['13012345670', 'liushuai@163.com', '北京市海淀区'],
}
def input_phone() -> str:
while 1:
phone = input('请输入手机号:')
if re.match('^(\+86[\- ])?1[3-9][0-9]{9}$', phone):
return phone
print('您输入的手机号有问题')
while 1:
msg = '1.添加联系人\n'\
'2.查看联系人\n'\
'3.修改联系人\n'\
'4.删除联系人\n'\
'0.退出\n'\
'请选择:'
n = input_int(msg, 0, 4)
match n:
case 0:
break
case 1:
name = input('请输入联系人姓名:')
if name not in data:
phone = input_phone()
email = input('请输入邮箱:')
address = input('请输入地址:')
data[name] = [phone, email, address]
print('添加成功')
pass
else:
print('联系人已存在')
pass
case 2:
print('姓名\t电话\t\t邮箱\t\t\t地址')
for k, v in data.items():
print(f'{k}\t', '\t'.join(v), sep = '')
pass
case 3:
a = ['电话', '邮箱', '地址']
msg = '\n'.join([f'{i + 1}. 修改' + a[i] for i in range(len(a))]) + '\n请选择:'
n = input_int(msg, 1, len(a))
name = input('请输入姓名:')
if name in data:
data[name][n - 1] = input_phone() if n == 1 else input('请输入' + a[n - 1] + ': ')
print('修改成功')
pass
else:
print('联系人不存在')
pass
case 4:
name = input('请输入姓名:')
if name in data:
data.pop(name)
print('删除成功')
pass
else:
print('联系人不存在')
pass
print('*' * 60)
# 在终端执行,control + c 是退出
# input_util 优化
import re
# 封装 2 个函数
# 输入任意正确范围的整数
# 参数:提示语句,不定长参数(约束范围)
# 返回值:需要
# 传范围
def fun2(n: float, *args: float | int) -> float | int:
if len(args) == 0:
return n
elif len(args) == 1:
if n >= args[0]:
return n
else:
print(f'请输入大于等于{args[0]}的数字')
else:
if args[0] <= n <= args[1]:
return n
else:
print(f'请输入{args[0]} - {args[1]}的数字')
def input_int(msg: str = '请输入一个整数:', *args: int) -> int:
while 1:
n = input(msg)
if re.match('^\-?[0-9]+$', n):
n = int(n)
result = fun2(n, *args)
if result is not None:
return n
else:
print('输入的不是数字')
pass
# 输入任意正确范围的小数
def input_float(msg: str = '请输入一个小数:', *args: float) -> float:
regex1 = '^(\-)?[0-9]*\.[0-9]+$'
regex2 = '^(\-)?[0-9]+\.[0-9]*$'
while 1:
n = input(msg)
if re.match(regex1, n) or re.match(regex2, n):
n = float(n)
result = fun2(n, *args)
if result is not None:
return n
else:
print('输入的不是小数')
pass
pass
pass
7.json 模块
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。
Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:
- json.dumps(): 对数据进行编码:python 对象——>json.dumps()——>json 字符串
- json.loads(): 对数据进行解码:json 字符串——>json.loads()——>python 对象