自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

南宫理的日知录

开卷有益,无书不可读,阅读,思考,沉淀,分享!

  • 博客(32)
  • 收藏
  • 关注

原创 18、Python之容器:字典(dict)缺失值处理不够优雅?试试defaultdict

关于字典中缺失值处理的场景,本文首先介绍了dict中常规的分支判断的处理方法,以及通过setdefault()简化分支处理的方法。之后,引入defaultdict,介绍了更加灵活、强大的处理方法。根据实际使用场景,可以自行选择!

2024-07-20 07:15:00 399

原创 17、Python之容器:字典(dict)就是哈希表换个马甲?

从上一篇文章开始,开始了Python中常用的数据结构,也就是容器类的介绍,上一篇文章简要介绍了列表的使用,这一篇文章准备介绍一下Python中字典(dict)的使用。还是以人员信息为例,这次我们使用嵌套字典的方式存储,字典的key为name,字典的值为完整的人员信息的字典,包含name、age、gender、height。上面的代码中,我们需要进行分支判断,如果key在字典中已经存在,则将姓名追加到值的列表中,如果不存在,则首次进行初始化为值列表的操作。关于字典的增、删、改的操作比较简单,这里就不列举了。

2024-07-19 07:00:00 767

原创 16、Python之容器:元组与列表、推导式与生成式,差之毫厘谬以千里

本文简单介绍了Python中元组的特点,同时对比了元组与列表、推导式与生成式。这些粗略看来,相差不大的概念,仔细思考之后,还是能发现很多值得注意的点,而这些可能就决定了Python代码编写的质量,以及实际运行的效率。

2024-07-18 06:45:00 454

原创 15、Python之容器:列表是个百宝箱,什么都能往里装

本文简单介绍了Python中的列表这个容器类型,包括常用的内置方法以及列表推导式的使用。列表的灵活性,配合列表推导式的简洁性,在实际的Python编程实践中非常实用,掌握了列表的使用,一定能大大提升Python开发的效率。

2024-07-17 07:00:00 916

原创 14、Python之super star:一颗星、两颗星,满天都是小星星

在Python中,星号(*)的主要用法有:1、基础的乘法运算2、字符串的重复3、列表的扩充4、定义不定长的函数位置参数5、函数调用时,将列表拆包为位置参数进行传递6、定义不定长的函数关键字参数7、函数调用时,将字典拆包为关键字参数进行传递只要理解了这几点,在后续的使用中,就能大大简化自己代码的编写,真正提高代码的编写效率,毕竟我们选择用Python的原因在于人生苦短。

2024-07-16 06:45:00 1049

原创 Python番外篇:函数和类也是一等公民

通过前面的关于函数作为Python中的一等公民的演示,可以看出,在Python中,函数对象如同其他数据类型一样,可以很灵活地应用在各个场景中。类对象作为Python中的对象,也与函数极为类似。在后续的文章中,我们会将函数的基础用法及一些实用的高阶用法,逐步展开。

2024-07-15 12:45:00 946

原创 Python番外篇:标准类型层次结构

看定义中的说明文档,我们发现type这个类的初始化函数,可以获取类对象,初始化函数接收的参数,可以是一个对象,也可以是更多的参数。前面的文章中,我们提到了在Python中一切皆对象,理所当然的,函数和类也是对象,所以,函数和类在Python中也是一等公民。由于,类也是对象,也就是类对象,类对象也是有自己的属性的,其中__bases__就是指向这个类对象的父类对象的属性。不管是type类,还是__class__属性,我们要找的都是对象与类之间的关系,也就是实例化关系。

2024-07-15 07:10:06 923

原创 Python番外篇:万法归一,一切皆对象

从上面示例代码中可以看出,内置类型int、str,以及自定义的类MyClass,这些类对象,都是由type这个类对象进行实例化的。那么type这个类对象又是谁实例化的呢?你没有看错,type类对象是由自己实例化的……虽然,本文的内容有点绕,但是,必须说的是,Python中的“一切皆对象”的理念,使得Python具有高度的灵活性和一致性。无论是简单的数据类型还是复杂的函数和类,它们都是对象,并可以进行统一的操作。这种设计哲学使得Python代码更加简洁、优雅和易于维护。

2024-07-13 06:45:00 1030

原创 13、Python之函数:简单的参数默认值其实并不简单

