一、for循环原理补充

使用while循环+异常处理+迭代器对象 完成for循环迭代取值的功能

l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
die_qi = l1.__iter__()
while True:
try:
res = die_qi.__next__()
print(res)
except Exception as e:
print('数据取完了')
break

二、生成器对象

生成器对象的本质

生成器对象其实本质上就是迭代器对象,内置有双下户线iter和双下划线next方法

区别

迭代器对象就是python解释器提供的各种数据类型或是文件对象,但是生成器对象是程序员编写的代码或是函数之类的关键字

生成器的两种形式

使用def定义函数然后内部使用yield关键字

在使用函数+yield关键字定义生成器的时候需要注意当我们使用括号调用函数的时候并没有运行这个函数,而是把这个函数体代码变成了一个生成器对象,之后我们想要调用函数产生数据就需要跟迭代器一样使用双下划线的next方法,并且每次运行的时候如果遇到yield关键字就会停止到那个位置,如果下方代码还有yield关键字,下一次运行双下划线的next方法就会运行到下一个yield关键字处停止

def my_iter():
print('哈哈哈 椰子汁很好喝')
yield
'''1.函数体代码中如果有yield关键字
那么函数名加括号并不会执行函数体代码
会生成一个生成器对象(迭代器对象)
'''
res = my_iter()
print(res)
# <generator object my_iter at 0x00000204CEDEBBA0>
'''2.使用加括号之后的结果调用__next__才会执行函数体代码'''
res.__next__()
# 哈哈哈 椰子汁很好喝

下面是多个yield的使用场景:

'''3.每次执行完__next__代码都会停在yield位置 下次基于该位置继续往下找第二个yield'''
def my_iter():
print('哈哈哈 椰子汁很好喝')
yield 111, 222, 333
print('呵呵呵 从小喝到大')
yield 111, 222, 333
print('嘿嘿嘿 特种兵牌还可以')
yield 111, 222, 333
print('哼哼哼 千万别整多了 倒沫子 头发掉光光')
yield 111, 222, 333
res = my_iter()
r1 = res.__next__()
print(r1)
r2 = res.__next__()
print(r2)
r3 = res.__next__()
print(r3)
r4 = res.__next__()
print(r4)
'''4.yield还有点类似于return 可以返回返回值'''
'''结果如下:
哈哈哈 椰子汁很好喝
(111, 222, 333)
呵呵呵 从小喝到大
(111, 222, 333)
嘿嘿嘿 特种兵牌还可以
(111, 222, 333)
哼哼哼 千万别整多了 倒沫子 头发掉光光
(111, 222, 333)
'''

注意:在上面的代码运行过程中我们也发现了yield关键字跟return一样可以返回返回值

(1)、自定义生成器对标range功能(一个参数 两个参数 三个参数 迭代器对象)

def my_range(start_num, end_num=None, step=1):
# 判断end_num是否有值 没有值说明用户只给了一个值 起始数字应该是0 终止位置应该是传的值
is_back = False
if not end_num:
# 判断第二个结束为止是否有参数,如果没有就把传给起始位置的参数给结束为止,其实位置变成0
end_num = start_num
start_num = 0
if step == 0:
yield '位移量不能为0'
if step < 0:
# 判断取值的步频是否为反方向
# 如果是反方向的步频,判断起始位置和结束为止是否前面的大后面的小
if not start_num > end_num:
yield '参数大小错误'
else:
is_back = True
# 起始位置和结束为止是前面的大后面的小的时候就返回True
while start_num < end_num or is_back:
# 起始位置小于结束位置的时候或是步频为负数的时候判断正确的话就输出数据值
if start_num < end_num:
# 起始位置小于结束位置
print(start_num)
yield start_num
start_num += step
elif is_back:
# 步频为负数
if start_num > end_num:
yield start_num
start_num += step
else:
is_back = False # 定义了模仿range方法的功能后,用for循环的方式调用内部数据值 for i in my_range(100, 50, 0):
print(i)

三、yield冷门用法

当我们使用yield关键字的时候可以用变量名绑定yield关键字,然后就可以使用send方法传参,然后会再次运行到yield关键字处停止运行

def eat(name, food=None):
print(f'{name}准备用餐')
while True:
food = yield
print(f'{name}正在吃{food}') res = eat('kevin')
res.__next__()
res.send('汉堡') # 1.将括号内的数据传给yield前面的变量名 2.再自动调用__next__
res.send('包子')
res.send('面条')
'''
kevin准备用餐
kevin正在吃汉堡
kevin正在吃包子
kevin正在吃面条
'''

(1)、yield与return的对比

yield
1. 可以有返回值
2. 函数遇到yield不会结束,只会'停住'
3. yield关键字把函数变成了生成器,支持迭代取值了
return
1. 可以有返回值
2. 遇到return关键字直接结束函数运行

