python3第五天

第一节、生成器:一边循环一边计算的机制,成为生成器

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
原文地址:https://www.cnblogs.com/jnbb/p/7284191.html