python开发函数进阶:可迭代的&迭代器&生成器

一,可迭代的&可迭代对象

1.一个一个的取值就是可迭代的   iterable
#str list tuple set dict
#可迭代的 ——对应的标志 __iter__

2.判断一个变量是不是一个可迭代的

# print(‘__iter__‘ in dir(list))
# print(‘__iter__‘ in dir([1,2,3]))

3.可迭代协议——凡是可迭代的内部都有一个__iter__方法

二,迭代器

1.将可迭代的转化成迭代器

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3
 4 # iterator  #迭代器
 5 # iterator   iterable#可迭代对象
 6 l = [1,2,3,4,5]
 7 for i in l:
 8     print(i)
 9 print(iter(l))   #内置函数  iter == l._iter_()
10 l.__iter__()
11 l_iterator = iter(l)
12 print(set(dir(l_iterator))-set(dir(l)))
13 print(next(l_iterator))  #迭代器就要通过next方法取值

2.迭代器小结

#迭代器里既有iter方法,又有next方法 ——迭代器协议
#通过iter(o)得到的结果就是一个迭代器,
#o是一个可迭代的

#迭代器 大部分都是在python的内部去使用的,我们直接拿来用就行了
#迭代器:内置__iter__和__next__方法

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3
 4 l = [1,2,3,4,5]
 5 l_iterator = iter(l)
 6 print(l_iterator.__next__())
 7 print(l_iterator.__next__())
 8 print(l_iterator.__next__())
 9 print(l_iterator.__next__())
10 print(l_iterator.__next__())
11 next(l_iterator) #==l_iterator.__next__()
12 # while True:  自己写相当于for循环
13 #     try:
14 #         print(next(l_iterator))
15 #     except StopIteration:
16 #         break

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

1 #!/usr/bin/env python
2 #_*_coding:utf-8_*_
3
4 from collections import Iterable
5 from collections import Iterator
6 # s = ‘abc‘
7 # print(isinstance(s,Iterable))      s 是不是一个可迭代对象
8 # print(isinstance(s,Iterator))      s 是不是一个迭代对象
9 # print(isinstance(iter(s),Iterator))

4.可迭代的和迭代器

#不管是一个迭代器还是一个可迭代对象,都可以使用for循环遍历
#迭代器出现的原因 帮你节省内存

三,生成器

#生成器函数
#生成器的本质就是迭代器

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3
 4 def func():
 5     print(‘aaaa‘)
 6     a = 1
 7     yield a    #返回第一个值
 8     print(‘bbbb‘)
 9     yield 12   #返回第二个值
10 #错误取值,相当于三个新的生成器
11 # g1 = func()
12 # g2 = func()
13 # g3 = func()
14 # print(next(func() )) #取第一个值
15 # print(next(func() )) #取第二个值
16 # print(next(func() )) #取第三个值 会报错 因为没有第三个值
17 #正确取值,都是同一个生成器
18 # ret = func()  #拿到一个生成器
19 # # print(ret)
20 # print(next(ret)) #取第一个值
21 # print(next(ret)) #取第二个值
22 # print(next(ret)) #取第三个值 会报错 因为没有第三个值

3,1 生成器做衣服实例

 1 #/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3
 4 def make_cloth():
 5     for i in range(2000000):
 6         yield "第%s件衣服"%i
 7 # szq = make_cloth()
 8 # print(next(szq))
 9 # print(next(szq))
10 #
11 # print(next(szq))
12 # for i in range(50):
13 #     print(next(szq))

3.2 监听文件实例

 1 #!/usr/bin/env python
 2 #_*_codingLutf-8_*_
 3
 4 #监听文件 tail -f
 5 import time
 6 def tail(filename):
 7     with open(filename) as f:
 8         f.seek(0, 2) #从文件末尾算起
 9         while True:
10             line = f.readline()  # 读取文件中新的文本行
11             if not line:
12                 time.sleep(0.1)
13                 continue
14             yield line
15
16 # for line in tail(‘tmp_file‘):
17 #     print(line,end = ‘‘)

3.3 计算移动平均值

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3
 4 #7日平均年化收益
 5 def averager():
 6     total = 0
 7     day = 0
 8     avrage = 0
 9     while True:
