python的小技巧一

文章目录

  • python的小技巧系列
    • 1、变量相关
      • 变量交换
      • 三元运算符
      • 一个数值的范围比较
      • 有的场景下使用 try...exception 代替if...else
    • 2、字符串相关
      • 格式化连接
      • 字符串的分割
      • 字符串的连接
    • 3、生成器
    • 4、列表相关
      • 取最后一个元素
      • 判断列表是否为空
      • 列表合并
      • 去除列表中的重复值
      • 判断某个值是包含在序列中
      • 列表推导式
      • 带条件的列表推导式
    • 5、字典相关
      • 俩字典合并
      • 字典反转
      • 对字典列表中的元素进行排序
      • 将两个列表的值组成字典
      • 字典推导式
    • 6、循环
      • 带索引值的循环
      • 反向遍历
      • 正向遍历
    • 7、文件相关
      • 读取文件方式一:
      • 读取文件方式二:
      • 删除文件时注意

python的小技巧系列

1、变量相关

变量交换

  • 常规的写法比较麻烦:

像JAVA,C,PHP 等需要用临时变量

temp = a
a = b
b = temp
  • python中较为简洁的方法
def swap_var(a, b):a, b = b, areturn a, b

三元运算符

  • 常规写法
def test_judge1(self):"""常规判断 成绩是否及格"""num = int(input("请输入一个数字:"))if num >= 60:print("及格")else:print("不及格")
  • 三元运算符

格式:“if 后的结果” if num >= 60 else “else的结果”

def test_judge2(self):"""使用三元运算符判断  成绩是否及格@return:"""num = int(input("请输入一个数字:"))# 这个三元运算符和 JAVA,C不同,它if后的结果是写在最前面的res = "及格" if num >= 60 else "不及格"print(res)

一个数值的范围比较

  • 常规的写法
def test_judge5(self):"""判断一个值得的范围大小@return:"""num = int(input("请输入一个数字:"))if num >= 0 and num <= 100:print("数字在0-100之间")else:print("数字不在0-100之间")
  • 简洁的写法
def test_judge6(self):"""判断一个值得的范围大小@return:"""num = int(input("请输入一个数字:"))# 使用更简洁的写法if 0 <= num <= 100:print("数字在0-100之间")else:print("数字不在0-100之间")

有的场景下使用 try…exception 代替if…else

在判断字典的某一个 key 是否为空,可以用 try…exception来实现

def test_judge3(self):dict_data = {"user_base": {"uid": 1,"uname": "allen","email": "hjc_042043@sina.cn"},"user_info": {"age": 18,"sex": "男"}}try:score = dict_data["user_base"]["score"]except KeyError:score = 0print(score)

在这里插入图片描述

list 在判断下标是否存在时也可以用这个方法

def test_judge4(self):"""判断列表中是否有某一个索引值@return:"""list_data = [78, 82, 93, 84, 65]try:score = list_data[6]except IndexError:score = 0print("学生成绩:", score)

2、字符串相关

字符串函数有很多,因篇幅优先列举3个,具体参考这个连接:https://baijiahao.baidu.com/s?id=1769926940734111824&wfr=spider&for=pc

格式化连接

  • 常规的字符串连接
uid = 123
uname = 'allen'
age = 18
string = 'uid=' + str(uid) + '&uname=' + uname + '&age=' + str(age)
print(string)
  • 使用字符串对象的format格式化连接
string = 'uid={}&uname={}&age={}'.format(uid, uname, age)
print("字符串对象的format方法:", string)
  • 格式化方式f-string(python3.6之后):
string = f'uid={uid}&uname={uname}&age={age}'
print("f-string:", string)

打印结果:
在这里插入图片描述

字符串的分割

字符串分割,默认以空白符分割,除了空格还有其他符号,比如:\t,\n,\r
也可以指定分隔符,比如:,或|,#等其他字符

def test_split(self):uname = "Tom green yellow"new_list = uname.split()print(new_list)num_str = "1,2,3,4,5,6,7,8,9,10"new_list = num_str.split(",")print(new_list)num_str = "1|2|3|4|5|6|7|8|9|10"new_list = num_str.split("|")print(new_list)pass

