Python函数04/生成器/推导式/内置函数

内容大纲

1.生成器

2.推导式

3.内置函数

1.生成器

  1. 迭代器:Python中内置的一种节省空间的工具
  2. 生成器的本质就是一个迭代器
  3. 迭代器和生成器的区别:一个是Python自带的,一个是程序员自己写的
  4. 写一个生成器:
  5. # def func():
  6. # print(123)
  7. # return "你好"
  8. # func()
  9. # def func():
  10. # if 3>2:
  11. # yield "你好" # 停
  12. # if 4>2:
  13. # yield "我好"
  14. # yield "大家好"
  15. # g = func() # 产生一个生成器
  16. # print(g.__next__())
  17. # print(g.__next__())
  18. # print(g.__next__())
  19. # for i in g:
  20. # print(i)
  21. # while True:
  22. # try:
  23. # print(g.__next__())
  24. # except StopIteration:
  25. # break
  26. # def foo():
  27. # for i in range(10):
  28. # pass
  29. # yield i
  30. # count = 1
  31. # while True:
  32. # yield count
  33. # count += 1
  34. # g = foo()
  35. # print(next(g)) # -- 推荐使用
  36. # print(next(g)) # -- 推荐使用
  37. # print(next(g)) # -- 推荐使用
  38. # print(next(g)) # -- 推荐使用
  39. # print(next(g)) # -- 推荐使用
  40. # for i in g:
  41. # print(i)
  42. -- 会产生新的生成器(g = foo()就不会是每次都产生一个生成器了)
  43. print(foo().__next__())
  44. print(foo().__next__())
  45. # send() -- 了解
  46. # def func():
  47. # a = yield "俺是send"
  48. # print(a)
  49. # g = func()
  50. # print(g.send(None))
  51. # print(g.send(123))
  52. #第一次获取yield值只能用next不能用send(其实是第一次可以用send(None))
  53. #send可以给上一个yield传递值
  54. 生成器应用场景:
  55. # def func():
  56. # lst = []
  57. # for i in range(100000):
  58. # lst.append(i)
  59. # return lst
  60. # print(func())
  61. # def func():
  62. # for i in range(100000):
  63. # yield i
  64. # g = func()
  65. # for i in range(50):
  66. # print(next(g))
  67. 可以看出来明显的节省了内存
  68. 小坑:
  69. # def func():
  70. # lst = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
  71. # for i in lst:
  72. # yield i
  73. # g = func()
  74. # print(next(g))
  75. # print(next(g))
  76. # print(next(g))
  77. # print(next(g))
  78. # print(next(g))
  79. # def func():
  80. # lst1 = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
  81. # lst2 = ["小浣熊","老干爹","亲嘴烧","麻辣烫","黄焖鸡","井盖"]
  82. # yield from lst1
  83. # yield from lst2
  84. #
  85. # g = func()
  86. # print(next(g))
  87. # print(next(g))
  88. # print(next(g))
  89. # for i in g:
  90. # print(i)
  91. # g.__iter__()
  92. # g.__next__()
  93. 在函数中将return改写成yield就是一个生成器
  94. yield会记录执行位置
  95. returnyield都是返回
  96. return可以写多个,但是只执行一次;yield可以写多个,还可以返回多次
  97. 一个__next__()对应一个yield
  98. 生成器可以采用for循环获取值
  99. yield from -- 将可迭代对象元素逐个返回
  100. 在函数内部,yield能将for循环和while循环进行临时暂停

