13.迭代器、生成器、模块和包

1.推导表达式

列表推导

   构建一个元素1-10的列表

    1)循环添加

        li=[]

        for i in range(11):

            li.append(i)

    2)列表推导

        li=[i for i in range(1, 11)]

构造形式:

列表推导+条件判断:

    li=[i for i in range(1, 11) if i%2==0]

列表推导+三目运算

    li=[i if i%2==0 else 0 for i in range(1, 11)]

集合和字典推导

集合推导

set = {i for i in range(1, 11)}

字典推导

dic = {i:j for i,j in enumerate(li)}(还记得枚举类型吗)

2.迭代器和生成器

从可迭代对象中依次取出元素

迭代

1)for 迭代变量 in 可迭代对象(每次循环都会使迭代变量指向下一个元素)

2)while循环

例:

the_list = [5, 4, 1, 3, 2]                                  i=0

for i in the_list:                                              while i<len(the_list)

    print(the_list[i])                                                 print(the_list[i])

                                                                               i+=1

迭代器

对可迭代对象元素的遍历

1)生成迭代器

  • iterator = iter(可迭代变量名)   ->函数方法
  • iterator = li.__iter__                 ->魔术方法

2)迭代器对象本身需要支持以下两种方法,一起构成迭代器协议

    iterator.__iter__

    iterator.__next__

3)取值

    next(iterator)

    iterator.__next__()

    注意:迭代器值取完后,会返回StopIteration错误

从可迭代对象生成一个迭代器

迭代器 = iter(可迭代对象)

下个值 = next(迭代器)

例:

the_list=[i for i in range(1,11)]
it = iter(the_list)
while True:
   print(next(it))

生成器 

特殊的迭代器,不需要__iter__()__next__()方法,只需要一个yiled关键字

例:

def fib():   #斐波那契数列
 
   prv, cur = 1, 1

   i = 0
   while True:
     yield cur
     prv, cur = cur, prv + cur

 a = fib()
 it = iter(a)
 i=0
 while i<10:
    print(next(i))

生成器无return,返回结果自动生成迭代器。实例化石时函数体的代码不会运行,在yield处 暂停,只有当调用nenxt()方法时才会激活下方代码,返回yield后的变量

yield 运行规则

1)返回这个对象

2)暂停这个函数

3)等待下次next重新激活

注意:

1)yield 表达式只能在函数中使用,在函数体中使用 
2)yield 表达式可以使函数成为一个生成器
3)yield 可以返回表达式结果,并且暂定函数执行,直到next激活下一个yield

3.模块

前边已经略微用到过模块的方法,即import + 模块名称来导入模块。另外,每一个py文件也可以看作一个模块,即在一个文件中调用另一个文件。

导入方法:

  • import 模块
  • from 模块 import 子模块 as 重命名(from datetime import datetime( as the_time) )

注:1)在python3中导入后,会在当前路径下生成一个 __pycache__  文件夹

       2)相同目录下文件的导入可用以上两种方法,不同目录下,需要使用sys.path添加路径

           sys.path.append('path')

           如:

– project 
    |–  1 
    |    |–  2 
    |    |    |–  3
    |    |    |    |–
a.py 
    |–  A 
    |    |–  test.py
    |    |–  B
    |    |    |–  C
    |    |    |    |–-c.py

当前文件为c.py,需要导入a.py中的A()方法
import sys

sys.path.append('../../../1/2/3')

from a import A
4.包和包管理

1)包概念:把很多模块放到一个文件夹里面,就可以形成一个包

2)包管理:当把很多模块放在文件中时,为了方便引用包中的模块,引入了包管理

3)__init__.py:在包管理中,加入此模块,则包名可以直接通过属性访问的方式,访问此模块的对象,此模块不                         加上可能不会报错,但是规范是要加上,文件内容可以为空

导入规则:

  • from 包名 import 模块名 (as 重命名)
  • from 包名.模块名 import 函数名 (as 重命名)
  • from 包名 import * (导入包中的全部模块)


猜你喜欢

转载自blog.csdn.net/weixin_42089175/article/details/80601706