可迭代对象:obj.__iter__
 
迭代器:iter1=obj.__iter()
1iter1.__next__
2iter2.__next__
 
迭代器:
优点:不依赖索引
            惰性计算,节省内存
缺点:
        不如按照索引的取值方便
         一次性,只能往后取,不能回退
 
迭代器的应用:
  • 提供了一种不依赖索引的统一的迭代方法
  • 惰性计算,比如取文件的每一行

判断可是否是可迭代对象和迭代器

from collections import Iterable, Iterator # 导入模块功能

isinstance(a, Iterable) 查看a是否为可迭代对象

isinstance(a, Iterator) 查看a是否为可迭代器

迭代器:

 d={'a':1,'c':2,'b':3}

 obj=d.__iter__()
while 1: #while 迭代
try:
i=obj.__next__()
print(i)
except StopIteration:
break for i in d: #for 迭代
print(i)
字符串,列表元组,字典,集合,文件都是可迭代的,只有文件是迭代器

生成器:

生成器函数:函数体内包含有yield关键字,该函数的执行结果是生成器函数
生成器函数运行的得到生成器
生成器就是迭代器
yield的功能:
  • 与return 类似,都可以返回值,但不一样的地方在于yeild返回多次值,而return只能返回一次值
  • 为函数封装好了__iter__ 和__next__,把函数的执行结果做成一个迭代器
  • 遵循迭代器的取值方式obj.__next(),触发的函数执行,函数暂停与再继续的状态都是由yiel保存

(包含yield的函数)
  yield 可以进行返回值操作,如果后面没有yield拦住,作为返回值,会报错 StopIteration  
    def foo():
      print(111)
      yield 1 # 如果打印下面.__next__的结果的话,会打印这个返回值
      print(222)

    f = foo() # 运行这一句的时候,系统不会运行 foo(),而是直接生成一个迭代器f
    f.__next__()
    f.__next__()

 def producer():
print('first------>')
yield 1
print('second------>')
yield 2
print('third------->')
yield 3 for i in producer():
print(i)
def countdown(n):
print('start countdown') while n>0:
yield n
n-=1
print('stop countdown') for i in countdown(9):
print(i)

列表解析
  # 要求:将 s = 'hello' 放到新列表中
  [i.upper() for i in s] # for 循环得到i,将i作为列表的元素
  # 要求:判断列表 l = [1,31,73,84,57]中的元素, 如果大于30,就将i加入新列表
  res = [i for i in l if i > 30]
      加入字典的值(i)   循环( for i in l )     条件( if i > 30 )

三元表达式
  res = 2 if 2 > 3 else 3     # 正确时执行 判断条件 错误时执行
  print(res)
  结果:3            # 执行结果为 3

学习实例:

import time
def tail_func(filename,encoding='utf-8'):
with open(filename,'r',encoding=encoding) as f:
f.seek(0,2)
while 1:
line=f.readline()
if line:
yield line
else:
time.sleep(0.5) def grep_func(lines,pattern):
for line in lines:
if pattern in line:
print( line) b=tail_func('b.txt')
c=grep_func(b,'error')
for i in grep_func(c,''):
print(i)

编写 tail -f a.txt |grep 'error' |grep '404'命令

函数---迭代器&生成器&列表解析&三元表达式的更多相关文章

  1. day4 内置函数 迭代器&生成器 yield总结 三元运算 闭包

    内置函数: 内置函数 # abs()返回一个数字的绝对值.如果给出复数,返回值就是该复数的模. b = -100 print(b) print(abs(b)) # all() 所有为真才为真,只要有一 ...

  2. Python 迭代器和列表解析

    Python 迭代器和列表解析 1)迭代器 一种特殊的数据结构,以对象形式存在 >>> i1 = l1.__iter__() >>> i1 = iter(l1) 可 ...

  3. python函数-迭代器&生成器

    python函数-迭代器&生成器 一.迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议: ① 协议内容:内部实现__iter__方法 ...

  4. Python(五)之迭代器和列表解析

    Python迭代器和列表解析 迭代器 例如: In [1]: l1 = [1,2,3,4,5] dir(i1)可以看到内置方法'__iter__' 生成一个迭代器: l1.__iter__,或i2 = ...

  5. Python自动化运维之7、生成器、迭代器、列表解析、迭代器表达式

    迭代器和生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外 ...

  6. 3、Python迭代器、列表解析及生成器(0530)

    1.动态语言 sys.getrefcount()    //查看对象的引用计数 增加对象的引用计数场景 对象创建时:以赋值的方式,创建变量名的同时就会创建变量 将对象添加进容器时:类似list.app ...

  7. xpinyin-函数返回多个值-lambda匿名函数-列表生成式-三元表达式

    import xpinyinp=xpinyin.Pinyin() #实例化print(p.get_pinyin('小白','')) 函数返回多个值:1.函数如果返回多个值的话,它会把这几个值放到一个元 ...

  8. 函数与函数式编程(生成器 && 列表解析 && map函数 && filter函数)-(四)

    在学习python的过程中,无意中看到了函数式编程.在了解的过程中,明白了函数与函数式的区别,函数式编程的几种方式. 函数定义:函数是逻辑结构化和过程化的一种编程方法. 过程定义:过程就是简单特殊没有 ...

  9. python学习-迭代器,列表解析和列表生成式

    迭代器为类序列对象提供了一个类序列的接口.Python 的迭代无缝的支持序列对象,而且还允许程序猿迭代非序列类型,包括用户定义的对象. 迭代器是一个next()方法的对象,而不是通过索引计数.当需要下 ...

随机推荐

  1. Gold Balanced Lineup - poj 3274 (hash)

    这题,看到别人的解题报告做出来的,分析: 大概意思就是: 数组sum[i][j]表示从第1到第i头cow属性j的出现次数. 所以题目要求等价为: 求满足 sum[i][0]-sum[j][0]=sum ...

  2. SecureCRTPortable.exe 如何上传文件

    如果未安装在命令行输入:yum install lrzsz rz     然后上传自己的文件.在解压

  3. 第一百九十八节,jQuery EasyUI,ProgressBar(进度条)组件

    jQuery EasyUI,ProgressBar(进度条)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 ProgressBar(进度条) ...

  4. Android无线测试之—UiAutomator UiObject API介绍三

    拖拽与滑动 一.拖拽与滑动的示意图 二.拖拽与滑动相关的API 返回值 API 描述 boolean dragTo(UiObject destObj, int setps) 拖拽对象到另一个对象位置上 ...

  5. 41、Android中当数据库需要更新时我们该怎么办?

    转载  http://blog.csdn.net/jiangwei0910410003/article/details/39670813

  6. vue之v-bind:style

    <div class="collect" @click="collected=!collected"> <i class="fa f ...

  7. SQL获取某个时间字符串里的月和日,获取某天是周几

    select datename(weekday,'2016-11-4') as '周' select convert(varchar,datepart(month,'2016-11-4')) as ' ...

  8. TFS二次开发-基线文件管理器(2)-TFS登录

    首先需要做一个TFS的登录. 以前的文章是使用的DomainProjectPicker 最新的VS里面使用的是TeamProjectPicker 首先可以在WinForm程序上写一个Button,然后 ...

  9. JavaScript和jQuery改变标签内容

    HTML: <div id="mazey">content</div> JavaScript: var mazey=document.getElementB ...

  10. Oracle数据库使用Analyze提升sql性能

    Oracle数据库使用Analyze提升sql性能 如果你不使用analyze完成sql优化,将意味着:你拒绝使用数据库的查询优化器,也失去了使用优化连接的机会.假设你创建了一张拥有100万条记录的临 ...