迭代
# 迭代
# Python的迭代不仅可以用在 list 或tuple 上,还可以作用在其他可迭代对象上。
# 迭代字符串
for char in "好好学Python,将来去板砖":
print(char, end=" ")
print("\n")
# 迭代字典
dict = {"济南":"鲁A", "青岛":"鲁B", "烟台":"鲁Y"}
# 键迭代
for keys in dict.keys():
print("键名--->", keys)
print("\n")
# 值迭代
for values in dict.values():
print("值名--->", values)
print("\n")
# 键值对迭代
for item in dict.items():
print("键值对--->", item)
print("\n")
# 迭代list
for x in [x for x in range(6)]:
print("--->{}".format(x))
print("\n")
迭代器?
iter()方法和next()方法
# Python 迭代器
# 迭代器有两个基本的方法:iter() 和 next(),且字符串,
# 列表或元组对象都可用于创建迭代器,迭代器对象可以使用常规 for 语句进行遍历,也可以使用 next() 函数来遍历。
# iter() 传入一个可迭代对象
str1 = "好好学Python,将来去搬砖"
iter1 = iter(str1) # 返回一个对象
iter2 = list(iter(str1)) # 解析迭代对象
print(iter1)
print(iter2)
print("\n")
# 遍历迭代器
for x in iter1:
print(x)
# 元组创建迭代器
iter3 = iter((1,2,3,4))
# next方法遍历迭代器或
while True:
try:
print(next(iter3))
except StopIteration: # 没有元素进行迭代的时候捕获错误
break
一行代码写9*9乘法表
# 一行代码写9*9乘法表
print("\n".join([" ".join("{} x {} = {}\t".format(i,j, i*j) for j in range(1, i+1)) for i in range(1, 10)]))
# 代码解析
# 生成第一个迭代对象
# [for i in range(1, 10)]
# 生成第二个迭代对象
# [(for j in range(1, i+1)) for i in range(1, 10)]
# 计算参数
# [( "{} x {} = {}\t".format(i,j,i*j) for j in range(1, i+1)) for i in range(1, 10)]
# join() 指定方式连接字符串
# print("\n".join([" ".join("{} x {} = {}\t".format(i,j,i*j) for j in range(1, i+1)) for i in range(1, 10)]))
生成器
generator
特点 边循环边计算,配合yield使用 在生成器中调用next()时遇到yeild语句返回
# 生成器
# 但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含 1000 万个元素的列表,
# 不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
# 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?
# 这样就不必创建完整的 list,从而节省大量的空间。
# 在 Python 中,这种一边循环一边计算的机制,称为生成器:generator。
# 在 Python 中,使用了 yield 的函数被称为生成器(generator)。
# 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器
# 生成器创建 [] 改为()
gen = (x * x for x in range(1,5))
print(gen)
# 遍历生成器
for x in gen:
print(x)
# 函数创建生成器
def func():
for j in range(1, 5):
yield j
# print(func())
# 生成器特点,一边循环,一边计算
# 变成 generator 的函数,
# 在每次调用 next() 的时候执行,遇到 yield语句返回,再次执行时从上次返回的 yield 语句处继续执行
def fibon(n):
a = b = 1
for i in range(n):
yield a
a,b = b, a+b
# for i in fibon(100):
# print(i)
def odd():
print ( 'step 1' )
yield ( 1 )
print ( 'step 2' )
yield ( 3 )
print ( 'step 3' )
yield ( 5 )
o = odd()
print(next(o))
print(next(o))
print(next(o))
print(next(o))
杨辉三角
# 杨辉三角
def triangle():
L = [1]
while True:
yield L
L.append(0)
L = [L[i-1] + L[i] for i in range(len(L))]
n = 0
for i in triangle():
print(i)
n = n + 1
if n == 10:
break
# 迭代器和生成器
class func:
def __init__(self, start):
self.start = start
def __iter__(self):
n = self.start
while n > 0:
yield n
n -= 1
def __reversed__(self):
n = 1
while n <= self.start:
yield n
n += 1
# for i in reversed(func(30)):
# print(i)
#
# print("\n")
# for j in func(30):
# print(j)
# 同时迭代多个序列
# 使用zip包 ,基于最短的遍历
ls1 = ["济南", "青岛", "烟台"]
ls2 = ["鲁A", "鲁B", "鲁Y"]
for city, plate in zip(ls1, ls2):
# print(city, plate)
pass
dict1 = dict(zip(ls1, ls2))
print(dict1)
?
|