Python从入门到高手(内部资源-配学习资料)_哔哩哔哩_bilibili
# 集合推导式 {}类似列表推导式,在列表推导式的基础上添加了一个去除重复项
list1 = [1, 2, 1, 3, 5, 2, 1, 8, 9, 7]
set1 = {x + 1 for x in list1 if x > 5}
print(set1)
# 字典推导式
dict1 = {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'C'}
newdict = {value: key for key, value in dict1.items()}
print(newdict)
# 生成器 ''' 得到生成器方式 1.通过列表推导式得到生成器 ''' # [0,3,6,9,12,15,18,21,...,27] newlist = [x * 3 for x in range(10)] print(newlist) # 得到生成器 generator g = (x * 3 for x in range(10)) print(type(g)) print(g) # 通过调用__next__() 方式得到元素 print(g.__next__()) # 0 print(g.__next__()) # 3 print(g.__next__()) # 6 # 方式2:next(生成器对象) builtins系统内置函数 # 每调用一次next则会产生一个元素 print(next(g)) # StopIteration 生成器本来可以产生10个,得到10个,在调用next(g),抛出异常
g = (x * 3 for x in range(10))
while True:
try:
e = next(g)
print(e)
except:
print("没有更多元素啦!")
break
--------------------------------------------------------------------------------
g = (x * 3 for x in range(10))
while True:
try:
e = next(g)
print(e)
except:
print("没有更多元素啦!")
break
# 定义生成器的方式二:借助函数完成
# 函数中出现了yield关键字,说明函数就不是函数,变成生成器
# 斐波那契数列
''':cvar
步骤:
1.定义一个函数,函数中使用yield关键字
2.调用函数,接收调用的结果
3.得到的结果就是生成器
4.借助于next(), __next__()得到元素
'''
def func():
n = 0
while True:
n += 1
print(n)
yield n # return n + 暂停
g = func()
print(g)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
def fib(length):
a, b = 0, 1
n = 0
while n < length:
# print(b)
yield b # return b + 暂停
a, b = b, a + b
n += 1
return 'abc' # return就是在得到StopIteration得到后的提示信息
g = fib(8)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
-------------------------------------------------------------------------------------
''':cvar
生成器方法
__next()__:获取下一个元素
send(value):向每次生成器调用中传值 注意:第一次调用send(None)
'''
def gen():
i = 0
while i < 5:
temp = yield i # return 0 + 暂停
print('temp:', temp)
for x in range(i):
print('------------>', x)
i += 1
return '没有更多数据'
g = gen()
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# g.__next__()
print(g.send(None)) # yield结束后才能接收值
n1 = g.send('呵呵')
print('n1:', n1)
n2 = g.send('哈哈')
print('n2:', n2)
-------------------------------------------------------------
# 进程>线程>协程
def task1(n):
for i in range(n):
print('正在搬第{}块砖!'.format(i))
yield None
def task2(n):
for i in range(n):
print('正在听第{}首歌!'.format(i))
yield None
g1 = task1(10)
g2 = task2(5)
while True:
try:
g1.__next__()
g2.__next__()
except:
break
''':cvar
生成器:generator
定义生成器方式:
1. 通过列表推导式方式
g=(x+1 for x in range(6))
2. 函数+yield
def func():
...
yield
g=gunc()
产生元素:
1. next(generator) --->每次调用都会产生一个新的元素,如果元素产生完毕,再次调用的话就会产生异常
2.生成器自己的方法:
g.__next__()
g.send(value)
应用:协程
'''
------------------------------------------------------------------------------------------------------
# 可迭代的对象:1.生成器 2.元组 列表 集合 字典 字符串
# 如何判断一个对象是否可以迭代?
from collections import Iterable
list = [1, 4, 7, 8, 8]
f = isinstance(list, Iterable)
print(f)
f = isinstance('abc', Iterable)
print(f)
f = isinstance(100, Iterable)
print(f)
g = (x + 1 for x in range(10))
f = isinstance(g, Iterable)
print(f)
''':cvar
迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历位置的对象
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束
迭代器只能往前不会后退
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
生成器是可迭代的,也是迭代器
list是可迭代的,但不是迭代器
list--->迭代器
生成器与迭代器:
1)借助iter()函数的转换,变成迭代器,字典、元组、列表、集合
2)迭代器用next()调用 ---生成器
'''
list1 = [1, 2, 3, 4, 5]
list1 = iter(list1) # 通过iter()函数将可迭代的变成一个迭代器
print(next(list1))
print(next(list1))