四、生成器表达式的面试题

"""
面试题(有难度)
大致知道流程即可
"""
def add(n, i): # 普通函数 返回两个数的和 求和函数
return n + i
def test(): # 生成器
for i in range(4):
yield i
g = test() # 激活生成器
for n in [1, 10]:
g = (add(n, i) for i in g)
"""
第一次for循环
g = (add(n, i) for i in g)
第二次for循环
g = (add(10, i) for i in (add(10, i) for i in g))
"""
res = list(g)
print(res) #A. res=[10,11,12,13]
#B. res=[11,12,13,14]
#C. res=[20,21,22,23]
#D. res=[21,22,23,24]
'''不用深入研究 大致知道起始数即可'''"""
面试题(有难度)
大致知道流程即可
""" def add(n, i):
return n + i
# 定义了一个add函数,作用求和 def test(): # 生成器
for i in range(4):
yield i
# 定义了一个生成器 g = test() # 激活生成器
# 激活了生成器,这样就而已用for循环取值了
for n in [1, 10]:
g = (add(n, i) for i in g)
"""
第一次for循环
这里就相当于给g重新绑定了一个生成器没有运行代码
g = (add(n, i) for i in g)
第二次for循环
这里就相当于用到for循环去(add(n, i) for i in g)里面取值了,这个时候的n是10,生成器给的四个值是0、1、2、3,然后运行add就等于c选项
g = (add(10, i) for i in (add(10, i) for i in g))
"""
res = list(g)
print(res) # A. res=[10,11,12,13]
# B. res=[11,12,13,14]
# C. res=[20,21,22,23]
# D. res=[21,22,23,24]
'''不用深入研究 大致知道起始数即可'''

五、常见内置函数

