分页查找

  1. #5.随意写一个20行以上的文件(divmod)
  2. # 运行程序,先将内容读到内存中,用列表存储。
  3. # l = []
  4. # 提示:一共有多少页
  5. # 接收用户输入页码,每页5条,仅输出当页的内容
  6. def read_page(bk_list,n,endline=None):
  7. startline = 5 * (n-1)
  8. endline = endline+startline-1 if endline else startline + 4
  9. # print(startline,endline)
  10. for i in range(startline,endline+1):
  11. print(bk_list[i],end = '')
  12.  
  13. def read_book(filename):
  14. f = open(filename)
  15. book_list = f.readlines()
  16. f.close()
  17. return book_list
  18.  
  19. book_list = read_book('tmp_file')
  20. line_num = len(book_list)
  21.  
  22. x,y = divmod(line_num,5)
  23. print(line_num,x,y)
  24. # if y:
  25. # page = x+1
  26. # else:
  27. # page = x
  28. page = x+1 if y else x
  29. print('一共有%s页'%page)
  30. while True:
  31. page_num = input('请输入您要阅读的页码 : ').strip()
  32. if page_num.isdigit():
  33. page_num = int(page_num)
  34. if page_num < page:
  35. read_page(book_list,page_num)
  36. elif page_num == page:
  37. read_page(book_list,page_num,y)
  38. else:
  39. print('您输入的内容有误')

一、可迭代对象

可以将某个数据集内的数据“一个挨着一个的取出来”,就叫做迭代

可迭代协议

假如我们自己写了一个数据类型,希望这个数据类型里的东西也可以使用for被一个一个的取出来,那我们就必须满足for的要求。这个要求就叫做“协议”。

可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。

可以被for循环的都是可迭代的,要想可迭代,内部必须有一个__iter__方法。

  1. l = [1,2,3,4,5]
  2. s = {1,2,3,4}
  3. #索引
  4. #for
  5. # for i in l:
  6. # print(i)
  7.  
  8. # for i in 50:
  9. # print(i)
  10.  
  11. #iterable 可迭代的
  12. #迭代
  13.  
  14. #str
  15. #列表
  16. #tuple
  17. #set
  18. #dict
  19.  
  20. #可迭代的 ——对应的标志 __iter__
  21. # print('__iter__' in dir([1,2,3])) #判断一个变量是不是一个可迭代的

二、迭代器

接着分析,__iter__方法做了什么事情呢?

  1. print([1,2].__iter__())
  2.  
  3. 结果
  4. <list_iterator object at 0x1024784a8>
  1. #可迭代协议
  2. l = [1,2,3,4,5]
  3. # for i in l:
  4. # print(i)
  5. # print(iter(l)) #内置函数
  6. l.__iter__()
  7. #iterator #迭代器
  8. #iterator iterable
  9. l_iterator = iter(l)
  10. # print(set(dir(l_iterator))-set(dir(l)))
  11. #__next__
  12.  
  13. # iter({1,2,3})

迭代器协议

既什么叫“可迭代”之后,又一个历史新难题,什么叫“迭代器”?

虽然我们不知道什么叫迭代器,但是我们现在已经有一个迭代器了,这个迭代器是一个列表的迭代器。

我们来看看这个列表的迭代器比起列表来说实现了哪些新方法,这样就能揭开迭代器的神秘面纱了吧?

  1. 可迭代协议——凡是可迭代的内部都有一个__iter__方法
    迭代器里既有iter方法,又有next方法 ——迭代器协议
    通过iter(o)得到的结果就是一个迭代器,
  1. '''
  2. dir([1,2].__iter__())是列表迭代器中实现的所有方法,dir([1,2])是列表中实现的所有方法,都是以列表的形式返回给我们的,为了看的更清楚,我们分别把他们转换成集合,
  3. 然后取差集。
  4. '''
  5. #print(dir([1,2].__iter__()))
  6. #print(dir([1,2]))
  7. print(set(dir([1,2].__iter__()))-set(dir([1,2])))
  8.  
  9. 结果:
  10. {'__length_hint__', '__next__', '__setstate__'}