10         day_num  = yield avrage  #return avrage
11         total += day_num
12         day += 1
13         avrage = total/day
14
15 # avg = averager()
16 # num = next(avg)  #激活生成器 avg.send(),什么都不send和next效果一样
17 # print(avg.send(10))  #传值 next
18 # print(avg.send(20))

3.4 带装饰器的生成器

 1 #!/usr/bin/env python
 2 #_*_codingLutf-8_*_
 3
 4 def wrap(func):
 5     def inner(*args,**kwargs):
 6         g = func(*args,**kwargs)
 7         next(g)
 8         return g
 9     return inner
10
11 @wrap
12 def averager():
13     total = 0
14     day = 0
15     avrage = 0
16     while True:
17         day_num  = yield avrage  #return avrage
18         total += day_num
19         day += 1
20         avrage = total/day
21
22 # g = averager()
23 # print(g.send(10))
24 # print(g.send(20))
时间: 2024-10-14 20:48:19

python开发函数进阶:可迭代的&迭代器&生成器的相关文章

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

Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return l print(func(1)) # [1] print(func(2)) # [1,2] print(func(3)) # [1,2,3] 二.函数名的应用 函数名指向的是函数的内存地址,加上()就执行这个函数 def func(args): return args print(func) #

python开发函数进阶:匿名函数

一,匿名函数 #简单的需要用函数去解决的问题 匿名函数的函数体 只有一行#也叫lambda表达式# cal2(函数名) = lambda n(参数) : n*n(参数怎么处理,并且返回值)#参数可以有多个,用逗号隔开#匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值#返回值和正常的函数一样可以是任意数据类型1.函数和匿名函数 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 def cal(n): 5 return n*n 6

python开发函数进阶:递归函数

一,什么叫递归 #递归#在一个函数里调用自己#python递归最大层数限制 997#最大层数限制是python默认的,可以做修改#但是我们不建议你修改 例子和尚讲故事 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #:基础版本 5 def story(): 6 print("从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?") 7 while True: 8 story() 9 10 #:递归版本 11 def story

python开发函数进阶:命名空间,作用域,函数的本质,闭包,内置方法(globales)

一,命名空间 #局部命名空间#全局命名空间#内置命名空间 #三者的顺序#加载顺序 硬盘上--内存里#内置-->全局(从上到下顺序加载进来的)-->局部(调用的时候加载) 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #全局命名空间 5 a = 5 6 b = 8 7 #局部命名空间(函数) 8 def my_max(): 9 c = a if a > b else b 10 return c 11 m = my_max() 12 pr

python开发函数进阶:装饰器

一,装饰器本质 闭包函数 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 二,设计模式 开放封闭原则 *对扩展是开放的 *对修改是封闭的 三,代码解释 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 tag = False 5 6 def login(func): 7 def inner(*args,**kwargs): 8 global tag 9 if tag == False: 10 user = input('pl

Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func):    #定义装饰器     de

python 调用函数 / 类型转换 / 切片/ 迭代

调用函数 / 类型转换 /  切片/ 迭代 1. 调用函数:abs(),max(),min() 2. 数据类型转换:int(),float(),str(),tool(),a=abs, 3. 定义函数,如果没有return语句,函数执行完毕后也会返回结果,只是结果为None 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数为例: def my_ab

python之函数进阶

一,引言 现在我有个问题,函数里面的变量,在函数外面能直接引用么? def func1(): m = 1 print(m) print(m) #这行报的错 报错了: NameError: name 'm' is not defined 上面为什么会报错呢?现在我们来分析一下python内部的原理是怎么样: 我们首先回忆一下Python代码运行的时候遇到函数是怎么做的,从Python解释器开始执行之后,就在内存中开辟里一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇

python基础-函数之装饰器、迭代器与生成器

1. 函数嵌套 1.1 函数嵌套调用 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数 def bar(): print("from in the bar.") def foo(): print("from in the foo.") bar() foo() 1.2 求函数最大值 def max2(x,y): if x > y: return x else: return y def max4(a,b,c,d): res1 = max2(a,b) re