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

概述

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

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

代码

以下是myList类的完整代码:

# ========================================================
# 名称:myList
# 类型:类
# 简介:专用于构造有序和无序列表的类
# 作者:巽星石
# Godot版本:v4.2.2.stable.official [15073afe3]
# 创建时间:202442711:25:40
# 最后修改时间:202442716:26:10
# ========================================================
class_name myList

var _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" # 以最大项数的位数补全0
	for 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI对决:谷歌 VS 微软,谁更赚钱|TodayAI

尽管Alphabet和微软都发布了强劲的季度财报&#xff0c;显示两家科技巨头均超越了销售和利润的预期&#xff0c;但在生成式人工智能&#xff08;AI&#xff09;领域的投资回报方面&#xff0c;它们展现了不同的情况。Alphabet的CEO桑达尔皮查伊表示&#xff0c;他对Google通过出…

【Win】PsPing:深入网络性能测试与故障排查

在维护 Azure 虚拟机的过程中&#xff0c;可能会遇到一些网络连通性的问题。例如&#xff0c;当您尝试从个人 PC 上 ping 虚拟机的公网 IP 地址时&#xff0c;可能会发现出现 “Request time out” 的信息&#xff0c;导致无法 ping 通。这种情况的发生&#xff0c;通常是因为在…

【C++打怪之路Lv3】-- 类和对象(上)

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

IDEA上配置Maven环境

1.选择IDEA中的Setting 2.搜索maven 3.设置IDEA使用本地安装的Maven&#xff0c;并修改配置文件路径 配置文件&#xff0c;本地仓库&#xff0c;阿里云仓库配置及路径教程 在IDEA上配置完成。

Java学习路线及自我规划

荒废了一段时间&#xff0c;这段时间的总结开始了JavaWeb的学习但是困难重重&#xff0c;例如Maven&#xff0c;Vue的路由等&#xff0c;所以我反省了一段时间&#xff0c;因为基础薄弱&#xff0c;加之学习的资源是速成视频&#xff0c;导致大厦将倾的局面&#xff08;也算不上…

