Python全栈之路Day22

初次编辑2017年10月28日,星期六

摘要
一. 上节课复习
二. 协程函数初始化装饰器
三. send实现爬网页
四. 面向过程的程序设计
五. 列表生成式
六. 三元表达式
七.生成器表达式
八. 声明式编程
作业
今日总结

摘要

引用:百度

  1. 列表生成式
  2. 生成器表达式
  3. 面向过程编程
  4. 递归

一. 上节课复习

  1. 可迭代的:对象有__iter__方法的都是可迭代的对象
  2. 迭代器:对象 .iter()得到的结果就是迭代器
  3. 迭代器的特征:
    1. 迭代器.next()取下一个值
    2. 优点:
      1. 提供了一种统一的迭代对象的方式,不依赖于索引
      2. 惰性计算
    3. 缺点:
      1. 无法获取迭代器的长度
      2. 一次性的,只能往后取值,不能往前退,不能像索引那样去取得某个位置的值
  4. 生成器:函数带有yield关键字,那么这个函数的执行结果就是生成器
  5. 生成器的本质就是迭代器
def func():
    n=0
    while True:
        yield n
        n += 1
g=func()
res=next(g)
for i in g:
    pass
  1. 总结yield功能:

    1. 相当于把__iter__和__next__方法封装到函数内部
    2. 与return相比,return只能返回一次,而yield可以返回多次
    3. 函数暂停以及继续运行的状态是通过yield保存的
  2. yield的表达式形式:

    food= yield

def eater(name):
    print(‘%s start to eat ‘%name)
    while True:
        food=yield
        print(‘%s eat %s‘%(name,food))
e=eater(‘zhejiangF4‘)
  1. e.send与next(e)的区别

    1. 如果函数内yield是表达式形式,那么必须先next(e)
    2. 二者的共同之处都是可以让函数在上次暂停的位置继续运行,不一样的地方在于send在触发下一次代码的执行时,会顺便给yield传一个值
    3. 另 e.send(None) 和next(e) 效果一样

二. 协程函数初始化装饰器

  1. 简单装饰器
def foo(func):
    def foo1(*args,**kwargs):
        res = func(*args,**kwargs)
        next(res)
        return res        #此处理解 生成器是一次性的
    return foo1

@foo        #eater = foo(eater) = foo1
def eater(name):
    print(‘%s start to eat food ‘% name)
    food_list = []
    while True:
        food = yield food_list
        print(‘%s get %s, to start eat ‘% (name, food))
        food_list.append(food)
    print(‘Done‘)

e = eater(‘钢蛋‘)        #foo1(‘钢蛋‘)
print(e.send(‘123‘))

三. send实现爬网页

from urllib.request import urlopen

def my_next(func):
    def foo(*args,**kwargs):
        res = func(*args,**kwargs)
        next(res)
        return res
    return foo

@my_next
def get():
    while True:
        url = yield
        res = urlopen(url).read()        #爬网页返回值
        print(res)        #输出爬网页结果

