第一节、生成器:一边循环一边计算的机制,成为生成器
1.列表生成式:使代码更简洁
print ([i*2 for i in range(10)])
相当于 :
a = []
for i in range(10):
a.append(i * 2)
print(a)
第一种方法:把列表生成式的[]改成()
example:
g=((i*2 for i in range(10)))
print(g)
g[8]直接打印不了
生成器只有在调用时才会生成相应的数据(可以用next方法)
生成器只记住当前位置,不记住前面不记住后面,不能返回前面
只有一个next方法
example:# g.__next__()
g=((i*2 for i in range(10)))
print(g.__next__())
print(g.__next__())
会打印出0、2
第二种方法:函数
斐波那契数列:除第一个第二个数字外,其他任意一个数都可以由前两个相加得到
example:
def fib(max):
n,a,b=0,0,1
while n<max:
print(b)
a,b=b,a+b
n=n+1
return ‘done'
fib(10)
要变成生成器:把print(b)变成yield b
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n=n+1
return ‘done'
f=fib(10)
print (f.__next__())
print (f.__next__())
example2:
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n=n+1
return ‘done'
f=fib(100)
print (f.__next__())
print (f.__next__())
print (f.__next__())
for i in f:
print(i)
可以全部打印出来
2.yield实现多线程
example:
import time
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("老子开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c.send(i)
c2.send(i)
producer(‘a’)#执行
yield保存了函数的中断状态
send可以把值传给yield
第二节、import
使用import语句导入模块,import语句语法如下:
import module
关键字 模块名
使用方法例如:
import math #入导math模块
math.floor() #调用math模块中的floor()
如果要同时导入多个模块,只需要在模块名之前用逗号进行分隔:
import module1,module2,module3.......
同时导入多个模块的方法,对于初学者来说可读性和可理解性不如第一种好。所以想要导入多个模块时,还是比较推荐用第一种方式,把每一个模块都单独进行一次导入,可能会感觉操作起来麻烦一些,但便于理解。
在用import语句导入模块时最好按照这样的顺序:
1、python 标准库模块
2、python 第三方模块
3、自定义模块
from...import...
from module import name
关键字 模块名 关键字 方法名
例如入导函数math模块中的floor函数方法:
from math import floor
from math import floor #导入math模块中的floor函数方法
floor() #调用floor()函数方法
第三节、包
sound/ Top-level package
__init__.py Initialize the sound package
test.py
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
当导入包以后,python通过sys.path中的目录来寻找包的子目录。 每一个包都必须有__init__.py,这样做是为了防止某些目录有一个共同的名字。在最简单的情况下,__ init__.py可以只是一个空文件,但它也可以执行包的初始化代码,包括设置__all__变量,稍后介绍。 我们可以从包中导入单个模块,import一个包名,就等于执行了这个包下的__init__文件。
1、主程序与模块程序在同一目录下: 例如test要调用其他py,如果同级的直接import,如果当前目录下能够找到要调用的包,可以直接from包import模块
2、主程序所在目录是模块所在目录的父(或祖辈)目录。如echo.py 调用上级test或其他目录的wavread
1 import sys,os 2 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #__file__获取执行文件相对路径,整行为取上一级的上一级目录 3 sys.path.append(BASE_DIR) #添加路径=
import test
import formats.wavread