【Godot4.2】有序和无序列表函数库 - myList

概述

在打印输出或其他地方可能需要构建有序或无序列表。本质就是构造和维护一个纯文本数组。并用格式化文本形式,输出带序号或前缀字符的多行文本。

为此我专门设计了一个类myList,来完成这项任务。

代码

以下是myList类的完整代码:

# ========================================================
# 名称:myList
# 类型:类
# 简介:专用于构造有序和无序列表的类
# 作者:巽星石
# Godot版本:v4.2.2.stable.official [15073afe3]
# 创建时间:202442711:25:40
# 最后修改时间:202442716:26:10
# ========================================================
class_name myListvar _arr:PackedStringArray# 实例化
func _init(list:PackedStringArray = []) -> void:_arr = list# ============================ 增删改查 ============================
# -------------------- 增
# 末尾添加列表项
func append(item:String)  -> void:_arr.append(item)# 末尾添加列表项
func insert(pos:int,item:String)  -> void:_arr.insert(pos,item)# 添加多个列表项
func append_array(items:PackedStringArray)  -> void:_arr.append_array(items)# 填充指定数目的相同列表项
func fill(item:String,count:int)  -> void:_arr.resize(count)_arr.fill(item)
# -------------------- 删
# 清除列表项
func remove(idx:int) -> void:_arr.remove_at(idx)
# 清空列表项
func clear() -> void:_arr.clear()
# -------------------- 改
# 修改列表项的值
func set_item(idx:int,new_val:String) -> void:_arr[idx] = new_val# 修改列表项的位置
func move_to(idx:int,new_pos:int) -> void:var item = _arr[idx]_arr.remove_at(idx)_arr.insert(new_pos if new_pos !=0 else 0,item)
# -------------------- 查
# 获取列表项的值
func get_item(idx:int) ->String:return _arr[idx]# 返回列表项的总数
func get_count() ->int:return _arr.size()
# -------------------- 遍历
# 遍历函数
func for_item(callback:Callable) ->void:for i in range(_arr.size()):callback.callv([_arr[i],i,_arr.size()])
# ============================ 获取列表 ============================
# 返回数组的副本
func get_data() -> PackedStringArray:return _arr.duplicate()# 返回有序列表字符串
# 如果show_zero=true,则以最大项序号的位数,在序号之前填充0
func get_OL_string(show_zero:=false) -> String:var s = ""var fm = "%" + "0%dd" % str(_arr.size()).length() if show_zero else "%d" # 以最大项数的位数补全0for i in range(_arr.size()):s+= fm % [i+1] + ".%s" % [_arr[i]]if i != _arr.size()-1:s+= "\n"return s
# 返回有序列表字符串(可直接用于MArkDown)
func get_OL_markdown() -> String:var s = ""for i in range(_arr.size()):s+= "%d. %s" % [i+1,_arr[i]]if i != _arr.size()-1:s+= "\n"return s# 返回html有序列表字符串
func get_OL_html() -> String:var s = "</li>\n\t<li>".join(_arr)return "%s%s%s" % ["<ol>\n\t<li>",s,"</li>\n</ol>"]# 返回html无序列表字符串
func get_UL_html() -> String:var s = "</li>\n\t<li>".join(_arr)return "%s%s%s" % ["<ul>\n\t<li>",s,"</li>\n</ul>"]# 返回无序列表字符串
func get_UL_string(symbol:String = "-") -> String:var s = ""for i in range(_arr.size()):s+= ("%s %s" % [symbol,_arr[i]])if i != _arr.size()-1:s+= "\n"return s

创建实例

我们可以用new()来创建myList实例:

var list = myList.new()   # 创建实例

或者在new()中传入一个PackedStringArray作为初始值:

var list = myList.new(["条目1","条目2","条目3","条目4"])   # 创建实例

添加列表项

除了实例化时直接传入一个字符串数组之外,还可以使用:

  • append():在列表末尾添加一个列表项
  • append_array():以字符串数组形式,在列表末尾批量添加列表项
  • fill():用指定个数的相同列表项填充列表
  • insert():在指定位置插入新的列表项