虽然函数参数的默认值,语法很简单,使用很方便。但是,稍微一不留意,可能也会导致一些异常的结果。基础很简单,但也很重要。真正掌握基础并不简单,只是把语法记住了,并不是真正掌握。遇到问题不要慌,关注底层的细节,能够更加容易的定位问题所在,并理解问题的产生。而所谓的编程学习,学的并不是写几行代码,而是通过写代码,逐渐习得并强化自己定位问题、解决问题的能力。

2024-07-12 06:45:00 792

原创 12、Python 之函数:你的代码是一整坨还是分块的

由于篇幅所限,这篇文章只介绍了关于函数的优点,以及函数的一些基础用法。最后在介绍lambda函数的时候,以一个简单的实际案例做了演示。案例中用到的rich和faker第三方框架,在前面的文章中已经介绍过,为了便于不熟悉的小伙伴学习使用,省去到故纸堆里搜检的工作,我把链接附在文章末尾。

2024-07-11 06:45:00 886

原创 11、Python之变量:看得见还是看不见

需要注意的是,通常来说,在编程语言中,语句与表达式是有区别的,表达式是有结果值的,可以作为赋值语句的一部分,也可以是其他语句中的组成部分。变量的作用域决定了变量在程序中的可见性和生命周期。本着“能用一行代码搞定的,绝不应该写两行”的理念(瞎说的),Python从3.8开始,引入了新的语法,叫做“赋值表达式”,不同于赋值语句,赋值表达式是可以出现在其他语句中的。假如不这样做,那么函数里的每条赋值语句都有可能影响全局作用域中的变量,这样不仅混乱,而且会让全局变量之间彼此交互影响,从而导致很多难以探查的bug。

2024-07-10 06:45:00 1138

原创 10、Python之写出更加Pythonic的代码:unpacking拆包机制

所有我们不需要的元素,都可以用占位符进行舍弃,但是,占位符_只是省去了我们给变量取名的麻烦,不需要的元素比较多的时候,似乎还是不太方便,反而不如索引操作方便,好在Python中提供了对应的解决方案。这是他们的优势,但也是他们的劣势。unpacking的机制,看似好用,但是,细心的你,可能立马会发现一个问题,如果集合中元素有很多个,此时,我们只需要其中的一部分,怎么办呢。代码中,会将除了name接收的第一个元素,以及gender接收的最后一个元素,之外的所有元素,封装为一个列表,由others接收。

2024-07-09 18:51:08 914

原创 9、Python之文本解析:字符串格式化的逆操作?

前面的文章中,提到了关于Python中字符串中的相关操作,更多地涉及到了字符串的格式化,有些地方也称为字符串插值操作,本质上,就是把多个字符串拼接在一起,以固定的格式呈现。在系统的运营过程中,记录用户在系统中的各种访问行为,通过这些行为日志的提取、分析,学习出用户相关动作背后的特定模式,从而更好地实现产品的运营,留存用户、提高转化率等。其实,关于文本数据的解析、提取,除了re、parse外,还有其他模块,分别用于更多的场景中的文本解析、提取。关于这些函数的使用,感兴趣的可以查看源码自行研究。

2024-07-08 18:18:52 656

原创 8、Python中的字符串:字符串的基本操作及再论对象是否可变

当发现代码中需要创建一个新的字符串对象时,Python解释器会首先检查字符串驻留池,如果已经存在相同的字符串,则直接返回该字符串对象的引用,而不是创建一个新的字符串。字符串驻留(String Interning)是一种优化技术,由于字符串对象本身是不可变的,所以,当一个相同的字符串有可能被重复使用时,可以通过把某些字符串驻留在内存中,让这些引用相同字符串的变量,指向常量内存池中的同一个字符串对象,从而节省内存并提高运行速度。关于字符串提供的方法,不用记忆,用到的时候,自行尝试或者检索即可,所以不再展开。

2024-07-05 15:16:06 1015

原创 Python番外篇之代码编译与字节码

其实,在真实场景中,我们需要用到字节码的地方比较少。更多的场景可能反而是在新手学习Python的过程中,遇到不理解的代码运行结果,通过查看字节码指令序列,从而更清晰地理解其中的细节。字节码本身并不复杂,甚至关于字节码的格式、字节码指令,在不同的编程语言虚拟机中的定义,也都是大同小异的,比如Java字节码和Python字节码。关于虚拟机的实现、内存管理机制,也都是基于比较通用的垃圾回收算法的不同实现而已。对字节码感兴趣的,可以查找更多的官网相关资料,进行进一步的研究。

