在日常生活中,随机数我们很多时候都会经常接触到,比如说游戏抽卡,随机到的数值就可以决定这波抽卡的结果是欧皇附体、正常水平还是直接吃井(保底)。正如其它编程语言一样,Python也有生成随机数的功能,其中有一个很重要的模块即是random,为了加深记忆,这篇文章记录一下该模块的一些主要的函数及其功能。
MySQL常见的与日期相关的函数
在MySQL中,需要用到日期相关的函数的场景还是非常多的,不论是时间戳和日期的转换,还是说不同日期间的数据比较,因此有必要记录一些常见的日期函数,巩固自己在这方面的知识点。
在开始本篇文章之前,先说一下MySQL常见的三种时间类型, date, datetime和timestamp三者之间的区别。
- date表示的是YYYY-MM-DD的形式,只能具体到日,而datetime和timestamp均可以表示到时分秒
- timestamp可以表示的时间范围为1970-01-01 00:00:01到2038-01-19 03:14:07,而datetime的话可以表示的时间会比较大,从 1000-01-01 00:00:00 到 9999-12-31 23:59:59
- timestamp表示的时间会根据当前数据库所在时区进行转换(存储时按照UTC时区存储,需要用的时候再转成数据库所在时区),而datetime的话时间是固定住的,不会因为时区变化而显示不同的时间
- timestamp占用4个字节存储,datetime占用8个字节存储,date占用3个字节存储
MySQL各部分的执行顺序
前几天参加了一个公司的面试,到了后面面试官出了一个SQL相关的题目:
给定访问id,用户id,页面id,访问时间,求出最近一个月对id为100的页面有访问记录且访问该页面次数大于10次的用户id
数据的形式类似于以下这样(表名为views):
view_id | user_id | page_id | view_time |
---|---|---|---|
1 | abc | 100 | 2021-01-15 |
2 | def | 101 | 2021-02-01 |
… | … | … | … |
Python如何处理单行输入的多个数字,以及map函数的使用
这段时间参加了几个公司的在线笔试,发现了一个很有意思的现象,因为不同公司使用的测试平台不同,所以将输入的数据告诉代码的方式也会有所区别。一种是“保姆”类型,即作为应试者,并不需要考虑如何将输入转换成机器能看得懂的代码,而只要实现解决问题的特定函数就可以了。输入的话已经有固定的代码实现了。典型例子比如牛客、Leetcode以及HackerRank。另外一种是应试者需要考虑如何将输入转变为代码的全过程,这就有些像本科时做的那种Online Judge,给个题目,然后编程板里全是空白的,需要从零开始写起。
比如说有这样的输入样例,其中第一行代表总共有多少数字,而第二行的输入代表每个数字的内容。
5
1 2 3 4 5
如何对Python中的字典进行排序
今天想到了去年在面一家startup的时候碰到的一个面试题。给定一组json字符串构成的API回调数据,按照某个特定的排列顺序进行输出。类似于下面这个栗子。
1 | API_response = { |
我们可以很容易地想到在SQL环境下的操作方法,即直接order by。但在Python的环境下,如果我们需要按照duration从小到大的顺序排列,且在满足相同duration的时候,按照distance从大到小输出对应的数据,应该如何操作呢?
Python的global和nonlocal关键字
今天在查阅Python的官方文档的时候,注意到了global和nonlocal这两个关键字,它们都和函数的作用域有关联,且效果比较类似,都可以修改函数定义域之外的特定值,但是两者之间也有着一定区别。
结合官方文档以及自己的代码实践,我对它们的作用进行了一些总结。
Global关键字修饰的是整个代码块中的全局变量。即加上global关键字后,本来只能在某一代码块(比如函数)作用域里起效果的局部变量,就升级成在整个代码中都可以读取的全局变量了。
如果说在代码最外层已经有该变量的定义(不论是否加上global关键字),或者在其它代码块里已经有该全局变量的定义,那么在代码块里面对同名变量加上global关键字后,如果修改代码块里面该变量的值,那么所有同名的全局变量都会发生改变。
一些目前自己对data方面的理解和总结
光阴如梭,转眼间又到了新的一年。感觉过去这一年对自己来说确实挺艰南的,不管是上半年的网课,还是下半年的戛然而止的第一份工,亦或是之后简历石沉大海,以及屡败屡战的求职经历,都为自己的这一年增加了不少魔幻的特征。
虽然说这第一份data相关的工作比较短暂,不过自己从中也积累了一些经验,也对整个项目作出了相关的贡献。因此感觉还是有必要记录以下自己在这过程中积累的一些data相关的理解吧。(不定期更新)
为什么我们需要数据仓库
当数据量相对较小的时候,一般都是使用数据库来进行数据的存储和读取,常见的主流关系型数据库包括MySQL、SQL Server以及PostgreSQL等。但是当业务不断发展,数据量不断扩大的时候,使用数据库就会遇到一定的瓶颈。
- 随着数据量的增加,查询效率降低 (数据库层面有读写分离、分库分表等方法,但当数据量更大的时候,这些解决方法依然存在瓶颈)
- 进行业务查询的时候,表的数量繁多,同时由于范式约束,很多时候查询需要对不同表进行各种join,费时
- 表里可能有非法字段,影响查询结果
当遇到这些瓶颈的时候,可以考虑使用数据仓库来解决这些问题。笔者之前做的是离线数仓,因此下文中的数仓,如无特别说明,均指离线数仓。
离线数仓和数据库的一个很大的区别在于,数据库是需要同时支持实时的增删查改操作的,而离线数仓的话主要专注于读取数据这一方面,因为离线数仓主要存储的是历史数据,所以在现实的生产环境中,根据实际需要,可能一天写一次或两次历史数据,也有可能几天写一次数据,因此它对于写的时效性要求不是很高(一般来说数据写入数仓都是在凌晨进行,可以用像Airflow这样的工具来进行调度),所以它的设计主要专注于读取数据的效率。
SQL的开窗函数(Window Function)
在使用数据库/数据仓库的过程中,我们可能会遇到以下几个情况:
- 需要得到的数据既要包括聚合后的数据, 也需要包括没被聚合的字段
- 需要获取多个字段前n条的数据
这个时候如果我们使用传统的group by聚合函数的话,可能会出现以下的问题,
数据仓库的星型模型和雪花模型
最近面试的时候被问到了星型模型和雪花模型的问题,然后把星座模型当成雪花模型说了…为了巩固自己在这一方面的知识,决定写一篇文章来记录一下。
星型模型、雪花模型和星座模型是数据仓库维度建模中重要的三种模型,接下来说一下它们的特点以及相互间的联系。
Python中and和or的用法
之前一直以为and和or都是用来进行布尔判断的,不过在 Learn Python the hard way 一书的Boolean Practice一节中看到了一个Common Question:
Why does “test” and “test” return “test” or 1 and 1 return 1 instead of True?
这引起了我的好奇,它们返回的可以是其它类型的值么?
于是我查了下相关的文档,发现and和or的运算规律是这样的: