>  기사  >  백엔드 개발  >  Python에서 반복자와 목록 이해를 사용하는 방법은 무엇입니까?

Python에서 반복자와 목록 이해를 사용하는 방법은 무엇입니까?

零下一度
零下一度원래의
2017-07-17 09:47:521389검색

Iterator: 예비 연구

이전 장에서 언급했듯이 실제로 for 루프는 모든 반복 가능한 개체에 사용할 수 있습니다. 실제로 이는 for 루프, 목록 이해, 멤버십 테스트 및 맵 내장 함수를 포함하여 왼쪽에서 오른쪽으로 개체를 검색하는 Python의 모든 반복 도구에 해당됩니다.

"반복 가능한 객체"라는 개념은 Python에서 상당히 새로운 개념입니다. 기본적으로 이는 시퀀스 개념의 일반화입니다. 즉, 객체가 실제로 저장된 시퀀스이거나 도구 환경에서 한 번에 하나씩 반복할 수 있는 객체인 경우입니다. , 그런 다음 반복 가능하다고 생각하십시오.

>>파일 반복자
파일은 반복 가능하므로 호출될 때마다 파일의 다음 줄을 반환하는 __next__라는 메서드가 있습니다. 파일 끝에 도달하면 __next__는 빈 문자열을 반환하는 대신 내장된 StopIteration 예외를 발생시킵니다.

이 인터페이스는 Python의 소위 반복 프로토콜입니다. __next__ 메소드가 있는 객체는 다음 결과로 진행되고 일련의 결과가 끝나면 StopIteration이 트리거됩니다. 그러한 객체는 모두 반복 가능한 것으로 간주됩니다. 모든 반복 도구는 각 반복에서 __next__를 호출하고 StopIteratin 예외를 포착하여 언제 종료할지 결정함으로써 내부적으로 작동하기 때문에 그러한 객체는 for 루프나 다른 반복 도구를 사용하여 반복될 수도 있습니다.

Python 반복자와 목록 이해

1) 반복자

 一种特殊的数据结构,以对象形式存在
        >>> i1 = l1.__iter__()
        >>> i1 = iter(l1)
        可迭代对象:
            序列:      list、str、tuple
            非序列:     dict、file
            自定义类:  __iter__()、 __getitem__()
   注意:
         若要实现迭代器,需要在类中定义next()方法
         要使迭代器指向下一个对象,则使用成员函数 next() 
             i1.next()
         当没有元素时,会引发StopIteration异常
         for循环可用于任何可迭代对象
         
         例:   >>> l1 = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
                >>> i1 = l1.__iter__()
                >>> il.next()
                'Sun' 
                >>> il.next()
                'Mon'

2) 목록 이해 [ ]

根据已有列表,高效生产新列表的方式。 常用于实现创建新的列表,因此要放置于 [ ] 中
语法:
    [ expression for iter_var in iterable ]
    [ expression for iter_var in iterable if cond_expr ]

    os模块中  listdir() 能够列出所有文件
    例:事先定义l1 l2        l1 = [ 1,2,3,4,5 ]     l2=[ ]                
           >>>  for i in l1:
                   l2.append(i**2)                     l2列表内各项为l1的平方
           >>>  print l2
           [1, 4, 9, 16, 25]

            >>> l3 = [ i**2 for i in l1 ]               l3列表内各项为l1的平方
            [1, 4, 9, 16, 25]
          
            >>> l4 = [ i**2 for i in l1 if i>=3 ]       l3列表内各项为l1中 >= 3的平方
            [9, 16, 25]
            
     例题:  l1 = ['x','y','z']     l2 = [1,2,3]  应用列表解析方法使其各项相乘
            
            >>> l3 = [ (i,j) for  i in l1 for j in l2 ]     for循环内部嵌套一个for循环实现各项乘
            [('x', 1), ('x', 2), ('x', 3), ('y', 1), ('y', 2), ('y', 3), ('z', 1), ('z', 2), ('z', 3)]

3) 생성기( )

    惰性计算、延迟求值
    生成器表达式并不真正创建数字列表,而是返回一个生成器对象,此对象在每次计算出一个条目后,把这个条目产生出来(一次返回一个值)
    语法:
        ( expr for iter_var in iterable )
        ( expr for iter_var in iterable  if cond_expr )
    
     例:  >>> l1 = ( i**2 for i in range(2,11,2))
           >>> l1.next()
           2
           >>> l1 = ( i**2 for i in range(2,11) if i%2==0 )
           >>> l1.next()
           2
     注意:
        序列过长,并且每次只获取一个元素时,应当考虑使用生成器表达式而不是列表解析
        列表解析与生成器的关系相当于range()与xrange()

4) 오프셋 및 요소 생성

    enumerate
    同时偏移缩印和偏移元素,使用enumerate()函数
    此内置函数返回一个生成器对象
    >>> S = 'Hello,world'
    >>> a = enumerate(S)
    >>> a.next()
    (0,'H')
    >>> a.next()
    (1,'e')

위 내용은 Python에서 반복자와 목록 이해를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.