字符串的连接

def test_join(self):"""字符串连接,默认以空白符连接,除了空格还有其他符号,比如:\t,\n,\r@return: """list = ["Tom", "green", "yellow"]new_str = "".join(list)print(new_str)list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]new_str = ",".join(list)print(new_str)list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]new_str = "|".join(list)print(new_str)pass

3、生成器

  • yield即生成器,相比return的优势是 循环体内,程序在执行到yield时,程序会暂停,并把值出栈;
    这样子就不会占用内存,下次循环进来时再接着上一次的yield的位置继续往下执行,而return的方式是先把数据都存放在栈中,一次性全部返回
  • yield可以处理比较耗时,占用内存的操作,比如网络请求,文件读取等,类似异步处理,比如一边下载文件,一边把文件内容显示出来
    下面列举两个简单的例子
  • 例子1:

计算100以内的平方数

import unittestclass YieldTestCase(unittest.TestCase):"""todo: 计算100以内的平方数@return:"""def test_return_square(self):lst = return_square()print(lst)passdef test_yield_square(self):gen = yield_square()for e in gen:print(e)passpassdef return_square():"""todo 使用return用于生成100以内的平方数@return:"""lst = []for i in range(100):lst.append(i ** 2)return lstdef yield_square():"""todo 使用yield实现一个生成器,用于生成100以内的平方数"""for i in range(100):yield i ** 2
  • 例子2:

测试下内存的使用情况,数值是100W

def test_yield_memory(self):# 先用列表推导式生成一个1000000的列表,再求和list1 = [x for x in range(1000000)]sum1 = sum(list1)print("推导式求和:", sum1)print("内存使用:", sys.getsizeof(list1), "字节")# 用生成器生成一个1000000的列表,再求和list2 = (x for x in range(1000000))sum2 = sum(list2)print("生成器求和:", sum2)print("内存使用:", sys.getsizeof(list2), "字节")pass

通过测试比较,效果一目了然,面对大数据,吃内存,耗时大的,使用生成器较好
在这里插入图片描述

4、列表相关

取最后一个元素

    def test9(self):lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# 取最后一个元素print(lst[-1])

判断列表是否为空

def test10(self):"""判断list是否为空@return:"""lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# 不好的写法:if len(lst) > 0:print('列表不为空')# 好的写法if lst:print('列表不为空')pass

列表合并

def test13(self):list1 = [1, "hjc", "email", 3.14, True]list2 = [2, "username"]print("将list+list2两个列表合并:", list1 + list2)list3 = [1, 2, 3, 4, 5]list4 = [6, 7, 8, 9, 10]print("将list3+list4两个列表合并:", [*list3, *list4])pass

去除列表中的重复值

def test12(self):"""去掉列表中的重复值@return:"""lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3]my_set = set(lst)print(list(my_set))pass

判断某个值是包含在序列中

def test11(self):"""判断某个值是否包含在序列中,包含列表,字符串,元组,字典等@return:"""lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]num = 5# 某个值是否包含在列表中,类似于 JAVA 的 a.contains(b)方法if num in lst:print('列表中包含该元素')else:print('列表中不包含该元素')# 某个字符子串是否包含着一个字符串中string = 'hello world'if 'hello' in string:print('字符串中包含该子串')else:print('字符串中不包含该子串')# 字典的键是否包含在字典中dic = {'name': 'allen', 'age': 20}if 'name' in dic:print('字典中包含该键')else:print('字典中不包含该键')pass

列表推导式

  • 常规for循环
def test1(self):"""使用常规的for循环遍历列表,将列表中的元素转换为大写@return: """new_list = []for fruit in self.fruites:new_list.append(fruit.upper())print(new_list)pass
  • 列表推导式:

这个推导式中的含义是:
①先看for循环,把元素遍历出来,
②再看 fruit.upper(),把循环体中元素转换为大写,
③最后把结果赋值给new_list

def test2(self):"""todo:使用列表推导式将列表中的元素转换为大写@return:"""new_list = [fruit.upper() for fruit in self.fruites]print(new_list)pass

在这里插入图片描述

带条件的列表推导式

  • 常规

列表遍历,并且将以 a 开头的元素转换为大写

def test3(self):new_list = []for fruit in self.fruites:if fruit.startswith('a'):new_list.append(fruit.upper())print(new_list)pass
  • 推导式简写
def test4(self):new_list = [fruit.upper() for fruit in self.fruites if fruit.startswith('a')]print(new_list)pass

在这里插入图片描述

5、字典相关

俩字典合并

格式:新的字典 = {**字典1,**字典2}

def test_dict_merge(self):"""合并两个字典:return:"""dict1 = {"a": 1, "b": 2, "c": 3}dict2 = {"d": 4, "e": 5, "f": 6}# 这里两个字典的**表示解包,将两个字典的键值对合并成一个新的字典new_dict = {**dict1, **dict2}print(new_dict)

字典反转

使用map 函数来对字典序列,回调反转排序函数

def test_everse(self):"""字典反转@return: """dict1 = {'one': 1,'tow': 2,'three': 3}new_dict = dict(map(reversed, dict1.items()))print(new_dict)

对字典列表中的元素进行排序

def test_sort_item(self):"""根据字典列表中的字典元素年龄进行倒序排列@return:"""dict_list = [{'name': 'allen', 'age': 18},{'name': 'john', 'age': 20},{'name': 'tom', 'age': 15}]new_dict_list = sorted(dict_list, key=lambda x: x['age'], reverse=True)print(new_dict_list)

将两个列表的值组成字典

def test_lists_to_dict(self):"""将两个列表合并到一个字典中,一个列表的值作为 key,另一个列表的值作为 value@return:"""keys = ['a', 'b', 'c']values = [1, 2, 3]new_dict = zip(keys, values)print(dict(new_dict))pass

字典推导式

字典推导式和列表推导式类似,只不过中括号改成大括号而已,区别就是字典推导式返回的类型是字典

  • 格式:
格式1{key:value for value in iterable(可迭代对象)}格式2{key:value for value in iterable(可迭代对象) if 条件}
  • 代码示例1:

不带条件

lst = ['hello', 'python', 'java']
# 还原字典推导式的实现
# new_dict = {}
# for x in lst:
#     new_dict[x] = len(x)
# print(new_dict)dic = {x: len(x) for x in lst}
print(dic)
  • 代码示例2:

带条件

"""
利用推导式计算一组股票价格大于100元的值
:return:
"""
d = {"601800": 10.74,"300776": 62.98,"300576": 44.10,"002594": 260.5,"300750": 223.47,"600519": 1711.05,
}
# 还原字典推导式
# new_dict = {}
# for key,val in d.items():
#     if val > 100:
#       new_dict[key] = valnew_dict = {key: val for key, val in d.items() if val > 100}
print("new_dict=", new_dict)

6、循环

带索引值的循环

使用enumerate 函数,来获取索引和值

def test5(self):for i, value in enumerate(self.fruites):print(i, value)

在这里插入图片描述

反向遍历

使用reversed 函数实现反向遍历

def test6(self):"""反向遍历@return: """for i,value in enumerate(reversed(self.fruites)):print(i,value)

反向遍历2,使用切片步长方式,[::-1]来实现,-1表示步长从从倒序开始取

def test7(self):"""@return:"""for i, value in enumerate(self.fruites[::-1]):print(i, value)

在这里插入图片描述

正向遍历

def test8(self):"""顺序遍历@return: """for i, value in enumerate(sorted(self.fruites)):print(i, value)

在这里插入图片描述

7、文件相关

读取文件方式一:

按常规的方式来读取文件,以默认只读方式打开文件—>读取内容—>关闭文件
因为不管异常是否处理,文件都要关闭操作

def test_read(self):global filetry:file = open(get_sources_dir() + "2.txt")text = file.read()  # 读取文件内容print(text)except Exception as e:print(e)finally:file.close()pass

读取文件方式二:

方式一,使用手动来关闭文件资源,不是很方便,不关闭又会一直占用文件资源
所以使用with…as上下文语句来处理更佳,它会自动帮我们关闭文件,并且代码简洁

def test_read(self):"""读取文件的内容:return:"""with open(get_sources_dir() + "2.txt", "r", encoding="utf-8") as f:content = f.read()print(content)pass

删除文件时注意

  • 删除文件

删除文件时,一定要判断文件是否存在,万一文件路径是个空的,不判断就会把目录删除掉,这样子后果严重

def test_rmfile(self):"""如果文件存在就删除文件:return:"""rm_file = get_sources_dir() + "write_big.txt"try:if os.path.isfile(rm_file):res = os.remove(rm_file)print("res=", res)else:print("文件不存在!")except OSError as e:print(e)pass
  • 删除目录

一般删除目录较少用,不会直接去删除,其判断方法和删除文件一样

def test_rmdir(self):rm_dir = get_sources_dir() + "test1"try:if os.path.isdir(rm_dir):# 如果是合法目录res = os.rmdir(rm_dir)print("res=", res)else:print("目录不存在!")except OSError as e:print(e)pass

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

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

相关文章

HJXH-E1/U静态信号继电器 面板安装 辅助电源220VDC 启动电压220VDC JOSEF约瑟

HJXH系列静态信号继电器 HJXH-61/U静态信号继电器&#xff1b; HJXH-61/I静态信号继电器&#xff1b; HJXH-62/U静态信号继电器&#xff1b; HJXH-62/I静态信号继电器&#xff1b; HJXH-E1/U静态信号继电器&#xff1b; HJXH-E1/I静态信号继电器&#xff1b; HJXH-E2/U静态信号…

Vue的DOM根组件模版

<!DOCTYPE html> <html> <head><title>DOM根组件模版</title> </head> <body><div id"app" ><button click "count">{{ count }}</button></div><!-- 引入Vue.js --><script…

学python新手如何安装pycharm;python小白如何安装pycharm

首先找到官网&#xff1a; Download PyCharm: The Python IDE for data science and web development by JetBrains 打开后选择下载&#xff0c;下图标红部分 点击exe程序&#xff0c;点击下一步&#xff01; 选择安装路径&#xff0c;下一步 弹出界面全选 选择默认 然后直接…

ros、c++基于类的编程基础

基于class的编程结构&#xff0c;中间穿插ros的话题发布机制。 首先建立功能包&#xff1a; catkin_create_pkg control geometry_msgs message_generation message_runtime nav_msgs roscpp rospy std_msgs以上依赖基本上是大多数的ros消息所需要的依赖了。 然后确定我们的…

腾讯云轻量2核4G5M服务器卡不卡?性能怎么样?

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&#xff0c;经阿腾云测试&a…

力扣题目训练(20)

2024年2月13日力扣题目训练 2024年2月13日力扣题目训练594. 最长和谐子序列598. 区间加法 II599. 两个列表的最小索引总和284. 窥视迭代器287. 寻找重复数135. 分发糖果 2024年2月13日力扣题目训练 2024年2月13日第二十天编程训练&#xff0c;今天主要是进行一些题训练&#x…

居民健康监测小程序|基于微信小程序的居民健康监测小程序设计与实现(源码+数据库+文档)

居民健康监测小程序目录 目录 基于微信小程序的居民健康监测小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、健康科普管理 5.3公告类型管理 3、论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

详解命令docker run -d --name container_name -e TZ=Asia/Shanghai your_image

docker run 是Docker的主要命令&#xff0c;用于从镜像启动一个新的容器。下面详细解释并举例说明 -d, --name, -e TZ 参数的用法&#xff1a; -d 或 --detach&#xff1a; 这个标志告诉Docker以守护进程&#xff08;后台&#xff09;模式运行容器。这意味着当你执行 docker ru…

[数据集][目标检测]智能手机屏幕缺陷检测数据集VOC+YOLO格式1200张3类别油斑划痕两点三类

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1200 标注数量(xml文件个数)&#xff1a;1200 标注数量(txt文件个数)&#xff1a;1200 标注…

