1.迭代器"""什么是迭代器 迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具
为什么要用 迭代器给你提供了一种不依赖于索引取值的方式
如何用"""n = 1f = 1.1s = 'hello'l = [1, 2, 34, ]t = (1, 2, 34)s1 = {1, 2, 3, 4}d = {'name': 'jason'}f1 = open('xxx.txt', 'w', encoding='utf-8')
## res = s.__iter__() # 等价于res = iter(s)## print(s.__len__()) # 简化成了len(s)# res1 = l.__iter__() # res1 = iter(l)# res2 = f1.__iter__() # res2 = iter(f1)# print(res,res1,res2)# print(f1)
# 可迭代对象执行内置的__iter__方法得到就是该对象的迭代器对象
2.迭代器取值"""迭代器对象 1.内置有__iter__方法 2.内置有__next__方法 # 只有作为迭代器对象时才能用第二种方法 ps:迭代器一定是可迭代对象 而可迭代对象不一定是迭代器对象"""
# l = [1,2,3,]# # 生成一个迭代器对象# iter_l = l.__iter__() 记住这个## # 迭代器取值 调用__next__# print(iter_l.__next__())# print(iter_l.__next__())# print(iter_l.__next__()) # 如果取完了 直接报错
# d = {'name':'jason','password':'123','hobby':'泡m'}# # 将可迭代对象d转换成迭代器对象# iter_d = d.__iter__()# # 迭代器对象的取值 必须用__next__# print(iter_d.__next__())# print(iter_d.__next__())# print(iter_d.__next__())# print(iter_d.__next__()) # 取完了 报错StopIteration
f1 = open('xxx.txt','r',encoding='utf-8')# 调用f1内置的__iter__方法# iter_f = f1.__iter__()# print(iter_f is f1)"""迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身(******)"""# print(f1 is f1.__iter__()"""问:__iter__方法就是用来帮我们生成迭代器对象而文件对象本身就是迭代器对象,为什么还内置有__iter__方法???"""
d = {'name':'jason','password':'123','hobby':'泡m'}# iter_d = d.__iter__()
# print(d.__iter__().__next__())# print(d.__iter__().__next__())# print(d.__iter__().__next__()) # 不断地生成的迭代器,导致结果重复
# print(iter_d.__next__())# print(iter_d.__next__())# print(iter_d.__next__())# print(iter_d.__next__())
# 异常处理# while True:# try:# print(iter_d.__next__())# except StopIteration:# # print('老母猪生不动了')# break
"""迭代器取值的特点 1.只能往后依次取 不能后退"""
3.for循环的本质d = {'name':'jason','password':'123','hobby':'泡m'}# for i in d:# print(i)# for循环后面的in关键 跟的是一个可迭代对象"""for循环内部的本质 1.将in后面的可迭代对象调用__iter__转换成迭代器对象 2.调用__next__迭代取值 3.内部有异常捕获StopIteration,当__next__报这个错 自动结束循环"""
"""可迭代对象:内置有__iter__方法的迭代器对象:既内置有__iter__也内置有__next__方法
迭代取值: 优点 1.不依赖于索引取值 2.内存中永远只占一份空间,不会导致内存溢出 缺点 1.不能够获取指定的元素 2.取完之后会报StopIteration错
"""# l = [1,2,3,4]# res = map(lambda x:x+1,l) # 内置for循环# print(map(lambda x:x+1,l)) # 这是一个迭代器的内存地址# print(res.__next__()) # print(res.__next__())# print(res.__next__())
l1 = [1,2,3,4,5] l2 = ['a','b','c']print(zip(l1,l2))
4.生成器(定义函数的形式)"""生成器:用户自定义的迭代器,本质就是迭代器"""
# def func():# print('first')# yield 666 # 注意 函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行# print('second')# yield 777# print('third')# yield 888# print('forth')# yield# yield# # yield后面跟的值就是调用迭代器__next__方法你能得到的值# # yield既可以返回一个值也可以返回多个值 并且多个值也是按照元组的形式返回# g = func() # 生成器初始化:将函数变成迭代器# print(g)# print(g.__next__())# print(g.__next__())# print(g.__next__())# print(g.__next__())# print(g.__next__()) # yield后没有值时结果为None
# print(range(1,10))
# for i in range(1,10,2):# print(i)
def my_range(start, end, step=1): while start < end: yield start start += step
5.yield 与return# yield支持外界为其传参def dog(name): print('%s 准备开吃' % name) while True: food = yield print('%s 吃了 %s' % (name, food))
# def index():# pass
#dog() # 这个不会运行但是print('dog')仍然是函数的的内存地址# 就是说当函数内有yield关键字的时候,调用该函数不会执行函数体代码 这是于自定义函数的区别# 将函数变成生成器即迭代器# g = dog('egon')# g.__next__() # 必须先将代码运行至yield 才能够为其传值# g.send('狗不理包子') # 给yield左边的变量传参 触发了__next__方法# g.send('饺子')
"""
yield 1.帮你提供了一种自定义生成器方式 2.会帮你将函数的运行状态暂停住 3.可以返回值
与return之间异同点 相同点:都可以返回值,并且都可以返回多个 不同点: yield可以返回多次值,而return只能返回一次函数立即结束 yield还可以接受外部传入的值"""
6.生成器表达式# 列表生成式# res = [i for i in range(1,10) if i != 4]# print(res)
# res = (i for i in range(1,100) if i != 4) # 注意这个不是元组的表达式,而是生成器表达式# print(res)# """# 生成器不会主动执行任何一行代码# 必须通过__next__触发代码的运行# """# print(res.__next__())# print(res.__next__())# print(res.__next__())# print(res.__next__())
# 占内存因为要一次性读取# f = open('xxx.txt','r',encoding='utf-8')# data = f.read()# print(len(data))# f.close() # 下面的with open 格式会自动帮你close文件
# with open('xxx.txt','r',encoding='utf-8') as f:# # 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)) # 因为逐行读取所以节省了内存提高了效率 记住sum逐行方法
7.常用的一些内置方法# print(abs(-11.11)) # 求绝对值# l = [0,1,0]# print(all(l)) # 只要有一个为False就返回False# print(any(l)) # 只要有一个位True就返回Truedef index():
username = '我是局部名称空间里面的username' # print(locals()) # 当前语句在哪个位置 就会返回哪个位置所存储的所有的名字 print(globals()) # 无论在哪 查看的都是全局名称空间# index()# print(bin(10))# print(oct(10))# print(hex(10))# print(int('0b1010',2))
# print(bool(1))# print(bool(0))
# s = 'hello'# print(s.encode('utf-8'))# print(bytes(s,encoding='utf-8'))
# 可调用的(可以加括号执行相应功能的)# l = [1,2,3]# def index():# pass# print(callable(l))# print(callable(index))
# print(chr(97)) # 将数字转换成ascii码表对应的字符# print(ord('a')) # 将字符按照ascii表转成对应的数字
"""面向对象需要学习的方法classmethoddelattrgetattrhasattrissubclasspropertyreprsetattrsuperstaticmethod"""# dir获取当前对象名称空间里面的名字"""迭代器对象 1.内置有__iter__方法 2.内置有__next__方法 ps:迭代器一定是可迭代对象 而可迭代对象不一定是迭代器对象"""
8.面向对象"""面向过程编程:就类似于设计一条流水线 好处: 将复杂的问题流程化 从而简单化 坏处: 可扩展性较差 一旦需要修改 整体都会受到影响"""# 注册功能# 1.获取用户输入def get_info(): while True: username = input(">>>:").strip() if not username.isalpha(): # 判断字符串不能包含数字 print('不能包含数字') continue password = input('>>>:').strip() confirm_password = input("confirm>>>:").strip() if password == confirm_password: d = { '1':'user', '2':'admin' } while True: print(""" 1 普通用户 2 管理员 """) choice = input('please choice user type to register>>>:').strip() if choice not in d:continue user_type = d.get(choice) operate_data(username,password,user_type) break else: print('两次密码不一致')
# 2.处理用户信息def operate_data(username,password,user_type): # jason|123 res = '%s|%s|%s\n'%(username,password,user_type) save_data(res,'userinfo.txt')
# 3.存储到文件中def save_data(res,file_name): with open(file_name,'a',encoding='utf-8') as f: f.write(res)
def register(): get_info()
register()
转载于:https://www.cnblogs.com/night-rain/p/11192279.html
相关资源:JAVA上百实例源码以及开源项目