Golang | Leetcode Golang题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; func totalNQueens(n int) (ans int) {columns : make([]bool, n) // 列上是否有皇后diagonals1 : make([]bool, 2*n-1) // 左上到右下是否有皇后diagonals2 : make([]bool, 2*n-1) // 右上到左下是否有皇后var backtrack func(int)…

使用预训练模型构建自己的深度学习模型(迁移学习)

在深度学习的实际应用中&#xff0c;很少会去从头训练一个网络&#xff0c;尤其是当没有大量数据的时候。即便拥有大量数据&#xff0c;从头训练一个网络也很耗时&#xff0c;因为在大数据集上所构建的网络通常模型参数量很大&#xff0c;训练成本大。所以在构建深度学习应用时…

【redis】Redis数据类型(二)Hash类型

目录 Hash类型介绍特性hash 的内部编码方式/底层结构hashtableziplistlistpack 适用场景举例 常用命令hset示例 hsetnx示例&#xff1a; hmset示例 hget示例 hmget示例 hgetall示例 hdel示例 hlen示例 hexists示例 hincrby示例 hincrbyfloat示例 hkeys示例 hvals示例 Hash类型介…

VS2019编译OSG3.7.0+OSGEarth3.3+OSGQt5.15.2时遇到的问题及解决方法

注:本次编译以文章《VS2019编译OSG3.7.0+OSGEarth3.3+OSGQt》为基础搜集资料并进行编译 一 OSG编译 1.Osg3.7.0编译中,cmake阶段按照文章步骤即可。 2.另外,还需要对以下三项进行设置,参照《OSG-OpenSceneGraph在WIN10与VS2022下的部署(OSG3.6.5+VS2022+Win10_x64)个…

RustGUI学习(iced)之小部件(二):如何使用滑动条部件

前言 本专栏是学习Rust的GUI库iced的合集&#xff0c;将介绍iced涉及的各个小部件分别介绍&#xff0c;最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个&#xff0c;目前处于发展中&#xff08;即版本可能会改变&#xff09;&#xff0c;本专栏基于版本0.12.1. 概述…

mybatis基本使用

文章目录 1. mybatis2. 基本使用(1) maven坐标(2) 配置文件编写(3) 数据库操作(4) 注解查询 2. 基本配置(1) 读取外部配置文件(2) mapper映射 3. 映射文件查询删除/修改/新增 动态sql 1. mybatis MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高…

CSS盒子模型(如果想知道CSS有关盒子模型的知识点,那么只看这一篇就足够了!)

前言&#xff1a;在网页制作的时候&#xff0c;我们需要将网页中的元素放在指定的位置&#xff0c;那么我们如何将元素放到指定的位置上呢&#xff1f;这时候我们就需要了解盒子模型。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSD…

sCrypt全新上线RUNES功能

sCrypt智能合约平台全新上线一键etch/mint RUNES功能&#xff01; 请访问 https://runes.scrypt.io/ 或点击阅读原文体验&#xff01; 关于sCrypt sCrypt是BSV区块链上的一种智能合约高级语言。比特币使用基于堆栈的Script语言来支持智能合约&#xff0c;但是用原生Script编…

网络靶场实战-物联网安全Unicorn框架初探

背景 Unicorn 是一款基于 QEMU 的快速 CPU 模拟器框架&#xff0c;可以模拟多种体系结构的指令集&#xff0c;包括 ARM、MIPS、PowerPC、SPARC 和 x86 等。Unicorn使我们可以更好地关注 CPU 操作, 忽略机器设备的差异。它能够在虚拟内存中加载和运行二进制代码&#xff0c;并提…

密码加密案例

文章目录 描述思路错误关于增强for循环改变不了数组的值这一现象的疑问代码反思 描述 思路错误 应该是将其放入数组&#xff0c;而不是单纯的读到&#xff0c;因为你要对每一位数字进行操作 关于增强for循环改变不了数组的值这一现象的疑问 我们尝试使用增强for循环 键盘输…

uniapp使用地图开发app

使用uniapp开发app中使用到地图的坑&#xff1a; 1、简单使用地图的功能比较简单&#xff0c;仅使用到地图选点和定位功能&#xff1a;&#xff08;其中问题集中在uni.chooseLocation中&#xff09;下面是api官网地址 uni.getLocation(OBJECT) | uni-app官网 官方建议app端使…

迁移学习基础知识

简介 使用迁移学习的优势&#xff1a; 1、能够快速的训练出一个理想的结果 2、当数据集较小时也能训练出理想的效果。 注意&#xff1a;在使用别人预训练的参数模型时&#xff0c;要注意别人的预处理方式。 原理&#xff1a; 对于浅层的网络结构&#xff0c;他们学习到的…

视频批量剪辑新纪元:轻松调整音频采样率,一键实现高效视频处理!

视频剪辑已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;面对大量的视频文件&#xff0c;如何高效地进行批量剪辑&#xff0c;同时又能轻松调整音频采样率&#xff0c;成为了许多视频制作人员、自媒体从业者、教育者和学生的共同需求。 第一步&#xff0c;进入…

[C++基础学习]----02-C++运算符详解

前言 C中的运算符用于执行各种数学或逻辑运算。下面是一些常见的C运算符及其详细说明&#xff1a;下面详细解释一些常见的C运算符类型&#xff0c;包括其原理和使用方法。 正文 01-运算符简介 算术运算符&#xff1a; a、加法运算符&#xff08;&#xff09;&#xff1a;对两个…

4.27日学习打卡----初学Redis(四)

4.27日学习打卡 目录&#xff1a; 4.27日学习打卡一. Redis的配置文件二. Redis构建Web应用实践环境搭建redis的优点引入本地缓存Google 开源工具GuavaGuava实现本地缓存 一. Redis的配置文件 在Redis的解压目录下有个很重要的配置文件 redis.conf &#xff0c;关于Redis的很多…