函数相关
'''
函数:将实现某个功能的重复的代码
放在一起 并给起个名字 使用时调用这个名字即可
创建函数
调用函数
形参
实参
返回值
函数名操作
函数作用域
匿名函数
函数嵌套
闭包
装饰器
'''
# 1、先创建
'''
定义格式:
def 函数名称(参数列表):
语句块
'''
def func():
pass
# 2、后调用 - 函数名(参数列表)
func()
# 3、形参(函数定义时 括号里面的参数)
# 3.1位置形参 - 按顺序
def func1(x, y):
pass
# 3.2关键字形参 - 按名称
def func2(name='张三', age=18):
...
# 3.3组合形参 - 位置+关键字(在末尾)
def func3(x, y, name='张三'):
print(x, y, name)
# 3.4可变长形参(*args, **kwargs)
# 形参接收参数个数不受限制
# 如:''.format()
def func4(*args, **kwargs):
# args: tuple类型 kwargs:dict类型
print(type(args), type(kwargs))
print(args, kwargs)
# 4、实参(函数调用时 的实际传入的参数)
# 函数调用时, 将实参的内存地址传递给形参
# 4.1位置实参 - 个数匹配
# func1(1) # 个数不匹配,程序会报错
func1(1, 2)
# 4.2关键字实参 - 名称匹配
func2(age=20, name='李四')
# 4.3组合实参 - 位置+关键字(在末尾)
# func3(1,2)
func3(1, 2, '哈哈')
# 4.4可变长实参(*必须前, **必须后)
# 实际传参个数不受限制
import random
info1 = [i for i in range(random.randint(1,3))]
info2 = {str(i):'法外张{}'.format(i) for i in range(random.randint(1,3))}
func4(*info1)
func4(**info2)
func4(*info1, **info2)
# 5、返回值
# 通过return关键字将函数一系列内部逻辑后的值返回给调用者
# 返回的就是 一个内存地址
# 5.1未定义return返回值,默认返回None
def func5(x, y):
c = x + y
f5 = func5(1, 2)
print(f5) # None
# 5.2定义return返回值
def func6(x, y):
c = x + y
return c
f6 = func6(1, 2)
print(f6) # 3
# 5.3return 返回多个值
def func7():
x = 1
y = 2
return x, y
f7 = func7()
print(f7,type(f7)) # (1, 2) tuple
# 5.4 return后的代码不会被执行
def func8():
x = 1
print('return前')
return x
print('return后')
f8 = func8()
print(f8)
# 6、函数名操作(就是对内存地址的操作)
# 6.1函数名的重新赋值
def my_sum(x,y):
return x + y
s1 = my_sum
s2 = s1(1, 2)
print(s2)
# 6.2函数名作为列表、字典中的元素
my_list = [1,2,my_sum]
func_dict = {
"1": my_sum
}
print('作为列表元素:{}'.format(my_list[2](2,2)))
print('作为字典元素:{}'.format(func_dict['1'](2,3)))
# 6.3将函数名做为另外一个函数的参数进行传递和返回
def my_func1(x, y):
return x + y
def my_func2(x):
print('传递进来的{}'.format(x))
return '返回回去的{}'.format(my_func1),my_func1
mg, mf = my_func2(my_func1)
print(mf(5,5))
# 7、函数作用域
# 7.1局部 - 函数内
def func11():
name = '法外张三'
return name
def func12():
name = '法外李四'
return name
print(func11())
print(func12())
# 7.2全局 - 函数外
name = '法外老王'
def func13():
return name
def func14():
return name
print(func13())
print(func14())
# 查找顺序, 先局部 再全局
age = 18
sex = '女'
def my_age():
age = 19 # 优先使用自己的
print(age, sex)
my_age()
# 7.4局部只能读取全局变量 不可修改
# 如需局部修改全局变量 通过global关键字
def func15():
global name
name = '隔壁老王'
return name
print(func15())
print(name)
# 8、匿名函数 - 没有名字的函数,适用简单操作
# 格式:lambda 参数: 单行代码
l = lambda x: x ** x
print(l(5))
# 9、函数嵌套 - 函数内再定义函数
def funcs():
print('funcs')
def func1():
print('funcs内的funcs1空间')
# 10、闭包函数 - 将数据封装函数中
# 由于函数执行完毕后 就会在内存中被释放掉
# 通过闭包形式可以让函数属性在内存中存活下去
def func_bb():
a = 1
print('func_bb')
def func1(b):
print(a + b)
print('func_bb内的func1空间')
return func1
fb = func_bb()
fb(5)
# 11、装饰器 - 不修改原有函数 且 新增额外功能
# 11.1接口方法示例
import time
import requests
url = 'http://baidu.com'
def api_request(url):
res = requests.get(url)
return res
print(api_request(url)) # <Response [200]>
# 11.2需求升级: 获取 请求时间 功能
# 定义增加 统计时间的 装饰器
from functools import wraps
def api_time(func):
@wraps(func)
def inner(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
return res, round(end - start, 2)
return inner
# 11.3.只需要在原有函数上方添加 @装饰器函数名称
# 即不改变原有的调用方式、传参, 又增加了新功能
@api_time
def api_request(url):
res = requests.get(url)
return res
print(api_request(url)) # (<Response [200]>, 0.09)
文件操作
'''
文件操作
读文件
写文件
'''
# 1、读文件
# 先在当前目录下创建个 test.txt.txt文件并写入一些内容
with open('test.txt', 'r', encoding='utf-8') as file:
# 1.1全部读取后 存放到一个字符串中
# read = file.read()
# print(type(read), read)
# 1.2一次只读取一行 存放到一个字符串中
# read_line = file.readline()
# print(type(read_line), read_line)
# 1.2读取全部行 存放到一个列表中
read_lines = file.readlines()
print(type(read_lines), read_lines) # list
# 2、写文件
# 2.1 w 覆盖模式
with open('test.txt', 'w', encoding='utf-8') as file:
file.write('python\n')
file.write('java\n')
file.write('c++\n')
# 2.2 a+ 追加模式
with open('test.txt', 'a+', encoding='utf-8') as file:
file.write('还有谁?')
表格操作
'''
表格操作
表格读取
表格写入
示例表格内容:(创建test.xlsx 并参考维护)
name age sex
san 18 男
si 19 女
Sheet1 Sheet2
'''
# 1、表格读取
# 安装相关包 pip3 install xlrd3
import xlrd3
def excle_read(excle_file,excle_sheet):
'''表格读取'''
# 打开工作簿
data = xlrd3.open_workbook(excle_file)
# 根据工作表名称获取对应工作表内容
sheet = data.sheet_by_name(excle_sheet)
# 获取工作表行数
rows = sheet.nrows
# 获取工作表第一行标题
header = sheet.row_values(0)
data_list = []
#创建空列表
for i in range(1,rows):
# 将标题与每行数据组装成字典
d = dict(zip(header, sheet.row_values(i)))
# 将字典添加到列表中
data_list.append(d)
return data_list #返回列表套接字典
read_result = excle_read('test.xlsx', 'Sheet1')
print(read_result)
# 2、表格写入
# 安装相关包 pip3 install xlutils
from xlutils.copy import copy
def excle_write(excle_file,excle_sheet,result):
'''表格写入'''
# 打开工作簿
data = xlrd.open_workbook(excle_file)
# 将xlrd对象向xlwt对象转换
excel = copy(wb=data)
# 根据工作表名获取索引
sheet_index = excel.sheet_index(excle_sheet)
# xlwt:根据工作表名对应索引获得要操作的工作表
excel_table = excel.get_sheet(sheet_index)
# xlrd:根据工作表名称获取对应工作表内容
table = data.sheet_by_name(excle_sheet)
# 获得工作表行数
nrows = table.nrows
# 获得工作表列数
ncols = table.ncols
# 需要写入的值 测试结果:result
#result = ["Y","N",'N']
# case行数与测试结果数校验
if nrows - 1 == len(result):
# 循环case行
for i in range(1,nrows):
# 工作表写入:case行,列数,写入值
excel_table.write(i,ncols,result[i-1])
# 保存工作簿
excel.save(excle_file)
else:
# 保存
excel.save(excle_file)
excle_write('test.xlsx', 'Sheet1', ["Y", "N"])