迭代器
提供迭代方法的容器称为迭代器,通常接触的迭代器有序列(列表,元组,字符串)和字典
字典: {键:项}
links = {"爸爸":"father",\
"妈妈":"mother",\"妹妹":"sister"}
for each in links:
print("%s -> %s" % (each,links[each])) %s表示字符串
结果:
爸爸 -> father
妈妈 -> mother
妹妹 -> sister
关于迭代,Python有两个BIF,分别是:
iter()
next()
>>> string = "fishc"
>>> it = iter(string)
>>> while True:
try:
each = next(it)
except StopIteration:
break
print(each)
与for循环结果相同:
>>> for each in string:
print(each)
魔法方法:
__iter()__
__next()__
#斐波那契数列,一个数是前两个数的和
class Fibs:
def __init__(self):
self.a = 0
self.b = 1
def __iter__(self):
return self
def __next__(self):
self.a, self.b=self.b, self.a + self. 译为:self.a = self.b 同时 self.b = self.a+self.b ,一定是同时,不能分开写
return self.a
>>> fibs = Fibs():
>>> for each in fibs:
if each < 20:
print(each)
生成器
def fibs():
a = 0
b = 1
while True:
a,b = b,a+b
yield a
for each in fibs():
if each <20:
print(each)
列表推导式
求100 以内,能被2整除,但不能被3整除的所有整数:
>>> a = [i for i in range(100) if not(i % 2) and (i % 3)]
>>> a
[2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46, 50, 52, 56, 58, 62, 64, 68, 70, 74, 76, 80, 82, 86, 88, 92, 94, 98]
如果i是偶数,则 i%2 == 0 , 0 表示False,not(i % 2) 表示1,True
如果i不能被3整除,则i%3不等于0,表示True
True and True 表示True , 但是注意 False and False 还是等于 False
字典推导式
>>> b = {i:i%2==0 for i in range(10)}
>>> b
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}
集合推导式
>>> c = {i for i in [1,1,2,3,3,4,5,5,6,7,7]} (去除重复数)
>>> c
{1, 2, 3, 4, 5, 6, 7}
生成器推导式 用小括号括起来
>>> e = (i for i in range(10))
>>> e
<generator object <genexpr> at 0x0000005D9EDE87D8>
>>> next(e)
0
>>> next(e)
1
>>> sum (i for i in range(10) if i %2 == 0)
20
第十三章 模块
导入模块:
import 模块名
from 模块名 import函数名
import 模块名 as 新名字
__name__ == "__main__":
test()
有了这个代码可以确保只有单独运行某一代码时才会执行 test()函数
查看文件路径
查看说明
更常用print(),给人看
查看变量说明
但是并不是所有这些名字对我们都有用,所以要过滤一些不需要的东西
用__all__属性
不是所有的模块都有 __all__属性,
如果一个模块设置了 __all__属性,那么使用 from timeit import * 这样的形式导入命名空间,就只有__all__属性这个列表里边的名字才会被导入,其他的名字不受影响
如果没有设置__all__属性,那么使用 from timeit import * 这样的形式导入命名空间,就会把所有不以下划线开头的名字都导入到当前的命名空间
所以建议在编写模块时,将对外提供的接口函数和类都设置到__all__属性这个列表里
课后题:
>>> a = range(5)
>>> it = iter(a)
>>> while True:
try:
each = next(it)
except StopIteration:
break
print(each)