python 函数(解包**、互相调用、作用域、函数的封装、内置函数:eval()、zip()、文件处理open())

news2024/9/30 15:25:55

函数解包

"""
1、函数的注释:参数和返回值 在注释里可以自动添加显示,只需手动加说明。

2、函数的解包【拆包】:函数的参数要传递数据有多个值的时候,中间步骤拿到数据 保存在元组或者列表 或者字典里。
- 传递参数的时候 加一个*  或者  ** 解包
  - 一次拿到元组 列表 字典的里数据 直接传递给函数的参数接受。
- 定义参数的额*args **keargs == 定义函数
"""
def send_offer(salary,bonus,subsidy=500):
    """
    这是一个发送offer的函数
    :param salary: 底薪
    :param bonus: 提成
    :param subsidy: 补助
    :param args: 不定长参数  薪资其他的组成
    :param kwargs: 不定长参数  薪资其他的组成
    :return: 返回薪资总共
    """
    smoney = salary + bonus + subsidy
    return smoney  # 定义smoney为函数返回值

# 参数数据保存在元组里,依次获取里面每一个数据 传参
param = (18000,3000,200)
# 传统方式 麻烦。
print('传统方式',send_offer(param[0],param[1],param[2]))
# 元组解包传参 : 元组前面加一个* 可以依次获取元组里每一个数据 按照位置顺序的传递给函数参数
print('元组解包传参'+str(send_offer(*param)))

# 列表解包
param = [18000,3000,200]
print(send_offer(*param))

# 字典解包 --键值对 : 字典跟顺序没关系,字典的key跟关键字名字【形参】对应就可以。
param = {"salary":17000,"bonus":2000,"subsidy":300}
# 传统方式 -- 多麻烦
print(send_offer(salary=param["salary"], bonus=param["bonus"], subsidy=param["subsidy"]))
# 字典解包
print(send_offer(**param))

函数的调用

函数里调用其他的函数:
注意: 函数执行原理顺序

  • 顶格代码 同级别: 从上到下依次执行。
  • 缩进代码: 函数体代码 ,只有在函数调用的时候的才会执行。

debug新用法:

  • step over : 第一个单步,不会进入函数或者方法里面执行
  • step into : 第二个【进入所有的函数和方法】 和第三个【只会自己定义函数和方法】

问题: 函数可以调用自己么?
= 会出现递归错误 函数不要调用自己。


# def get_offer(name):
#     """拿offer函数: 某个人 拿到x钱offer"""
#     # 调用send_offer函数
#     money = send_offer(16000,2000,800)
#     return f'{name}拿到了一个{money}工资的offer!'
#
# def send_offer(salary,bonus,subsidy=500):
#     smoney = salary + bonus + subsidy
#     return smoney
#
# print(get_offer("芒果"))

def get_offer(name):
    """拿offer函数: 某个人 拿到x钱offer"""
    # 调用send_offer函数
    money = get_offer("我")
    print(money)
    return f'{name}拿到了一个{money}工资的offer!'

get_offer("我")

如上自己调用自己就会报错:
在这里插入图片描述

函数的作用域

函数的作用域: 函数内部 和函数外部

  • 局部变量: 函数里定义的变量,不能在外面的调用。 【买的苹果】 私有财产 不能给别人使用
  • 全局变量:在函数外面定义的变量,在函数里面可以调用。 【小区的公共苹果】 所有人都可以拿
  • 全局变量函数可以调用,但是不能在函数内部去修改 【苹果可以吃 但是苹果树砍了不行】
  • 如果提前申明了 是可以修改 【但是跟物业申请了 可以砍了】
  • 在局部修改了全局变量值 生效。
    – 注意: 不建议在局部修改全局变量,容易造成别人调用了全局变量会被影响。

# add函数里的ab 变量 是局部还是全局的? -局部变量
c = 3  # 全局变量

def add(a,b):
    global c  # 申明全局变量  -- 用得很少
    c += 1
    return a + b -c

# print(a)  # 局部变量不能在函数外面使用的
print(add(2,3))
print(c)  # 在局部修改了全局变量值 生效。

运行结果如下:

1
4

函数的封装

函数是不是基本上所有功能代码都可以被封装成函数?-- 可以。但是并不是所有的都需要封装。
– 只有哪些需要多次 重复使用功能代码。–调用。