2.推导式

  1. # lst = []
  2. # for i in range(20):
  3. # lst.append(i)
  4. # print(lst)
  5. list推导式
  6. # print([i for i in range(20)])
  7. # 循环模式
  8. # [变量 for i in range(20)]
  9. # print([i+1 for i in range(10)])
  10. # 筛选模式
  11. # lst = []
  12. # for i in range(20):
  13. # if i % 2 == 0:
  14. # lst.append(i)
  15. # print(lst)
  16. # print([i for i in range(20) if i % 2 == 0])
  17. # [变量(加工后的变量) for循环 加工方式]
  18. # print([i for i in range(50) if i % 2 == 1])
  19. # print([i for i in range(1,50,2)])
  20. 生成器表达式:
  21. # 循环模式:
  22. # g = (i for i in range(20))
  23. # print(next(g))
  24. # print(next(g))
  25. # print(next(g))
  26. # print(list((i for i in range(20))))
  27. # 筛选模式
  28. # g = (i for i in range(50) if i % 2 == 1)
  29. # for i in g:
  30. # print(i)
  31. 字典推导式:(了解)
  32. # print({i:i+1 for i in range(10)})
  33. # print({i:i+1 for i in range(10) if i % 2 == 0})
  34. # {键:值 for循环 加工条件}
  35. 集合推导式:(了解)
  36. # print({i for i in range(10)})
  37. # print({i for i in range(10) if i % 2 == 0})
  38. list推导式:
  39. [变量(加工后的变量) for循环]
  40. [变量(加工后的变量) for循环 加工条件]
  41. 生成器表达式:
  42. (变量(加工后的变量) for循环)
  43. (变量(加工后的变量) for循环 加工条件)
  44. 字典推导式:
  45. {键:值 for循环 加工条件}
  46. 集合推导式:
  47. {变量(加工后的变量) for循环 加工条件}
  48. # 将10以内所有整数的平方写入列表
  49. # 100以内所有的偶数写入列表.
  50. # 从python1期到python24期写入列表lst
  51. # print([f"pyhton{i}期" for i in range(1,25)])
  52. # 将这个列表中大于3的元素留下来。
  53. # print([i for i in [1,2,3,23,1234,4235,] if i > 3])

3.内置函数(一)

  1. # s = """
  2. # for i in range(10):
  3. # print(i)
  4. # """
  5. # s1 = """
  6. # def func():
  7. # print(123)
  8. # func()
  9. # """
  10. # print(eval(s))
  11. # print(exec(s1)) # 厉害 不能用 (工作中尽量不要使用,容易出问题)
  12. # print(hash("asdfas"))
  13. # print(help(list))
  14. # help(dict)
  15. # def func():
  16. # pass
  17. # print(callable(func)) # 查看是否可调用
  18. # print(float(2)) # 浮点数
  19. # print(complex(56)) # 复数
  20. # print(oct(15)) # 八进制
  21. # print(hex(15)) # 十六进制
  22. # print(divmod(5,2)) # (2, 1) 2商 1余
  23. # print(round(5.3234,2)) # 四舍五入 -- 默认是整数,可以指定保留小数位
  24. # print(pow(2,3)) # 幂
  25. # print(pow(2,3,4)) # 幂,余
  26. # s = "alex"
  27. # print(bytes(s,encoding="utf-8"))
  28. # print(ord("你")) # 当前编码
  29. # print(chr(20320))
  30. # s = "C:\u3000"
  31. # print(repr(s))
  32. # print("\u3000你好")
  33. # lst = [1,2,3,False,4,5,6,7]
  34. # print(all(lst)) # 判断元素是否都为真 相似and
  35. # print(any(lst)) # 判断元素是否有真 相似or
  36. # name = 1
  37. # def func():
  38. # a = 123
  39. # # print(locals())
  40. # # print(globals())
  41. # func()
  42. # print(globals()) # 全局空间中的变量
  43. # print(locals()) # 查看当前空间的变量

