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()方法