末尾追加

var list = myList.new(["条目1","条目2","条目3","条目4",])   # 创建实例
list.append("条目5")                           # 末尾追加
list.append_array(["条目6","条目7","条目8",])   # 末尾追加多项

整体填充

var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充

在指定位置插入

var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
ist.insert(3,"inset插入的列表项")   # 在指定位置插入

对应的有序列表:

1.这是一个无序列表项
2.这是一个无序列表项
3.这是一个无序列表项
4.inset插入的列表项
5.这是一个无序列表项
6.这是一个无序列表项
7.这是一个无序列表项
8.这是一个无序列表项
9.这是一个无序列表项

修改列表项

  • set_item():修改指定项的值
  • move_to():修改指定项的位置

修改指定项的值

var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
list.set_item(3,"修改后的值")       # 修改指定位置列表项的值

对应的有序列表:

1.这是一个无序列表项
2.这是一个无序列表项
3.这是一个无序列表项
4.修改后的值
5.这是一个无序列表项
6.这是一个无序列表项
7.这是一个无序列表项
8.这是一个无序列表项

移动列表项

var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
list.set_item(3,"修改后的值")   # 修改指定位置列表项的值
list.move_to(3,6)            # 修改列表项位置

对应的有序列表:

1.这是一个无序列表项
2.这是一个无序列表项
3.这是一个无序列表项
4.这是一个无序列表项
5.这是一个无序列表项
6.这是一个无序列表项
7.修改后的值
8.这是一个无序列表项

获取列表项的值

  • get_item():获取指定位置列表项的值
var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
print(list.get_item(0))            # 获取指定位置列表项的值

输出:

这是一个无序列表项

获取总的列表项数目

  • get_count():获取总的列表项数目
var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
print(list.get_count())            # 获取总的列表项数目

输出:

8

遍历函数

  • for_item():遍历函数,可以传入一个匿名函数作为回调,包含item,index,count三个参数。
  • 可以用于快速遍历列表项,执行某些操作
var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
# 使用遍历函数
list.for_item(func(item,index,count):printt(item,index,count)
)

输出:

这是一个无序列表项	0	8
这是一个无序列表项	1	8
这是一个无序列表项	2	8
这是一个无序列表项	3	8
这是一个无序列表项	4	8
这是一个无序列表项	5	8
这是一个无序列表项	6	8
这是一个无序列表项	7	8

获取列表数据

  • get_data():返回内部数组的副本。
var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
print(list.get_data())             # 获取列表数据

输出:

["这是一个无序列表项", "这是一个无序列表项", "这是一个无序列表项", "这是一个无序列表项", "这是一个无序列表项", "这是一个无序列表项", "这是一个无序列表项", "这是一个无序列表项"]

有序列表

  • get_OL_string():返回纯字符串形式的有序列表,无法被MarkDown编辑器识别
  • get_OL_markdown():返回可以被MarkDown编辑器识别的纯字符串形式有序列表
  • get_OL_html():返回HTML形式的有序列表

创建myList实例:

var list = myList.new(["条目1","条目2","条目3","条目4",])   # 创建实例
list.append("条目5")      # 末尾追加
list.append_array(["条目6","条目7","条目8",])   # 末尾追加多项

普通有序列表字符串

print(list.get_OL_string())   # 打印普通有序列表

输出:

1.条目1
2.条目2
3.条目3
4.条目4
5.条目5
6.条目6
7.条目7
8.条目8

get_OL_string()有一个参数show_zero,默认为false,如果设为true,则会自动在序号前补上0,序号的总位数取决于最大项序号的位数。

var list = myList.new()              # 创建实例
list.fill("这是一个有序列表项",100)    # 填充
print(list.get_OL_string(true))   # 获取并打印有序列表

输出:

