欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第1周总结

程序员文章站 2024-01-29 13:52:16
...

1 面向对象还是面向过程

没有思路的时候,以实现功能为主,先用面向过程的方法把功能排下来。写到一定程度,就可以把功能内聚,入口单一、出口单一的一部分,归总到一个函数中,做成面向对象的方法。如果多个函数实现的都是针对同一件事情,就可以放在一个类中。当然封装涉及到传参、构造函数、类属性、类方法、私有变量等内容。

2 怎么使用框架

框架只是一个高度的抽象集合,通常已经封装好各种的常用功能。如果在使用框架的时候,发现框架已经无法满足某些个性化的需求,比如产品需要与数据库快速交互,又或者开发过程中需要经常直接更改数据库表结构,不希望被框架束缚,这个时候就可以根据需要替换、自己重写框架中的功能,比如数据库交互的部分、或者比如用户验证的部分。

实际上,Django 可以只剩下 http、request/response 部分,其余部分都可以自己重新写,而剩下的这部分,完全可以换成其他的框架,比如 Flask 或者 Tornado,所以框架是为人服务的,而不是框架束缚人。当然,能够重写框架的时候,往往已经到了架构师的级别。在最开始,就要根据公司实际情况(包括人员水平、产品属性等),考虑上不上框架、上什么框架、使用框架中的那些模块,而决策的能力是构建在多年积累的基础上,以及对公司实际情况的权衡与把握。

3 性价比高的学习投资

所以实际上而言,性价比最高的学习投资是对语言、数据结构、软件工程、数据库、工具与算法等基础知识的熟练掌握。有一定基础知识之后,再去学习框架、甚至看框架的源码,相对会比较轻松。

3.1 语言

总的来说,先把一种语言熟练掌握,知道这门语言的边界在哪里,把可以做的事情都做一遍或者了解到,把这门语言能做得好的事情尽量熟透。避免在一门语言不熟悉的情况下,去学习多门语言,造成精力分散、且没有形成生产力。

对语言的基本要求是熟悉语言各种常用功能,进阶一步是深刻理解语言自带的标准库(built-in standard library)。对于 Python 而言,Python 的标准库中自带了大量的内置模块,好处是随用随取,不会存在当前 Python 版本与这些模块的版本冲突。而且这些库已经进行了大量优化,比如底层用C语言实现、使用了最优算法等。况且这些标准库在常年使用中久经考验,bug 相对少很多。

标准库中比如 Python 的 logging, json, Queue, Thread, zip, time, glob 等模块可能在平常会用到。当然, Python 的魅力之一是大众造*,如果内置的标准库满足不了日常要求时,有大量的第三方包可以使用,甚至可以自己写第三方包贡献到 pypi。比如内置的 urllib 不好用时,可以使用第三方的包 requests。对于第三方包,要了解的就更多,比如下载要用 requests。做图片处理要用 pillow, imagehash 和 distance。数据分析要用 pandas 和 jupyter notebook。甚至一些供应商提供的 sdk,比如七牛提供的 qiniu,可以方便上传图片到七牛的空间。

3.2 数据结构

  • 拿到一个变量,首先要用 type() 查看类型,再做相应的处理。
  • 对于字符型。str()转换、split、切片等要熟练。
  • 整型:其中长整型涉及到32位数的概念。16进制转换成10进制、转换成2进制。有些2进制数字还�要补齐前面的0,包括位数齐整。
  • float:两个数相除,在 Python 2 中得到的结果是整数部分,小数部分被截掉。所以要对被除数进行 float 转换, float(A)/B。
  • list:创建、append()、取值。
  • dict:创建、增加内容、取值,以及与 json 对象或者 json 文件的相互转化
  • set:创建、交集 &,并集 |,差集 -,增加 add.()
  • 遍历迭代:
  • 字符与 list 的迭代都可以用 for i in X: 格式
  • 对于字典而言,获取键与值可以使用 for k,v in some_dict:,然而更合理的是在 Python 2 里面使用 for k,v in some_dict.iteritems():,Python 3 更改为 for k,v in some_dict.items():,因为对于比较大的 json 转换来的 dict,如果不知用 .iteritem(),直接就会报错说 dict 太大,无法打开 unpack。
  • 列表解析式,举例
    • 基础款:a = [x for x in a_list]
    • 改进款:a = [x+x for x in a_list]
    • 函数款:a = [f(x) for x in a_list]
    • 字典型:a = [k for k,v in a_dict.items]
    • 筛选条件:a = [x for x in a_list if x > 0]
  • json:
    • 写入文件
import json
data = {
  "key1": "value1",
  "key2": "value2"
}

with open("somefile.json", "w") as f:
    json.dump(data, f)
  • 从文件中读出来
with open("somefile.json", "w") as f:
    data = json.load(f)
  • 对文件的处理,使用 json.load/json.dump,而对于非文件的处理,使用 json.loads/json.dumps 后面多了一个 s

  • list形式的字符串,要看是否是 unicode,如果是 Python 2 中需要 decode 到 utf-8编码

