首页 > 编程语言 >python第16课--

python第16课--

时间:2022-10-17 17:46:46浏览次数:47  
标签:__ .__ 迭代 16 python iter next -- 对象

1. 作业讲解

登录校验装饰器+用户权限
1.有几个普通函数
2.需要在执行之前添加校验用户信息的功能
3.编写一个校验用户是否登录的装饰器
4.定义全局变量存储用户是否登录的信息(由于不单单需要记录用户登录状态还需要记录当前用户的权限 所以使用了字典)
5.装饰器每次获取用户信息之前先判断用户是否已登录
	如果没有登录则获取用户名和密码
 	如果登录了则获取当前登录的执行权限
6.装饰器内部如何获取当前用户想要执行的功能编号
	有参装饰器
7.登录之后获取执行权限然后判断功能编号是否存在于执行权限内

昨日回顾

重要内置函数

1.map()       映射 map(func,array...) array是可迭代对象   map方法会依次迭代array,得到的值依次传给匿名函数(也可以是有名函数),而map函数得到的结果仍然是迭代器。
map会根据提供的函数对指定的序列做映射。第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列.

image

2.max() min()
def max(*args, key=None):

res = max(d1, key=lambda k: d1.get(k))
d1是字典   key是关键字参数,默认为none,不传值就默认for循环迭代出得值直接比较大小。
当给key传值后字典for循环出的值会经过函数处理后比较大小,最终得出最大值所对应的键!!

image

3.reduce()
函数先从列表(或序列)中取出2个元素执行指定函数,并将输出结果与第3个元素传入函数,输出结果再与第4个元素传入函数,…,以此类推,直到列表每个元素都取完。
传多个值返回一个值,会对参数序列中元素进行累积。(累积包括累加、累乘、等)
res=reduce(func,array)  假设func等于lambda x,y:x+y,先对array迭代一次得到的值最为x,再迭代一次的值作为y,x与y相加后的值再作为x,array迭代三次的值作为y,如此往复直到array结束!!!
4.zip() 拉链
l1 = [11, 22, 33, 44, 55]
l2 = ['jason', 'kevin', 'oscar', 'jerry', 'tony']
l3 = [1, 2, 3, 4, 5]
res = zip(l1, l2, l3)
print(list(res))
[(11, 'jason', 1), (22, 'kevin', 2), (33, 'oscar', 3), (44, 'jerry', 4), (55, 'tony', 5)]
它从每个迭代器中聚合元素,返回一个元组的迭代器,当最短的输入迭代被耗尽时,迭代器就停止了。zip的 最终结果一组一组的元组,每个元组里面的数据是要拉链的迭代器的每一次迭代的取值,但最终zip方法最终的返回值无法直接打印,可以想成生成了工厂,工厂里面可以产生每次拉链操作产生的元组,必须最后用list转化一下,才能一次性全部拿出所有拉链出的元组数据。

image

5.filter()  过滤
它主要用来根据特定条件过滤迭代器中不符合条件的元素,返回一个惰性计算的filter对象或迭代器。需要用list函数进行转换,才能得到符合的条件元素组成的新列表。
filter(function or None, iterable)
function:函数,作用是对iterable中的每个元素判断是否符合特定条件。
None:不调用任何函数,只对可迭代对象中的元素本身判断真假,保留为真的元素。
iterables:可迭代对象(序列、字典等)。
c = [-10, 28, 9, -5, 30, 5]
res = filter(lambda a:a>0, c)
print(res)
print(list(res))
<filter object at 0x000001915DFF00D0>
[28, 9, 30, 5]

image

6.sorted()
如果对python中的列表进行排序,可以使用List类的成员函数sort,该函数会在原空间上进行操作,对列表本身进行修改,不返回副本。语法如下:
L.sort(cmp=None, key=None, reverse=False)

sorted函数就比sort函数要强大许多了,sort只能对列表进行排序,sorted可以对所有可迭代类型进行排序,并且返回新的已排序的列表。语法如下:
sorted(iterable, cmp=None, key=None, reverse=False)
iterable可迭代对象    比较函数cmp    

image

1. 迭代器介绍:

迭代器即用来迭代取值的工具!!!!!!而迭代是重复反馈过程的活动!!!!!!
其目的通常是为了逼近所需的目标或结果.
每一次对过程的重复称为一次“迭代”.
而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代!!!!!!

msg = input('>>: ').strip()
while True:
    print(msg)

下述while循环才是一个迭代过程,不仅满足重复,而且以每次重新赋值后的index值作为下一次循环中新的索引进行取值,反复迭代,最终可以取尽列表中的值

goods=['mac','lenovo','acer','dell','sony']
count=0
while index < len(goods):
    print(goods[count])
    count += 1

2. 可迭代对象 就是可迭代的东西 Iterable

通过索引的方式进行迭代取值,实现简单,但仅适用于序列类型:字符串,列表,元组。
对于没有索引的字典、集合等非序列类型,必须找到一种不依赖索引来进行迭代取值的方式,这就用到了迭代器。
迭代器:可以不依赖索引来进行迭代取值!!!!
要想了解迭代器为何物,必须事先搞清楚一个很重要的概念:可迭代对象(Iterable)。从语法形式上讲,内置有__iter__方法的对象都是可迭代对象,字符串、列表、元组、字典、集合、打开的文件都是可迭代对象:

