测试奇谭,BUG不见。

讲解之前,我先说说我的教程和网上其他教程的区别:

1 我分享的是我在工作中高频使用的场景,是精华内容;

2 我分享的是学习方法,亦或说,是指明你该学哪些、该重点掌握哪些内容;

3 基于1和2,你可以按照我的教程学,也可以网上找视频学,也可以看书学……你得明白,掌握学习方法比找学习资料重要得多。

前5期,我已经分享了python的基础语法,如果你按照我的文章,一步一步练习,保准你对python代码的语法特点、书写方式有所了解,并能独立的写一些简单的函数方法,甚至能尝试开始自动化测试的实践(基于python语法)。

当然,如果你想更进一步掌握python语法的特点,那接下来的几篇文章一定不要错过。

这一场,主讲python的生成器和匿名函数。

目的:掌握这两个知识点的概念和使用。

生成器

01 什么是生成器?

记住两个关键:

  • 生成器是一种特殊的函数方法。意味着它和函数(def)密不可分。
  • 基于上一点,只要函数中出现yield关键字,就是生成器函数

初学的你,还是太难理解?

02 通俗的讲解

你可以将生成器理解为一个盒子,你可以向这个盒子里随意添加元素,当你需要的时候,再取出来用。

请看下面的例子:

# 普通函数
def func():
return 1 f = func()
print("函数返回值:",f)
->函数返回值:1
print("函数返回值的类型:",type(f))
->函数返回值的类型:<class 'int'> # 生成器
def gen_func():
yield 1
yield 2 g = gen_func()
print("生成器对象:",g)
->生成器对象:<generator object gen_func at 0x00000189B8CFF7C8>
print("生成器对象的类型:",type(g))
->生成器对象的类型:<class 'generator'>
# 读取生成器对象的值,因为生成器也是一个迭代器,实现了python的迭代协议(即实现了__iter__方法) for i in g:
print("生成器对象的值:",i)
->生成器对象的值: 1
->生成器对象的值: 2

03 生成器到底有什么用?

作用:惰性求值(一边循环一边计算的机制),节省性能

04 生成器的常见用途?

  • 读大文件
  • 网络爬虫 scrapy 框架
  • 协程

举个例子:斐波那契数列(0,1,1,2,3,5...),打印斐波那契数列前50个元素

# 不使用生成器,会消耗大量内存
def fib(idx):
res=[]
n, a, b = 0, 0, 1
while n < idx:
res.append(b)
a, b = b, a+b
n += 1
return res
res = fib(100)
print(res) # 使用生成器,可节约大量内存
def gen_fib(idx):
n, a, b = 0, 0, 1
while n < idx:
yield b
a, b = b, a+b
n += 1 for i in gen_fib(100):
print(i)

匿名函数

01 什么是匿名函数?

当:

  • 函数实现比较简单
  • 函数不需要被多个地方调用
  • 懒得给这个函数起名字

时,我们可以使用匿名函数。

初学的你,还是太难理解?

02 通俗的讲解

你想实现一个求x的平方的函数,但是这个函数太简单,不值得专门def定义,同时,你忘记了平方的英文如何拼写,要是命名成 "pingfang",又显得自己太low,于是乎,你可以不给这个函数起名字,还能实现它。这就是匿名函数lambda表达式。

比如:求一个数的平方

# 不用 lambda 表达式
def square(x):
return x * x
print(square(2)) # 使用 lambda 表达式
# 写法:lambda 返回值:计算表达式
s = lambda x: x * x
print(s(2))

一如既往,做个总结

01 如果你是初学者,可以先不掌握生成器和匿名函数,待学成python后,再行琢磨;

02 在实际工作中,生成器和匿名函数的使用频次,相对较高,并且在面试中是高频问点。

