迭代器、生成器、send方法、send与return的异同点、生成器表达式、常用的内置方法
迭代器:
作用:可以不依赖索引进行取值。
可迭代对象:#
必须内置有__iter__方法
__iter__读法:双下+方法名
需要迭代取值的数据类型:
字符串、列表、元祖、字典、集合(均为可迭代对象)
文件对象:(迭代器对象)执行内置__iter__之后还是它本身。
f1 = open('xxx.txt','w',encoding='utf-8')
print(f1)
可迭代对象执行内置的__iter__方法之后就变成了迭代器对象。
迭代器对象:#
1.有内置方法__iter__、__next__方法
l = [1,2,3,4]
__iter__l = l.__iter__()#生成迭代器对象
迭代器取值 需要调用__next__方法
print(__iter__l.__next__())
......
当取空时会直接报错(StopIteration)
迭代器对象无论执行多少次__iter__()方法得到的还是迭代器本身。
f1=open('a.txt','r',encoding='utf-8')
print(f1 is f1.__iter__().__iter__().__iter__().__iter__())
问:__iter__方法就是用来帮我们生成迭代器对象而文件对象本身就是迭代器对象,为什么还内置有__iter__方法???
因为如果没有这个内置方法的话迭代器对象调用__iter__()时,就会报错。
异常处理:#
try:
.....
except StopIteration(错误类型):
“错误类型匹配时执行此处的代码!”
迭代器的取值特点:只能依次的往后去,不能后退。
for循环的本质:
for ... in ...
关键字in的后面:可迭代对象。
for循环的内部本质:
1.将in后面的对象调用__iter__转换成迭代器对象。
2.调用__next__迭代取值
3.内部有异常处理机制,用来捕获错误类型StopIteration,当__next__出现这种错误类型时,自动调用break来结束本次循环。
迭代取值的优缺点:#
优点:
1.不用依赖传统的索引取值。
2.在内存中永远只占一份空间,需要的时候再取出,不会导致内存溢出。
缺点:
1.不能够只取出指定元素,只能依次取出。
2.当迭代器中的值被取完时会报错。(StopIteration)
生成器:即用户通过自定义的迭代器。
一般形式:
def func():
print('first')
yield 666 #函数体内有yield关键字时,加括号并不会取执行函数
#yield 1,2,3,4
#yield后面的值就是当你调用迭代器__next__方法时,你可以得到的值。
同时yield可以返回多个值,并且多个值也是按照元祖的形式返回的
g = func() #生成器初始化:将函数变成迭代器
print(g.__next__())
自己手写一个range(1,10,2)函数
def my_range(n,k,j):
while n<k:
yield n
n+=j
res = my_range(1,10,2)
print(res)
print(res.__next__())
yield表达式形式(了解内容)
def dog(name):
print('%s 准备开吃'%name)
while True:
food = yield
print('%s 吃了 %s'%(name,food))
# def index():
# pass
yield支持外界为其传参(send())#
当函数体内有yield关键字的时候,调用该函数不会执行函数体代码,而是将函数变成一个生成器。
通过send()方法为yield传值的时候,必须将代码运行到yield才能够为其传值(运行至yield是会自动停止运行),通过send传值是也会自动触发__next__方法,进行输出一次。
send与return的异同点:#
相同点:都可以返回多个值。
不同点:yield可以返回多次值,而return一次函数就结束了;yield还可以接受外部传入的值。
生成器表达式:#
# res = (i for i in range(1,10) if i != 4) # 生成器表达式
# print(res)
# """
# 生成器不会主动执行任何一行代码
# 必须通过__next__触发代码的运行
生成器表达式的应用:#
# with open('xxx.txt','r',encoding='utf-8') as f:
#(传统的for循环方法)
# # n = 0
# # for line in f:
# # n += len(line)
# # print(n)
#(利用生成器表达式方法)
g = (len(line) for line in f)
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(sum(g))
面试题:
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 test())
# 第二次for循环g=(add(n,i) for i in (add(n,i) for i in test()))
print(n)
res=list(g)
"""
for i in (add(10,i) for i in test()): 会执行所有的生成器内部的代码
add(n,i)
"""
#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
#C. res=[20,21,22,23] 答案
#D. res=[21,22,23,24]
常用的内置方法:#
abs():求绝对值
print(abs(-11))#11
l = [1,2,3]
all(l)#只要有一个元素返回值为false,就返回false
any(l)#只要有一个元素返回值为True就返回true
globals():#查看全局名称空间的变量名
二进制:bin()
八进制:oct()
十六进制:hex()
chr(97)#将数字转换成ASCII码表对应的字符。
order(‘a’)#将字符按照ASCII表转换成对应的数字。
"""
面向对象需要学习的方法#
classmethod
delattr
getattr
hasattr
issubclass
property
repr
setattr
super
staticmethod
"""
dir()#获取当前对象的名称空间里面的名字
l=[1,2,3]
print(dir(l))
divmod()#分页器
print(divmod(101,10))#(10, 1)
enumerate #枚举
l = ['a','b','c']
for i,j in enumerate(l):
print(i,j)
#结果:
0 a
1 b
2 c
eval(s):(提取字符串中的Python代码并进行运算)不支持代码逻辑只支持一些简单的Python代码
s='
print(1+2)
for i in range(10):
print(i)
'
eveal(s1)#(报错)
exec(s1)#(可以运行)
exec(s):(提取字符串中的Python代码并进行运算)支持代码逻辑,比eveal高级
# isinstance 后面统一改方法判断对象是否属于某个数据类型
# n = 1
# print(type(n))
# print(isinstance(n,list)) # 判断对象是否属于某个数据类型
round():#四舍五入
面向过程编程:#
好处:
将复杂的问题流程化 从而简单化
坏处:
可扩展性较差 一旦需要修改 整体都会受到影响

1 # 注册功能 2 # 1.获取用户输入 3 def get_info(): 4 while True: 5 username = input(">>>:").strip() 6 if not username.isalpha(): # 判断字符串不能包含数字 7 print('不能包含数字') 8 continue 9 password = input('>>>:').strip() 10 confirm_password = input("confirm>>>:").strip() 11 if password == confirm_password: 12 d = { 13 '1':'user', 14 '2':'admin' 15 } 16 while True: 17 print(""" 18 1 普通用户 19 2 管理员 20 """) 21 choice = input('please choice user type to register>>>:').strip() 22 if choice not in d:continue 23 user_type = d.get(choice) 24 operate_data(username,password,user_type) 25 break 26 else: 27 print('两次密码不一致') 28 29 # 2.处理用户信息 30 def operate_data(username,password,user_type): 31 # jason|123 32 res = '%s|%s|%s\n'%(username,password,user_type) 33 save_data(res,'userinfo.txt') 34 35 # 3.存储到文件中 36 def save_data(res,file_name): 37 with open(file_name,'a',encoding='utf-8') as f: 38 f.write(res) 39 40 def register(): 41 get_info() 42 43 register()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)