工作中我遇到过哪些 Python 的坑?

144 阅读3分钟
直播亮点
Python 最近几年的火热程度毋庸置疑,无论是哪个编程语言排行榜,它都能雷打不动地占据前几名的位置。

但 Python 也是一门易学难精的语言,虽然你可以很快用它写出简单可用的小程序,但如果你在工作中需要用 Python 来构建更复杂的项目,前方就会有无数的坑在等着你,一不留神就会在其中浪费不少时间和精力。

本次直播,尹会生老师将结合自己的实战经验,为你一一剖析那些在工作中最常见的坑,帮你提升工作效率,同时也让你了解更多的 Python 高阶技能。

python适合做什么

  • 脚本
    • 封装API
    • 自动化运维 自动化测试
  • 文本处理
    • 财务统计 文字相关 正则表达
    • 文字的识别 调用深度学习的库
    • 文本合并
    • 爬虫的数据不是规范化的 需要进行处理
  • 网站开发
    • 内部需求阔地
      • 简单的界面、RestfulApi
      • 图形展示类的需求
      • 舆情监控
    • WEB框架 Django、Flask
  • 调度系统
    • 程序耦合
    • 调度系统
    • 集群间的调度 组合、联动
  • 科学计算
    • Numpy Pandas
  • 爬虫
    • Beautifulsoup、urllib
  • 机器学习
  • 编程入门

  • 初期用python 实现快速的功能落地
  • 后期并发量大了就要用Go、java重构

1.语法

  • 1.字符串驻留
    • python一切皆对象
    • 长度0 a-z A-Z 会驻留
    • 解释器认为两个字符串是一样的,纯字符的形式 虽然声明了两次 也认为是一样的
      • 优点就是 可以节约大量的内存 对于早期的服务器有效果;对于现代的服务器
      • a = "apple" b = "apple" a is b True
    • 有特殊字符串就不行
      • a = "apple!" b = "apple!" a is b False
  • 2.相同值的不可变对象
    • dict1 = dict()

常规的key冲突应该维护一个链表 python直接给覆盖了

In [1]: dict1 = dict()

In [2]: dict1[1] = "golang"

In [3]: dict1[1.0] = "python"

In [4]: dict1
Out[4]: {1: 'python'}

In [5]: dict1.keys()
Out[5]: [1]

In [6]: 1==1.0
Out[6]: True
  • 3 生成器
    • 为了保持协议的一致性
    • 只能调用一次 取一次之后就为空了
In [23]: genexpr = ( lambda x: x*i for i in range(10) )

In [24]: for i in genexpr:
    ...:     print(i(10))
    ...:     
0
10
20
30
40
50
60
70
80
90

In [25]: for i in genexpr:
    ...:     print(i(10))
    ...:     
  • 4.函数传参 函数所有的参数 就是一个对象 有指定的类型
def function1(var1, var2=[]):
	var2.append(var1)
	return var2
    
In [34]: data1= function1(111)

In [35]: print function1(111)
[111, 111]

In [36]: print function1(111)
[111, 111, 111]

In [37]: print function1(111)
[111, 111, 111, 111]

2. 框架

  • 1 数据库连接池
  • 2 数据库字符集
    • emjoy 需要utf8mb4

3. 模块

  • 1.类的多继承 python2 古典类 python3 新式类 继承顺序不一样 一个深度优先 一个广度优先 建议看下mro() python 变量作用域的规则 LEGB规则

  • 2.使用模块而不是造轮子

    • 自己开发的东西 没有考虑多线程 原子性 安全 传输的异常 建议优先考虑自带的模块
    • 如果达不到pythonic的时候 再去找第三方库 再不行就自己写
      • 要求工整 方便后期分析

      • logging模块 可以格式化输出 定制输出内容 比自己写一个要方便

      • urllib - requests - aiohttp(异步请求)

4.缓存

  • 缓存雪崩与降级
    • 缓存穿透解决办法

其他

  • 虚拟环境
  • 装饰器和设计模式
    • function.warps()

    • call callable对象

  • GIL 影响计算行密集的任务