• Python基础_迭代器、生成器、模块与包


      本节的内容是介绍几个概念。

    一.列表推倒式

      列表推导式就是列表里做一些简单的运算,直接来看几个例子。

    1 #例1: 输出10以内的所有偶数
    2 >>> l4=[i for i in range(11) if i%2==0]
    3 >>> l4
    4 [0, 2, 4, 6, 8, 10]
    1 # 2--100内质数
    2 [i for i in range(2,101) if not [j for j in range(2,i) if i%j==0]]

      注意列表推导式的形式

    二.迭代器

      迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法。
      1 其中__iter__()方法返回迭代器对象本身;

      2 __next__()方法返回容器的下一个元素,在结尾时引发StopIteration异常。

      注意: 迭代器与可迭代对象是不同的。可迭代对象只是要求有__iter__()方法,而迭代器要求同时有__iter__()和__next__()方法。

    1 >>> li=[1,2,3,4]
    2 >>> dir(li)
    3 ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__',
    '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__',
    '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__',
    '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
    '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__',
    '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert',
    'pop', 'remove', 'reverse', 'sort']

    很容易发现:列表没有__next__方法,所以列表不是迭代器。

     1 >>> g=li.__iter__()
     2 >>> dir(g)
     3 ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', 
    '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__',
    '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__',
    '__sizeof__', '__str__', '__subclasshook__'] 4 >>> g.__next__() 5 1 6 >>> g.__next__() 7 2 8 >>> g.__next__() 9 3 10 >>> g.__next__() 11 4 12 >>> g.__next__() 13 Traceback (most recent call last): 14 File "<pyshell#32>", line 1, in <module> 15 g.__next__() 16 StopIteration

    __iter__可以将一个可迭代对象变为迭代器,__next__返回迭代器元素。iter(),next() 有同样的功能。

    三.生成器  

      Python中,使用生成器可以很方便的支持迭代器协议。

      生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果,在每个结果之间挂起和继续它们的状态,来自动实现迭代协议。

      也就是说,yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护着挂起和继续的状态。生成器函数返回生成器的迭代器。 “生成器的迭代器”这个术语通常被称作”生成器”。要注意的是生成器就是一类特殊的迭代器。作为一个迭代器,生成器必须要定义一些方法,其中一个就是__next__()。如同迭代器一样,我们可以使用__next__()函数来获取下一个值。在一个 generator function 中,如果没有 return,则默认执行至函数完毕,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。

    1 def fun():
    2     i = 0
    3     while i<5:
    4         print('Fangfang')
    5         yield 'stop'
    6         i+=1
    7         print('哈哈',i)
     1 >>> g=fun()
     2 >>> g
     3 <generator object fun at 0x03612F90>
     4 >>> g.__next__()
     5 Fangfang
     6 'stop'
     8 >>> g.__next__()
     9 哈哈 1
    10 Fangfang
    11 'stop'
    12 >>> g.__next__()
    13 哈哈 2
    14 Fangfang
    15 'stop'
    16 >>> g.__next__()
    17 哈哈 3
    18 Fangfang
    19 'stop'
    20 >>> g.__next__()
    21 哈哈 4
    22 Fangfang
    23 'stop'
    24 >>> g.__next__()
    25 哈哈 5
    26 Traceback (most recent call last):
    27   File "<pyshell#50>", line 1, in <module>
    28     g.__next__()
    29 StopIteration

    三.模块和包

    1.内置模块
      本身就带有的库,就叫做Python的内置的库。(模块==库)
    一些常见的内置模块
      os 和操作系统相关 os.path
      sys 和系统相关 sys.path
      sys.path.append(r'') 可以添加路径

    2.第三方模块
      非Python本身自带的库,就是所谓的第三方的库

    3.模块的导入
      import xxx [as yy]
      from ../xx import xx [as yy]

    4.自定义模块
      py文件,可以做为一个模块来用,直接作为一个模块导入就行
      __main__ 的意义:
      当文件是直接运行是,文件的__name__是__main__ ,当文件是被导入时,__name__是文件名

    5.包管理
      基本上就是另外一类模块。把用来处理一类事物的多个文件放在同一文件夹下组成的模块集。
      要让python 将其作为包对待,在python2中必须包含__init__.py的文件,但在python3中没有__init__.py文件也可以,使用包可以避免多个文件重名的情况,不同的包下的文件同名不影响。

      导入包和模块是一样的方法,包导入后会在目录中自动生成__pycache__文件夹存放生成的.pyc文件,要注意的是import后面的才是存在当前作用域中的对象名,from是告诉python从什么地方导入,
    使用sys.path添加文件的目录路径。

    例子:

     1 #python -m pip install
     2 #内置模块
     3 #import keyward   #导入所有内容
     4 #from copy import deepcopy  #指定导入
     5 #第三方模块
     6 ##相对路径(同级路径) import +文件名
     7 
     8 ##不同路径
     9 
    10 
    11 import sys
    12 sys.path   #查找路径,返回路径  将需要导入的路径添加
    13 """sys.path.append(r'F:潭州教育python学习笔记笔记Python进阶')
    14           
    15 >>> import Car
    16           
    17 2016 tesla models
    18 This car has a 70-kwh"""
  • 相关阅读:
    VOA 翻译研讨:2009.2.26 教育报道——在美国学习:网络重新阐释学院之旅
    javac Java 编程语言编译器的使用文档
    在Eclipse中集成Ant编程之配置篇
    ANT使用范例
    MySQL实用命令
    [转]java多线程同步
    Perl 教学 列表和数组变量
    MySql常用命令总结
    MySQL 备份和恢复
    log4j配置详解
  • 原文地址:https://www.cnblogs.com/fangfang31140519/p/8561193.html
Copyright © 2020-2023  润新知