封装函数步骤:
1、先分析求 把功能代码写好
2、def 封装 [功能代码缩进变成函数体]
3、函数参数化:变化的数据 或者用户控制输入的数据 定义为形参
4、判断函数是否需要定义返回值:获取数据 有就返回; 没有不定义返回值。

def buy(price):
    discount = "0"
    if price.isdigit(): # 判断是否输入的是数字
        if 50 <= int(price) <= 100:
         price = int(price) * 0.9
         discount = "10%"
        elif int(price) > 100:
         price = int(price) * 0.8
         discount = "20%"
        return f"折扣为:{discount},最终要付的金额为:{price}"
    else:
        return "请输入数字"


print(buy("200"))

运行结果如下:

折扣为:20%,最终要付的金额为:160.0

内置函数

总结内置函数:安装Python软件的时候,已经内部定义好的 可以直接使用的函数。

  • ctrl + 点击函数名字 == =builtin 描述文件,参数 使用方法和功能等信息。 底层是c语言封装的。
  • 内置函数有很多,不需要目前全掌握 先掌握用的频率较高。
    常用的内置函数
  • print input
  • len
  • type isinstance
  • range()
  • str int float list tuple set dict
  • 字符串的方法: str.find , .index .lower .upper .join .strip .replace .split .endswith .startswith 。。。
  • 列表方法: .append .extexd .insert .pop .remove ,.count
  • 字典方法: .update .get .keys .values .item() .pop

print: 参数: * args可以接受多个参数;

  • sep=’ ’ : 默认值是空格,所以多个参数之间用这个字符隔开 ,可以传参
  • end=‘\n’,每个print语句最后都会换行 默认换行符;–也可以修改 传参
    print(“乖乖”,“余”,“芒果”,sep=“–”,end=“*”)
    print(“乖乖”,“余”,“芒果”,sep=“–”)

eval()

eval(): 函数用来执行一个字符串表达式,并返回表达式的值。 == 脱引号获取及运行字符串里的Python表达式。
字符串表达式可以包含变量、函数调用、运算符和其他 Python 语法元素。

使用场景1 : 接口测试的时候,测试数据存在excel里【文本-字符串】;代码读取出来,存在字典和列表。-- 脱引号 转化字典
使用场景2 : 接口测试数据参数化,excel表格里数据生成,在excel表格里调用数据生成函数。

eval不是万能的,有些字符串不能用的 只要那些字符串里的表达式符合Python语法的才可以。

参考文章 :http://testingpai.com/article/1692240611928

# eval()
a = "1 + 4"  # 字符串
print(a)  # 结果 "1 + 4"
print(eval(a)) # 脱引号 运算引号里的Python表达式 1+4

a = '{"name":"itop","age":18}'  #在字典外面加了一对引号  字符串
print(a,type(a))
print(eval(a),type(eval(a)))
# 接口测试的时候,测试数据存在excel里【文本-字符串】;代码读取出来,存在字典和列表。-- 脱引号 转化字典

# 函数调用
def p_test():
    print("hello world")

# "test()"  # 这样不行调用函数
# eval执行字符串里函数调用
eval("p_test()")

# 异常场景  --有一个null 在Python里是不能被识别的  异常符合。None
a = '{"name":"itop","age":18,"hobby":null}'
print(eval(a),type(eval(a)))

运行结果如下:

1 + 4
5
{"name":"itop","age":18} <class 'str'>
{'name': 'itop', 'age': 18} <class 'dict'>
hello world
Traceback (most recent call last):
  File "D:\BaiduNetdiskDownload\1-Python基础\20231110_py65基础第六节课-函数和文件处理\day06_函数和文件处理\day06_函数和文件处理\d5_内置函数和eval函数.py", line 54, in <module>
    print(eval(a),type(eval(a)))
  File "<string>", line 1, in <module>
NameError: name 'null' is not defined

zip()

zip(): 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

  • 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

使用场景: 接口测试测试用例保存在字典里,方便数据读取。{“id”:1,“title”:“注册成功”}

a = ["a","b","c"]
b = [1,2,3,4]
print(list(zip(a, b))) #压缩并转化为列表嵌套元组 [('a', 1), ('b', 2), ('c', 3)]
print(dict(zip(a, b))) # 压缩成为键值对 的字典 key value {'a': 1, 'b': 2, 'c': 3} ==这种用更多

