python(五)生成器 模块与包的定义

回顾与练习:

利用列表生成式来检查ip是否合法

1.判断是否有空格

2.判断是否ip的每一位在0-225之间

3.是否为32位

#!/usr/bin/env python
#coding:utf-8
ip = raw_input("请输入一个ip:")
if  len(ip.split("."))!= 4:    ##将ip划分为字符串类型的列表,并判断是否为4段
    print "no"
    exit()
li = [i.isspace() for i in ip]
if li.count(True)>0:                  ##判断是否有空格
    print "no"
else:
    sip = [int(i) for i in ip.split(".")]                #逗号分隔ip的每一位,并化为整型
    for i in sip:
        if not 0<=i<=255:
            print "no"
            break
    else:
        print "yes"

## 生成器

通过列表生成式,我们可以直接创建一个列表,受到内存限制,列表容量肯定是有限的;创建一个包含 100 万个元素的列表,占用很大的存储空间在循环的过程中通过不断推算出后续的元素而创建完整的 list,从而节省大量的空间。在 Python 中,这种一边循环一边计算的机制,称为生成器(Generator)。

创建生成器,只需要将列表生成式的[ ] 改为( )  

g = ( i  for i in range(1,10))

使用g.next( )的方法依次读取生成器中的元素

fib 函数定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,逻辑非常类似 generator。要把 fib 函数变成 generator,只需要把print b 改为 yield b 就可以.

def fib(max):                 ##max为最终生成的fib数列的个数
    n,a,b = 0,0,1           ##n代表当前fib数列的个数,a代表n,b代表n-1
    while n < max:
        print b           ##当前的第一个数列
        a,b = b,a +b   ##将b赋给a,a+b赋给b
        n +=1

g生成器:

return和yield的区别

函数顺序执行,遇return语句或最后一行函数语句就返回。•generator函数在每次调用next() 的时候执行,遇到 yield 语句返回,再次执行时从上次返回的yield 语句处继续执行。

生成器的send方法:

1.使用send方法给生成器发送数据:

2.在send发送前必须调用一次next( )方法;

3.遇到下一个yeild停止

实例一:

生产者消费者模型(包子1.0):

#!/usr/bin/env python
# coding:utf-8
import time
def consumer(name):
    print "%s 准备买包子" %(name)
    while True:
        bzname = yield
        print "客户[%s]买了[%s]馅的包子" %(name,bzname)
def producer(name):
    c1 = consumer("宣萱")
    c2 = consumer("明明")
    c1.next()
    c2.next()
    print "制作包子中........."
    for i in ["肉","豆沙","韭菜"]:
        time.sleep(2)
        print "[%s]做了包子,被两个用户购买"  %(name)
        c1.send(i)
        c2.send(i)
producer("谢霆锋")

生产者消费者模型(包子2.0)

#!/usr/bin/env python 
# coding:utf-8 
import time 
def consumer(name): 
    print ("%s 准备买包子" %(name)) 
    while True: 
        bzname = yield  
        print ("客户[%s]买了[%s]馅的包子" %(name,bzname))
food = [] 
def producer(name,*kind): ##包子种类不唯一
    c1 = consumer("宣萱") 
    c2 = consumer("明明") 
    next(c1) 
    next(c2) 
    print("制作包子中.........")
    for i in kind: 
        time.sleep(2) 
        print("[%s]做了[%s]包子" % (name,i))
        food.append(i) 
        c1.send(i) 
        c2.send(i) 
producer("谢霆锋","大肉","韭菜","豆沙")

实例二:

聊天机器人

def chat_robot():
    res = ""
    while True:
        receive = yield res
        if "hi" in receive or "hello" in receive:
            res = "你好,我是小斌"
        elif "name" in receive:
            res = "你的名字是什么呢?"
        elif "age" in receive:
            res = "小斌已经1岁啦"
        elif "无聊" in receive:
            res = "小斌可以陪你聊天啊"
        elif "bye" in receive:
            res = "很高兴认识你,再见"
        else:
            res = "小斌不知道你在说什么,请换种说法"

