生成器迭代器推导式

可迭代对象和迭代器

# 可以进行循环更新的一个实实在在值。
# 如何判断一个对象是否是可迭代对象: 利用内置函数:dir()可以查看对象内部方法
# 有__iter__方法的对象,都是可迭代对象。
# print('__iter__' in dir(str))

# 如何判断一个对象是迭代器: 可更新迭代的工具
# 在python中,内部含有'__iter__'方法并且含有'__next__'方法的对象就是迭代器。
# print('__iter__' in dir(str) and '__next__' in dir(str))

# 可迭代对象转化成迭代器:
# 利用内置函数iter()
# obj = iter(l1)
# object.__iter__()

# 迭代器可以迭代取值。利用next()进行取值(节省内存)或者转为list 元祖等等取值
# 一个next()取一个值 且会记录位置
# 迭代器一条路走到底,不走回头(记录位置)。
# 取完了再next()会报错(StopIteration) 我们可以用try处理 万能异常(Exception)

while模拟for循环

s = 'gkffdsa;lfkdsk;lafkds;laldgjfd'
obj = iter(s)
while 1:
    try:
        print(next(obj))
    except StopIteration:
        break

可迭代对象与迭代器的对比

  • 可迭代对象是一个操作方法比较多,比较直观,存储数据相对少(几百万个对象,8G内存是可以承受的)的一个数据集。
  • 当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。
  • 是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。
  • 当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。

小练习
https://www.cnblogs.com/saoqiang/p/11402159.html

生成器

# return作用 返回值 单个或多个 终止函数
# 结束函数,给函数的执行者返回值(多个值通过元组的形式返回)。
# 将return换为yield就是生成器函数
# 只要函数中出现了yield那么他就不是函数,它是生成器函数。
# 不结束函数,对应着给 next 返回值(多个值通过元组的形式返回)。 会记录位置
def func():
    yield 2,4,5
    print(11)
    yield 3
    print(22)
    print(33)
    yield 4
    yield 5
ret = func()  # 生成器对象
# print(ret)
# print(next(ret))
# print(next(ret))
# print(next(ret))
# yield : 对应next给next返回值

yield from

# yield from 将一个可迭代对象的每一个元素返回给next
# yield from 节省代码,提升效率(代替了for循环)
# def func():
#     l1 = [1, 2, 3]
#     yield from l1#就是下面的简写
#     '''
#     yield 1
#     yield 2
#     yield 3
#     '''
# ret = func()
# print(next(ret))

出错题

def eat_baozi_gen():
    for i in range(1,5):
        yield f'{i}号包子'
        print(11)
ret1 = eat_baozi_gen()
for i in ret1:
    print(i)

生成器表达式,列表推导式

# 两种构建方式:
# 1.循环模式: [变量(加工后的变量) for 变量 in iterable]
# print([i**2 for i in range(1, 11)])
# 2.筛选模式: [变量(加工后的变量) for 变量 in iterable if 条件]
# print([i**2 for i in range(1, 11)])

# 列表推导式的优缺点:
# 优点:
    # 1, 简单,快捷,装b。
# 缺点:
    # 2. 可读性不高,不好排错。
# 慎用,不要入迷。

# 生成器表达式: 小括号
# 与列表推导式几乎一模一样。
# 循环模式,筛选模式。
# obj = (i for i in range(1, 11))
# 字典推导式,集合推导式:  两种模式: 循环模式,筛选模式
l1 = ['小潘', '怼怼哥','西门大官人', '小泽ml亚']
# {0: '小潘', 1: '怼怼哥', 2: '西门大官人'}
# dic = {}
# for index in range(len(l1)):
#     dic[index] = l1[index]
# print(dic)
# print({i:l1[i] for i in range(len(l1))})

匿名函数

一句话函数 一般与内战函数结合

# 匿名函数:没有名字的函数
# 匿名函数只能构建简单的函数,一句话函数。
# func2 = lambda 形参: 返回值
# func2 = lambda x,y: x + y

面试题

i改变了指向
func_list = []
for i in range(10):
    func_list.append(lambda x:x+i)
v1 = func_list[0](2)
v2 = func_list[5](1)
print(v1,v2)

func_list = []
for i in range(10):
    func_list.append(lambda x:x+i)
for i in range(0,len(func_list)):
    result = func_list[i](i)
    print(result)

result = []
for i in range(10):
    func = lambda : i      # 注意:函数不执行,内部代码不会执行。
    result.append(func)
print(i)#9
print(result)
v1 = result[0]()
v2 = result[9]()
print(v1,v2)

def func(num):
    def inner():
        print(num)
    return inner
result = []
for i in range(10):
    f = func(i)
    result.append(f)
print(i)
print(result)
v1 = result[0]()
v2 = result[9]()
print(v1,v2)

如 10.3.9.12 转换规则为二进制:
        10            00001010
         3            00000011
         9            00001001
        12            00001100
