Python之旅.第三章.函数3.30

一、迭代器

1、什么是迭代?:迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来

2、要想了解迭代器到底是什么?必须先了解一个概念,即什么是可迭代的对象?可迭代的对象:在python中,但凡内置有__iter__方法的对象,都是可迭代的对象num=1

以下都是可迭代的对象str1=‘hello‘list1=[1,2,3]tup1=(1,2,3)dic={‘x‘:1}s1={‘a‘,‘b‘,‘c‘}f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)

3、迭代器:迭代取值工具,可迭代的对象执行__iter__方法得到的返回值就是迭代器对象dic={‘x‘:1,‘y‘:2,‘z‘:3}iter_dic=dic.__iter__()print(iter_dic.__next__())print(iter_dic.__next__())

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

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

4、可迭代的对象vs迭代器对象?‘‘‘可迭代的对象:str,list,tuple,dict,set,file1、获取可迭代对象的方式:无须获取,python内置str,list,tuple,dict,set,file都是可迭代对象2、特点:    内置有__iter__方法的都叫可迭代的对象,执行该方法会拿到一个迭代器对象

迭代器对象:文件对象本身就是迭代器对象1、获取迭代器对象的方式:    执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象2、特点:    内置有__next__方法,执行该方法会拿到迭代器对象中的一个值    内置有__iter__方法,执行该方法会拿到迭代器本身

‘‘‘

x=‘hello‘

iter_x=x.__iter__()iter_x.__next__print(iter_x.__iter__().__iter__() is iter_x)

文件本身就是迭代器对象str1=‘hello‘list1=[1,2,3]tup1=(1,2,3)dic={‘x‘:1}s1={‘a‘,‘b‘,‘c‘}f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)f.__next__()

5、迭代器的优缺点分析5.1 迭代器的优点:5.1.1、提供了一种可不依赖于索引的取值方式l=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘)iter_l=l.__iter__()while True:    try:        print(iter_l.__next__())    except StopIteration:        break

5.1.2 迭代器更加节省内存item=range(0,100000000000000000000000000000000000000000000)print(item)

5.2迭代器的缺点:5.2.1、取值麻烦,只能一个一个取,只能往后取,5.2.2、并且是一次性的,无法用len获取长度

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

6. for循环原理分析:6.1、for 循环称之为迭代器循环,in后跟的必须是可迭代的对象6.2、for循环会执行in后对象的__iter__方法,拿到迭代器对象6.3、然后调用迭代器对象的__next__方法,拿到一个返回值赋值给line,执行一次循环体6.4、周而复始,直到取值完毕,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

obj=chicken()print(obj)生成器本质就是迭代器,也就是说生成器的玩法其实就是迭代器的玩法print(obj.__iter__() is obj)res=obj.__next__()print(res)

res1=obj.__next__()print(res1)

res2=obj.__next__()print(res2)

obj.__next__()

1、iter_obj=obj.__iter__(),拿到迭代器2、出发iter_obj.__next__(),拿到该方法的返回值,赋值给item3、周而复始,直到函数内不在有yield,即取值完毕4、for会检测到StopIteration异常,结束循环for item in obj:    print(item)

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

def my_range():    print(‘start........‘)    n=0    while True:        yield n        n+=1

obj=my_range()print(obj)

print(obj.__next__())print(obj.__next__())

for i in my_range():    print(i)

def my_range(start,stop,step=1):    n=start    while n < stop:        yield n #yield 4        n+=step #5

obj=my_range(3,7,2) #3,5,print(obj.__next__())print(obj.__next__())

for item in my_range(5,10,2):    print(item)

三、生成器之yield的表达式

def eat(name):    print(‘%s ready to eat‘ %name)    food_list=[]    while True:        food=yield food_list # food=‘骨头‘        food_list.append(food) #food_list=[‘泔水‘,‘骨头‘]        print(‘%s start to eat %s‘ %(name,food))