# 首先用 type() 确定是否是 unicode,如果是 unicode,Python 2 中需要 decode 到 utf-8编码
a_list = u'["Monday", "Tuesday", "Wednesday"]'
a_list_trans = json.loads(u.decode('utf8'))

或者参照 Convert string representation of list to list in Python 使用 ast,好处是无须解码,坏处是 ast 比较小众。

import ast
a_list = u'["Monday", "Tuesday", "Wednesday"]'
a_list_trans = ast.literal_eval(x)

3.3 软件工程

面向对象内容是基础。

  • 如果要把一个文件目录做成 Python 可识别的 package,至少在目录中有一个空的 __init__.py 文件。
  • 不同文件的 py 文件、类、方法的相互引用
  • 继承:是否调用父类的构造函数,比如多线程包 Thread 的使用时,就需要在继承了 Thread 类以后,在子类的构造函数中调用父类的构造函数。
  • 实例化传参,在构造函数接收参数,并在类中使用。比如外部的一个序列 q = Queue.Queue() 就要传入到多线程中,确保这个序列是一个私有的变量。
  • 私有变量的使用
  • self.__class__. 的使用

设计模式的使用:

  • 工厂模式:多种相似的类,公用父类中的同样方法
  • 生产者-消费者模式:队列 Queue 中放入需要下载的 url,用多线程的类去队列中取 url 来下载。生成队列的这个类,就是生产者。多线程下载的这个类,就是消费者。当然队列的处理器可以是 celery,队列可以存放在 RabbitMQ, Redis 或者 Memcached,这样的好处是单机出现问题的时候,分布式的储存结构确保了数据的安全性。

3.4 数据库

对于后端而言,数据库的掌握很重要,不管是实现业务逻辑,还是进行数据分析,都离不开对数据库的使用。

数据库的基本操作,增删查改(CRUD,create, retrieve, update and delete)。主要是 MySQL 的操作,包括多表联合查询。另外,对于一个不了解的数据库,不能一上来就使用 SELECT * FROM SOME_TABLE,因为如果查询的这张表比较大,比如25G,那么不限制条数的查询就会被系统杀掉进程,直接退出 MySQL,所以这时候需要在后面加上限定查询记录条数的语句,比如 SELECT * FROM SOME_TABLE LIMIT 5,只插5条。查看表结构使用 DESCRIBE SOME_TABLE 或者 DESC SOME_TABLE。另外还需要了解,group by, order by, count等。

Python (或者其他语言)中对数据库的增删查改,基本分为:

  • 基本款:MySQLdb 或者 PyMySQL,直接在 Python 中写 SQL 语言。那么更进一步,如何把这个基本的 MySQLdb 整合进框架中,替换框架自己的数据库交互模块,是一个比较大的封装。
  • ORM:对象关系映射。就是用 Python 操作对象的形式,进行与数据库的交互。最知名的包括 SQLAlchemy(主要 Flask 使用,也可以单独使用),Django ORM(Django 内置,一般不单独使用,另外 Django 的 ORM 经常被人诟病速度慢),pymongo(操作 MongoDB)。

数据库的导入导出,特别是大表的处理,以及导出为 csv 文件,便于 pandas 处理。或者 pandas 直接读取 MySQL 的数据,注意使用 chunksize 避免内存爆炸。Django 可以自己识别数据库结构,用 inspectdb 自动生成 models,然而这会导致一些数据关系的遗失和错误,比如数据库中 INT设定超过了255,在 Django 中就会报错,而且主键、外键等也可能出错。另外 Django 的导入大表容易出错,有了结构以后,建议直接用 MySQL 复制进去数据。

对于多个数据库的操作,要设置多个连接。要么自己设计出相应的类,要么使用 Django 的数据库路由等。

3.5 工具

服务器上的工具需要掌握

  • linux 基本命令,scp 进行本地与服务器之间的文件拷贝。scp -r 则是拷贝目录。
  • vim 的跳转、查找、编辑保存退出,删除 .swap 文件。
  • git 的操作
  • oh-my-zsh 好看
  • iTerms 轻松实现多窗口
  • tmux 的 session 确保shell停留在上次的状态,是神器

3.6 算法

对于遍历,需要考虑优化:

  • 数据是否可以用 hash
  • 对于 hash 的对比,是否可以先考虑
    • 前面几个字符先分类 hash
    • 比较 hash 的长度
    • 比较 hash 的和
  • hash 是16进制的时候,算哈明距离(hamming distance)需要考虑先转化成2进制。

对于图片和文字的处理,都可以进行 hash。

  • 图片可以用 dHash, aHash, pHash
  • 图片还可以用 pillow 中的 Image.histogram() 把 768 个点的RGB累计直方图算出来

对于相似程度,考虑计算各种距离:

  • 余弦
  • 哈明距离:识别 hash 的相似度
  • 皮尔森系数 Pearson correlation:对比两个向量的相似度。可以针对图片的熵,或者累计直方图形成的向量

上一篇: Mysql知识点

下一篇: oracle知识点