‘pro‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

https://blog.csdn.net/weixin_48877626/article/details/135308016https://blog.csdn.net/weixin_48877626/article/details/135308016

一文搞懂分布式事务解决方案

前言 在当今的分布式系统中&#xff0c;分布式事务管理是一个关键挑战。在面对跨多个服务的复杂业务流程时&#xff0c;确保数据一致性和事务的原子性变得至关重要。本文将深入探讨分布式事务的概念、原理、实现方式以及在Java领域的应用。 什么是分布式事务 分布式事务是指涉…

【Javascript编程实操06】1、反转数组和字符串 2、将二维数组转一维数组

前言 1、反转数组和字符串 代码&#xff1a; 实现效果&#xff1a; 2、将二维数组转一维数组 代码&#xff1a; 实现效果&#xff1a; 总结 前言 本次主要是针对Javascript阶段的字符串与数组的实操练习&#xff0c;共有2个实操&#xff0c;大家可以在实操的过程中更加深…

阅读 - 二维码扫码登录原理

在日常生活中&#xff0c;二维码出现在很多场景&#xff0c;比如超市支付、系统登录、应用下载等等。了解二维码的原理&#xff0c;可以为技术人员在技术选型时提供新的思路。对于非技术人员呢&#xff0c;除了解惑&#xff0c;还可以引导他更好地辨别生活中遇到的各种二维码&a…

2024批量导出公众号所有文章生成目录,这下方便找文章了

公众号历史文章太多&#xff0c;手机上翻起来太费劲&#xff0c;怎么快速找到某一天的文章呢&#xff1f;比如深圳卫健委这个号从2014到2024发布近万篇文章。 公众号历史文章太多&#xff0c;手机上翻起来太费劲&#xff0c;怎么快速找到某一天的文章&#xff1f; 如果要找2020…

主干网络篇 | YOLOv8更换主干网络之ShuffleNetV2(包括完整代码+添加步骤+网络结构图)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。ShuffleNetV2是一种轻量级的神经网络架构&#xff0c;用于图像分类和目标检测任务。它是ShuffleNet的改进版本&#xff0c;旨在提高模型的性能和效率。ShuffleNetV2相比于之前的版本&#xff0c;在保持模型轻量化的同时&am…

用户视角的比特币和以太坊外围技术整理

1. 引言 要点&#xff1a; 比特币L2基本强调交易内容的隐蔽性&#xff0c;P2P交易&#xff08;尤其是支付&#xff09;成为主流&#xff0c;给用户带来一定负担&#xff08;闪电网络&#xff09;在以太坊 L2 中&#xff0c;一定程度上减少了交易的隐蔽性&#xff0c;主流是实…

【Linux进程状态】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、直接谈论Linux的进程状态 看看Linux内核源代码怎么说 1.1、R状态 -----> 进程运行的状态 1.2、S状态 -----> 休眠状态(进程在等待“资源”就绪) 1.3、T状…

突破编程_前端_JS编程实例(工具栏组件)

1 开发目标 工具栏组件旨在模拟常见的桌面软件工具栏&#xff0c;所以比较适用于 electron 的开发&#xff0c;该组件包含工具栏按钮、工具栏分割条和工具栏容器三个主要角色&#xff0c;并提供一系列接口和功能&#xff0c;以满足用户在不同场景下的需求&#xff1a; 点击工具…

Vue+SpringBoot打造音乐平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首音乐4.2 新增音乐4.3 新增音乐订单4.4 查询音乐订单4.5 新增音乐收藏 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的音乐平台&#xff0c;包含了音乐…

tigramite教程(五)使用TIGRAMITE 进行自助聚合和链接置信度量化

使用TIGRAMITE 进行自助聚合和链接置信度量化 自助聚合&#xff08;Bagging&#xff09;和置信度估计例子数据生成模型基本的PCMCIBagged-PCMCI使用优化后的pc_alpha进行自举聚合使用优化的pc_alpha进行CMIknn的自举聚合 TIGRAMITE是一个用于时间序列分析的Python模块。它基于P…