'123'.__iter__()
[1,2,3].__iter__()
(3,4,5).__iter__()
{7,8,9}.__iter__()
{'name':'jason'}.__iter__()

3. 迭代器对象 就是迭代器Iterator

调用obj.iter()方法返回的结果就是一个迭代器对象(Iterator)。
迭代器对象是内置有__iter__和__next__方法,打开的文件本身就是一个迭代器对象。
执行迭代器对象.iter()方法得到的仍然是迭代器本身,
执行迭代器.next()方法就会计算出迭代器中的下一个值。
迭代器是Python提供的一种统一的、不依赖于索引的迭代取值方式,只要存在多个“值”,无论序列类型还是非序列类型都可以按照迭代器的方式取值!!!!!!

s = [1,2,3]               # 可迭代对象s
i = s.__iter__()          # 可迭代对象s变成迭代器
print(i.__next__())
print(i.__next__())   # 迭代器继续调用.__next__方法,就会计算出迭代器中的下一个值
print(i.__next__())
print(i.__next__())       # 发现迭代器中无值可取,报异常了
1
2
3
StopIteration            # 抛出StopIteration的异常,代表无值可取,迭代结束
i = s.__iter__() 语法与 i=iter(s)一个意思
i.__next__()  语法与next(i) 一个意思

image

4. for循环原理

有了迭代器后,我们便可以不依赖索引迭代取值了,使用while循环的实现方式如下

goods=['mac','lenovo','acer','dell','sony']
i=iter(goods)             # 生成一个迭代器对象
while True:
    try:
        print(next(i))   # 迭代器调用.__iter__方法后,计算出迭代器中产生的第一个值,循环后计算第二个...
    except StopIteration:  # 捕捉异常终止循环
        break

image

for循环又称为迭代循环,in后可以跟任意可迭代对象,上述while循环可以简写为

goods=['mac','lenovo','acer','dell','sony']
for item in goods:
    print(item)

for 循环在工作时,首先会调用可迭代对象goods内置的__iter__方法拿到一个迭代器对象,然后再调用该迭代器对象的__next__方法将取到的值赋给item,执行循环体完成一次循环,周而复始,直到捕捉StopIteration异常,结束迭代。

5. 迭代器的优缺点

基于索引的迭代取值,所有迭代的状态都保存在了索引中,而基于迭代器实现迭代的方式不再需要索引,所有迭代的状态就保存在迭代器中,然而这种处理方式优点与缺点并存:

优点

1、为序列和非序列类型提供了一种统一的迭代取值方式。

2、惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用__next__来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。

缺点

1、除非取尽,否则无法获取迭代器的长度

2、只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。

标签:__,.__,迭代,16,python,iter,next,--,对象
From: https://www.cnblogs.com/tengyifan888/p/16799999.html

相关文章

  • 11.0 Spring整合Mybatis原理
    一、整合核心思路由很多框架都需要和Spring进行整合,而整合的核心思想就是把其他框架所产生的对象放到Spring容器中,让其成为Bean,只要成为了Bean,在Spring项目中就能很方便的......
  • 经历与经验
    做过的叫经历,收获的叫经验。我们常说自己有xx年的工作经验,为何还会时常被一些比较初级难度的问题所困扰?因为我们所说的xx年可能只是工作经历,而非工作经验。......
  • 四层负载均衡和七层负载均衡
    四层负载均衡指的是通过ip+端口进行转发;七层负载均衡指的是通过URL、浏览器类别、语言等应用层信息进行转发。七层负载均衡举个例子,如果你的Web服务器分成两组,一组是中......
  • vue+elementui 的表格单元格内修改数据
    cellDbClick(row,column,cell,event){   varthat=this     event.target.innerHTML=''     varcellInput=document.createElem......
  • Pytorch 多卡并行 torch.nn.DistributedDataParallel (DDP)
    PyTorch分布式训练简明教程 (知乎,推荐)PyTorch分布式DPP启动方式(包含完整用例) (csdn) ......
  • python学习记录:爬取网易云音乐爬虫代码
    #爬取163音乐 importrequestsfromlxmlimportetreeurl='https://music.163.com/discover/toplist?id=3779629'domain='http://music.163.com/song/media/outer/ur......
  • 关于异常-git日常开发问题
    问题解决方法      是.husky下面的pre-commit已经存在了删除掉这个pre-commit文件再从stash里把内容Apply拿出来提交就可以了 ......
  • 质量内建七步法(转载)
    转载:http://blog.itpub.net/69978212/viewspace-2702938一、什么是质量内建1.1关于质量 在软件开发里面,质量是个永恒的话题,如下图所示,这是传统项目管理中的项目管理......
  • 常用类
    常用类包装类(Integer例)基本介绍:八种基本数据类型相应的引用类型——包装类装箱和拆箱:publicclassInteger01{publicstaticvoidmain(String[]arg......
  • 推荐有礼 | 京东云推荐返利活动说明
    京东云云推客是京东云推出的服务于代理商群体的交易服务平台。为代理商提供可代理产品、分销获客工具、渠道管理工具、对账结算工具等,赋能代理商数字化升级,实现降本增效。......