001.这是一个有序列表项
002.这是一个有序列表项
003.这是一个有序列表项
004.这是一个有序列表项
005.这是一个有序列表项
006.这是一个有序列表项
007.这是一个有序列表项
008.这是一个有序列表项
009.这是一个有序列表项
010.这是一个有序列表项
011.这是一个有序列表项
...
098.这是一个有序列表项
099.这是一个有序列表项
100.这是一个有序列表项

可以被MarkDown编辑器识别的有序列表字符串

print(list.get_OL_markdown())   # 打印可以被MarkDown编辑器识别的有序列表

输出:

1. 条目1
2. 条目2
3. 条目3
4. 条目4
5. 条目5
6. 条目6
7. 条目7
8. 条目8

粘贴到Typora中会被自动识别和转化为有序列表:
image.png

HTML形式有序列表

print(list.get_OL_html())

输出:

<ol><li>条目1</li><li>条目2</li><li>条目3</li><li>条目4</li><li>条目5</li><li>条目6</li><li>条目7</li><li>条目8</li>
</ol>

网页浏览器中效果:
image.png

无序列表

  • get_UL_string():返回纯字符串形式的有序列表,可以被MarkDown编辑器识别
  • get_UL_html():返回HTML形式的有序列表

创建并填充一个无序列表:

var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充

普通无序列表字符串

print(list.get_UL_string())  # 获取并打印无序列表

输出:

- 这是一个无序列表项
- 这是一个无序列表项
- 这是一个无序列表项
- 这是一个无序列表项
- 这是一个无序列表项
- 这是一个无序列表项
- 这是一个无序列表项
- 这是一个无序列表项

起始,这种形式也可以直接被MarkDown编辑器识别为无序列表:
image.png

显示自定义符号

  • get_UL_string()有一个参数,可以传入自定义的列表符号:
print(list.get_UL_string("*"))   # 自定义无序列表符号
* 这是一个无序列表项
* 这是一个无序列表项
* 这是一个无序列表项
* 这是一个无序列表项
* 这是一个无序列表项
* 这是一个无序列表项
* 这是一个无序列表项
* 这是一个无序列表项
print(list.get_UL_string("□"))   # 自定义无序列表符号
□ 这是一个无序列表项
□ 这是一个无序列表项
□ 这是一个无序列表项
□ 这是一个无序列表项
□ 这是一个无序列表项
□ 这是一个无序列表项
□ 这是一个无序列表项
□ 这是一个无序列表项

HTML形式无序列表

print(list.get_UL_html())

输出:

<ul><li>这是一个无序列表项</li><li>这是一个无序列表项</li><li>这是一个无序列表项</li><li>这是一个无序列表项</li><li>这是一个无序列表项</li><li>这是一个无序列表项</li><li>这是一个无序列表项</li><li>这是一个无序列表项</li>
</ul>

代码技巧总结

获取数字的位数

对于整数,通过将其转化为字符串,获取长度来获取位数:

print(str(32).length()) # 2

对于浮点数,可以采取类似的方法:

print(str(10.25).length()) # 5

如果需要不包含小数点的位数,早上面的值之上减1就可以了:

print(str(10.25).length()-1) # 4

判断数字是浮点数还是整数

通过判断是否有.,可以判断数字是不是小数:

print(true if str(10.25).find(".") != -1 else false) # true
print(true if str(100).find(".") != -1 else false)   # false

或者更简单的用is:

print(num is float)   # 判断数字是不是浮点数
print(num is int)     # 判断数字是不是整数

单独获取浮点数的整数和小数部分,及其位数

我们可以用字符串分割来获取整数部分和小数部分的数字:

print(str(10.25).split(".")[0]) # "10"  浮点数的整数部分
print(str(10.25).split(".")[0].length()) # 2 浮点数的整数部分的位数
print(str(10.25).split(".")[1]) # "25" 浮点数的小数部分位数
print(str(10.25).split(".")[1].length()) # 2 浮点数的小数部分位数
print("0.%s" % str(10.25).split(".")[1]) # "0.25" 浮点数的完整小数部分

构造复杂的多重格式化字符串