4.今日总结

  1. # 1.生成器
  2. # 生成器的本质就是一个迭代器
  3. # 生成器和迭代器的区别:
  4. # 迭代器是Python自带的
  5. # 生成器是咱们(程序员)写得
  6. 定义一个生成器:
  7. 基于函数
  8. 函数体中存在yield就是一个生成器
  9. 函数名()就是产生一个生成器
  10. 生成器:
  11. 节省空间 --惰性机制
  12. 不能逆行
  13. 一次性
  14. 一个next对应一个yield
  15. yield能够进行返回内容,还能够返回多次
  16. yield能够临时停止循环
  17. yield能够记录执行的位置
  18. yield from --将一个可迭代对象的元素逐个返回
  19. # list:[变量(加工后的变量) for循环 加工条件]
  20. # dict:{键:值 for循环 加工条件}
  21. # set:{变量(加工后的变量) for循环 加工条件}
  22. # 生成器表达式:(变量(加工后的变量) for循环 加工条件)
  23. # 1.普通循环推导
  24. # 2.筛选推导
  25. # 3.内置函数一
  26. """
  27. all() any() bytes()
  28. callable()
  29. chr() complex()
  30. divmod() eval()
  31. exec() format()
  32. frozenset() globals()
  33. hash() help() id() input()
  34. int() iter() locals()
  35. next() oct() ord()
  36. pow() repr() round()
  37. """

5.今日练习

  1. # 2.用列表推导式做下列小题
  2. # 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
  3. # print([i.upper() for i in s if len(i) > 3])
  4. # 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
  5. # print([(i, i+1) for i in range(6) if i % 2 == 0])
  6. # 求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
  7. # print([i[-1] for i in M])
  8. # 求出50以内能被3整除的数的平方,并放入到一个列表中。
  9. # print([i for i in range(50) if i % 3 == 0])
  10. # 构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
  11. # print([f'python{i}期' for i in range(1,11) if i != 5])
  12. # 构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
  13. # print([(i,i+1) for i in range(6)])
  14. # 构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
  15. # print([i for i in range(20) if i % 2 == 0])
  16. # 有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
  17. # l1 = ['alex', 'WuSir', '老男孩', '太白']
  18. # print([l1[i]+str(i) for i in range(len(l1)) ])
  19. # 3.有以下数据类型:
  20. # x = {
  21. # 'name':'alex',
  22. # 'Values':[{'timestamp':1517991992.94,
  23. # 'values':100,},
  24. # {'timestamp': 1517992000.94,
  25. # 'values': 200,},
  26. # {'timestamp': 1517992014.94,
  27. # 'values': 300,},
  28. # {'timestamp': 1517992744.94,
  29. # 'values': 350},
  30. # {'timestamp': 1517992800.94,
  31. # 'values': 280}
  32. # ],}
  33. # 将上面的数据通过列表推导式转换成下面的类型:
  34. # [[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
  35. # print([em for i in x['Values'] for em in i.values()])
  36. #
  37. # 4.构建一个列表,列表里面是三种不同尺寸的T恤衫,每个尺寸都有两个颜色(列表里面的元素为元组类型)。
  38. # colors = ['black', 'white']
  39. # sizes = ['S', 'M', 'L']
  40. # print([(a,b) for a in sizes for b in colors])
  41. # 5.构建一个列表,列表里面的元素是扑克牌除去大小王以后,所有的牌类(列表里面的元素为元组类型)。
  42. # l1 = [('A','spades'),('A','diamonds'), ('A','clubs'), ('A','hearts')......('K','spades'),('K','diamonds'), ('K','clubs'), ('K','hearts') ]
  43. # print([(a,b) for a in ['A','2','3','4','5','6','7','8','9','10','J','Q','K'] for b in ['spades','diamonds','clubs','hearts']])
  44. # 6.简述一下yield 与yield from的区别。
  45. # yield yield只能由for循环,逐个返回
  46. # yield from 可以将可迭代对象元素逐个返回
  47. # 7.看代码求结果(面试题):
  48. # v = [i % 2 for i in range(10)]
  49. # print(v)
  50. # [0,1,0,1,0,1,0,1,0,1]
  51. #
  52. # v = (i % 2 for i in range(10))
  53. # print(v)
  54. #<generator object <genexpr> at 0x000000F9C7CBFEB8> # 内存地址
  55. #
  56. # for i in range(5):
  57. # print(i)
  58. # print(i)
  59. # 1
  60. # 2
  61. # 3
  62. # 4
  63. # 4