我们看到在列表迭代器中多了三个方法,那么这三个方法都分别做了什么事呢?

  1. iter_l = [1,2,3,4,5,6].__iter__()
  2. #获取迭代器中元素的长度
  3. print(iter_l.__length_hint__())
  4. #根据索引值指定从哪里开始迭代
  5. print('*',iter_l.__setstate__(4))
  6. #一个一个的取值
  7. print('**',iter_l.__next__())
  8. print('***',iter_l.__next__())

在for循环中,就是在内部调用了__next__方法才能取到一个一个的值。

那接下来我们就用迭代器的next方法来写一个不依赖for的遍历。

  1. l=[1,2,8,1,9,4]
  2. l_iterator=iter(l)
  3. print(l_iterator.__next__())
  4. print(l_iterator.__next__())
  5. while True:
  6. try:
  7. print(next(l_iterator))
  8. except:
  9. break

判断是否是迭代器 和 可迭代对象的简便方法

  1. #迭代器 大部分都是在python的内部去使用的,我们直接拿来用就行了
  2. #迭代器:内置__iter__和__next__方法
  3. from collections import Iterable
  4. from collections import Iterator
  5. #判断是否是迭代器 和 可迭代对象的简便方法
  6. # s = 'abc'
  7. # print(isinstance(s,Iterable))
  8. # print(isinstance(s,Iterator))
  9. # print(isinstance(iter(s),Iterator))
  10. map_o = map(abs,[1,2,-3,4])
  11. #map_o = [1,2,3,4]
  12. print(isinstance(map_o,Iterable))
  13. print(isinstance(map_o,Iterator))

range()

  1. #不管是一个迭代器还是一个可迭代对象,都可以使用for循环遍历
  2. #迭代器出现的原因 帮你节省内存
  3. from collections import Iterable
  4. from collections import Iterator
  5. a = range(100)
  6. print(isinstance(a,Iterable))
  7. print(isinstance(a,Iterator))

为什么要有for循环

基于上面讲的列表这一大堆遍历方式,聪明的你立马看除了端倪,于是你不知死活大声喊道,你这不逗我玩呢么,有了下标的访问方式,我可以这样遍历一个列表啊

  1. l=[1,2,3]
  2.  
  3. index=0
  4. while index < len(l):
  5. print(l[index])
  6. index+=1
  7.  
  8. #要毛线for循环,要毛线可迭代,要毛线迭代器

for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,即在遍历之前,先调用对象的__iter__方法将其转换成一个迭代器,然后使用迭代器协议去实现循环访问,这样所有的对象就都可以通过for循环来遍历了,

  1. #可迭代协议 : 内部实现了__iter__方法
  2.  
  3. #迭代器协议 : 内部实现了__iter__ __next__方法
  4.  
  5. #可迭代和迭代器的不同点 : 迭代器多实现了一个__next__方法
  6.  
  7. #可迭代和迭代器的相同点 : 都可以用for循环
  8.  
  9. #判断迭代器和可迭代的方法
  10. #第一种:判断内部是不是实现了 __next__
  11. #'__next__' in dir(o)
  12.  
  13. #第二种:
  14. # from collections import Iterable #可迭代
  15. # from collections import Iterator #迭代器
  16. # isinstance(o,Iterable)
  17. # isinstance(o,Iterator)
  18.  
  19. #迭代器的特点
  20. #可以用for循环
  21. #可以节省内存
  22. #你只能用一次 l = [1,2,3,4]

初识生成器

我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省内存。

如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。

Python中提供的生成器:

1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

生成器Generator:

  本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)

  特点:惰性运算,开发者自定义

生成器函数