var fm = "%" + "0%dd" % str(32).length()
print(fm % 1) # 01
  • str(32).length()获取整数32的位数
  • "%" + "0%dd" % str(32).length(),首先将替换"0%dd"中的%d,变为"02d",然后加上之前的%,构成格式化字符串"%02d"

在整数末尾补0

  • "%04d" % 123,返回0123
  • "%0-4d" % 123,返回1230,-实现了在右侧,也就是末尾补0的效果
print("%0-4d" % 123) # 1230

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

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

相关文章

模型剪枝-Network Slimming算法分析

代码见文末 论文地址&#xff1a;Learning Efficient Convolutional Networks through Network Slimming ICCV 2017 Open Access Repository 1.概述 由于边缘设备的限制&#xff0c;在模型的部署中经常受到模型大小、运行内存、计算量的限制。之前的方法要么只能解决其中一个…

spark实验求TOP值

实验1&#xff1a;求TOP值 已知存在两个文本文件&#xff0c;file1.txt和file2.txt&#xff0c;内容分别如下&#xff1a; file1.txt 1,1768,50,155 2,1218, 600,211 3,2239,788,242 4,3101,28,599 5,4899,290,129 6,3110,54,1201 7,4436,259,877 8,2369,7890,27 fil…

合泰杯(HT32F52352)RTC的应用(计时)--->掉电不丢失VBAT(代码已经实现附带源码)

摘要 在HT32F52352合泰单片机开发中&#xff0c;rtc在网上还是挺少人应用的&#xff0c;找了很久没什么资料&#xff0c;现在我根据手册和官方的代码进行配置理解。 RTC在嵌入式单片机中是一个很重要的应用资源。 记录事件时间戳&#xff1a;RTC可以记录事件发生的精确时间&…

STL——stackqueue

stack stack即为栈&#xff0c;先进后出是其特点 栈只有栈顶元素能被外界使用&#xff0c;故不存在遍历行为 栈中常用接口 构造函数 stack<T> stk; //默认构造方式 stack(const stack &stk); //拷贝构造 赋值操作 stack& operator(const stack &stk); …

动手学深度学习——softmax分类

1. 分类问题 回归与分类的区别&#xff1a; 回归可以用于预测多少的问题&#xff0c; 比如"预测房屋被售出价格"&#xff0c;它是个单值输出。softmax可以用来预测分类问题&#xff0c;例如"某个图片中是猫、鸡还是狗&#xff1f;"&#xff0c;这是一个多…

Apache POI 在java中处理excel

介绍: Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下&#xff0c;POI 都是用于操作 Excel 文件。 如何使用: 1.maven坐标引入 <depend…

安卓获取SHA

1&#xff1a;安卓通过签名key获取SHA 方式有两种&#xff0c; 1、电脑上来存在eclipse的用户或正在使用此开发工具的用户就简单了&#xff0c;直接利用eclipse 走打包流程&#xff0c;再打包的时候选择相应的签名&#xff0c;那么在当前面板的下面便会出现签名的相关信息。 2、…

iOS实现一个高性能的跑马灯

效果图 该跑马灯完全通过CATextLayer 实现&#xff0c;轻量级&#xff0c;并且通过 系统的位移动画实现滚动效果&#xff0c;避免了使用displaylink造成的性能瓶颈&#xff0c;使用系统动画&#xff0c;系统自动做了很多性能优化&#xff0c;实现更好的性能&#xff0c;并使用…

ChatGPT 网络安全秘籍(四)

原文&#xff1a;zh.annas-archive.org/md5/6b2705e0d6d24d8c113752f67b42d7d8 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第八章&#xff1a;事故响应 事故响应是任何网络安全策略的关键组成部分&#xff0c;涉及确定、分析和缓解安全漏洞或攻击。 及时和有效地…

LLM应用:让大模型prompt总结生成Mermaid流程图

生成内容、总结文章让大模型Mermaid流程图展示&#xff1a; mermaid 美人鱼, 是一个类似 markdown&#xff0c;用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具&#xff0c;您可以在文档中嵌入一段 mermaid 文本来生成 SVG 形式的图形 Prompt 示例&#xff1a;用横向…

