day8-基础函数的学习(三)
开始今日份总结
今日目录
1.生成器
2.列表推导式
3.匿名函数
4.装饰器
开始今日份总结
1.生成器
1.1 生成器的定义
定义:生成器本质就是迭代器,生成器是自己用python代码写的迭代器
1.1.1 生成器函数
def func():
yield 666
yield '三包春药'
ret = func()
#函数中含有yield这个关键字参数就是一个生成器函数
print(next(ret))
print(next(ret))
print(next(ret))
#一个next对应一个yield,如果输入多的next则报错
#StopIteration错误
对于yield与return之间的差别
- 俩者都会返回值,return是给函数的执行者返回值,yield是给next()返回值
- 碰到return会结束函数,yield只会冻结函数,有一个next唤醒输出
1.1.2 生成器的用法
现在有一个需求:商家需要500个搪瓷杯,找甲乙俩家生产搪瓷杯,甲一次性备料,一次性生产完毕,乙根据生产需求,提了需求,然后生产一部分
甲厂
def glass():
for i in range(500):
print('%s号杯子'%i)
glass()
乙厂
def glass2():
for i in range(500):
yield '%s号杯子'%i
obj = glass2()
for i in range(100):
print(next(obj))
for j in range(20):
print(next(obj))
#可以分批,根据订单来生产商品,第一批100,第二批20
通过上面我们可以得知生成器的特点
- 节省内存,需要一个你产生一个
- 惰性机制,只有调用时才运行
- 一条道走到黑,只会一直往下走,不会返回
1.2 send的用法
send的用法,不止能对应yield传值,也可以给上一个yield发送一个值
def func():
msg1 =yield ''
print(msg1)
msg2 = yield 'abc'
print(msg2)
yield [12,13,14] genor = func()
print(genor.send(None))
print(genor.send('ABC'))
print(genor.send(333))
#结果
111
ABC
abc
333
[12, 13, 14]
#例外情况一:第一个send不为空
报错:can't send non-None value to a just-started generator
谨记send是对上一个yield赋值
#例外情况二:在最后一个位置多输入一个send
报错:StopIteration
谨记send和和yield是一一对应,多一个就会报这个错误
1.3 yield from的用法
这个是最新的python 3.x的用法
#按照我们的想法应该是迭代的输出test1.test2 .test3. test4
def func():
li =['test1','test2','test3','test4']
yield li
obj = func()
for i in obj:
print(i)
#结果
['test1', 'test2', 'test3', 'test4']
#原因是yield是将li当做是单独的元素返回出来,并不是一个个出来
#为了改善,只能将以下方法
def func():
li =['test1','test2','test3','test4']
yield from li
obj = func()
for i in obj:
print(i)
#结果
test1
test2
test3
test4
#yield from是将一个可迭代对象变为迭代器
2.列表推导式
2.1 列表推导式的优点以及常用的三种方法
列表推导式:用一行代码构建简单或者较复杂的列表,还有为了减少代码量,还有最重要的装逼(不知道会不会被打)
2.1.1 循环模式
列表结构: [ 变量(加工后的变量)for 变量 in iterable ]
print([i for i in range(1,101)])
#构建一个列表:['python1期', 'python2期',....'python25期']
l1 = ['python%s期' %i for i in range(1,26)]
print(l1)
#很简单的构建了一个列表
2.1.2 筛选模式
列表结构:[变量(加工后的变量)for 变量 in interable if 条件]
# 三十以内所有的偶数留到列表中
# print([i for i in range(1,31) if i % 2 == 0]) # 30以内所有能被3整除的数
# print([i for i in range(1,31)if i % 3 == 0])
# 30以内所有能被3整除的数的平方
# print([i**2 for i in range(1,31)if i % 3 == 0])
# ['地球1号', '地球3号','地球5号',....'地球99号',]
# print(['地球%s号'% i for i in range(1,100,2)])
2.1.3 三元模式(循环模式)
其实就是带三元运算的循环模式
# 构建一个列表:列表里面的元素是1~20,但是能被3整除元素替换成*。
# ret = '*' if 3>2 else 1
# print(ret)
# print(['*' if i % 3 == 0 else i for i in range(1,21)]) # 将至少含有两个e的名字放到一个列表中
# names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
# ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# print([name for l in names for name in l if name.count('e') >= 2])
列表推导式的优缺点
优点:一行搞定,节省代码量,高逼格
缺点:
- 不能用debug模式
- 列表推导式有毒,会盲目去使用列表推导式去写,建议超过三层的不要轻易使用列表推导式
2.2 生成器表达式
与列表推导式基本一模一样,只是[]换成了()
# l1 = ['python%s期' %i for i in range(1,26)]
# gentor = ('python%s期' %i for i in range(1,26))
# print(gentor)
# for i in gentor:
# print(i)
2.3 字典推导式,集合推导式(了解)
# print({i:None for i in range(1,10)})
# mcase = {'a': 10, 'b': 34, 'c': 20, 'd': 15}
# print({value:key for key,value in mcase.items()})
#
# set1 = {1, -2, 3, -4, 4}
# print({i ** 2 for i in set1})
3.匿名函数
def func(x, y): return x + y
# print(func(3,4))
# 针对于只有返回值的这样的函数:python 提供了一个函数可以简化:
# 匿名函数。一行函数
func2 = lambda x,y: x + y
print(func2(3,4))
# 写一个匿名函数:需要三个数字参数,返回值为三个数相乘
4.装饰器
详细内容请看
https://www.cnblogs.com/gbq-dog/p/10222938.html
day8-基础函数的学习(三)的更多相关文章
- Python学习---基础函数的学习
1.1. 基础函数 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 灌输一个概念:Python中函数就是对象,函数和我们之前的[1,2,3],'abc ...
- 蜗牛—ORACLE基础之触发器学习(三)
版权声明:本文为大腰子原创文章,如若转载,请标明原地址. https://blog.csdn.net/u010071361/article/details/30037215 建立一个触发器, 当职工表 ...
- 量子计算机编程(二)——QPU基础函数
第二部分主要是QPU的基础功能,第一部分就像是我们有了哪些基本的语句,第二部分就是我们能写一些简单基础的函数,一些小模块,第三部分就是他的应用了. 先来看一下一个简单量子应用的结构: 第一步,将量子态 ...
- Python入门基础学习 三
Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...
- Python基础学习三
Python基础学习三 1.列表与元组 len()函数:可以获取列表的元素个数. append()函数:用于在列表的最后添加元素. sort()函数:用于排序元素 insert()函数:用于在指定位置 ...
- 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数
前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...
- Django基础学习三_路由系统
今天主要来学习一下Django的路由系统,视频中只学了一些皮毛,但是也做下总结,主要分为静态路由.动态路由.二级路由 一.先来看下静态路由 1.需要在project中的urls文件中做配置,然后将匹配 ...
- 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)
salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL) salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...
- JS学习三(函数)
[函数的声明格式] 1.函数的声明格式: function 函数名(参数1,参数2,...){ 函数体代码 return 返回值: } 函数的调用: ① 直接调用:函数名(参数1的值,参数2的值,.. ...
随机推荐
- JDK源码分析(9)之 WeakHashMap 相关
平时我们使用最多的数据结构肯定是 HashMap,但是在使用的时候我们必须知道每个键值对的生命周期,并且手动清除它:但是如果我们不是很清楚它的生命周期,这时候就比较麻烦:通常有这样几种处理方式: 由一 ...
- Refit在ASP.NET Core中的实践
前言 声名式服务调用,己经不算是一个新鲜的话题了,毕竟都出来好些年了. 下面谈谈,最近项目中用到一个这样的组件的简单实践. 目前部分项目用到的是Refit这个组件,都是配合HttpClientFact ...
- Docker 网络之理解 bridge 驱动
笔者在前文<Docker 网络之进阶篇>中介绍了 CNM(Container Network Model),并演示了 bridge 驱动下的 CNM 使用方式.为了深入理解 CNM 及最常 ...
- 痞子衡嵌入式:第一本Git命令教程(5)- 提交(commit/format-patch/am)
今天是Git系列课程第五课,上一课我们做了Git本地提交前的准备工作,今天痞子衡要讲的是Git本地提交操作. 当我们在仓库工作区下完成了文件增删改操作之后,并且使用git add将文件改动记录在暂存区 ...
- Mysql加锁过程详解(8)-理解innodb的锁(record,gap,Next-Key lock)
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- SpringBoot集成rabbitmq(一)
前言 Rabbitmq是一个开源的消息代理软件,是AMQP协议的实现.核心作用就是创建消息队列,异步发送和接收消息.通常用来在高并发中处理削峰填谷.延迟处理.解耦系统之间的强耦合.处理秒杀订单. 入 ...
- canvas API ,通俗的canvas基础知识(一)
在没学canvas的时候,觉得canvas是这么的神秘,这么的绚丽,这么的高深,用canvas做出来的效果是如此的炫酷,能做的事情如此的宽广,简直让我心生敬畏之心,时常感叹:我要是得此技能,必定要上天 ...
- .Net Excel 导出图表Demo(柱状图,多标签页)
1 使用插件名称Epplus,多个Sheet页数据应用,Demo为柱状图(Epplus支持多种图表) 2 Epplus 的安装和引用 新建一个工程文件或控制台应用程序 打开 Vs2017 Tools ...
- 数据结构(java版)学习笔记(序章)
程序=数据结构+算法 序章做一个简单的思维导图,方便理解数据结构这门课的大纲,接下来我们将是按照线性表,栈,队列,串,树和图的顺序依次往下学.
- JS截取数字
Math是javascript的一个内部对象,该对象的方法主要是一些数学计算方法floor:下退 Math.floor(12.9999) = 12ceil:上进 Math.ceil(12.1) = 1 ...