一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。

  1.  
  1. import time
  2. def genrator_fun1():
  3. a = 1
  4. print('现在定义了a变量')
  5. yield a
  6. b = 2
  7. print('现在又定义了b变量')
  8. yield b
  9.  
  10. g1 = genrator_fun1()
  11. print('g1 : ',g1) #打印g1可以发现g1就是一个生成器
  12. print('-'*20) #我是华丽的分割线
  13. print(next(g1))
  14. time.sleep(1) #sleep一秒看清执行过程
  15. print(next(g1))

生成器有什么好处呢?就是不会一下子在内存中生成太多数据

假如我想让工厂给学生做校服,生产2000000件衣服,我和工厂一说,工厂应该是先答应下来,然后再去生产,我可以一件一件的要,也可以根据学生一批一批的找工厂拿。
而不能是一说要生产2000000件衣服,工厂就先去做生产2000000件衣服,等回来做好了,学生都毕业了。。。

  1. 初识生成器二
  2.  
  3. def produce():
  4. """生产衣服"""
  5. for i in range(2000000):
  6. yield "生产了第%s件衣服"%i
  7.  
  8. product_g = produce()
  9. print(product_g.__next__()) #要一件衣服
  10. print(product_g.__next__()) #再要一件衣服
  11. print(product_g.__next__()) #再要一件衣服
  12. num = 0
  13. for i in product_g: #要一批衣服,比如5件
  14. print(i)
  15. num +=1
  16. if num == 5:
  17. break
  18.  
  19. #到这里我们找工厂拿了8件衣服,我一共让我的生产函数(也就是produce生成器函数)生产2000000件衣服。
  20. #剩下的还有很多衣服,我们可以一直拿,也可以放着等想拿的时候再拿

读取文件

  1. import time
  2.  
  3. def tail(filename):
  4. f = open(filename)
  5. f.seek(0, 2) #从文件末尾算起
  6. while True:
  7. line = f.readline() # 读取文件中新的文本行
  8. if not line:
  9. time.sleep(0.1)
  10. continue
  11. yield line
  12.  
  13. tail_g = tail('tmp')
  14. for line in tail_g:
  15. print(line)

计算移动平均值‘

  1. #计算移动平均值
  2. #7日平均年化收益
  3. #10,12,11 = (10+12+11)/3
  4. #total = 10 + 12 + 11
  5. #day = 1 + 1 + 1
  6. #avg = 10/1 22/2 33/3
  7. # 10 11 11
  8.  
  9. def averager():
  10. total = 0
  11. day = 0
  12. avrage = 0
  13. while True:
  14. day_num = yield avrage #return avrage
  15. total += day_num
  16. day += 1
  17. avrage = total/day
  18.  
  19. # avg = averager()
  20. # num = next(avg) #激活生成器 avg.send(),什么都不send和next效果一样
  21. # print(avg.send(10)) #传值 next
  22. # print(avg.send(20))
  1. __author__ = 'Administrator'
  2. def wapper(fun):
  3. def inner(*args,**kwargs):
  4. g=fun(*args,**kwargs)
  5. next(g)
  6. return g
  7. return inner
  8.  
  9. @wapper
  10. def aa():
  11. day=0
  12. total=0
  13. avrage =0
  14. while True:
  15. day_num=yield avrage
  16. total+=day_num
  17. day+=1
  18. avrage=total/day
  19.  
  20. g=aa()
  21. print(g.send(20))

