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

函数解包

"""
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 + subsidyreturn 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 += 1return 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.9discount = "10%"elif int(price) > 100:price = int(price) * 0.8discount = "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+4a = '{"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.mzph.cn/news/764590.shtml

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

相关文章

活用 C语言之union的精妙之用

一、union的基本定义 Union的中文叫法又被称为共用体、联合或者联合体。它的定义方式与结构体相同,但意义却与结构体完全不同。下面是union的定义格式: union 共用体名 {成员列表}共用体变量名;它与结构体的定义方式相同,但区别在于共用体中的成员的起始地址都是相同的,…

【理解机器学习算法】之Clustering算法(DBSCAN)

DBSCAN&#xff08;基于密度的空间聚类应用噪声&#xff09;是数据挖掘和机器学习中一个流行的聚类算法。与K-Means这样的划分方法不同&#xff0c;DBSCAN特别擅长于识别数据集中各种形状和大小的聚类&#xff0c;包括存在噪声和离群点的情况。 以下是DBSCAN工作原理的概述&am…

KubeSphere的基本使用操作

KubeSphere的基本使用操作 基本使用用户角色创建企业空间创建项目 创建应用创建密钥创建MySQL密钥创建WordPress密钥 创建存储卷创建MySQL存储卷创建Wordpress存储卷 添加组件服务类型添加MySQL组件添加WordPress组件 访问Wordpress 基本使用 用户角色 KubeSphere 中的权限控制…

FloodFill算法——岛屿数量

文章目录 题目解析算法解析代码解析 题目解析 岛屿数量 题目依旧是熟悉的配方&#xff0c;熟悉的味道&#xff0c;还是那个0还是那个1还是那个二维矩阵&#xff0c;这时候BFS和DFS闻着味就来了&#xff0c;我们来看一下这个题目&#xff0c;这个题目也很容易理解如下图有一个…

【每日一问】IOS手机上Charles证书过期怎么办?

1、如何查看证书是否过期? 设置>通用>VPN与设备管理 2、在Charles中重置证书 步骤1&#xff1a;重置证书 Help>SSL Proxying>Reset Charles Root Certificate… 步骤2&#xff1a;在浏览器中&#xff0c;下载证书 首先&#xff0c;手机连上代理&#xff0c;然…

qt+ffmpeg 实现音视频播放(三)之视频播放

一、视频播放流程 &#xff08;PS&#xff1a;视频的播放流程跟音频的及其相似&#xff01;&#xff01;&#xff09; 1、打开视频文件 通过 avformat_open_input() 打开媒体文件并分配和初始化 AVFormatContext 结构体。 函数原型如下&#xff1a; int avformat_open_inpu…

Java项目:71 ssm基于ssm+vue的外卖点餐系统+vue

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统功能 系统分为前台订餐和后台管理&#xff1a; 1.前台订餐 用户注册、用户登录、我的购物车、我的订单、商品列表 2.后台管理 商品管理&#xf…

QT tableWidget横向纵向设置

横向控件 要设置QTabWidget选项卡的字体方向&#xff0c;可以使用QTabWidget的setTabPosition()方法。通过传递Qt枚举值QTabWidget.east或QTabWidget.west作为参数&#xff0c;可以设置选项卡的字体方向为从左到右或从右到左。 myTabWidget QTabWidget() myTabWidget.setTabP…

Grass手机注册使用教程,利用闲置手机WiFi带宽赚钱

文章目录 Grass是什么&#xff1f; 项目介绍Grasss手机使用步骤第一步&#xff1a;下载狐猴浏览器第二步&#xff1a;注册账户&#xff08;已注册直接跳过&#xff09;第三步&#xff1a;安装Grass Chrome插件1、推荐离线安装2、在线安装 第四步&#xff1a;登录第五步&#xf…

MySQL 更新执行的过程

优质博文&#xff1a;IT-BLOG-CN Select语句的执行过程会经过连接器、分析器、优化器、执行器、存储引擎&#xff0c;同样的 Update语句也会同样走一遍 Select语句的执行过程。 但是和 Select最大不同的是&#xff0c;Update语句会涉及到两个日志的操作redo log&#xff08;重做…

欧科云链OKLink:坎昆升级后,Layer2项目是否更具竞争力?

在坎昆升级激活之际&#xff0c;OKLink 上线以太坊坎昆升级 Dencun 专题页 &#x1f449; 从专业链上数据分析角度&#xff0c;带来一场充实且即时的 Layer2 数据盛宴。 在近日由 137Labs 发起&#xff0c;Cointime 主持的 Layer2 生态专场讨论中&#xff0c;OKLink 产品…

InnoDB 缓存

本文主要聊InnoDB内存结构, 先来看下官网Mysql 8.0 InnoDB架构图 MySQL :: MySQL 8.0 Reference Manual :: 17.4 InnoDB Architecture 如上图所示,InnoDB内存主要包含Buffer Pool, Change Buffer, Log Buffer, Adaptive Hash Index Buffer Pool 其实 buffer pool 就是内存中的…

练习实践-进程回收01-找到并清理僵尸进程

参考来源&#xff1a; https://blog.csdn.net/qq_36528114/article/details/71076110 https://blog.51cto.com/u_12083623/2363384 极客时间-性能优化实战-CPU性能篇 进程回收中的孤儿和僵尸进程的特点 演示环境&#xff1a; 操作系统&#xff1a;Ubuntu18.04 查询工具&#x…

Golang案例开发之gopacket抓包三次握手四次分手(3)

文章目录 前言一、理论知识三次握手四次分手二、代码实践1.模拟客户端和服务器端2.三次握手代码3.四次分手代码验证代码完整代码总结前言 TCP通讯的三次握手和四次分手,有很多文章都在介绍了,当我们了解了gopacket这个工具的时候,我们当然是用代码实践一下,我们的理论。本…

Java 基础学习(二十)Maven、XML与WebServer

1 Maven 1.1 什么是Maven 1.1.1 Maven概述 Maven是一种流行的构建工具&#xff0c;用于管理Java项目的构建&#xff0c;依赖管理和项目信息管理。它使用XML文件来定义项目结构和构建步骤&#xff0c;并使用插件来执行各种构建任务。Maven可以自动下载项目依赖项并管理它们的…

PMSM 永磁同步电机滑膜控制 SVPWM矢量控制 matlab simulink 仿真

仿真搭建平台&#xff1a; (1)该模型采用matlab/simulink 2016b版本搭建&#xff0c;使用matlab 2016b及以上版本打开最佳; (2)该模型已经提前转换了各个常用版本&#xff08;最低为matlab2012b&#xff09;&#xff0c;防止出现提示版本过高的情况。 模型截图&#xff1a; 算…

1、goreplay流量回放

目的 在实际项目中&#xff0c;会有大量的回归测试工作&#xff0c;通常会使用自动化代码的手段来实现回归&#xff0c;但是对于一个庞大的系统来说&#xff0c;通过自动化脚本的方式来实现回归测试&#xff0c;又显得很费时费力。并且如果有定期将线上数据同步到测试环境的需求…

【mysql 127错误】mysql启动报错mysqld.service: Failed with result ‘exit-code‘.

无网环境&#xff0c;mysql 安装 出现如下错误 [rootmysql tools]# systemctl status mysqld.service ● mysqld.service - MySQL ServerLoaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)Active: failed (Result: exit-code) since…

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

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

防火墙的原理和配置

“防火墙”一词起源于建筑领域&#xff0c;用来隔离火灾&#xff0c;阻止火势从一个区域蔓延到另一个区域。引入到通信领域&#xff0c;防火墙这一具体设备通常用于两个网络之间有针对性的、逻辑意义上的隔离。这种隔离是选择性的&#xff0c;隔离“火”的蔓延&#xff0c;而又…