2024-07-04 18:33:25 1097

原创 7、Python之sys模块:容易被忽视,却又很实用

Python的sys模块提供了许多关于Python虚拟机、运行环境相关的很实用的功能,我们可以更加方便地访问和控制运行时环境。本文中的关于sys模块的内容,只是笔者整理的在实用中可能更加常用的功能,对sys模块感兴趣的,可以查看sys相关官方文档学习掌握更多的内容。

2024-07-04 06:30:00 617

原创 6、Python之变量:变或不变?结合字节码及内存动态看变量的底层细节

字符串、元组类型的变量,也是属于值类型的变量,其赋值修改过程,都是类似于整型变量的上述过程,都是先在常量池中构建对象,然后变量中存储对象的id,修改变量值,其实就是创建新的对象,变量存储新的对象的id的过程。有的教材中,或者Python大神说,id()函数返回一个对象在内存中的地址,其实是不严谨的,id()就是返回一个对象的身份标识,这个身份标识,可以是对象在内存中的地址,也可以不是。接下来,我们通过几行简单的变量赋值的代码,来看变量在内存中的实际存储的动态变化,从而更加清晰地理解变量的变与不变。

2024-07-03 06:45:00 1502

原创 Python番外篇之责任转移:有关于虚拟机编程语言的往事

关于最好的编程语言的论战,其实,见仁见智,更多的是对编程语言设计背后思想的认同与否。我们也不应该随便地说出,Python是最好的编程语言,而应该更加客观、理性的说,“Python的设计理念、思想跟我比较契合,我用起来特别舒服”,虽然说是理性、客观,其实,那还是一种感觉。虽然,人类可读了,但是太底层了,要实现一个简单的需求,都要堆砌很多个指令,很繁琐,编程起来很痛苦。不好的一定会不断被更好的所取代,但是,从来就没有最好的,只有在特定场景、特定需求下的更好的,最适合的才是更好的。编程语言的好用与否,也是如此。

2024-07-02 06:45:00 879

原创 结合数据索引结构看SQL的真实执行过程

2、加入最终返回的字段比较多,执行引擎在执行的过程中,可能决定不将所有字段都放入sort_buffer,可能只放主键id和参与排序的字段,然后排序完成之后,需要再按序进行一次回表的操作,获取用户需要的所有字段,然后再返回给用户。这种查询场景,叫做”回表“。回表的操作,会增加磁盘IO的次数,如果辅助索引结构中已经包含了用户需要的所有字段,则可以避免回表的操作,这时候的索引叫做”覆盖索引“。实际上SQL的执行要考虑的真实场景比较复杂,本文为了便于描述与理解,做了相应的简化,感兴趣的可以自行研究。

2024-07-01 08:26:20 1493

原创 数学之美:SQL语句的编译与关系代数

关系型数据背后的关系代数及SQL语句的编译及优化

2024-06-29 07:18:42 1056

原创 5、Python之rich:GUI之外,终端呈现也能玩出花

武装终端,更加美观、灵活的数据呈现效果

2024-06-28 13:47:34 913

原创 4、Python之数据输出:你真的会用print函数吗

用了这么多年Python,你真的会用print()函数吗?

2024-06-27 13:15:08 709

原创 3、Python之Faker:更巧妙的批量数据生成

虽然Faker模块提供了很多用于生成测试数据的方法,但是,有时候我们还是有一些自定义的测试数据生成规则的需要。这时候,我们可以用random模块来实现自定义的特定需求。当然,Faker模块也提供了我们进行自定义测试数据Provider类的方法,从而扩展Faker模块的测试数据生成的功能。如果暂时不熟悉面向对象的相关语法,以下代码实例,可以跳过,通常使用random模块依然能够满足需求。# 自定义Provider,用于随机生成性别,男、女、未知,三个取值出现的概率比是100:100:1。

2024-06-26 09:25:12 1113

原创 2、Python之random数据生成:巧妇能为无米之炊

在上面的示例中,涉及到了Python中for循环的使用,以及f-string的语法,这两块比较简单,如果是一个Python新手小白,可以自行百度,或者借助ChatGPT学习一下,很简单的。此外,关于查看内置模块相关函数的定义与用法,可以在PyCharm中,将鼠标悬停在模块的导入语句的random,或者某个函数,比如random.shuffle()上,然后,Mac中,按下Command键的同时,按下鼠标左键,即可打开模块的定义,并跳转到对应的函数定义所在行。我觉得只是不够巧的缘故,足够巧,无米之炊亦可为。