yield from

  1. # __author__ = 'Administrator'
  2. # def fun():
  3. # for i in "ab":
  4. # yield i
  5. # print("....")
  6. # yield 1
  7. #
  8. # aa=fun()
  9. # while True:
  10. # try:
  11. # print(next(aa))
  12. # except:
  13. # break
  14. # print(next(aa))
  15.  
  16. def fun():
  17. yield from "abc"
  18. yield from [1,2,4,5]
  19.  
  20. aa=fun()
  21. print(next(aa))
  22. print(aa.__next__())
  23. print(next(aa))
  24. print(aa.__next__())
  25.  
  26. while True:
  27. try:
  28. print(next(aa))
  29. except:
  30. break
  1. n = yield r //yield,放弃本函数的执行,同时把r的值返回给调用者send()。 n的值就是send(n)的参数值
  1. r = c.send(n) //r的值就是yield的参数值。
  1. next()让包含yield的函数(Generator)执行
  2.  
  3. next()和send()在一定意义上作用是相似的,区别是send()可以传递值给yield表达式,而next()不能传递特定的值,只能传递None进去。因此,我们可以看做
  4. c.next() c.send(None) 作用是一样的。
  5.  
  6. 第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错的,因为没有yield语句来接收这个值。
  7.  
  8. 1
  9. 2
  10. 3
  11. 4
  12. 5
  13. 6
  14. def x():
  15. print 'bai wei'
  16. m = yield 5
  17. print m
  18. d = yield 12
  19. print 'reach here '
  20.  
  21.   
  22. c = x()
  23. c.next() //启动generator
  24. c.next() //给yield表达式传一个None值
  25.  
  26. 输出
  27.  
  28. bai wei
  29. None
  30.  
  31. c = x()
  32.    c.next() /启动generator,运行到第一个yield处停止
  33.  
  34.    c.send('hi')  //从停止的yield处继续运行,并把值hi传过去
  35.  
  36. 输出
  37.  
  38. bai wei
  39. hi
  40.  
  41. c = x()
  42.    c.send('hi') //出错,generator还没启动
  43.  
  44. 输出
  45.  
  46. Traceback (most recent call last):
  47. File "yield.py", line 36, in <module>
  48. c.send('hi')
  49. TypeError: can't send non-None value to a just-started generator
  1. 5. send(msg) next()的返回值
  2.  
  3. send(msg) next()是有返回值的,它们的返回值很特殊,返回的是下一个yield表达式的参数。比如yield 5,则返回 5 。到这里,是不是明白了一些什么东西?本文第一个例子中,通过for i in alist 遍历 Generator,其实是每次都调用了alist.Next(),而每次alist.Next()的返回值正是yield的参数,即我们开始认为被压进去的东东。我们再延续上面的例子:
  4.  
  5. def h():
  6. print 'Wen Chuan',
  7. m = yield 5
  8. print m
  9. d = yield 12
  10. print 'We are together!'
  11.  
  12. c = h()
  13. m = c.next() #m 获取了yield 5 的参数值 5
  14. d = c.send('Fighting!') #d 获取了yield 12 的参数值12
  15. print 'We will never forget the date', m, '.', d
  16. 输出结果:
  17. Wen Chuan Fighting!
  18. We will never forget the date 5 . 12

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

  1. #老男孩由于峰哥的强势加盟很快走上了上市之路,alex思来想去决定下几个鸡蛋来报答峰哥
  2.  
  3. egg_list=['鸡蛋%s' %i for i in range(10)] #列表解析
  4.  
  5. #峰哥瞅着alex下的一筐鸡蛋,捂住了鼻子,说了句:哥,你还是给我只母鸡吧,我自己回家下
  6.  
  7. laomuji=('鸡蛋%s' %i for i in range(10))#生成器表达式
  8. print(laomuji)
  9. print(next(laomuji)) #next本质就是调用__next__
  10. print(laomuji.__next__())
  11. print(next(laomuji))
  1. # for i in range(100):
  2. # print(i*i)
  3.  
  4. # l =[i*i for i in range(100)]
  5. # print(l)
  6.  
  7. # l = [{'name':'v','age':28},{'name':'v'}]
  8. # name_list = [dic['name'] for dic in l]
  9. # print(name_list)
  10.  
  11. # l = [{'name':'v1','age':28},{'name':'v2'}]
  12. # name_list_generator = (dic['name'] for dic in l)
  13. # print(name_list_generator)
  14. # print(next(name_list_generator))
  15. # print(next(name_list_generator))
  16.  
  17. # egg_list=['鸡蛋%s' %i for i in range(10)]
  18. # print(egg_list)
  19.  
  20. # laomuji = ('鸡蛋%s' %i for i in range(1,11))
  21. # print(laomuji)
  22. # print(next(laomuji))
  23. # print(next(laomuji))
  24.  
  25. # print(sum([1,2,3]))
  26. # print(sum(range(1,4)))
  27.  
  28. def func():
  29. # yield from 'ABC'
  30. for i in 'ABC':
  31. yield i
  32.  
  33. # g = func()
  34. # print(next(g))
  35. # print(next(g))
  36.  
  37. for i in range(10):
  38. print(i)
  39.  
  40. [i for i in range(10)]
  41. a = 10
  42. b=20
  43. if a >b :
  44. print(a)
  45. else:
  46. print(b)
  47. a if a>b else b