# 用例 == 压缩成为字典
title = ["id","title","testdata"] # 作为保存用例的字典的key
case1 = ["1","注册成功","123456"]
case2 = ["2","注册失败","123456"]
print(dict(zip(title, case1))) # {'id': '1', 'title': '注册成功', 'testdata': '123456'}
print(dict(zip(title, case2)))

# 项目里实战: 二维数据 --模拟excel里存储 行列
# 所有的用例放在大列表里,每条用例存在字典里 [{},{},{},{}]
testcases = [["id","title","testdata"],
            ["1","注册成功","123456"],
            ["2","注册失败","123456"]]
title = testcases[0]  # 先获取标题 用来作为字典的key
new_list = []
for case in testcases[1:]:  # 从第二行开始读取 不需要标题行
    dict_case = dict(zip(title,case))  # 一条用例 字典
    new_list.append(dict_case)
print(new_list)

# 优化写法: 列表推导式
testcases = [["id","title","testdata"],
            ["1","注册成功","123456"],
            ["2","注册失败","123456"]]
title = testcases[0]
new_case = [dict(zip(title,case)) for case in testcases[1:]]
print(new_case)

运行结果如下:

[('a', 1), ('b', 2), ('c', 3)]
{'a': 1, 'b': 2, 'c': 3}
{'id': '1', 'title': '注册成功', 'testdata': '123456'}
{'id': '2', 'title': '注册失败', 'testdata': '123456'}
[{'id': '1', 'title': '注册成功', 'testdata': '123456'}, {'id': '2', 'title': '注册失败', 'testdata': '123456'}]
[{'id': '1', 'title': '注册成功', 'testdata': '123456'}, {'id': '2', 'title': '注册失败', 'testdata': '123456'}]

open()

open(): 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。

  • 数据存储到文件里-- 写入文件数据
  • 配置文件: 数据库 项目的地址等 放在文本里进行统一管理,读取里面数据-- 文件的读取
  • UI自动化-- 截图保存图片

文件处理的操作:

  • 打开文件
  • 读取文件内容
  • 写入内容到文件
  • 关闭文件 :文件打开了 一定要记得关闭。不关闭再次使用的时候 容易冲突 报错。

文件里有中文: UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x86 in position 47: illegal multibyte sequence

  • 打开文件的时候 加上编码 UTF8编码。
  • 语言默认只能处理英文,编码ASCII编码,国际编码通用-UTF8。 加上参数: encoding=“UTF8” 默认加上。

mode :

  • r 读取
  • w: 覆盖之前内容 写入
  • a: 追加写入 == 更常用 更安全
  • x: 写入 写入新文件 不能是已经存在的文件,直接生成新的文件并写入内容
  • b: 写入文件不是文本,图片 视频等 二进制流的格式 ; 不单独用,配合以上读写模式一起用
    • rb
    • wb
    • ab
      注意: 不能加encoding=“UTF8”。

读取

demo文本内容如下:我希望名可以继续捡10块钱我希望名可以继续捡10块钱我希望明天可以继续捡10块钱

# open 打开文件 读取里面内容
f = open("demo",encoding="UTF8")
# print(f)  # 对象,通过他可以进行后续操作
data = f.read()  # 读取数据 赋值给data变量
print(data)
# 关闭文件
f.close()

运行结果如下:

我希望名可以继续捡10块钱我希望名可以继续捡10块钱我希望明天可以继续捡10块钱

写入

# open 写入数据--  mode 默认是读的模式 不能写入。 修改mode为w 【write】
# f = open("demo",encoding="UTF8",mode="a")
# f.write("我希望明天可以继续捡10块钱")

# f = open("demo",encoding="UTF8",mode="w")
# f.write("我希望明天可以继续捡10块钱")

# f = open("demo1",encoding="UTF8",mode="x")
# f.write("我希望明天可以继续捡10块钱")

f = open("tricy.png",mode="rb")
data = f.read()  # 图片内容 是十六进制格式
print(data)
f.close()

# 复制一张图片 --把写入内容
f = open("tri2.png",mode="wb")
f.write(data)
f.close()

逐行读取

当文档里有很多内容的时候,一次性读取写入处理不太灵活,很多时候需要逐行读取和写入操作。–方便拿到想要的数据。

  • 逐行读取 : readlines()
    • 按照行数一次性读取多行,存在列表里,每一行的数据【字符串】是列表的一个元素。
    • 注意默认把行末 的换行符读出来\n,如果不需要换行符,去除strip
  • 逐行写入: writelines()
  • 把多个数据存在列表/元组的元素,依次逐个写到文本里;
  • 但是注意: 列表里的元素必须要是字符串。
  • 注意: 写入过程没有间隔符 和换行符等,如果需要 手动添加 \n \t
