一、容器、迭代器、生成器
http://python.jobbole.com/87805/
容器
一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。尽管绝大多数容器都提供了某种方式来获取其中的每一个元素,但这并不是容器本身提供的能力,而是可迭代对象赋予了容器这种能力。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象),在Python中,常见的容器对象有:
list, deque, ….
set, frozensets, ….
dict, defaultdict, OrderedDict, Counter, ….
tuple, namedtuple, …
str
迭代器和生成器
https://www.zhihu.com/question/20829330
迭代器
使用内建的工厂函数iter(iterable)可以获取迭代器对象:iter(range(5));迭代器支持迭代协议的对象:for、in、not in;
生成器
当需要有一百万个元素的数组时,如果直接写出数组,将会保存到内存,那么会造成资源浪费。生成器就是在你需要的时候,会生成这个数组,占用空间极小。
生成器一般都是迭代器,但是迭代器不一定是生成器;
def range1(n):
i = 0
r = []
while i < n:
i += 1
r.append(i)
return r
def range2(n):
i = 0
while i < n:
i += 1
yield i
- 简写如下
[i for i in range(100)]
- 用 圆括号 代替 中括号, 就能得到一个生成器
(i for i in range(100))
列表推倒
列表推导:可以加条件 if,可以进行运算
字典推导:和列表推导一样
集合推到:{}
l = [i for i in range(10)]
# 相当于
l = []
for i in range(10):
l.append(i)
# 更复杂的例子如下
l = [i for i in range(10) if i % 2 == 0]
# 相当于
l = []
for i in range(10):
if i % 2 == 0:
l.append(i)
l = [str(i) for i in range(10)]
- 字典推倒
{k: 1 for k in range(10)}
{str(k): 1 for k in range(10)}
print({str(k): 1 for k in range(10)})
- 集合推到
>>> {i.lower() for i in ['A','B']}
{'a', 'b'}
>>> a = {i.lower() for i in ['A','B']}
>>> type(a)
<class 'set'>
>>>
python 类
- 静态方法(类)
- @staticmethod 修饰的方法
- 只能用 类.方法() 的方式来调用
- 实际上相当于一个普通函数
- 放到类里只是为了看上去整齐点
- 没有额外的参数
- 类方法(类、实例子)
- @classmethod 修饰的方法
- 可以用 类.方法() 和 实例.方法() 来调用
- 有一个 cls 参数代表调用者的 class
- 实例方法(实例)
- 普通方法
- 有一个 self 参数
- 只能被 实例.方法() 调用
python 参数
-
*args **kwargs
- 多参数和关键字参数
-
def log(*args):
- args 是一个包含了所有参数的 list
print(*args)
- log(1, 2, 3, 4)
-
匿名函数
- lambda 函数
f = lambda a, b: a + b
- 上面一句相当于下面一句
def add(a, b): return a + b f = add
- 匿名函数中只能有一个语句
- 如果代码复杂,在 Python 中就不应该使用匿名函数
sorted(d, key=lambda part: part[0])
迭代器与生成器
类方法
匿名函数