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

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

#迭代器#可迭代对象# s1 = ‘123‘# for i in s1:#     print(i)

#错误例子:# int object is not iterable# for i in 123:#     print(i)

#内部含有__iter__方法的就是可迭代对象,遵循可迭代协议。#dir# print(dir(‘123‘))  # ‘__iter__‘# print(‘__iter__‘ in dir([1, 2, 3]))# print(‘__iter__‘ in dir({‘name‘:‘alex‘}))# print(‘__iter__‘ in dir({‘name‘}))# print(‘__iter__‘ in dir((1, 2, 3)))# print(‘__iter__‘ in dir(1))  # False# print(‘__iter__‘ in dir(True))  # False

# 可迭代对象通过.__iter__()可以转换成迭代器,满足迭代器协议。# # 内部含有__iter__ 且 __next__方法的就是迭代器。# l = [1, 2, 3,5]# l_obj = l.__iter__()# print(l_obj)# 迭代器的取值两种方法:# 方法一:__next__()# print(l_obj.__next__())# print(l_obj.__next__())# print(l_obj.__next__())# print(l_obj.__next__())# 方法二 for循环# for i in l_obj:#     print(i)# print(‘__next__‘ in dir(l_obj))# 第二种判断方式:# from collections import Iterable   #迭代对象# from collections import Iterator    #迭代器# print(isinstance(‘123‘, Iterable))# print(isinstance(‘123‘, Iterator))# 实际上可迭代对象是不可以一个一个的一次取值的,因为他没有__next__方法。# for循环提供一个机制:# 1,将可迭代对象转化成迭代器。# 2,利用__next__进行取值。# 3,用try异常处理方法防止报错。# l = [1, 2, 3, 4, 5]# l_obj = l.__iter__()# while True:#     try:#         print(l_obj.__next__())#     except Exception:#         break

#迭代器:# 1,节省内存。# 2,满足惰性机制。# 3,取值过程不可逆(一条路走到黑)。

#生成器# 生成器本质也是迭代器,生成器是自己用Python写的迭代器。# 1,通过生成器函数构建。# 2,通过生成器推导式构建。

# def func1():#     print(666)#     return 222# ret=func1()# print(ret)

def func1():    print(11)    print(333)    yield 222    print(666)    yield 777g_obj=func1()    #生成器对象 generator objectprint(g_obj.__next__())print(g_obj.__next__())

# def cloth1():#     for i in range(1,10001):#         print(‘衣服%s‘ % i)# cloth1()

def cloth2():    for i in range(1,10001):        yield ‘衣服%s‘%ig=cloth2()for i in range(1,51):    print(g.__next__())

for s in range(51,201):    print(g.__next__())

#  send :# 1,给上一个yiled整体发送一个值# 2, send不能给最后一个yiled发送值# 3, 获取第一个值的时候,不能用send只能用nextdef func1():    count=yield 222    print(count)    yield 777    yield 888g_obj=func1()# print(g_obj.__next__())print(g_obj.send(‘wusir‘))

#知识点补充

#1,装饰器:#装饰器的本质是闭包。# 开放封闭原则。#‘‘‘1.对扩展是开放的    为什么要对扩展开放呢?    我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。2.对修改是封闭的    为什么要对修改封闭呢?    就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。装饰器完美的遵循了这个开放封闭原则。‘‘‘

# count = 1## def func1():#     print(count)# func1()#局部作用域可以对全局作用域的变量进行引用。

# count = 1# 函数内部如果有变量名与全局变量名相同且对此变量进行改变,# Python 就会将你引用的那个变量视为局部定义的变量,但是局部没定义,# 则他会报错。# def func1():#     count1 = count + 1#     print(count)# func1()## def func1():#     count = 3#     def inner():#         count = count + 1#     inner()#     print(count)# func1()

#函数中如果使用global + 变量 必须是第一次使用这个变量。# flag = True# def func1():##     if flag:#         print(333)#     global flag#     flag = False# func1()# flag = True# while flag:#     print(333)#     flag = False#     print(222)#for if while 没有开辟临时空间。

#globals() locals()# locals :函数会以字典的类型返回 当前位置 的全部 局部变量。## globals:函数以字典的类型返回全部全局变量。## def extendList(val,list=[]):#     list.append(val)#     # print(globals())#     print(locals())  # {‘list‘: [1], ‘val‘: 1}#     def inner():#         a = 3#         b = 4#         print(locals())#     inner()#     return list# ret = extendList(1)

# print(globals())  # ‘ret‘: [1]# print(locals())

# 列表推导式:能用列表推导式完成的,用python代码都可以完成。# 用一句话构建一个你想要的列表。# 优点:简单,稍微难理解。# 缺点: 不能用debug。# li = []# for i in range(1, 12):#     li.append(i)# print(li)# li = [i for i in range(1, 12)]# [ 变量(加工后的变量) for 变量 in 可迭代对象 ]  遍历模式# print(li)