g=get()
g.send(‘http://www.baidu.com‘)
g.send(‘http://www.python.org‘)

四. 面向过程的程序设计

  1. 面向过程的编程思想:流水线式的编程思想,在程序设计时,需要把整个流程设计出来

    1. 优点:

      1. 体系结构更加清晰
      2. 简化程序的复杂度
    2. 缺点:
      1. 可扩展性极其差,所以说面向过程的应用场景是:不需要经常变化的软件
  2. 实现 #grep -rl ‘python‘ C:\egon
# grep -rl ‘python‘ C:\egon
import os

#装饰器,将生成器next初始化
def init(func):
    def foo(*args,**kwargs):
        res = func(*args,**kwargs)
        next(res)
        return res
    return foo

@init
def search(target):
    ‘查找文件绝对路径‘
    while True:
        dir_path = yield        #此yield放在while外还是内有疑问:yield放在while外就会造成死循环,无法进行下次yield
        g = os.walk(dir_path)        #g为迭代器
        for i in g:
            # print(i)
            for j in i[-1]:
                file_path = ‘%s\\%s‘%(i[0],j)
                target.send(file_path)

@init
def opener(target):
    ‘打开文件获取文件句柄‘
    while True:
        file_path = yield
        with open(file_path) as f:
            target.send((f,file_path))        #send传递两个文件时,需加括号

@init
def cat(target):
    ‘读取文件内容‘
    while True:
        f,file_path = yield
        for line in f:        #读取一行文件
            target.send((line,file_path))

@init
def grep(target,pattern):    #传递两个参数,其中pattern为要过滤的字符串
    ‘过滤文件一行中是否有python‘
    while True:
        line,file_path = yield
        if pattern in line:
            target.send(file_path)        #需传递文件路径

@init
def printer():
    ‘打印文件路径‘
    while True:
        file_path = yield
        print(file_path)

g=search(opener(cat(grep(printer(),‘python‘))))
g.send(‘C:\\egon‘)

五. 列表生成式

  1. 普通表达
egg_list = []

for i in range(100):
    egg_list.append(‘egg%s‘% i)
print(egg_list)
  1. 列表生成式表达普通
egg_list = [‘egg%s‘%i for i in range(100)]
print(egg_list)
  1. 列表生成式表达if判断
#列表内只会添加大于50的数字
egg_list = [‘egg%s‘%i for i in range(100) if i >50]
print(egg_list)
  1. 语法
[expression for item1 in interable if condition1
                    for item2 in interable if condition2
                    …
                    for itemN in interable if conditionN
                    ]

类似于

res = []
for item1 in interable:
    if condition1:
        for item2 in interable:
            if condition2:
                …
                for itemN in interable:
                    if conditionN:
                        res.append(expression )
  1. 实现查找文件绝对路径,以列表的形式表达
import os

g = os.walk(‘C:\\egon‘)
l = [‘%s\\%s‘% (i[0],j) for i in g for j in i[-1]]
print(l)
#[‘C:\\egon\\a.txt - 副本.txt‘, ‘C:\\egon\\a.txt.txt‘, ‘C:\\egon\\a\\a.txt.txt‘, ‘C:\\egon\\a\\a2.txt.txt‘, ‘C:\\egon\\b\\a.txt.txt‘, ‘C:\\egon\\b\\a1.txt.txt‘]

六. 三元表达式

name = ‘alex‘
name = ‘egon‘

res = ‘sb‘ if name ==‘alex‘ else ‘shuai‘
print(res)        #输出shuai

七.生成器表达式

  1. 语法:与列表生成式相似
(expression for item1 in interable if condition1
                    for item2 in interable if condition2
                    …
                    for itemN in interable if conditionN
                    )
  1. 优点:省内存,一次只产生一个值在内存中
  2. 应用:读取一个大文件的所有内容,并且行处理
#读取文件,并去掉每一行两头空格
f = open(‘a.txt‘)
g= (line.strip() for line in f)
print(next(g))

注意:因g为可迭代的,因而可以转换成列表list(g)

八. 声明式编程

  1. 消费总额计算
#鸡蛋  5  3
#特斯拉 10000000.2  5
#上衣  1000    3
#裤子  2000    3
#袜子  100
#读取包含以上信息的文件,并计算总共花费

#第一种传统写法
total = []
with open(‘b.txt‘,‘r‘,encoding=‘utf-8‘) as f:
    for line in f:
        goods=line.split()    #split用法及返回值需加强
        # print(goods)
        res = float(goods[1])*float(goods[-1])
        total.append(res)
print(total)
print(sum(total))

#第二种声明式编程写法
f=open(‘b.txt‘,‘r‘,encoding=‘utf-8‘)    #不能用with 否则会IO操作报错
total=(float(line.split()[1])*float(line.split()[-1]) for line in f)

print(total)
print(sum(total))
  1. 文件内容以字典形式嵌套在列表中
#[{‘name‘: ‘袜子‘, ‘price‘: ‘100‘, ‘num‘: ‘3‘}, {‘name‘: ‘袜子‘, ‘price‘: ‘100‘, ‘num‘: ‘3‘}, {‘name‘: ‘袜子‘, ‘price‘: ‘100‘, ‘num‘: ‘3‘}, {‘name‘: ‘袜子‘, ‘price‘: ‘100‘, ‘num‘: ‘3‘}, {‘name‘: ‘袜子‘, ‘price‘: ‘100‘, ‘num‘: ‘3‘}]
# 基本写法
res = []
d = {}

with open(‘b.txt‘,‘r‘,encoding=‘utf-8‘) as f:
    for line in f:
        l = line.split()
        d[‘name‘] = l[0]
        d[‘price‘] = l[1]
        d[‘num‘] = l[2]
        res.append(d)
print(res)
  1. 模拟数据库查询
with open(‘b.txt‘,‘r‘,encoding=‘utf-8‘) as f:
    res = (line.split() for line in f)
    dic_g = ({‘name‘:line[0],‘price‘:line[1],‘num‘:line[2]} for line in res)
    goods_dic = next(dic_g)
    print(goods_dic[‘num‘])
  1. 关于with open() 报错
with open(‘b.txt‘) as f:
    d = f
print(d)        #有内存地址,不是很理解
print(next(d))    #报错

作业

今日总结

时间: 2024-10-08 12:33:41

Python全栈之路Day22的相关文章

Python全栈之路系列之赋值与运算符

Python全栈之路系列之赋值与运算符 在继续下面的文章之前我们先来浏览一下Python为我们提供的几种运算符,定义两个变量,分别是a和b,a的值是10,b的值是20. 算术运算符 运算符 描述 实例 + 加,两个对象相加 a+b=30 - 减,两个对象相减,可能会得到负数 a-b=-10 * 乘,两数相称或是返回一个被重复若干次的字符串 a*b=200 / 除,两个对象相除 b/a=2 % 取膜,返回除法的余数 b%a=0 ** 幂,返回x的y次幂 a**b=10000000000000000

Python全栈之路_01

Python全栈之路 前言:因为Python主要是在Linux和widows操作系统上使用所以,首先就介绍Pyhton在这两个平台上的安装和一些基础知识 Linux系统下安装Pyhton 1.工具 虚拟机:VMware workstation 12 Pro Linux系统:CentOS 64 位 VMware虚拟机安装很简单就不说明了. 在虚拟机安装CentOS 需要注意的是: 运行内存分配1G左右即可 可以开机按F2进入bios界面boot目录下选择启动设备选择Hard Drive为优先启动位

python 全栈之路

python 全栈之路 一. python 1. Python基础知识部分 Python Python那点事 Python windows和linux下 安装 Python2,Python3 Python 开启入坑之路 Python 基本数据类型 Python 那些零碎的知识点 Python -函数 Python - 面对对象 Python - 模块 Python - 文件操作 Python - python中经常踩得的坑 2. Python - 网络编程 3. Python - 并发编程 二.

Python全栈之路----常用模块----hashlib加密模块

加密算法介绍 HASH       Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值. 简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数. HASH主要用于信息安全领域中加密算法,他把一

Python全栈之路----函数----返回值

函数外部的代码想要获取函数的执行结果,就可以在函数里用return语句,把结果返回. def stu_register(name,age,course='PY',country='CN'): print('----注册学生信息----') print('姓名:',name) print('年龄:',age) print('国籍:',country) print('课程:',course) if age > 22: return False else: return True registriat

Python全栈之路系列----之-----面向对象4接口与抽象,多继承与多态)

接口类与抽像类 在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念 编程思想 归一化设计: 1.接口类 不实现具体的方法,并且可以多继承 2.抽象类 可以做一些基础实现,并且不推荐多继承 编程的几类原则: 开放封闭原则:对扩展示开放的,对修改是封闭的依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该应该依赖细节:细节应该依赖抽象.换言之,要针对接口编程,而不是针对实现编程接口隔离原则:使用多个专门的接口,而不使用单一的总接口.

python全栈之路【四】测试 2

1.请用代码实现:利用下划线将列表的每一个元素拼接成字符串,li = ['alex', 'eric', 'rain'] li = ['alex', 'eric', 'rain'] v = "_".join(li) print(v) alex_eric_rain 2.查找列表中元素,移除每个元素的空格,并查找以 a 或 A 开头 并且以 c 结尾的所有元素. li = ["alec", " aric", "Alex", &quo

Python全栈之路Day1(补)

2017年9月18日 0:20:28 摘要一.计算机硬件介绍二.计算机启动流程作业今日总结 摘要 引用:东方越迁blog 因前期笔记整理较差,故重新开始整理笔记并且每日上传至blog. 一.计算机硬件介绍 概念:由一条总线把CPU.内存和I/O设备串联起来并与其他设备进行通信.CPU负责运算,内存用于储存临时变量,硬盘用于储存数据 处理器CPU(寄存器+控制器) 取指令->解码->执行,直到程序结束. 通用寄存器:用来保存变量和临时结果 程序计数器:它保存了将要取出的下一条指令的内存地址.在指

Python全栈之路系列----之-----re模块(正则表达式)

正则表达式并不是python中的一部分,正则表达式适用于处理字符串的强大工具,拥有自己独特的语法,以及独立的处理引擎.在提供了正则表达式的语言中都它的语法是都一样的 re模块本质上和正则表达式没有一毛钱的关系,re模块是python提供给我们方便操作正则的工具而已 正则表达式概念 使用单个字符串规则来描述匹配一系列符合某个句法规则的字符串 是对字符串操作的一种逻辑公式 应用场景:处理文本和数据 正则表示是过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功:否则匹配失败 正