一、复习

迭代器:拥有__iter__,__next__;

怎样从迭代器中取值:_next 和 for

生成器:

自己定义一个能实现迭代器功能的函数就是生成器

生成器函数:带yield的函数,调用生成器函数,不会执行函数中的任何功能,只是返回一个生成器,调用next、时才执行函数中内容,遇到yield停止,并返回yield的值

send方法就是向函数中传值,把值赋给yield对应的变量,同时还执行next方法

一个要用send方法的生成器函数中至少要有两个yield、

一个生成器函数中有多少个yield就可以调用多少个(next+send)方法、

生成器的激活只能用next方法

#2.生成器表达式
#new_g = (i*i for i in range(100)) #new_g是一个生成器表达式

二、作业

读文件,找带关键字的行

  1. # 3.处理文件,用户指定要查找的文件和内容
  2. # 将文件中包含要查找内容的每一行都输出到屏幕
  3.  
  4. def read(fname,str):
  5. with open(fname,encoding="utf-8")as f:
  6. l=f.readlines();
  7. for i in l:
  8. if str in i:
  9. yield i
  10.  
  11. aa=read("1","奥特曼")
  12. for i in aa:
  13. print(i)

、进阶版本

  1. __author__ = 'Administrator'
  2.  
  3. def init(fun):
  4. def inner(*args,**kwargs):
  5. g=fun(*args,**kwargs)
  6. next(g)
  7. return g
  8. return inner
  9.  
  10. @init
  11. def read(g_read_line):
  12. while True:
  13. fname=yield
  14. str=yield
  15. with open(fname,encoding="utf-8")as f:
  16. l=f.readlines()
  17. for line in l:
  18. if str in line:
  19. g_read_line.send(line)
  20.  
  21. @init
  22. def read_line():
  23. while True:
  24. line=yield
  25. if line:print(line)
  26.  
  27. g_read=read(read_line())
  28. g_read.send("1")
  29. g_read.send("奥特曼")

列表推倒式和生成器表达式

  1. new_l = []
  2. for i in range(100):
  3. new_l.append(i*i)
  4.  
  5. #list(range(100))
  6.  
  7. new_l = [i*i for i in range(100)]
  8.  
  9. new_l = (i*i for i in range(100)) #生成器表达式

