初次编辑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=0while True:yield nn += 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=yieldprint('%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_listprint('%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 urlopendef my_next(func):def foo(*args,**kwargs):res = func(*args,**kwargs)next(res)return resreturn foo@my_next
def get():while True:url = yieldres = 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 resreturn foo@init
def search(target):'查找文件绝对路径'while True:dir_path = yield        #此yield放在while外还是内有疑问:yield放在while外就会造成死循环,无法进行下次yieldg = 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 = yieldwith open(file_path) as f:target.send((f,file_path))        #send传递两个文件时,需加括号@init
def cat(target):'读取文件内容'while True:f,file_path = yieldfor line in f:        #读取一行文件target.send((line,file_path))@init
def grep(target,pattern):    #传递两个参数,其中pattern为要过滤的字符串'过滤文件一行中是否有python'while True:line,file_path = yieldif pattern in line:target.send(file_path)        #需传递文件路径@init
def printer():'打印文件路径'while True:file_path = yieldprint(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 condition1for 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 osg = 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 condition1for 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))    #报错

作业

今日总结

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

转载于:https://www.cnblogs.com/sama/p/7825409.html

Python全栈之路Day22相关推荐

  1. Python全栈之路系列之数字数据类型

    上篇文章中我们简单的体验了Python语言基本概念与语法,那么在继续深入下去的过程中,不妨先学习几个常见的Python内置数据类型?这也是大部分Python教科书的学习目录,由浅至深,慢慢深入. Py ...

  2. Python全栈之路---day01(背景、语法初识)

    PART ONE Python背景知识 Python历史 1989年的圣诞节期间,荷兰人吉多·范罗苏姆(Guido van Rossum),即我们熟悉的龟叔,在阿姆斯特丹不堪眼前的无趣生活,决心开发一 ...

  3. 【四十一】Python全栈之路--JS

    文章目录 1. js的数据类型 1.1 js引入方式 1.2 注释变量 1.3 数据类型 2. js类型转换_运算符 2.1 强制转换_Number 2.2 强制转换_String 2.3 强制转换_ ...

  4. 【四十五】Python全栈之路--JQuery

    文章目录 1. lable标签补充 2. jquery引入和简单使用 3. 选择器 3.1 基础选择器 3.2 组合选择 3.3 层级选择器 3.4 属性选择器 3.5 表单对象属性选择器 3.6 表 ...

  5. 1.python全栈之路:python基础

    变量: 变量的限制 变量名: 1. 只能用数字,字母,下划线 组成 2. 不能以数字开头 3. 变量名不能是python内部的关键字基本的数据类型:1. 数字:123  age = 18 2. 字符串 ...

  6. Python全栈之路系列----之-----内置函数和匿名函数lamdba

    引子 什么是内置函数? 内置函数就是python 提供给我们直接拿来就可以用的函数   内置函数--内置命名空间   只管调用 不管实现 总共68个 def func(): == #这是自己定义的函数 ...

  7. 【四十六】Python全栈之路--bootstrap

    文章目录 1. bootstrap简单介绍_栅格_布局容器 1.1 bootstrap简单使用 1.2 布局容器 1.3 栅格单位 1.4 表单 2. bootstrao组件和插件简单使用 2.1 简 ...

  8. 【十二】Python全栈之路--推导式_生成器

    文章目录 1. 推导式 2. 推导式练习 3. 集合_字典推导式 4. 生成器 4.1 生成器表达式 4.2 生成器函数 5. 小练习 1. 推导式 # ### 推导式 : 通过一行循环判断遍历出一些 ...

  9. 【七】Python全栈之路--字符串_列表相关操作

    文章目录 1. format格式化_填充符号使用 1.1 format格式化 1.2 format的填充符号的使用 2. 字符串相关的方法 3. 列表的相关操作 4. 列表的相关函数 5. 深浅拷贝 ...

  10. Python全栈之路标准库系列之random模块

    This module implements pseudo-random number generators for various distributions. random.random() 生成 ...

最新文章

  1. 【问题收录】Ubuntu Starting LightDM Display Manager fail
  2. 扩增子统计绘图3热图:样品相关分析,差异OTU
  3. IIS日志自动删除程序 收藏
  4. 【设计模式】命令模式
  5. (转)CocosCreator零基础制作游戏《极限跳跃》二、制作游戏开始场景
  6. java customerservlet_顾客管理系统java+servlet
  7. [设计模式] ------ 工厂方法模式
  8. 想推翻JAVA的统治? 呵洗洗睡吧
  9. mysql安装(glibc版本安装5.7.22)
  10. 【转载】解决telnet无法连接 Connection refused
  11. 2、pip2.7安装Ansible
  12. .NET Framework高低版本兼容问题解决办法
  13. Linux下wps文档结构图,wps文字的文档结构图
  14. 二月、三月校招面试复盘总结(二)
  15. ant design pro入门踩坑:删除页面文件报错
  16. 深圳学位分数计算机,深圳各区学位录取积分出炉!罗湖录取到C类,南山最高降40分……...
  17. 目标检测算法汇集介绍
  18. springcloud启动错误
  19. itchat实现微信聊天机器人,定时发送微信消息,消息防撤回,消息监控,自定义回复消息
  20. gear s3刷android wear,【干货】三星Gear S3/Gear S3 classic 智能手表刷机教程

热门文章

  1. MySQL 大表优化方案(长文)
  2. Java中的锁原理、锁优化、CAS、AQS
  3. 高级政工师具备的能力_广东省固体废弃物利用处置能力评价资质申报指南
  4. Mybatis-Spring扫描路径有重叠导致Invalid bound statement(not found)问题
  5. 廖雪峰Java2面向对象编程-5包和classpath-4classpath和jar
  6. Delphi / Pascal 语法知识干货
  7. 解决CentOS内网机通过Windows下架设代理来访问网络
  8. JAVA过滤器的使用(Filter)
  9. ASP.NET MVC 缓存使用示例
  10. Ruby学习笔记1 -- 基本语法和数据类型, Class