Chat = chat_robot()
Chat.next()
#next(Chat)
while True:
    your_said = raw_input("客户>>>:")
    if your_said.lower() == "quit":
        print "Robot exit....."
        break
    response = Chat.send(your_said)
    print "小斌>>: %s" %(response)

##模块与包

在 Python 中,一个.py文件就称之为一个模块(Module)。模块大大提高了代码的可维护性;编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。

包:如果不同的人编写的模块名相同,为了避免模块名冲突,Python 又引入了按目录来组织模块的方法,称为包(Package)

创建包的步骤:
1.创建一目录为包名;
2.在该文件夹下创建__init__.py文件存放包的信息,该文件可以为空;
包的导入 : 根据需要存放脚本文件,已编译的扩展及子包;可以用import,import as,from import等语句导入模块和包

模块的分类:

-内置模块  

os 模块:

1.当前所在平台, linux  为“posix”   windows 为"nt"

2.获取当前所在的路径

os.getcwd

3.获取指定目录下的文件名

os.listdir("/root/var/log")

4.删除指定目录

os.rmdir("hello")

5.创建指定目录

os.mkdir("hello")

使用 Python 执行 Linux 命令
•os.system , 并没有返回值,是靠副作用产生输出的
•os.popen 返回一个文件对象
•os.popen2 返回两个文件对象,一个是 stdin, 一个是 stdout
•os.popen3 返回三个文件对象 :stdin,stdout,stderr

os.path 是os 的一个子模块 , 主要是对路径进行解析、创建、测试和其他的一些操作,封装了不同平台的路径操作。

sys模块:

sys.argv 获取传递给脚本的参数,参数解析类似于 bash 的方式,第一个参数代表脚本本身;

print sys.argv     #以列表方式返回传递给脚本的参数

sys.stderr , sys.stdin , sys.stdout 这些都分别代表一个文件对象;

print >> sys.stderr, 'I am error

练习:

   如果用户输入 >2 ,在当前目录创建目录hello1和hello2,并打印出这两个文件的绝对路径b;

如果当前参数=1,显示当前目录下的所有文件

如果五忍耐和参数,显示当当前目录下的所有目录信息(同linux的stat)

#!/usr/bin/env python
# coding:utf-8
import os
import sys
argv_len = len(sys.argv)    判断脚本后参数的 长度值


if argv_len > 2:
        os.mkdir("hello1")
        os.mkdir("hello2")
        cdir = os.getcwd()+os.path.sep    ##以目录分隔符显示当前目录
        print cdir+"hello1"
        print cdir+"hello2"                          ##显示目录的绝对路径
elif argv_len ==1:
    all_file = [i for i in os.listdir(".") if os.path.isfile(i)]     ##显示当前目录下的所有文件
    for i in all_file:
        print i
else:
    all_stat = [os.stat(i) for i in os.listdir(".") if os.path.isdir(i)]     ##显示当前目录下的目录信息    
    for i in all_stat:
        print i
        print

 random 模块:

练习2:
    生成一个包含4个字符的随机验证码,(由数字和字母组成);
   

    import string
    all_str = string.letters+string.digits
    "".join(random.sample(all_str,4))



    编写一个makepass模块,实现功能为为系统管理员创建的新用户帐号分配一个不同的完全随机的密码;

    def GenPasswd(length=6):
        all_str = string.letters+string.digits
        "".join(random.sample(all_str,length))   ##随机生成6个字符和数字组合

-第三方模块

itchat        jupyter notebook

安装  pip install  加模块名或在pytharm中安装

-自定义模块

导入模块(加载模块的内容)

import   模块名

import 模块名 as 模块别名

from 模块名 import 变量或者函数

作用域:
在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在 Python 中,是通过 _ 前缀来实现。比如__author__ , __name__就是特殊变量的,__func__,__fun为私有函数,不能直接引用

__name__:当不是import运行时,值为__main__.

                      当是import导入时,值为模块的名称;

因此在写代码时,会添加下面的内容:

if  __name__ == "__main__":

            print __name__

            return function()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值