python语言特性
- python是动态强类型语言
- 静态类型语言是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求.
- 动态类型语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。
- 强类型语言是一旦变量的类型被确定,就不能转化的语言。实际上所谓的貌似转化,都是通过中间变量来达到,原本的变量的类型肯定是没有变化的。
弱类型语言则反之,一个变量的类型是由其应用上下文确定的。比如语言直接支持字符串和整数可以直接用 + 号搞定。当然,在支持运算符重载的强类型语言中也能通过外部实现的方式在形式上做到这一点,不过这个是完全不一样的内涵 - 通常的说,java/python都算是强类型的,而VB/Perl/C都是弱类型的.
不过相比于动态/静态语言的分类,强类型/弱类型更多的是一个相对的概念。
python作为后端语言优缺点
优点
- 胶水语言, 轮子多,应用广泛(爬虫,网站后端,数据分析,量化投资,机器学习)
- 语言灵活,生产力高
缺点
- 性能问题,代码维护问题(动态语言一时爽,代码重构火葬场),python2/3兼容问题
鸭子类型
- 关注点在对象的行为,而不是类型(duck typing)
- 比如 file, StringIO, socket对象都支持read/write方法(file like object)
- 再比如定义了
__iter__
魔术方法的对象可以用for迭代 - 鸭子类型更关注接口而不是类型
monkey patch
- monkey patch(猴子补丁) 就是运行时替换
- 比如gevent 库需要修改内置的 socket
from gevent import monkey; monkey.patch_socket()
将内置的阻塞的socket替换成非阻塞的socket
import time
print(time.time())
def _time():
return 1234
time.time = _time
print(time.time())
自省 Introspection
- 运行时判断一个对象的类型的能力
- Python一切皆对象, 用 type, id, isinstance 获取对象类型信息
- Inspect 模块提供了更多获取对象信息的函数
列表和字典推导
- 列表推导时
[i for i in range(10) if i%2 == 0]
字典推导式:
a = ['a', 'b', 'c']
b = [1, 2, 3]
# d = {'a': 1, 'b': 2, 'c': 3}
d = {}
for i in range(len(a)):
d[a[i]] = b[i]
print(d)
- 字典推导式
d = {k: v for k, v in zip(a, b)}
print(d)
- 生成器推导式,可节省内存
l = (i for i in range(10) if i%2 == 0)
for i in l:print(i)
Python之禅
- Time Peters 编写的关于Python编程的准则
- import this
Python可变对象和不可变对象
- 不可变对象: bool、int、float、tuple、str、frozenset
- 可变对象:list、set、dict
Python *args, **kwargs
含义:都是用来处理可变参数
*args 被打包成tuple
def args(*args):
print(type(args), args)
for idx,i in enumerate(args):
print(idx,i)
args(1,2,3)
# 第二种调用方法
args(*[1,2,3])
out:<class 'tuple'> (1, 2, 3) 0 1 1 2 2 3
- **kwargs被打包成dict
def print_kwargs(**kwargs):
print(type(kwargs), kwargs)
for k, v in kwargs.items():
print(k,v)
print_kwargs(a=1, b=2)
# 第二种调用方法
print_kwargs(**dict(a=1, b=2))
out:<class 'dict'> {'a': 1, 'b': 2} a 1 b 2
def print_all(a, *args, **kwargs):
print(a)
if args:
print(args)
if kwargs:
print(kwargs)
print_all('hello', 'one', name='meto')
生成器 Generator
- 生成器就是可以生成值的函数
- 当一个函数里有了yield关键字就成了生成器
- 生成器可以挂起执行并且保持当前执行的状态
单元测试相关的库
- nose/pytest 较为常用
- mock 模块用来模拟替换网络请求等
- coverage 统计测试覆盖率