生成器相关面试题

  1. # def demo():
  2. # for i in range(4):
  3. # yield i
  4. # g=demo()
  5. # g1=(i for i in g)
  6. # g2=(i for i in g1)
  7. # print(list(g2))
  8. # print(list(g1))
  9.  
  10. def add(n,i):
  11. return n+i
  12. def test():
  13. for i in range(4):
  14. yield i
  15. g=test()
  16. for n in [1,10]:
  17. g=(add(n,i) for i in g)
  18.  
  19. # # g=(add(n,i) for i in g)
  20. # n = 10
  21. # g=(add(n,i) for i in (add(n,i) for i in g))
  22. # print(list(g))
  23.  
  24. # for i in [1,2]:
  25. # pass
  26. #
  27. # print(i)
  28.  
  29. import os
  30.  
  31. def init(func): #预激活生成器的一个装饰器
  32. def wrapper(*args,**kwargs):
  33. g=func(*args,**kwargs) #func是一个生成器函数,返回的g是一个生成器
  34. next(g) #预激活生成器
  35. return g #返回激活后的生成器g
  36. return wrapper
  37.  
  38. @init #list_files = init(list_files) == wrapper
  39. def list_files(target): #target = opener_g
  40. while 1:
  41. dir_to_search=yield
  42. for top_dir,dir,files in os.walk(dir_to_search): #os.walk (路径,文件夹,文件)
  43. for file in files: #从文件列表中获取一个一个的文件
  44. target.send(os.path.join(top_dir,file)) #把文件的绝对路径传给了opener_g
  45. @init #opener = init(opener) == wrapper
  46. def opener(target): #target = cat_g
  47. while 1:
  48. file=yield #拿到了一个文件的路径
  49. fn=open(file,encoding='utf-8') #打开文件获取了一个文件句柄
  50. target.send((file,fn)) #cat_g发送了一个文件的路径和句柄
  51. @init #cat = init(cat) == wrapper
  52. def cat(target): #target = grep_g
  53. while 1:
  54. file,fn=yield #文件路径和文件的句柄
  55. for line in fn:
  56. target.send((file,line)) #文件路径,文件中的一行
  57. @init #grep = init(grep) == wrapper
  58. def grep(pattern,target): #要搜索的关键字,printer_g
  59. lst = []
  60. while 1:
  61. file,line=yield #文件的路径和每一行
  62. if pattern in line and file not in lst: #判断关键字是否在当前行
  63. lst.append(file)
  64. target.send(file) #printer_g.send文件路径
  65. @init #printer = init(printer) == wrapper
  66. def printer():
  67. while 1:
  68. file=yield #获取一个文件路径
  69. if file:
  70. print(file) #打印文件的路径:文件里包含了要搜索的关键字
  71.  
  72. g=list_files(opener(cat(grep('python',printer()))))
  73. # g=list_files(opener(cat(grep('python',printer_g))))
  74. # g=list_files(opener(cat(grep_g)))
  75. # g=list_files(opener(catg)))
  76. # g=list_files(opener_g)
  77. g.send('D:\Python代码文件存放目录\S6\day18')
  78.  
  79. #用户给一个路径和关键字
  80. #可以从一个文件路径中找到所有包含关键字的文件

二、匿名函数、

匿名函数 简单的需要用函数去解决的问题 匿名函数的函数体 只有一行也叫lambda表达式

  1. # cal2 = lambda n : n*n
  2. # ret = cal2(20)
  3. # print(ret)
  4.  
  5. # def add(x,y):return x+y
  6. # add2 = lambda x,y : x+y
  7. # ret = add2(1,2)
  8. # print(ret)
  1. print(max(dic))
  2. func = lambda k:dic[k]
  3. print(max(dic,key = func))
  4. print(max(dic,key=lambda k:dic[k]))
  1. l = [1,2,3,4]
  2. d=lambda x:x*x
  3. print(list(map(d,l)))
  1. l = [10,11,8,12]
  2. # def func(x):
  3. # return x>10
  4. # print(list(filter(func,l)))
  5. # print(list(filter(lambda x:x>10,l)))
  1. #现有两个元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
  2. t1 = (('a'),('b'))
  3. t2 = (('c'),('d'))
  4. print(list(zip(t1,t2)))
  5. c=lambda t:{t[0]:t[1]}
  6. d=map(c,zip(t1,t2))
  7. print (list(d))
  8.  
  9. d=list(map(lambda z:{z[0],z[1]},zip(t1,t2)))
  10. print(d)
  1. l=[i for i in range(100) if i%3==0]
  2. print(l)
  3. print(len(l))
  1. # names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
  2. # ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
  3. # print([name for lst in names for name in lst if name.count('e') >=2])
  1. mcase = {'a': 10, 'b': 34}
  2. for i in mcase:
  3. print(i)
  4.  
  5. [i for i in mcase]
  6. print({key:key+'1' for key in mcase})
  7. print({key:mcase[key] for key in mcase})
  8. print({mcase[key]:key for key in mcase})
  9.  
  10. mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
  11. mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase}
  12. print(mcase_frequency)