dog1=eat(‘alex‘)

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(‘\033[45m用户名必须为英文字母...\033[0m‘)            continue        with open(r‘%s‘ %db_path,‘r‘,encoding=‘utf-8‘) as f:            for line in f:                uinfo=line.strip(‘\n‘).split(‘,‘)                if uname == uinfo[0]:                    print(‘\033[45m用户名已存在...\033[0m‘)                    break            else:                return uname

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

def get_bal():    while True:        bal=input(‘请输入余额: ‘).strip()        if bal.isdigit():            # bal=int(bal)            return bal        else:            print(‘\033[45m钱必须是数字,傻叉...\033[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\n‘ %(uname,pwd,bal,age))

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

原文地址:https://www.cnblogs.com/yangli0504/p/8678149.html

时间: 2024-11-05 18:50:56

Python之旅.第三章.函数3.30的相关文章

Python之旅.第三章.函数3.28

一.命名关键字参数: 什么是命名关键字参数?格式:在*后面参数都是命名关键字参数特点:1 必须被传值1 约束函数的调用者必须按照key=value的形式传值2 约束函数的调用者必须用我们指定的key名 def foo(x,y,*,z): #创建foo函数,z为命名关键字参数 print(x,y,z)#foo(1,2,aaa=3) #报错,z为命名关键字参数,只能用用关键字z=值foo(1,2,z=3) ------------------------------def auth(*args,na

Python编程快速上手-让繁琐工作自动化 第三章 函数习题及其答案

第三章 函数习题及其答案 1.为什么在程序中加入函数会有好处? 答:函数减少了重复的代码.这让程序更短,更容易阅读,更容易修改. 2.函数中的代码何时执行: 在函数被定义时,还是在函数被调用时? 答:函数中的代码在函数被调用时执行,而不是在函数定义时. 3.什么语句创建一个函数? 答:def语句定义了(创建了)一个函数. 4.一个函数和一次函数调用有什么区别? 答:函数包含def语句和在def子句中的代码.函数调用让程序执行转到函数内,函数调用求值为该函数的返回值. 5.Python程序中有多少

Python编程入门-第三章 编写程序 -学习笔记

第三章 编写程序 1.编辑源程序.运行程序 可通过IDLE中File>New File新建一个文本以编辑源程序,编辑完成可通过Run>Run Module(或者F5快捷键)来运行程序.Python源文件都以.py格式存储. 2.从命令行运行程序 除了上述利用IDLE的集成功能运行程序的方式外,当然也可以通过命令行运行程序,命令格式为:python ‘源文件名称.py’. 3.编译源代码 当运行py格式文件时,Python会自动创建相应的.pyc文件,该文件包含编译后的代码即目标代码,目标代码基

Python读书笔记-第三章,四章

第三章 1. 字符串格式化 >>>format="hello %s  %s world" >>>values=('world','hot') >>>print format % values  #也可以接收单个字符串也 也可以用%f %d这类的类似与c的printf 匹配多个参数的时候应该用圆括号 >>>'%s plus %s equals %s'  %(1,1,2) >>>'%010.2f' %

Python学习(第三章)

一. 转义字符 1. \t 使输出垂直方向保持对齐 # \t 在控制台输出一个制表符,是输出垂直方向保持对齐 print("1 2 3") print("10 11 12") print("1\t2\t3") print("10\t11\t12") --------------------------------------------------- 1 2 310 11 121    2    3    10   11  

第三章 函数练习题

文件处理相关 1,编码问题 (1)请问python2与python3中的默认编码是什么? 1 2 python 2.x默认的字符编码是ASCII,默认的文件编码也是ASCII python 3.x默认的字符编码是unicode,默认的文件编码也是utf-8 (2)为什么会出现中文乱码,你能举例说明乱码的情况有哪几种? 1 2 3 4 5 6 7 8 9 无论以什么编码在内存里显示字符,存到硬盘上都是2进制,所以编码不对,程序就会出错了. (ascii编码(美国),GBK编码(中国),shift_

python核心编程-第三章-个人笔记

1.语句和语法 (1)反斜杠"\"表示语句继续.python良好的编程习惯是一行最后不超过80个字符,一行字符过多时便须用到反斜杠换行继续该语句. PS:在使用小括号.中括号.大括号时可以跨行书写,无须反斜杠:三引号的字符串也可以跨行书写 (2)分号";"可以在同一行写多个语句.虽然python支持这么做,但为了代码可读性,一般不建议这么做 2.变量赋值 (1) python中,对象是引用传递的,而不是直接将值赋给对象  如: >>> a = 12

《算法导论》读书笔记--第三章函数的增长 课后题

本章的课后题看一下即可,比较平凡. 3.1渐近记号 引用一下别人的答案,非常感谢: 原文地址:http://www.cnblogs.com/timebug/archive/2010/03/25/1694286.html |概念回顾| 当输入规模大到使只有运行时间的增长量级有关时,就使在研究算法的渐进效率. 几个重要渐进记号的定义: Θ(g(n))={ f(n): 存在正常数c1,c2和n0,使对所有的n>=n0,有0<=c1g(n)<=f(n)<=c2g(n) } O(g(n))=

Python之旅.第五章.面向对象 4.12

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 13.0px "PingFang SC"; color: #000066; background-color: #ffffff } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 13.0px Courier; color: #000066; background-co