# 逐行读取 : readlines()
# f = open("demo",encoding="UTF8")
# data = f.readlines()
# print(data)
#
# # 去除每行读取数据的末尾的换行符 - strip
# new_data = []
# for a in data:
#     new_a = a.strip("\n")  # 去除换行符之后赋值给变量
#     new_data.append(new_a)  # 再追加到新的列表里
# print(new_data)
# f.close()

# 逐行写入: writelines()
f = open("demo",mode="a",encoding="UTF8")  # 追加模式 a
data = ["\nname  ","age\t","hobby\t"]
f.writelines(data)  # 可以逐个把列表的每一个元素 依次取出来写到文本里
f.close()

with方式打开文本

with方式打开文本: 自带关闭,自动关闭文件 不需要手动添加close代码。 --推荐使用写法

  • 子代码 写上文件相关的操作代码
  • 不用close方法 不会忘记关闭文件。
with open("demo",encoding="UTF8",mode="r") as f:
    data = f.read()
    print(data)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1537707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【超全详解】Maven工程配置与常见问题解决指南

Maven工程 目录 Maven工程一、如何检查Maven工程是否配置正确&#xff1f;1、检查路径2、检查基本配置3、其他配置 二、Maven的基本操作基本操作install和package的区别 三、获取别人的Maven工程之后如何修改&#xff1f;四、如何正确写好配置文件&#xff1f;1.寻找配置资源2.…

css的active事件在手机端不生效的解决方法

需求&#xff1a;需求就是实现点击图中的 “抽奖” 按钮&#xff0c;实现一个按钮Q弹的放大缩小动画 上面是实现的效果&#xff0c;pc端&#xff0c;点击触发 :active 问题&#xff1a;但是这种方式在模拟器上可以&#xff0c;真机H5一调试就没生效了&#xff0c;下面是简单…

图像几何变换(仿射变换和透视变换...)及python-opencv实现

文章目录 图像变换类型仿射变换透视变换python-opencv实现参考文献 图像变换类型 图像几何变换主要包括以下几种类型&#xff1a; 平移&#xff08;Translation&#xff09;&#xff1a;将图像在水平或垂直方向上移动&#xff0c;不改变图像的尺寸和形状。缩放&#xff08;Sca…

【深度学习】基于机器学习的无机钙钛矿材料形成能预测,预测形成能,神经网络,回归问题

文章目录 任务分析数据处理处理离散数值处理缺失值处理不同范围的数据其他注意事项 我们的数据处理模型训练网页web代码、指导 任务分析 简单来说&#xff0c;就是一行就是一个样本&#xff0c;要用绿色的9个数值&#xff0c;预测出红色的那1个数值。 数据处理 在进行深度数…

linux命令详解——uniq,wc,tr

uniq uniq可以对查看内容去重 但在我们使用时会发现&#xff0c;uniq的去重逻辑是&#xff0c;当遇到连续多行内容相同时&#xff0c;去除重复行&#xff0c;而对间隔重复内容&#xff0c;无法实现去重功能 这里想到可以将sort与uniq结合使用&#xff0c;先对文件内容进行排序…

Visual Studio 插件 AnAPI++ for VS 2022

Anmial API abbreviation AnAPIis an automatically generated WebAPI project that has encapsulated Jwt Oauth2 token authentication, SqlSugar, Swagger, Nlog, Cross domain technologies, and supports Net6 and above versions Anmial API缩写AnAPI是一个自动生成的Web…

嵌入式开发--STM32G431RBTx-定时器中断流水灯

嵌入式开发–STM32G431RBTx-定时器中断流水灯 定时器工作原理 如图有反映stm32g431的定时器资源。 共10个定时器 定时器定时器类型个数TIM6&#xff0c;7基本定时器2TIM2&#xff0c;3&#xff0c;4全功能通用定时器3TIM15&#xff0c;16&#xff0c;17通用定时器(只有1或2个…

uniapp安装axios

先npm安装 npm i axios然后在项目里面建一个utils文件&#xff0c;再建一个index.js 以下是index.js代码&#xff1a; import axios from axios; const service axios.create({baseURL: //xxxx.xxxxx.com///你的请求接口域名, timeout: 6000, // request timeoutcrossDomai…