数智新重庆 | 推进信号升格 打造算力山城

2024年&#xff0c;是实现“十四五”规划目标任务的关键一年&#xff0c;高质量的5G网络、强大的AI能力作为新质生产力的重要组成部分&#xff0c;将有效赋能包括制造业在内的千行万业数字化化、智能化、绿色化转型升级&#xff0c;推动融合应用新业态、新模式蓬勃兴起&#xf…

【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、回调函数二、快速排序(Qsort)2.1 Qsort参数部分介绍2.2 不…

1天搞定uniApp+Vue3+vite+Element UI或者Element Plus开发学习,使用vite构建管理项目,HBuilderX做为开发者工具

我们通常给小程序或者app开发后台时&#xff0c;不可避免的要用到可视化的数据管理后台&#xff0c;而vue和Element是我们目前比较主流的开发管理后台的主流搭配。所以今天石头哥就带大家来一起学习下vue3和Element plus的开发。 准备工作 1&#xff0c;下载HBuilderX 开发者…

数据库管理-第179期 分库分表vs分布式(20240430

数据库管理179期 2024-04-30 数据库管理-第179期 分库分表vs分布式&#xff08;20240430&#xff09;1 分库分表1.1 分库1.2 分表1.3 组合1.4 问题 2 分布式3 常见分布式数据库4 期望总结 数据库管理-第179期 分库分表vs分布式&#xff08;20240430&#xff09; 作者&#xff1…

应用监控(Prometheus + Grafana)

可用于应用监控的系统有很多&#xff0c;有的需要埋点(切面)、有的需要配置Agent(字节码增强)。现在使用另外一个监控系统 —— Grafana。 Grafana 监控面板 这套监控主要用到了 SpringBoot Actuator Prometheus Grafana 三个模块组合的起来使用的监控。非常轻量好扩展使用。…

iA Writer for Mac:简洁强大的写作软件

在追求高效写作的今天&#xff0c;iA Writer for Mac凭借其简洁而强大的功能&#xff0c;成为了许多作家、记者和学生的首选工具。这款专为Mac用户打造的写作软件&#xff0c;以其独特的设计理念和实用功能&#xff0c;助你轻松打造高质量的文章。 iA Writer for Mac v7.1.2中文…

【Jenkins】持续集成与交付 (四):修改Jenkins插件下载地址、汉化

🟣【Jenkins】持续集成与交付 (四):修改Jenkins插件下载地址、汉化 一、修改Jenkins插件下载地址二、汉化Jenkins三、关于Jenkins💖The Begin💖点点关注,收藏不迷路💖 一、修改Jenkins插件下载地址 由于Jenkins官方插件地址下载速度较慢,我们可以通过修改下载地址…

机器学习高频问答题总结

机器学习问答题总结 第一章 线性回归1.什么是线性回归&#xff1f;解释主要原理2.解释线性回归中最小二乘法的原理吗&#xff1f;3.如何评估线性回归模型的性能&#xff1f;4.线性回归中正则化的目的是什么吗&#xff1f;L1正则化和L2正则化有什么不同&#xff1f; 第二章 逻辑…

『FPGA通信接口』DDR(3)DDR3颗粒读写测试

文章目录 前言1.配套工程简介2.测试内容与策略3. 测试程序分析4.程序结果分析5.一个IP控制两颗DDR36.传送门 前言 以四颗MT41K512M16HA-125AIT颗粒为例&#xff0c;介绍如何在一块新制板卡上做关于DDR3的器件测试。前面两篇介绍了什么是DDR&#xff0c;并介绍了xilinx给出的FPG…

Matlab生成txt文件导入到Vivado仿真

Matlab处理数据并将其写入txt文件 %% Txt Generate pre_RS_datadec2bin(simDataIn,8); %将数据转化为8bit的二进制 fidfopen("F:\FPGA\Xilinx_vivado\project\dvbstestbench\dbvs\matlab\pre_RS_data.txt","wt"); for i1:n*nMessages %数据…