# [ 变量(加工后的变量) for 变量 in 可迭代对象 ]  遍历模式# [ 变量(加工后的变量) for 变量 in 可迭代对象 if 判断]  筛选模式

# l1 = [i for i in range(1, 101) if i % 2 == 0]# print(l1)#1,筛选,100以内所有的奇数。# l2 = [i for i in range(1, 101) if i % 2 == 1]# l2 = [i for i in range(1, 101, 2)]# print(l2)#2,10以内所有数的平方。 [1,4,9,16.。。100]# print([i*i for i in range(1, 11)])#3,将100以内所有内被三整除的数留到列表中。# print([i for i in range(1,101) if i % 3 == 0])# 列表推导式 简单明了,但是占内存# 生成器表达式 节省内存,不易看出。

# names = [[‘Tom‘, ‘Billy‘, ‘Jefferson‘, ‘Andrew‘, ‘Wesley‘, ‘Steven‘, ‘Joe‘],#          [‘Alice‘, ‘Jill‘, ‘Ana‘, ‘Wendy‘, ‘Jennifer‘, ‘Sherry‘, ‘Eva‘]]# l3 = [ name for i in names for name in i if name.count(‘e‘) == 2]# print(l3)# mcase = {‘a‘: 10, ‘b‘: 34}# mcase_frequency = {mcase[k]: k for k in mcase}# print(mcase_frequency)

原文地址:https://www.cnblogs.com/weilaixiaochaoren/p/9047877.html

时间: 2024-07-30 16:50:15

Python---迭代器,生成器,列表推导式的相关文章

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里面有个很棒的语法糖(syntactic sugar),它就是 list comprehension ,有人把它翻译成"列表推导式",也有人翻译成"列表解析式".名字听上去很难理解,但是看它的语法就很清晰了.虽然名字叫做 list comprehension,但是这个语法同样适用于dict.set等这一系列可迭代(iterable)数据结构. 语法规范: out_list = [out_express for out_express in input_l

【python基础】列表推导式&字典推导式&集合推导式

一.定义 python的一种独有特性, 推导式是可以从一个数据序列构建另一个新的数据序列的结构体 列表推导式,字典推导式,集合推导式(集合是可变数据类型,集合中的元素是不可变数据类型) 1.列表推导式 提供了简单的生成列表的方法 (1)语法结构 ①list = [表达式 for item in 容器] ②list = [表达式 for item in 容器 if 条件] ③list = [表达式 for item1 in 容器1 for item2 in 容器2] (2)执行流程 ①循环遍历出容

python中的列表推导式的简单实用

列表推导式是利用其它列表创建新列表的一种方法,它的工作方式类似于for循环: >>> [x*x for x in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 列表由range(10)中的每个x的平方组成,如果只想打印出那些只能被3整除的平方数呢?那么可以使用模运算符--x%3,当数字可以被3整除时返回0: >>> [x*x for x in range(10) if x%3==0] [0, 9, 36, 81] 也可以

python基础之列表推导式

1.列表推导式 1.1.求0~29之间能被3整除的数 ret = [i for i in range(30) if i%3 ==0] print(ret) 输出结果: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27] 2.字典推导式 2.1.将字典mcase = {'a': 10, 'b': 34}的key.value互换位置 mcase = {'a': 10, 'b': 34} mcase_frequency = {mcase[k]: k for k in mcase}

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

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

Python List comprehension列表推导式

http://blog.chinaunix.net/uid-28631822-id-3488324.html 具体内容需要进一步学习 原文地址:https://www.cnblogs.com/xiaoxuesheng993/p/10962961.html

day5--装饰器函数的信息打印,迭代器,生成器,列表推导式,内置函数

本文档主要内容: 一 装饰器函数的信息打印 二 迭代器 三 生成器 四 生成器表达式和列表推导式 五 内置函数 一 装饰器函数的信息打印 一个函数一旦被装饰器给装饰后,这个函数的信息使用原来的命令打印的就是装饰器函数的信息了,如何做呢? from functools import wraps def logger(f): @wraps(f) def inner(*args, **kwargs): """ :param args: 函数名,密码 :param kwargs: 备

闭包,迭代器,生成器,列表推导式

1:函数名的应用   1, 函数名就是函数的内存地址.    2, 函数名可以作为变量.    3, 函数名可以作为函数的参数.    4, 函数名可以作为容器类类型的元素.    5,函数名可以当做函数的返回值. 2:globals() locals() globals() # 返回全局变量的一个字典. locals()  返回 当前位置 的局部变量的字典. 1 name = 'leiwenxuan' 2 def fun(): 3 a = 2 4 b = 3 5 6 print(globals