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.字典推导式
知道来列表推导式,再来看看字典推导式,照葫芦画瓢
dic = {"num{}".format(i):i+1 for i in range(5)} print(dic) #{‘num0‘: 1, ‘num1‘: 2, ‘num2‘: 3, ‘num3‘: 4, ‘num4‘: 5}
练习:使用字典推导式,将下面字符串格式的数据,改成字典类型的数据
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‘}
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)) #再次运行,从print("python")处释放,继续运行到yield输出数据,又暂停 print(next(res)) #同理,从print("hello")处释放,运行到最后。函数生成器的全部数据已经取完,再执行就会报错。 #<generator object fun at 0x1090eb150> # 100 # python # 1000 # hello # 10000
原文:https://www.cnblogs.com/ananmy/p/13927612.html