总结十三

一.迭代器

什么是迭代器

  迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果

  迭代器:迭代取值的工具

为什么要用

  迭代器给我们提供了一种不依赖于索引取值的方式

例子:

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()
注册功能

 

 

 

 

 

posted @ 2019-07-15 21:53  二哈强拆Python世界  阅读(100)  评论(0)    收藏  举报