一者春、容器、迭代器预茄、生成器
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))
生成器.PNG
列表推倒
列表推導:可以加條件 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 類
- 靜態(tài)方法(類)
- @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])
迭代器與生成器
類方法
匿名函數