python知识点(二)

函数相关

'''
函数:将实现某个功能的重复的代码
放在一起 并给起个名字 使用时调用这个名字即可
    创建函数
    调用函数
    形参
    实参
    返回值
    函数名操作
    函数作用域
    匿名函数
    函数嵌套
    闭包
    装饰器
'''
# 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"])

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值