一篇文章带你学习Python3的高级特性(2)

 更新时间:2022年01月25日 17:23:34   作者:FUXI_Willard  
这篇文章主要为大家详细介绍了Python3的高阶函数,主要介绍什么是高级特性,高级特性的用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1.生成器

# 一边循环一边计算的机制,称为生成器:generator;
# 创建generator方法:
# 1.把一个列表生成式的[]改成()
numsList = [num * num for num in range(10)]
print("列表生成式生成numsList:",numsList)
numsGenerator = (num * num for num in range(10))
print("生成器生成numsGenerator:",numsGenerator)
# 使用next()函数获得generator的下一个返回值
print("打印numsGenerator第一个元素:",next(numsGenerator))
print("打印numsGenerator第二个元素:",next(numsGenerator))
print("--------------------------------------------------------")
# 使用for循环打印generator元素
print("使用循环打印生成器中的元素!")
for num in numsGenerator:
    print(num,end = " ")
print("\n")
print("--------------------------------------------------------")
# 斐波拉契数列(Fibonacci):除第一个和第二个数外,任意一个数均可由前两个数相加得到
# 1,1,2,3,5,8,13,21,34
def fibonacci(num):
    n, a, b = 0, 0, 1
    while n < num:
        print(b,end = "  ")
        a, b = b, a + b
        n = n + 1
    return "Done"

print("Fibonacci前10项为:")
fibonacci(10)
print("\n")
print("--------------------------------------------------------")
# 2.把fibonacci()函数变成generator函数
def fibonacci(num):
    n, a, b = 0, 0, 1
    while n < num:
        yield b
        a, b = b, a + b
        n = n + 1
    return "Done"

# Tips:
# 1.如果一个函数定义中包含yield关键字,则这个函数是一个generator函数;
# 2.调用一个generator函数将返回一个generator;
fib = fibonacci(10)
print("fib的值:",fib)

# 结果输出:
列表生成式生成numsList: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
生成器生成numsGenerator: <generator object <genexpr> at 0x0000028F0E6ACB88>
打印numsGenerator第一个元素: 0
打印numsGenerator第二个元素: 1
--------------------------------------------------------
使用循环打印生成器中的元素!
4 9 16 25 36 49 64 81 

--------------------------------------------------------
Fibonacci前10项为:
1  1  2  3  5  8  13  21  34  55  

--------------------------------------------------------
fib的值: <generator object fibonacci at 0x0000028F0E7839A8>
 

# 普通函数和generator函数的执行流程:
# 1.普通函数:顺序执行,遇到return语句或最后一行函数语句就返回;
# 2.generator函数:在每次调用next()的时候执行,遇到yield语句返回;
# 3.再次执行时从上次返回的yield语句处继续执行;
# 实例:定义一个generator函数,依次返回"Willard",18,"Engineer"
def willardInfo():
    print("STEP1")
    yield "Willard"
    print("--------")
    print("STEP2")
    yield 18
    print("--------")
    print("STEP3")
    yield "Engineer"

# 调用willardInfo()这个generator函数,先生成一个generator对象
# 然后用next()函数不断获得下一个返回值,即可用循环直接打印
willardInfoObject = willardInfo()
for willard in willardInfoObject:
    print(willard)

# 结果输出:
STEP1
Willard
--------
STEP2
18
--------
STEP3
Engineer
 

2.迭代器

# 可直接用于for循环的数据类型:
# 1.list、tuple、dict、set、str等;
# 2.generator,包括:生成器和带yield的generator function;
# 3.可以直接作用于for循环的对象称为可迭代对象:Iterable;
# 4.使用isinstance()判断一个对象是否为Iterable对象;
from collections.abc import Iterable
print("判断list是否为可迭代对象!",isinstance([],Iterable))
print("判断dict是否为可迭代对象!",isinstance({},Iterable))
print("判断str是否为可迭代对象!",isinstance("Willard",Iterable))
print("判断生成式是否为可迭代对象!",isinstance((num for num in range(10)),Iterable))
print("判断number是否为可迭代对象!",isinstance(99,Iterable))

