总结十三
一.迭代器
什么是迭代器
迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果
迭代器:迭代取值的工具
为什么要用
迭代器给我们提供了一种不依赖于索引取值的方式
例子:
n = 0 while True: print(n)
只是简单的重复,不算是迭代器
l = [1,2,3,4,5]
s = 'hello'
n = 0
while n < len(s)
print(s[n])
n += 1
重复+每次迭代都基于上一次结果
"""
需要迭代取值的数据类型
字符串
列表
元组
字典
集合
"""
可迭代对象:只有内置有__iter__方法的都叫做可迭代对象
补充:针对双下线开头双下线结果的方法
读法推荐:双下+方法名
基本数据类型中,是可迭代对象的有
str list tuple dic set
文件对象(执行内置__iter__之后还是本身,没有任何变化):
文件对象本身就是迭代器对象
可迭代对象执行内置的__iter__方法得到的就是该对象的迭代器对象
n = 1
f = 1.1
s = 'hello'
l = [1,2,3]
t = (1,2,3)
s1 = {1,2,3,4}
d = {'name':'jason'}
f1 = open('test.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)
二.迭代器取值
迭代器对象:
1.内置有__iter__方法
2.内置有__next__方法
ps:迭代器一定是可迭代对象
而可迭代对象不一定是迭代器对象
l = [1,2,3,4] # 生成一个迭代器对象 iter_l = l,__iter__() # 迭代器取值 调用__next__ print(iter_l.__next__()) print(iter_l.__next__()) print(iter_l.__next__()) print(iter_l.__next__()) print(iter_l.__next__()) # 如果取完了,直接报错
d = {'name':'jason','password':'123','hobby':'DNF'}
# 将可迭代对象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('test.txt','r',encoding='utf-8')
# 调用f1内置的__iter__方法
iter_f = f1.__iter__()
print(iter_f is f1)
迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身(******)
迭代器取值的特点:只能往后依次取,不能后退
三.for循环的本质
for循环内部的本质:
1.将in后面的对象调用__iter__转换成迭代器对象
2.调用__next__迭代取值
3.内部有异常捕获StopIteration,当__next__报这个错,自动结束循环
d = {'name':'jason','password':'123','hobby':'DNF'}
for i in d:
print(i)
# for循环后面的in关键字,跟的是一个可迭代对象
可迭代对象:内置有__iter__方法的
迭代器对象:既内置有__iter__也内置有__next__方法
迭代取值:
优点:
1.不依赖于索引取值
2.内存中永远只占一份空间,不会导致内存溢出
缺点:
1.不能够获取指定的元素
2.取完之后会报错StopIteration
四.生成器
生成器:用户自定义的迭代器,本质就是迭代器
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__())
# 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 for j in my_range(1,10,2): print(j)
五.yield表达式
yield
1.帮你提供了一种自定义生成器方式
2.会帮你将函数的运行状态暂停住
3.可以返回值
与return之间的异同点
相同点:都可以返回值,并且都可以返回多个
不同点:yield可以返回多次值,而return只能返回一次函数立即结束
六.生成器表达式
生成器不会主动执行任何一行代码,必须通过__next__触发代码的执行
res = (i for i in range(1,100) if i != 4) # 生成器表达式 print(res) print(res.__next__()) print(res.__next__()) print(res.__next__()) print(res.__next__())
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] 答案:C
七.常用内置方法
abs() 求绝对值
locals() # 当前语句在哪个位置,就会返回哪个位置所存储的所有的名字
globals() # 无论在哪,查看的都是全局名称空间
bin(10) 二进制转八进制
oct(10) 二进制转十进制
hex(10) 二进制转十六进制
callable() 可调用的
chr() # 将数字转换成ASCII码表对应的字符
ord() # 将字符按照ASCII码表转换成对应的数字
"""
面向对象需要学习的方法
classmethod
delattr
getattr
issubclass
property
repr
setattr
super
staticmethod
"""
dit() # 获取当前对象名称空间里面的名字
divmod 分页器
enumerate 枚举
format 三种玩法
{} 占位
{index} 索引
{name} 指名道姓
八.面向过程编程
面向过程编程,就类似于设计一条流水线
好处:将复杂的问题流程化,从而简单化
坏处:可扩展性较差,一但需要修改,整体都会受到影响
# 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): 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()
浙公网安备 33010602011771号