本文介绍: 迭代总结生成器生成器yield的其他用法、生成器表达式、生成器笔试题、常见的内置函数

迭代总结

迭代器主要就是一个迭代取值,另外一种取值方式就是索引(下标)取值

l = [1, 2, 3, 4]
res = l.__iter__()
res.__next__() # 1
res.__next__() # 2

# 迭代取值
    1. 不依赖索引取值的一种取值方式
    2. 不能够重复取值,只能够从左往右固定取值

# 索引取值
    1. 它能够重复取值(通过索引l[0])
    2. 它需要是容器类型

生成器

生成器只要是为了节省内存空间,是自定义迭代器的一种

关键字:yield

def index():
    print('from index')
    print('from index')
    yield 123,234,345 # 以元组的方式返回
    print('second')
    yield 'hello'
res=index() 
print(res)    # <generator object index at...&gt; 生成内存空间 
res.__next__()    # from index from index
print(res.__next__())   # None  (123,234,345)
"""和return用法几乎一样,但是yield会暂停,走一步停一步"""

yield和return的对比:

yield:
    1. 代码遇到yield不会停止,而是停住
    2. yield也可以返回值,并且还支持多个,以元组的形式返回
    3. yield可以把一个函数变成生成器,next取值

return
    1. 代码遇到return就会停止
    2. return可以返回值并且还支持多个,以元组的形式返回

练习题:利用生成器的原理实现range函数功能
for i in range(0,10):
    print(i)
def my_range(start, stop=None, step=1):
    if not stop: # 意味着只传了一个参数,stop没有值
        stop = start
        start = 0
    while start < stop:
        yield start
        start+=step
for i in my_range(10):
    print(i)

生成器yield的其他用法

def eater(name):
    print('%s:正在吃...' % name)
    while True:
        food = yield
        print('%s正在吃%s' % (name, food))
res=eater('jerry') # 生成器对象generator object
print(res)        # <generator object eater at 0x0000021869489B30&gt;
res.__next__()
'''eater就变成了生成器'''

# send() : 传值给yield和执行__next__

res.send('包子')    # jerry正在吃包子
res.send('水果')    # jerry正在吃水果
res.send('水果')    # jerry正在吃水果

生成器表达式

列表生成式

res = [name for name in names_list]
print(res) # 就是一个列表
names_list = ['kevin', 'jerry', 'tony', 'oscar']
res1 = (name for name in names_list)
print(res1) # <generator object <genexpr> at 0x00000218F4569CF0>
print(res1.__next__())
"""生成器表达式如果不使用数据,就不给你数据"""

把迭代器、生成器看成是一个工厂,什么时候需要数据工厂就给你加工数据
目的:就是为了节省内存空间

生成器笔试题

# 求和
def add(n, i):
    return n + i
# 调用之前是函数 调用之后是生成器
def test():
    for i in range(4):
        yield i
g = test()  # 初始化生成器对象
for n in [1, 10]:
    g = (add(n, i) for i in g)

res = list(g)
print(res)

#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
C. res=[20,21,22,23]
#D. res=[21,22,23,24]

常见的内置函数

1、abs():绝对值 

print(abs(10))

2、all():判断整个列表是否全部为真

print(all([1, 2, 3, True, False]))   #  False

3、any:判断列表中,一个为真,结果便是真

print(all([1, 2, 3, True, False])) # True

4、ascii():参数值是数值、布尔类型或字符串

print(ascii('abc'))    # 'abc'
print(ascii('我就是很喜欢你呀'))    # u7fd4u5687...  中文转成unicode

5、bin():二进制

6、bool():把一个数值转为布尔类型

7、bytes():二进制

s = 'hello你还'
res = s.encode('utf-8')
print(res)
print(res.decode('utf-8'))
res2=bytes(s, 'utf-8')
print(res2)
print(str(res2, 'utf-8'))

8、callcble():判断index函数是否会调用

s1 = 'hello'
print(callable(s1)) # False

9、chr():根据ASCII表将数字转为对应的字母

print(chr(65)) # A

10、ord:与chr相互转换

print(ord('A')) # 65

11、dir():查:看方法

print(dir[])   # 查看列表可用的方法   __iter__
def index():
    pass
# index.__name__
print(dir(index))   #查看index里可用的方法

12、divmod():拿到商和余数

divmod(99, 10)   (9, 9)
divmod(101, 10)  (10, 1)

13、enumerate:拿到索引和元素

14、eval()和evel():执行字符串里的代码

res = """print(123)"""
eval(res)    # print(123)   只能执行简单的
exec(res)    # print(123)
res = """
for i in range(10):
    print(i)
"""
exec(res)    # 可以执行一些复制的python代码

今日思维导图:

原文地址:https://blog.csdn.net/qq_48064830/article/details/132877508

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_1221.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注