python极简教程05:生成器和匿名函数的更多相关文章

  1. Python 极简教程(八)字符串 str

    由于字符串过于重要,请认真看完并保证所有代码都至少敲过一遍. 对于字符串,前面在数据类型中已经提到过.但是由于字符串类型太过于常用,Python 中提供了非常多的关于字符串的操作.而我们在实际编码过程 ...

  2. python极简教程04:进程和线程

    测试奇谭,BUG不见. 大家好,我是谭叔. 这一场,主讲python的进程和线程. 目的:掌握初学必须的进程和线程知识. 进程和线程的区别和联系 终于开始加深难度,来到进程和线程的知识点~ 单就这两个 ...

  3. python极简教程01:基础变量

    测试奇谭,BUG不见. 其实很久之前,就有身边的同事或者网友让我分享一些关于python编程语言的教程,他们同大多数自学编程语言的人一样,无外乎遇到以下这些问题: 网络上的资料过多且良莠不全,不知道如 ...

  4. Python 极简教程(七)列表 list

    由于列表过于重要,请认真看完并保证所有代码都敲过一遍. 什么是列表 列表是 Python 中最常用的数据结构,也是一种数据类型,其样式如下: li = [1, 2, 3, 'a', 'b'] 列表是一 ...

  5. python极简教程06:生成式和装饰器

    测试奇谭,BUG不见. 这一场,主讲python的生成式和装饰器. 目的:掌握四种生成式(列表.生成器.集合.字典),装饰器的原理和使用. 生成式 01 什么是生成式? 能够用一行代码,快速高效的生成 ...

  6. Python 极简教程(一)前言

    现在 Python 用处很多,学的人也很多,其流行程度自不必说.但是很多人学 Python 的时候都遇到过问题,特别对于非计算机专业毕业的人来说. 现在的教程非常多,但是绝大部分对于初学者都不够友好. ...

  7. Python 极简教程(三)数据类型

    每种语言都有各种数据类型.这就像在现实生活中,我们计数的时候需要用到数字,在表述金额.重量.距离等需要精确计数时用到小数,在日常交谈中要用文字,等等.在计算机语言中,为了表述不同的情况,也需要用到各种 ...

  8. Python 极简教程(二)编码工具

    Python 的编码工具很多.目前最流行的是 pycharm,关于 pycharm 的安装使用请参考 PyCharm安装使用教程. 而学习过程中,我觉得最好用的,还是 Python 自带的练习工具 I ...

  9. python极简教程07:封装、多态和继承

    测试奇谭,BUG不见. 这一场主讲python的面向对象部分--封装.多态和继承. 目的:掌握Python面向对象的三个核心概念. 封装 01 什么是封装? 封装的目的是,保护隐私.通俗的讲:不想让别 ...

随机推荐

  1. [BUUCTF]PWN——[V&N2020 公开赛]babybabypwn

    [V&N2020 公开赛]babybabypwn 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看程序的大概情况 64位ida载入,看一下main函数 sub_1202()函 ...

  2. [BUUCTF]REVERSE——相册

    相册 附件 步骤: apk文件,习惯用apkide打开,看它反编译成了jar,就换jadx-gui打开,题目提示找邮箱,因此在导航栏里搜索mail 看到了sendMailByJavaMail(java ...

  3. 添加备注信息(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 就在任务信息的[高级]选项卡隔壁,还有一个[备注]选项卡,可别拿备注不当回事,因为任务名称的字数不能太多. 好吧,张同学也 ...

  4. CF950A Left-handers, Right-handers and Ambidexters 题解

    Content 有 \(l\) 个人是左撇子,有 \(r\) 个人是右撇子,另外有 \(a\) 个人既惯用左手又惯用右手.现在想组成一个队伍,要求队伍中惯用左手的人和惯用右手的人相等,试求出团队里面的 ...

  5. java 输入输出IO流 字符流 FileWriter FileReader

    为什么要使用字符流 当使用字节流读取文本文件时,可能会有一个小问题.就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储.所以Java提供一些字符流类,以字符为单位读写 ...

  6. 『学了就忘』Linux日志管理 — 91、日志服务rsyslogd说明

    目录 1.日志文件格式 2.rsyslogd服务的配置文件 (1)rsyslog.conf文件内容 (2)rsyslog.conf配文件内容说明 (3)定义自己的日志 1.日志文件格式 只要是由日志服 ...

  7. HttpServletResponse工具类和HttpServletRequest工具类,前台参数接收方式和后台返回(JSON)数据格式

    RequestUtils.java 操作类 package cn.utils; import org.apache.commons.lang3.StringUtils; import org.slf4 ...

  8. JAVA微信公众号网页开发——将接收的消息转发到微信自带的客服系统

    如果公众号处于开发模式,普通微信用户向公众号发消息时,微信服务器会先将消息POST到开发者填写的url上,无法直接推送给微信自带的客服功能.如果需要把用户推送的普通消息推送到客服功能中,就需要进行代码 ...

  9. This request has been blocked; the content must be served over HTTPS.处理方案

    在页面head标签中加入 <meta http-equiv="Content-Security-Policy" content="upgrade-insecure- ...

  10. ubuntu无法找到ifconfig(command not found: ifconfig)

    演示环境 $ uname -a Linux xxxxx-xxxxx-xxxx5.4.0-47-generic #51-Ubuntu SMP Fri Sep 4 19:50:52 UTC 2020 x8 ...