面试专题几个概念(下)

1、生成器和迭代器

迭代器协议:

_iter__()方法返回自身

__next()__返回下一个被迭代值

迭代完毕时抛出StopIteration异常

迭代器对象:实现了迭代器协议的对象,包括被iter函数处理过字符串、列表、元组、字典、集合等

a = range(4)
b = iter(a)  # 转成迭代器
print(id(b))
print(id(b.__iter__()))
print(b.__next__())  # 0
print(b.__next__())  # 1
print(b.__next__())  # 2
print(b.__next__())  # 3
print(b.__next__())  # 抛异常

执行结果:
2893130398192
2893130398192
0
1
2
3
Traceback (most recent call last):
  File "D:/zl/die.py", line 10, in <module>
    print(b.__next__())
StopIteration


#满足协议的类,变为可迭代对象
class A:
    i = 0
    _i = 0

    def __init__(self, i):
        self.i = i

    def __iter__(self):
        return self

    def __next__(self):
        if self.i == self._i:
            raise StopIteration
        self._i += 1
        return 1


for i in A(4):
    print(i)

生成器:在函数中使用yield关键字,则函数的返回值是一个生成器,生成器已经实现了迭代器协议

def kally(i):
    _i = 0
    yield 1


print(kally)  # <function kally at 0x0000015D0A6C61F0>
print(kally(1))  # <generator object kally at 0x0000015D0A818900>

2、上下文管理器

使用with关键字时,自动调用对象的以下方法

__enter__进入时调用

__exit__离开时调用

常见例子:

with open('a.txt') as  f :
    print(f.read())

优势:因为自动执行,可以省略try/finally语句

实现:

1、在类中重写__enter__和__exit__方法

2、在函数中使用@contextmanager+yield

3、表推导式是什么,有什么用

通过简单的方式创建列表,字典

# 列表推导式
l = []
for i in range(10):
    x = i * i
    l.append(x)
ll = [i * i for i in range(10)]
print(l)
print(ll)
# 字典推导式
d = {}
for i in range(10):
    x = i * i
    d[i] = x
dd = {i: i * i for i in range(10)}
print(d)
print(dd)
# 元组没有推导式
cc = (i * i for i in range(10))  # 生成器表达式

4、海象运算符

py3.8的新特性,为变量赋值+返回赋值内容

# 赋值运算没有返回值
print(a := 1)
s = "dfdddf"
if (l := len(s)) > 0:
    print(f"{s} s length =={l}")

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值