再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
# IP地址转换为int
# 思路IP按照split进行分隔成4个部分,然后每个部分都转换为二进制类型.
# 然后将这些二进制进行拼接成一个32位的大的二进制字符串.
# 最后将这个二进制数,转换成对应的int类型
def ipToInt(ip_str):
    # 分隔
    ip_list = ip_str.split('.')
    # 拼接
    bin_str = ""
    # 遍历,然后求出每一个二进制数,(注意切割,舍弃0b),还要把它弄成8位.再相加
    for i in ip_list:
        part = bin(int(i))[2:]
        # 将part前面补充0
        part = part.zfill(8)
        bin_str += part
    # 最后将这个二进制数转换为整数
    ip_int = int(bin_str, 2)
    return ip_int

v = [lambda :x for x in range(10)]
print(v)
print(v[0])
print(v[0]())

v = (lambda :x for x in range(10))
print(v)
print(next(v))
print(next(v)())

def num():
    return [lambda x:i*x for i in range(4)]
print([m(2)for m in num()])

原文地址:https://www.cnblogs.com/saoqiang/p/12386192.html

时间: 2024-10-08 01:10:13

生成器迭代器推导式的相关文章

python 【迭代器 生成器 列表推导式】

python [迭代器  生成器  列表推导式] 一.迭代器 1.迭代器如何从列表.字典中取值的 index索引 ,key for循环凡是可以使用for循环取值的都是可迭代的可迭代协议 :内部含有__iter__方法的都是可迭代的迭代器协议 :内部含有__iter__方法和__next__方法的都是迭代器 print(dir([1,2,3])) lst_iter = [1,2,3].__iter__() print(lst_iter.__next__()) print(lst_iter.__ne

函数生成器、推导式及python内置函数

函数生成器.推导式及python内置函数 函数生成器 生成器的定义 在 Python 中,使用了 yield 的函数被称为生成器(generator). 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器. 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行. 调用一个生成器函数,返回的是一个迭代器对象. 生成器与迭代器的区别 生成

Python---迭代器,生成器,列表推导式

# 02,迭代器# 可迭代对象:内部含有__iter__# 迭代器:可迭代对象.__iter__()# 迭代器:内部含有__iter__且__next__# 判断 __iter__ 在不在dir(对象中)# isinstance()# 节省内存.# 惰性机制.# 单向不可逆.# for循环的机制:# while# pass# 可迭代对象# 迭代器# 两者区别# 模拟for循环机制## 03,生成器# 本质上是迭代器,用python代码构建的.# 生成器定义# 生成器的写法# yield# sen

python生成器和推导式

一.生成器 什么是生成器.生成器实质就是迭代器. 在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的装换也可以获取生成器 def func(): print("111") return 222 ret = func() print(ret) 结果:111 222 将函数中的return换成yield就是生成器 def func() print("111") yield 222 ret = func() pri

Python之函数(七)生成器与推导式

4.10 生成器 简介: 什么是生成器? 生成器的本质就是迭代器 生成器跟迭代器的区别:迭代器都是python给你提供已经写好的工具或者数据转换而来的,生成器需要我们自己用python代码构建的工具 生成器的构建方式 通过生成器函数 def func(): print(11) return 22 ret=func() print(ret) #结果为:11 22 #将函数中的return换成yield,这样func就不是函数了,而是一个生成函数 def func(): print(11) yiel

Python 生成器和推导式

一.Python生成器和生成器函数1.生成器和生成器函数的概念    1.生成器的本质是迭代器    2.函数中包含yield,就是生成器函数 2.生成器函数的写法    def func():        a =10        yield 20    gen = func()  #没有执行,而是生成一个生成器    普通函数和生成器函数的不同    1.普通函数名()表示函数的的执行    2.生成器函数名()不是函数的执行,而是生成一个生成器 yield和return的不同    1.

2018,7,18_迭代器,生成器与推导式

函数的动态传参 *args 动态接收所有位置参数 **kwargs 动态接收关键字参数 顺序: 位置参数, *args, 默认参数, **kwargs def func(*args, **kwargs): 可以接收任何参数 pass global和nonlocal global: 在函数内部引入全局变量. nonlocal: 在函数内部. 内层函数访问外层函数中的局部变量 globals() 查看全局作用域中的名字 locals() 查看当前作用域中的名字 1, 函数名的应用,第一类对象 函数名

Python中生成器,迭代器,以及一些常用的内置函数.

知识点总结 生成器 生成器的本质就是迭代器. 迭代器:Python中提供的已经写好的工具或者通过数据转化得来的. 生成器:需要我们自己用Python代码构建的 创建生成器的三种方法: 通过生成器函数 通过生成器推导式 python内置函数或者模块提供 生成器函数 yield:一个yield对应一个next,next超过yield数量,就会报错,与迭代器一样. yield与return的区别: return一般在函数中只设置一个,他的作用是终止函数,并传给函数的执行者返回值 yield在生成器中可

python3 推导式大总结

推导式 --总结并引出 生成器推导式 ##列表推导式 >>> a = [i for i in range(100) if not(i%2) and i%3] ##注意列表是中括号 三项内容 变量 循环体 判断条件 >>> a #输出为符合判断条件的结果 100以内能被2整除的数字 [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