python 可迭代对象,迭代器和生成器,lambda表达式的更多相关文章

  1. python 可迭代对象 迭代器 生成器总结

    可迭代对象 只要有魔法方法__iter__的就是可迭代对象  list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...

  2. python编程系列---可迭代对象,迭代器和生成器详解

    一.三者在代码上的特征 1.有__iter__方法的对象就是可迭代类(对象) 2.有__iter__方法,__next()方法的对象就是迭代器3.生成器 == 函数+yield 生成器属于迭代器, 迭 ...

  3. 一文搞懂Python可迭代、迭代器和生成器的概念

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  4. Python可迭代对象、迭代器和生成器

    Python可迭代对象.迭代器和生成器 python 函数 表达式 序列 count utf-8 云栖征文 python可迭代对象 python迭代器 python生成器 摘要: 8.1 可迭代对象( ...

  5. Python中的可迭代对象/迭代器/For循环工作机制/生成器

    本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...

  6. 可迭代对象&迭代器&生成器

    在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...

  7. 11.Python初窥门径(函数名,可迭代对象,迭代器)

    Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

  8. Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器

    Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: ​ 1. 可以在局部作用域声明一 ...

  9. 孤荷凌寒自学python第十六天python的迭代对象

    孤荷凌寒自学python第十六天python的迭代对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 迭代也就是循环. python中的迭代对象有相关的如下几个术语: A容器 contrai ...

  10. 【笔记】Python基础四:迭代器和生成器

    一,迭代器协议和for循环工作机制 (一),迭代器协议 1,迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能往 ...

随机推荐

  1. Luogu 4155 [SCOI2015]国旗计划

    BZOJ 4444 倍增 + 贪心. 发现是一个环,先按照套路把环断开复制一倍,这样子的话覆盖完整个环就相当于覆盖一条长度不小于$m$的链,注意这样子有一些区间在新的这条链上会出现两次. 我们为了找到 ...

  2. PHP初级经典面试题目汇总

    17.isset.empty.is_null的区别 isset 判断变量是否定义或者是否为空 变量存在返回ture,否则返回false 变量定义不赋值返回false unset一个变量,返回false ...

  3. oracle获取表和列的备注

    using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Runti ...

  4. (转)EASYUI+MVC4通用权限管理平台

    原文地址:http://www.cnblogs.com/hn731/archive/2013/07/15/3190947.html 通用权限案例平台在经过几年的实际项目使用,并取得了不错的用户好评.在 ...

  5. 如何解决某个jar包的依赖冲突问题

    我用的是idea集成开发环境,因此以该开发工具讲解. 首先在在Terminal窗口中,键入:mvn dependency:tree -Dincludes=com.google.guava 如果不加-D ...

  6. 加载 页面 中js 方法

    js 文件中 var mingchen= mingchen|| {    init: function (){ } }; 文件中 mingchen.init(); 注意问题: 在新加载 页面中     ...

  7. EBS登陆界面个性化

    把完整资料贴出来 Set the profile option Local Login Mask (FND_SSO_LOCAL_LOGIN_MASK). (This profile option is ...

  8. springcloud 实现微服务间调用

    package com.idoipo.ibt.config; import org.apache.http.HttpException; import org.apache.http.HttpRequ ...

  9. Android ActionBar仿微信界面

    ActionBar仿微信界面 1.学习了别人的两篇关于ActionBar博客,在结合别人的文章来仿造一下微信的界面: 思路如下:1).利用ActionBar生成界面的头部,在用ActionBar的Ac ...

  10. 二、搭建SpringBoot项目

    与其说是搭建,还不如说去下载...(注意,在此之前要确保你的3000块钱的笔记本上安装了JDK8+已经最新的相对较新的maven:apache-maven-3.6.0,至于JDK以及maven的相关安 ...