1.迭代器:通过iter()方法获得了list的迭代对象,然后就可以通过next()方法来访问list中的元素了,当容器中没有可访问元素时,会抛出StopIteration异常终止迭代器
data = [1,2,3,4,5] itr = iter(data) print(itr.__next__())
2.自定义迭代器:需要实现__iter__,__next__方法
class CustomRange: def _init__(self, length): self.inx = 0 self.length = length def __iter__(self): return self def __next__(self): if self.inx < self.length: val = self.idx self.idx += 2 return val else: raise StopIteration if __name__ == "__main__": cr = CustomRange(20) print(next(cr)) print(next(cr))
3.生成器,yield
4.生成器与迭代器的区别:
> 通过实现迭代器协议对应的__iter__()和__next__()方法,可以自定义迭代器。对于可迭代对象,for语句可以通过iter()方法获取迭代器,并且通过next方法获取容器的下一个元素
> 生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__()和__next__()方法
> 生成器通过生成器函数产生,生成器函数可以通过常规的def来定义,但是不用return返回,而是用yield一次返回一个结果
5.列表的api
# append,在后方插入一个元素 # insert(index, obj),插入一个元素 # pop(index),默认移除最后一个元素 # remove(obj),移除第一个匹配的元素,一次删除一个 # index(obj),找到第一个匹配到的元素的索引,没有则抛异常 # count(obj),统计匹配到的元素的次数 # extend(seq),在列表末尾追加序列中的元素 # reverse(),列表反转 # sort([Func]),排序,根据ASCII码从大到小进行排 ll = [(1,5,4),(1,2,3,6,3),(5,1,4,3)] # 按照每个元素的长度大小进行排序 ll.sort(key=lambda x: len(x), reverse=True)
6.复制
# 引用复制 a = [1,2,3] b = a # 非引用复制 a = [1,2,3] b = a[:]
# copy,deepcopy
a = [1,2,['a', 'b']]
b = a #将a的引用给b,无论a如何变化,b都将保持跟随,因为a,b指向的是同一个
c = copy.copy(a) # 浅拷贝,只拷贝父对象,不会拷贝父对象中的子对象,对子对象拷贝的仍然是子对象的引用。即:a.append(6),c不会变化,如果a[2].append("c"),c会变化。c中的子对象会跟随a中的子对象进行变化。
d = copy.deepcopy(a) # 深拷贝,与a完全没有任何瓜葛了
7.列表推导
ret = [ i for i in [1,2,3] if i >2]
8.枚举
for inx, value in enumerate([11,22,33]): print inx, value
9.使用list实现一个栈
# 使用list实现栈
# coding:utf-8
class Stack:
"""
栈
"""
_arr = []
capcity = 0
size = 0
def __init__(self, capcity=100):
self.capcity = capcity
def push(self, element):
if self.is_full:
raise Exception("The Stack is FULL")
self._arr.append(element)
self.size += 1
def pop(self):
if not self.is_empty:
del self._arr[self.size - 1]
self.size -= 1
else:
raise Exception("The Stack is EMPTY")
def is_empty(self):
if self.size == 0:
return True
return False
@property
def foo(self):
return self._foo
@property
def is_full(self):
if self.size >= self.capcity:
return True
return False
def get_stack(self):
if not self.is_empty:
return self._arr[self.size - 1]
raise Exception("The stack is EMPTY")
def __str__(self):
msg = ["Stack: "]
if self.is_empty:
return "Stack is EMPTY!"
for arr in self._arr:
msg.append(str(arr) + " ")
return "".join(msg)
10.字典排序
d = {3:3,8:-9,1:1,0:0} s = sorted(d.items(), key=lambda x:x[1], reverse=False)
> dict.fromkeys(seq)
> dict.fromkeys(seq, 0)
> d.get("1", "key not found") #防治抛出异常
> d.update({111:111}),如果有这个key,就更新value,没有则添加到d中
9