Python函数04/生成器/推导式/内置函数的更多相关文章

  1. 12.Python略有小成(生成器,推导式,内置函数,闭包)

    Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...

  2. 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ

    一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...

  3. Learn day5 迭代器\生成器\高阶函数\推导式\内置函数\模块(math.time)

    1.迭代器 # ### 迭代器 """能被next调用,并不断返回下一个值的对象""" """ 特征:迭代器会 ...

  4. python之迭代器 生成器 枚举 常用内置函数 递归

    迭代器 迭代器对象:有__next__()方法的对象是迭代器对象,迭代器对象依赖__next__()方法进行依次取值 with open('text.txt','rb',) as f: res = f ...

  5. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  6. python函数(6):内置函数和匿名函数

    我们学了这么多关于函数的知识基本都是自己定义自己使用,那么我们之前用的一些函数并不是我们自己定义的比如说print(),len(),type()等等,它们是哪来的呢? 一.内置函数 由python内部 ...

  7. 学习Python函数笔记之二(内置函数)

    ---恢复内容开始--- 1.内置函数:取绝对值函数abs() 2.内置函数:取最大值max(),取最小值min() 3.内置函数:len()是获取序列的长度 4.内置函数:divmod(x,y),返 ...

  8. Python中字符串String的基本内置函数与过滤字符模块函数的基本用法

    Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ...

  9. python---基础知识回顾(一)(引用计数,深浅拷贝,列表推导式,lambda表达式,命名空间,函数参数逆收集,内置函数,hasattr...)

    一:列表和元组(引用计数了解,深浅拷贝了解) 序列:序列是一种数据结构,对其中的元素按顺序进行了编号(从0开始).典型的序列包括了列表,字符串,和元组 列表是可变的(可以进行修改),而元组和字符串是不 ...

随机推荐

  1. Mybaties概述

  2. turtle绘制彩色螺旋线

    代码实现: #绘制彩色螺旋线 import turtle import time turtle.pensize(2) turtle.bgcolor("black") colors ...

  3. Charles抓包1-Charles安装汉化(附正版注册码)

    目录 1.下载&&安装 2.汉化 1.下载&&安装 charles官网 charles下载 下载后直接安装即可. 2.汉化 下载提供的汉化包charles.jar(加群 ...

  4. Java 从入门到进阶之路(二十三)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的迭代器 Iterator,本章我们来看一下 Java 集合框架中的Collection 的泛型. 在讲泛型之前我们先来 ...

  5. Mac App破解之路九 vscode插件破解

    破解对象: luaide 破解目的:学习如何破解vscode插件 破解背景: vsscode用了这么多年,安装了很多插件,其中luaide插件是收费的.  说实话,100块并不贵, 我本来准备买的. ...

  6. 深入理解JVM(③)虚拟机性能监控、故障处理工具

    前言 JDK的bin目录中有一系列的小工具,除了java.exe.javac.exe这两个编译和运行Java程序外,还有打包.部署.签名.调试.监控.运维等各种场景都会用到这些小工具. 这些工具根据软 ...

  7. 深度解剖dubbo源码---01dubbo的架构原理-探索.mp4

    02内核解剖-dubbo自己的SPI实现.mp4 https://blog.csdn.net/prestigeding/article/details/80795708 https://segment ...

  8. Jmeter系列(30)- 详解 JDBC Request

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 JDBC Request 主要是 ...

  9. vue基础入门(1)

    1.vue初体验 1.1.vue简介 1.1.1.vue是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架,什么叫做渐进式呢?通俗的讲就是一层一层的,一步一 ...

  10. JS判断 函数是否定义/变量是否定义

    函数是否定义: <script type="text/javascript"> try { if(typeof FunName === "function&q ...