2024年通信工程专业-毕业论文

2024年毕业设计-通信专业VoLTE掉话分析资源-CSDN文库 毕业设计 ----移动通信中VoLTE信令流程分析 学生姓名 专业班级 学 号 指导教师 完成时间 …

比一比gitee、gitlab、github

gitee、gitlab、github&#xff0c;哪个是目前国内大型公司使用最多的呢&#xff1f;共同点&#xff1a;三者都是基于git的代码托管工具&#xff0c;都支持版本管理。 gitee&#xff1a;适合国内开发者&#xff0c;更友好的本地化服务&#xff0c;形成了一个适合中国宝宝学习的…

SQLiteC/C++接口详细介绍sqlite3_stmt类(十一)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十二&#xff09; 43、sqlite3_reset sqlite3_reset 函数用于重置已经编…

【云呐】事业单位资产盘点报告总结怎么写

事业单位固定资产盘点报告总结主要内容包括:  一、概述  说明本次盘点的目的和任务  明确盘点范围(如某处所有固定资产)  说明盘点时间(起止日期)  二、准备工作  组建盘点工作组  制定盘点计划和工作流程  录入联网资产管理系统或编制盘点清单  三、盘点实施…

一站式App流量统计,Xinstall助您洞悉用户行为

在如今的移动互联网时代&#xff0c;App的推广和运营对于开发者来说至关重要。然而&#xff0c;想要精准掌握App的流量情况&#xff0c;却并不是一件容易的事情。这时&#xff0c;一款强大的App流量统计工具就显得尤为重要。而Xinstall&#xff0c;正是这样一款能够帮助开发者轻…

后端项目中构建前端模块问题记录

后端项目中在登陆页面使用jsp&#xff0c;后端项目会通过接口返回给前端几个js的路径&#xff0c;这几个js呢&#xff0c;是由后端先构建好&#xff0c;然后返回给前端路径的&#xff0c;前端通过这个路径访问js执行。。。 总之&#xff0c;很奇怪的项目。。 1、首先要安装no…

selenium自动化登录模块HTMLTestRunner测试报告

1.下载HTMLTestRunner.py放到python的Lib目录下&#xff0c;python3之后的&#xff0c;文件要修改以下内容&#xff1a; 第94行&#xff0c;将import StringIO修改成import io 第539行&#xff0c;将self.outputBuffer StringIO.StringIO()修改成self.outputBuffer io.Strin…

stable diffusion 提示词进阶语法-年龄身材肤色-学习小结

stable diffusion 提示词进阶语法-年龄&身材&肤色 前言年龄提示词青年&#xff08;18-25岁&#xff09;幼年、少年&#xff08;1-18&#xff09;中年&#xff08;35-60岁&#xff09;老年&#xff08;65-80岁 老爷爷 老奶奶&#xff09; 身材提示词肤色关键词(人物基础…

linux网络服务学习(3):tftp与sftp

1.TFTP TFTP是基于UDP协议实现的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务&#xff0c;不具备通常的FTP的许多功能。端口号为69。 1.1 centos7安装TFTP yum -y install tftp tftp-server #安装tftp客户端与服务器…

XSKY 智能存储,助力“数据要素 X”先进制造

3 月 21-22 日&#xff0c;主题为“突破 智行”的 IMC2024 第七届中国智造数字科技峰会在重庆召开。作为在先进制造领域拥有领先存储解决方案以及众多应用实践的企业&#xff0c;星辰天合受邀参加了此次峰会并荣获大会颁发的“最佳存储解决方案奖”。同时&#xff0c;星辰天合先…

QT gridlayout 循环设置组件,表格也通用 已解决

在需求中。经常遇到&#xff0c;表格 展示需求。 几乎都是json格式的。 // 列表配置文件QJsonArray listJsonArray getCfgJsonData("details_tab_table_config.json");if (listJsonArray.isEmpty()){return;}ui->gridWidget->setMaximumSize(QSize(310, 180)…

定制红酒:品质保障,从源头做起

云仓酒庄的洒派定制红酒&#xff0c;以其卓着的品质和与众不同的口感&#xff0c;赢得了众多消费者的喜爱。而这种品质的保障&#xff0c;正是从源头上开始的。 在葡萄种植方面&#xff0c;种植者对土壤、气候等自然条件进行严格的筛选和评估&#xff0c;确保葡萄能够在理想的环…