2024-06-25 16:09:18 1009

原创 1、学习Python前的准备工作:欲善其事先利其器

学习Python前的准备工作:欲善其事先利其器

2024-06-24 18:19:31 799

原创 0、一篇文章搞定编程学习的问题,你也可以学会这门手艺、特长

在今后的一段时间内,我会结合一些实际场景写一些关于具体使用Python的文章,尽可能地将编程好玩、有用的一面呈现出来。编程是一门技术,也应该是一门手艺,一种兴趣特长。人生苦短,我用Python。

2024-06-23 17:31:31 1087

原创 两种思维:99%的人是前一种,你呢?

正如爱因斯坦所说:如果给我1小时解答一道决定我生死的问题,我会花55分钟弄清楚这道题到底在问什么。一旦清楚它到底在问什么,剩下的5分钟足够回答这个问题。德鲁克也说过:最重要、最艰难的工作从来不是找到对的答案,而是问出正确的问题。因为世界上最无用、最危险的情况,就是虽然答对了,但是一开始就问错了。所以,你是在用哪一种思维呢。

2024-06-22 20:24:38 737

原创 可行与高效你选哪个:SQL背后的核心算法

经过前面几篇数据库的数据库设计与优化的铺垫之后,一直想着开始进行真正的SQL的优化分析,但是细想下来,还有些工作没有做:其一,数据库管理系统的基本构成全貌,目前仍然缺失的,一直在细节内打转,难免陷入管窥蠡测的困境;其二,对动态的SQL执行大体情况,也是需要进行相应的补充。之后,才能更好地把握数据库的优化。

2024-06-21 14:46:27 1279

原创 位图索引、倒排索引及布隆过滤

介绍了几种索引的结构及使用,我们需要始终回归到数据库设计与优化的基本原则:尽量减少磁盘的IO操作,不管是聚簇索引、辅助索引,还是位图索引、倒排索引,或者是布隆过滤器的使用,其实都在是落实这项基本原则。

2024-06-19 11:34:12 972

原创 数据库索引、河神、樵夫与《新华字典》

实际检索中,如果从辅助索引检索,则在不是覆盖索引(懂的都懂,以后再说)的情况下,定位到主键的键值后,还要到聚簇索引中找到真正数据页,这一步叫做回表。如果索引/键不能唯一标识出目标数据,符合条件的可能有多条,怎么确保符合条件的都被找到呢,所以数据必须以有序的方式进行存储,从第一个符合条件的开始,直到找到第一个不符合条件的,就可以停止查找了。数据库有序真正的困境在于,从数据库表创建之时起,数据的每一次增删改,都要保证数据库的有序,索引的个数越多,增删改维持数据有序的成本越大……选择了一种,就要放弃其他的可能。

2024-06-16 11:13:33 1009

原创 关于Cache与延迟的思考

Cache技术的应用带来的新问题,一方面是数据一致性的问题,缓存数据与数据源的不一致,必然带来数据同步的问题,在一些场景下,我们甚至放弃了强一致性,弱一致性、最终一致性似乎也变得可以接受;而关于最优解的探求,我们的目标一定是全局最优解,但是很多情况下,并不现实,同样是各种可见、不可见的约束的共同作用下,最终我们得到的只能是可接受的局部最优解。主存有瓶颈,理所当然的就会想到引入更快的存储介质,比如SRAM,所以,最早的Cache是以硬件的形式被引入到分级存储体系中,用于尽量弥合CPU与主存之间速度的差异。

2024-06-15 11:47:14 797

原创 从冯诺依曼体系看数据库设计与优化

2、内存属于易失性存储介质,数据需要持久化存储到辅助存储器/外部存储器中,典型的是磁盘,从磁盘读写数据的时间延迟一般是毫秒(ms)级,跟内存读取速度,存在10^6(百万级)的差距,延迟的大头在于寻道时间+旋转延迟,批量顺序磁盘IO操作,可以更加充分地发挥磁盘性能,使得磁盘的延迟无限趋近于传输时间;可以粗略的认为,发生在计算机中的每一件事情,不论是指令的执行还是数据的处理,都是作用于驻留在内存的信息上的(尽管实际上通常会将所使用的数据转移到高速缓存中)。例如,循环结构中的变量在每次循环迭代时都会被重复访问。

2024-06-14 14:33:53 962

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除