# 结果输出:
判断list是否为可迭代对象! True
判断dict是否为可迭代对象! True
判断str是否为可迭代对象! True
判断生成式是否为可迭代对象! True
判断number是否为可迭代对象! False
 

# 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
# 使用isinstance()判断一个对象是否为Iterator对象;
from collections.abc import Iterator
print("判断生成器是否为迭代器!",isinstance((num for num in range(10)),Iterator))
print("判断list是否为迭代器!",isinstance([],Iterator))
print("判断dict是否为迭代器!",isinstance({},Iterator))
print("判断str是否为迭代器!",isinstance("Willard",Iterator))
print("----------------------------------------------------------")
# Tips:
# 1.生成器都是Iterator对象,但list、dict、str是Iterable但不是Iterator;
# 2.Iterator对象表示数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,
# 直到没有数据时抛出StopIteration错误;这个数据流可以看作一个有序序列,
# 但不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,
# Iterator的计算是惰性的,只有在需要返回下一个数据时才计算;
# 3.使用iter()函数把list、dict、str变成Iterator;
print("使用iter()函数把list、dict、str变成Iterator.")
print("判断list是否为迭代器!",isinstance(iter([]),Iterator))
print("判断dict是否为迭代器!",isinstance(iter({}),Iterator))
print("判断str是否为迭代器!",isinstance(iter("Willard"),Iterator))

# 结果输出:
判断生成器是否为迭代器! True
判断list是否为迭代器! False
判断dict是否为迭代器! False
判断str是否为迭代器! False
----------------------------------------------------------
使用iter()函数把list、dict、str变成Iterator.
判断list是否为迭代器! True
判断dict是否为迭代器! True
判断str是否为迭代器! True
 

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容! 

相关文章

  • Python实现读取json文件到excel表

    Python实现读取json文件到excel表

    这篇文章主要介绍了Python实现读取json文件到excel表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 爬虫代理池Python3WebSpider源代码测试过程解析

    爬虫代理池Python3WebSpider源代码测试过程解析

    这篇文章主要介绍了爬虫代理池Python3WebSpider源代码测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • python 生成器生成杨辉三角的方法(必看)

    python 生成器生成杨辉三角的方法(必看)

    下面小编就为大家带来一篇python 生成器生成杨辉三角的方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • python绘制无向图度分布曲线示例

    python绘制无向图度分布曲线示例

    今天小编就为大家分享一篇python绘制无向图度分布曲线示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • django 捕获异常和日志系统过程详解

    django 捕获异常和日志系统过程详解

    这篇文章主要介绍了django-捕获异常和日志系统过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Flask项目中实现短信验证码和邮箱验证码功能

    Flask项目中实现短信验证码和邮箱验证码功能

    这篇文章主要介绍了Flask项目中实现短信验证码和邮箱验证码功能,需本文通过截图实例代码的形式给大家介绍的非常详细,需要的朋友可以参考下
    2019-12-12
  • Python求两个字符串最长公共子序列代码实例

    Python求两个字符串最长公共子序列代码实例

    这篇文章主要介绍了Python求两个字符串最长公共子序列代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 详解Python发送邮件实例

    详解Python发送邮件实例

    这篇文章主要介绍了Python发送邮件实例,Python发送邮件需要smtplib和email两个模块,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • Python内置模块Collections的使用教程详解

    Python内置模块Collections的使用教程详解

    collections 是 Python 的一个内置模块,所谓内置模块的意思是指 Python 内部封装好的模块,无需安装即可直接使用。本文将详解介绍Collections的使用方式,需要的可以参考一下
    2022-03-03
  • Python对比校验神器deepdiff库使用详解

    Python对比校验神器deepdiff库使用详解

    deepdiff模块常用来校验两个对象是否一致,包含3个常用类,DeepDiff,DeepSearch和DeepHash,其中DeepDiff最常用,可以对字典,可迭代对象,字符串等进行对比,使用递归地查找所有差异,本文给大家讲解Python对比校验神器deepdiff库,感兴趣的朋友一起看看吧
    2023-04-04

最新评论