2017-11-05-12迭代器和生成器;模块和包

1迭代器和生成器;2模块和包

1迭代器

	迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的iter()和next()方法。

	其中iter()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。

2生成器generator

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

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

	也就是说,yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护这挂起和继续的状态。

	生成器函数返回生成器的迭代器。"生成器的迭代器"这个术语通常被称作"生成器"。

	要注意的是生成器是一类特殊的迭代器。作为一个迭代器,生成器必须定义一些方法,其中一个就是next()。如同迭代器一样,我们可以使用next()函数获取下一个值。

	在一个generator function 中,如果没有return,则默认执行至函数完毕,如果在执行过程中return,则直接抛出StopIteration 终止迭代。

2模块和包

1内置模块

	本身就带有的库,就叫做Python的内置的库。(模块==库)

	一些常见的内置模块:

	os 和操作系统相关	os.path

	sys 和系统相关	sys.path

	sys.path.append(r' ') 可以添加路径

	re	正则表达式

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中不需要。不同的包下文件名相同也互不影响。

	导入包和模块的方法是一样的。宝会在目录中自动生成pychache文件夹存放生成的.pyc文件,要注意的是import后面的才是存在当前域中的对象名,from则告诉你python从哪里导入。

	使用sys.path添加文件的目录路径。



#迭代器生成器、模块和包
#回忆
'''
1.文件:open, (r,w,a,+,x)
        read readline  readlines
        write writelines
        flush  seek  tell
        close  closed
2.异常: try  except  else  finally.  raise   assert


'''

#1.迭代器和生成器

#补充
li = [0,2,4,6,8,10,12,14,16,18]  # 0- 100

l2 = []
for i in range(20):
    if i%2 ==0:
        l2.append(i)

        

l3 = []
for i in range(0,20,2):
        l3.append(i)

l4 = list(range(0,20,2))


#列表推导式   优化,简单代码 
l5 =[i for i in range(20)]  # 第一个 i,就是往列表 添加的 value

l6 =['aa' for i in range(20)]
#偶数
l7 =[i for i in range(20) if i%2 ==0]
#奇数
l8 = [i for i in range(20) if i%2!=0]
l8 = [i for i in range(20) if i%2==1]

#偶数   #奇数 -> 'a'
l9 = [i if i%2==0 else 'a' for i in range(20)]


#集合
s = {i for i in range(10)}

#字典
di ={i:'jianeng' for i in range(10)}


#迭代器   核心 __iter__()和__next__()
'持迭代器协议就是实现对象的 __iter__() 和__next__()方法。'

# 可迭代对象  __iter__()

# iter()   __iter__()

li = iter(li)  # li 变成一个迭代器
#li[0]
type(li)

## next()  __next__()    # 迭代的取值
next(li)
#l2.__next__()


# 只要 有__iter__()和__next__()方法  ,就是一个迭代器
'''
iter()  实现了 __iter__()
next()  实现了 __next__()

'''
# 迭代器是用来干嘛的
'''
for :
1. iter() —> 迭代器
2. next()  —>  迭代的取值

extend(iterable)  -》iter() -》 next() ->append()

'''
##for i in li:
##	print(i)



#### 生成器, 本质也迭代器

def fun():
    i = 0
    while i<5:
        print('***')
        yield i   # 暂停的  , 同时 返回值
        i +=1
        print('+++',i)




next( fun() )  #每次调用,会新生产一个对象

a = fun()
next(a)
a.__next__()


#例子:  斐波拉契数  1 1 2 3 5 8 (前面两个输的和,就是后面这个数的值)

def fib(num):
    n,a,b = 0,0,1
    while n < num:
        print(b)
        a,b = b, a+b
        n = n +1


#yield


def fib2(num):
    n,a,b = 0,0,1
    while n < num:
        print(b)
        if n%10 ==0:
            yield    #暂停
        a,b = b, a+b
        n = n +1






###2.模块和包

##模块  本质就是一个 py 文件

##内置模块   python 自带
import keyword    #会把模块里面所有的内容都导入


from random import randint  # 指定导入,节省内存


from random import *  #会把模块里面所有的内容都导入,
                     #但是不会把,_cos

from random import _cos




##第三方模块,  别人写,不是python自带的   自己写的

## 同路径下
import test   ##可以用import
test.test()   ##  调用方法
test.test1      ##  调用属性


#__name__    #我自己调用,才会执行



#不在同路径

# import test2

import os,sys
sys.path
sys.path.append(r'E:\16班基础\5高级专题')  #添加路径

import test2
test2.test()
test2.test1


#包  一个文件夹里面,放了很多的模块。 文件夹就叫包

import xml
import xml.dom
import xml.dom.domreg
# 不是系统的包就添加路径



### 补充
sys.argv


##time

import time
time.localtime()
time.asctime(time.localtime())
time.time()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值