3-列表推导式 字典推导式 生成器 迭代器

1.列表推导式

思考:如何生成一个num0-100的列表

用for 循环来实现:

my_list = []
for i in range(101):
    li = "num{}".format(i)
    my_list.append(li)
print(my_list)

用列表推导式---依赖for循环,表达式放在列表里面,根据前面的式子,按照for循环取值依次放在列表中

my_list1 = ["num{}".format(i) for i in range(101)]
print(my_list1)

output:['num0', 'num1', 'num2', 'num3', 'num4'。。。。。。。'num100']

栗子2: 1-100能被3整除但是不能被2整除的数

#Python中的真假测试对于整数而言,0为假,非0为真
#下面的式子就是能被2整除的是假,不能被3整除的,就是非0,即是真
#下面的式子实现的功能就是:1-100能被3整除但是不能被2整除的数
a = [i for i in range(100) if not(i % 3) and (i % 2)] 
print(a)  #output:[3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 99]

2.字典推导式

知道来列表推导式,再来看看字典推导式,照葫芦画瓢

dic = {"num{}".format(i):i+1 for i in range(5)}
print(dic) #{'num0': 1, 'num1': 2, 'num2': 3, 'num3': 4, 'num4': 5}

练习1:使用字典推导式,将下面字符串格式的数据,改成字典类型的数据

str = "name=zhangsan;age=17;gender=boy;phone=1309998890"
dict1 = { item.split("=")[0]:item.split("=")[1] for item in str.split(";")}
print(dict1) #{'name': 'zhangsan', 'age': '17', 'gender': 'boy', 'phone': '1309998890'}

 练习2:value 是对key的奇偶判读,比如key是偶数,value就是True

dic = {i:(i % 2== 0) for i in range(10)}
print(dic) #output: {0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}

3.生成器 ---节省内存,提高性能

1⃣️按照上面的推导式,用元组,是不是元组推导式呢?看下:

tu = (i for i in range(6))  
print(tu) #<generator object <genexpr> at 0x102f57150>

嗯?不是元组推导式,是一个generater,生成器。--------没有元组推导式的说法哦!!!!

生成器保留计算的规则,即生成器对象存储的是计算公式,想需要多少数据,再去生成,避免内存的浪费。---比如存储1000万条数据,用列表存储,就要放1000条数据进去;生成器只是存储个公式,减少内存。

2⃣️获取生成器的全部数据--将其转化为list

tu = (i for i in range(6))
print(tu) #<generator object <genexpr> at 0x102f57150>
print(list(tu))#[0, 1, 2, 3, 4, 5]

如何一个一个获取生成器的数据

tu = (i for i in range(6))
print(tu) #<generator object <genexpr> at 0x102f57150>
# print(list(tu))
print(next(tu))
print(next(tu))
print(next(tu))
print(next(tu))
print(next(tu))
print(next(tu))
print(next(tu))
"""
<generator object <genexpr> at 0x10b6d9150>
0
1
2
3
4
5
Traceback (most recent call last):
  File "/Users/juan.cao/virenv/soft_deve_day1/列表推导shi.py", line 28, in <module>
    print(next(tu))
StopIteration
"""

取完所有数据以后,再执行取元素操作,会报错。

4.yield生成器

1⃣️定义个函数,没有return值,打印结果为none

def fun():
    #yield
    print("python")

print(fun())
#output: python
#        None

2⃣️加上yield,就是一个生成器函数

def fun():
    yield
    print("python")

print(fun()) #<generator object fun at 0x101464150>

拓展

def fun():
    "函数生成器"
    yield 100
    print("python")
    yield 1000
    print("hello")
    yield 10000

print(fun())   #<generator object fun at 0x101464150>
res = fun()
print(next(res)) #函数运行到yield,输出100,在此处暂停
print(next(res)) #再次运行,从第一个yield处释放,运行print("python"),继续运行到yield输出数据,又暂停
print(next(res)) #同理,从第二个yield处释放,运行到最后。函数生成器的全部数据已经取完,再执行就会报错。
#<generator object fun at 0x1090eb150>
# 100
# python
# 1000
# hello
# 10000

栗子:用生成器实现费布那契数列(1,1,2,3,5,8,13,21.。。。)

#费布那契数列的实现
def Fibonacci():
    a = 0
    b = 1
    while True:
        a,b = b,a + b
        yield a

for i in Fibonacci(): if i < 100: #100以内的费布那契数列 print(i)

5.迭代器

迭代的意思,就类似于循环,每一次重复的过程就是一次迭代的过程,每一次迭代的结果,被用作再一次迭代的初始值

那么,提供迭代方法的容器,就称作迭代器

通常,我们接触的迭代器是序列:列表、元祖、字符串、字典  ,他们都支持迭代操作

一般用for 循环来做迭代。

1⃣️字符串容器--迭代器

for i in "python": #字符串是一个容器,同时也是一个迭代器;for语句就是触发这个迭代器的迭代功能,每次从容器中拿出一个值,就是所谓的迭代操作
    print(i)

2⃣️字典容器--迭代器

#字典实现迭代
my_dict = {"name":"zhangsan","age":18,"gender":"boy"}
for each in my_dict:
    print("{}是{}".format(each,my_dict[each]))
# 结果:
# name是zhangsan
# age是18
# gender是boy

3⃣️用for 循环跟while实现迭代

下面2种方法都可以实现对字符串的迭代输出

#迭代器
str = "python"
for i in str:
    print(i)
it = iter(str)
while True:
    try:
        print(next(it))
    except StopIteration:
        break

那么iter()方法

原文地址:https://www.cnblogs.com/ananmy/p/13927612.html