坏蛋Dan
知乎@坏蛋Dan
发布时间:2024.1.4

前言

昨天我们学了操作符、控制流、函数、模块

坏蛋Dan:python简单入门--day2:运算符、控制流、函数、模块

今天我们来学数据结构

另外还是那句话,下面的内容会省略一些点,是面向有编程基础的(最好是前端)。


数据结构

python有四种内置的数据结构,分别是list、tuple、dictionary以及set

List

类似前端的数组或者后端的vector,可以增删改查,即动态的。

不过这里有一点需要注意,和前端的数组类似,python中的list也是类似对象/类的存在,这个list对象的字段是ivalue就是i对应的元素。

这就很符合python中万物皆对象的理念了。

不多说,直接上例子

用法也几乎和js中的Array一样,不过这里需要注意,del是会直接影响到数组的长度的,这一点和js的不一样。

另外这个sort方法是基于timsort的,我之前有篇文章实现了这个timsort,是基于typescript的,感兴趣的可以去看下

坏蛋Dan:基于Typescript实现timsort算法


Tuple

元组这玩意儿前端只有typescript 里做了支持,一般都是后端语言有这个概念。

元组的长度是不可变的,但是它里面可以放不同类型的东西,甚至是再放一个tuple

来看下例子

不过和List一样,Tuple也是序列(sequence),表示一系列的item

括号可以不写,但是建议是加上。


Dectionary

字典字如其名,类似传统的对象,但是对象这个概念已经被用了,所以换了个词。用法自然也是对象的样子,直接看例子

我们创建的字典都是dist类的实例/对象

另外还有一点不同:不可以使用.来访问对应的key.python中是用来访问对象的属性的。


Sequence

ListTuple以及String都是sequence, 那么这个Sequence到底是个啥呢?

最主要的特性就是membership tests(比如in或者not in表达式)以及indexing operations即索引操作,允许我们通过下标找到对应的元素。

来看个例子

除了常规的操作外,你甚至可以传入负数,它会从length - x给你找对应的元素。

还可以做切割子序列的操作,在rust中管这叫做slice即切片。

这里还支持第三个参数,表示切片的step

传入负数表示倒序切

另外切片是新生成一个Sequence,而不是引用,相当于deep copy

List、Tuple以及String都是基于Sequence的,所以它们都可以有上面的操作。


Set

就和传统的Set一样,无序,可以去重。

其它不过多介绍了,到时候用多了自然就懂了。


补充下Strings

前面说了字符串也是基于Sequence的,至于原理这里就不多说了,应该是和RustString为什么是一个集合的原理是差不多的。

另外字符串也是对象,它有自己的属性len和方法format等。

方法干的啥相信大家一眼就知道了,所以就不多说了。


例子

那么我们这会儿学的差不多了,该搞个demo当作期中考试了。

目标

写一个程序用来备份我们的import进来的文件。

分析

我们现在直接上手写代码会有些无从下手的感觉。我们应该先将功能进行拆分,分为几个点来实现。

  • 需要备份的文件/文件夹需要存放到一个List
  • 需要放在主文件夹里
  • 需要zip压缩
  • 备份的名字为:当前日期 + 时间
  • 下载zip这个指令(GNU/Linux/Unix自带)

安装zip(windows)

在开始写代码之前,window用户先往这里看:http://gnuwin32.sourceforge.net/downlinks/zip.php

需要自行下载、安装zip工具才行,安装完之后还得把这个工具加到环境变量中。

完事后新开一个终端输入zip,如果有以下显示

那就表示安装成功了,但是如果你输入后返回"zip不是可执行程序"。那么建议你把整个vscode重启了,或者干脆直接重启电脑。


实现

我们重新创建一个文件,就叫backup_main.py

我们把同文件夹里的index.py文件作为备份对象,压缩放到当前目录下。

然后基于os.system让操作系统执行zip -r ${path} ${backup_target}

如果存放备份的文件不存在,那么这个时候就创建target文件夹。

然后我们再看到我们当前文件夹里就多了一个当前时间的zip文件了。

  • os.spe: 分隔符,在window上是\\,而在unix上则是/
  • time.strftime: 根据传入的格式返回当前时间,至于%Y%m%d这些东西表示什么我就不多说了,大家都懂。
  • zip -r:这里的-r表示的是recursively,是否深度处理即包含所有的子孙文件。

优化1

我们刚实现的小工具目前是直接用当前的时间作为压缩文件的名字,我们可以优化成:当前年月日/时间 即以日期为文件夹,时间为文件名字,这样我们就可以更好的分类了。


优化2

我们还可以进一步进行区分,用数字来区分虽然比较安全,但是不便于理解和阅读。

我们还可以提供一个输入入口给用户,让他们自定义文件的后缀,这样用户区分的时候会知道对应的压缩文件是用来干嘛的。


总结

可以看到python的语法其实是比较简单的,几乎没什么很难理解的用法。

发布于 2023-04-02 17:53・IP 属地广东