# print(abs(10))
# print(abs(-10)) # 绝对值 # l = [1, 2, 3, 0]
# print(all(l)) # True
# print(any(l)) arr = range(10) myslice = slice(5) # 设置截取5个元素的切片 """
100条数据 10条 10页
99条 10 10页
101条 101 11
""" # page, more=divmod(100, 10)
# page, more=divmod(99, 10)
# page, more=divmod(2005, 10)
# if more:
# page += 1
# print(page) # res="""print('hello world')""" #
res="""
# 这是注释
for i in range(10):
print(i)
""" #
# eval(res) # 识别简单的python代码
# exec(res) # if type(123) is int:
# print('123')
# print(type('123') is int) # 判断数据类型的
# print(isinstance('123', int))
# print(isinstance(123, int))
# print(isinstance('123', str))
# print(isinstance([1,2,3,4], list))
# print(isinstance({'a':1}, dict)) # print(chr(65))
# print(chr(97)) # 根据ASCII码表,填入对应的十进制,返回对应的字符
# print(ord('A'))
# print(ord('z')) # 根据ASCII码表,填入对应的字符,返回对应的十进制 # l = [10, 20, 30 ,40, 50]
# print(sum(l)) # 求和 # print(pow(4, 3)) # 4 ** 3
# print(pow(2, 3)) # 4 ** 3
s = '你好啊'
# res=s.encode('utf-8')
# print(res)
# ret = res.decode('utf-8')
# print(ret) # res=bytes(s, 'utf-8')
# print(res)
# print(str(res, 'utf-8')) def index():
print('from index') # print(callable(index)) # 查看是否能够被调用 '''健壮性'''
# res=callable(index)
# if res:
# index()
# else:
# '''''' # def func(name, age):
# print(locals()) # {'name': 1, 'age': 2}
# func(1, 2) # 复数,而不是负数
# 1+2j # 四舍五入
print(round(3.4))
print(round(3.5))
print(round(3.6))

for循环原理补充、生成器对象、yield冷门用法、生成器表达式的面试题、常见内置函数的更多相关文章

  1. 重要内置函数、常见内置函数(了解)、可迭代对象、迭代器对象、for循环原理、异常捕获

    目录 一.重要内置函数 二.常见内置函数(了解) 三.可迭代对象 四.迭代器对象 五.for循环内部原理 六.捕捉异常 一.重要内置函数 1. zip 说白了就是压缩几组数据值,说细了就是将可迭代对象 ...

  2. python生成器对象&常见内置函数

    内容概要 异常捕获(补充) for循环本质 生成器 yield 和 return优缺点 笔试题 常用内置函数 内容详细 一.异常捕获补充 try: print(name) except NameErr ...

  3. 重要内置函数、常见内置函数、可迭代对象、迭代器对象、for循环的本质、异常捕获处理

    重要内置函数 #zip拉链 zip 函数是可以接收多个可迭代对象,然后把每个可迭代对象中的第i个元素组合在一起,形成一个新的迭代器,类型为元组. l1 = [11, 22, 33] l2 = ['a' ...

  4. day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)

    day11:装饰器(装饰器形成.装饰器作用.@语法糖.原则.固定模式) 装饰器形成:最简单的.有返回值的.有一个参数的.万能参数 函数起的作用:装饰器用于在已经完成的函数前后增加功能 语法糖:使代码变 ...

  5. Python基础之函数:5、内置函数、迭代器对象、异常的捕获和处理

    目录 一.重要内置函数 1.zip() 2.filter() 3.sorted() 二.常见内置函数 1. abs() 2.all.any() 3.bin.oct.hex.int() 4.bytes( ...

  6. 学习过程中遇到的python内置函数,后续遇到会继续补充进去

    1.python内置函数isinstance(数字,数字类型),判断一个数字的数字类型(int,float,comple).是,返回True,否,返回False2.python内置函数id()可以查看 ...

  7. day4 内置函数 迭代器&生成器 yield总结 三元运算 闭包

    内置函数: 内置函数 # abs()返回一个数字的绝对值.如果给出复数,返回值就是该复数的模. b = -100 print(b) print(abs(b)) # all() 所有为真才为真,只要有一 ...

  8. day15生成器send方法,递归,匿名函数,max结合匿名工作原理,常用的内置函数

    复习 ''' 1.带参装饰器 - 自定义 | wraps def wrap(info) def outer1(func): from functools import wraps @wraps(fun ...

  9. Python 基础 内置函数 迭代器与生成器

    今天就来介绍一下内置函数和迭代器 .生成器相关的知识 一.内置函数:就是Python为我们提供的直接可以使用的函数. 简单介绍几个自己认为比较重要的 1.#1.eval函数:(可以把文件中每行中的数据 ...

  10. day15(生成器send方法,递归,匿名函数,内置函数)

    一,复习 ''' 1.带参装饰器 - 自定义 | wraps def wrap(info) def outer1(func): from functools import wraps @wraps(f ...

随机推荐

  1. 钉钉获取第三方token时提示签名时间戳参数超时的处理方法

    今天在更新平台功能时,碰到一个问题,从钉钉跳转到平台,始终不能成功.查看日志发现,出现了 签名时间戳参数超时 的错误. 想着没有动过相对应的代码,应该不是代码的问题. 查询官方文档,没有给出明确的答复 ...

  2. 关于Android开发工具的下载之SDK篇

    SDK的下载 需要注意的是,如果我们使用的是Eciplise工具的话,那我们需要下载版本较低的android SDK tools, 在这里把下载链接放在这里啦:https://link.csdn.ne ...

  3. 代码大全_V2(1,2章笔记)

    译序 这本书讲什么 代码大全 原名叫 code complete,它是什么,又不是什么? 不是IDE中的代码自动补全功能 不是软件源代码 "大全" 是 "编码完成&quo ...

  4. 使用Vue脚手架

    关于不同版本的Vue: vue.js与vue.runtime.xxx.js的区别: (1) vue.js是完整版的Vue,包含: 核心功能+模板解析器 (2) vue.runtime.xxx.js是运 ...

  5. 如何针对海外不同地区进行音视频自动化测试?丨Dev for Dev 专栏

    近年来由于全球性的新冠疫情,世界各地对实时音视频的需求猛增.不同国家和地区由于经济发展.国家政策等原因,网络环境有很大不同,如果要做好音视频体验,就需要分地域进行音视频指标测试.但是不论是外包,还是云 ...

  6. 移动端网页--better-scroll容易采坑合集

    移动端网页--better-scroll容易采坑合集 一.better-scroll源码bug,浏览器需要刷新一次才能正常滑动 在new BScroll时,在options中加入 mouseWheel ...

  7. 明解STM32—GPIO理论基础知识篇之寄存器原理

    ​ 一.前言 在之前的STM32的GPIO理论基础知识中,分别对基本结构和工作模式进行了详细的介绍.GPIO基本结构中主要对GPIO内部的各个功能电路逐一的进行的分析:GPIO工作模式中主要介绍GPI ...

  8. FreeSWITCH的originate命令解析及示例

    FreeSWITCH版本:1.10.9 操作系统:CentOS 7.6.1810 originate经常用于发起呼叫,在实际工作过程中用到的也比较多,今天总结下基本用法,也方便我以后查阅. 一.wik ...

  9. 图与网络分析—R实现(三)

    最小生成树 (Minimum Spanning Tree) 应该大家都不陌生,Spanning 有跨越的意思,生成树一般来说每个节点都能访问到别的节点,是一个连通树.所以,一般考虑无向图里去造生成树. ...

  10. 超详细!手把手教你用 JaCoCo 生成单测覆盖率报告!

    我们都知道 Spock 是一个单测框架,其特点是语法简明.但当我们使用 Spock 写了一堆单元测试之后,如何生成对应的单测覆盖率报告呢?一般来说,我们会使用两个插件来一起完成单测覆盖率报告的生成,分 ...