zoukankan      html  css  js  c++  java
  • 3/29 迭代器/生成器/生成器之yield的表达式形式/面向过程的编程思想

    1 迭代器

    迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来

    可迭代的对象:在pytnon,但凡有内置__iter__放法的对象,都是可迭代的对象

    以下都是可以迭代的对象

    str,list,tup,dic,sl,文件。

    迭代器:选代取值的工具,可迭代的对象执行__iter__方法得到的返回值都是迭代对象

    dic={'x':1,'y':2,'z':3}
    iter_dic=dic.__iter__()
    print(iter_dic.__next__())
    print(iter_dic.__next__())
    print(iter_dic.__next__())

    s1={'a','b','c'}
    iter_s1=s1.__iter__()
    print(iter_s1.__next__())
    print(iter_s1.__next__())
    print(iter_s1.__next__())

    list1=[1,2,3]
    iter_list1=list1.__iter__()
    print(iter_list1.__next__())
    print(iter_list1.__next__())

    可迭代的对象:ste,lsit,tuple,dict,set,file

    1获取可迭代对象的方式:,无须领取,python内置的ste,lsit,tuple,dict,set,file,都是可迭代的对象

    2特点:

    内置有__list__方法的都叫可迭代的对象,执行该方法会拿到一个迭代器的对象

    迭代器对象,文件对象本身就是迭代器对象

    1获取迭代器对象的方式:

    执行可迭代的对象__iter__放法,拿到返回值就是迭代器对象。

    2 特点:

    内置有__next__方法,执行该方法会拿到迭代器对象中的一个值

    内置有__iter__方法,执行该方法会拿到迭代器本身

    迭代器的优缺点分析

    迭代器的缺点

    提供了一种可不依赖索引的取值方式

    l=open('a.txt','r',encoding='utf-8')
    iter_l=l.__iter__()
    while True:
    try:
    print(iter_l.__next__())
    except StopIteration:
    break

    迭代器更加节省内存

    迭代器的缺点:

    取值麻烦,只能一个一个取值,只能往后取

    并且是一次性的,无法用len获取长度

    x=[1,2,3]
    iter_x=x.__iter__()
    while True:
    try:
    print(iter_x.__next__())
    except StopIteration:
    break
    print('第二次=================================》')
    iter_x=x.__iter__()
    while True:
    try:
    print(iter_x.__next__())
    except StopIteration:
    break

    for 循环原理分析

    for 循环称之为迭代器循环,in后跟的必须是可迭代的对象

    for循环会执行in后对象的__iter__方法,拿到迭代器对象

    然后用迭代器对象的__next__方法,拿到一个返回值赋值给line,执行一次循环体

    周而复始,直到取值完毕,for循环会检测到异常自动结束循环

    l=open('a.txt','r',encoding='utf-8')
    for line in l: #iter_l=l.__iter__()
    print(line)

    for item in {'x':1,'y':2}:
    print(item)


    生成器内水内包含有yield关键字,再调用函数,就不会执行函数体代码,拿到的返回值就是一个生成器对象。

    def chicken():
    print('=====>first')
    yield 1
    print('=====>sencond')
    yield 2
    print('=====>third')
    yield 3

    生成器本质就是迭代器,也就是说生成器的玩法其实就是迭代器的玩法

    #总结yield:
    #1、为我们提供了一种自定义迭代器的方式,
    # 可以在函数内用yield关键字,调用函数拿到的结果就是一个生成器,生成器就是迭代器
    #2、yield可以像return一样用于返回值,区别是return只能返回一次值,而yield可返回多次
    # 因为yield可以保存函数执行的状态


    #1、必须初始化一次,让函数停在yield的位置
    res0=dog1.__next__()
    print(res0)

    #2、接下来的事,就是喂狗
    #send有两方面的功能
    #1、给yield传值
    #2、同__next__的功能
    res1=dog1.send('泔水')
    print(res1)
    res2=dog1.send('骨头')
    print(res2)
    res3=dog1.send('shit')
    print(res3)

    '''
    1 面向过程的编程思想
    核心是'过程'二字,过程即解决问题的步骤,即先干什么,再干什么。。。。
    基于面向过程编写程序就好比在设计一条流水线,是一种机械式的思维方式。


    2、示范:

    3、总结优缺点:
    优点:复杂的问题流程化,进而简单化
    缺点:修改一个阶段,其他阶段都有可能需要做出修改,牵一发而动全身,即扩展性极差
    应用:用于扩展性要求低的场景

    '''
    #1、步骤一:拿到用户输入的合法的信息:用户名、密码、余额、年龄
    db_path='db.txt'

    def get_uname():
    while True:
    uname=input('用户名>>:').strip()
    if not uname.isalpha():
    print('33[45m用户名必须为英文字母...33[0m')
    continue
    with open(r'%s' %db_path,'r',encoding='utf-8') as f:
    for line in f:
    uinfo=line.strip(' ').split(',')
    if uname == uinfo[0]:
    print('33[45m用户名已存在...33[0m')
    break
    else:
    return uname

    def get_pwd():
    while True:
    pwd1=input('请输入密码>>: ').strip()
    pwd2=input('再次输入密码>>: ').strip()
    if pwd1 == pwd2:
    return pwd1
    else:
    print('33[45m两次输入的密码不一致,请重新输入...33[0m')

    def get_bal():
    while True:
    bal=input('请输入余额: ').strip()
    if bal.isdigit():
    # bal=int(bal)
    return bal
    else:
    print('33[45m钱必须是数字,傻叉...33[0m')

    def get_age():
    pass

    #2、步骤二:写入文件
    def file_hanle(uname,pwd,bal,age):
    with open(r'%s' %db_path,'a',encoding='utf-8') as f:
    f.write('%s,%s,%s,%s ' %(uname,pwd,bal,age))

    # 注册功能
    def register():
    #步骤1:
    uname=get_uname() #拿到合法的用户名
    pwd=get_pwd() #拿到合法的密码
    bal=get_bal() #拿到合法的余额
    #步骤2:
    file_hanle(uname,pwd,bal) #写入文件


  • 相关阅读:
    show master status, show slave status中的Executed_Gtid_Set
    MySQL分库分表
    数据库的读锁和写锁在业务上的应用场景总结
    MySQL死锁分析
    Java接口幂等性
    MySQL读写分离原理
    mysql 安装参考
    关于我
    【2020五校联考NOIP #6】最佳观影
    【2020五校联考NOIP #6】三格缩进
  • 原文地址:https://www.cnblogs.com/seanliang/p/8677977.html
Copyright © 2011-2022 走看看