python列表生成器语法_python语法_列表生成器_生成器_迭代器_异常捕获
列表生成式
a = [x for x in range(10)]
print(a)
x 可進(jìn)行操作
a = [x*2 for x in range(10)]
print(a)
x甚至可以為函數(shù),
def f(n):
return n*n*n
a = [f(x) for x in range(10)]
########################
賦值方法
t = ('123',8)
a,b = t
print(a)
print(b)
#############
a =(x for x in range(10))#
print(a)#generator object
這個(gè)時(shí)候打印出來的結(jié)果是一個(gè)生成器對象,并沒有生成序列且將里面的元素并全部存進(jìn)內(nèi)存(列表生成器時(shí)生成的列表,列表里的元素已經(jīng)全部存進(jìn)內(nèi)存了)
類比于之前是廚師做了N道菜出來(列表),菜(元素)全部吃進(jìn)了肚子(內(nèi)存),這里只是生成了一個(gè)廚師(生成器),想吃什么菜(元素)就調(diào)用廚師進(jìn)行生成。
print(next(a)) 這樣就可答應(yīng)序列的第一個(gè)值了,next(a)等價(jià)于 a.__next__() a.next()
生成器里能迭代多少次,就能取多少次值,只能按順序一個(gè)一個(gè)區(qū),不能隔取,反順序取,取完不能再進(jìn)行曲了,會返回迭代錯(cuò)誤的報(bào)錯(cuò)。
生成器就是一個(gè)可迭代對象Iterable object
for i in s:
print(i)
這里for循環(huán)其實(shí)就是調(diào)用了next(s),循環(huán)時(shí),第一次i打印0 ,第二次打印1,第二次打印的時(shí)候0對象由于沒人引用,已經(jīng)被回收了。
####
生成器第二種生成方法:使用yield
def foo():
print("Ok1")
yield 1
print("OK2")
yield 2
foo() 直接調(diào)用foo() 是不會打印的,因?yàn)檫@是一個(gè)生成器函數(shù),碰到y(tǒng)ield 就會創(chuàng)建一個(gè)生成器
g = foo()
next(g) 采用next(g) 調(diào)用,遇到y(tǒng)ield 則返回生成器里定義的第一個(gè)值。
next(g) 再次采用next(g)進(jìn)行調(diào)用,會yield 1開始,返回值
##
凡是能進(jìn)行for循環(huán)的 都是可迭代的。
凡是有擁有__iter__方法的都是可迭代對象。
###
使用斐波那契數(shù)列進(jìn)行生成器的例子
def fbnq(max):
n,before,after = 0,0,1
while n < max:
yield after #將需求里需要的值設(shè)置為yield 返回的即可,yield 其實(shí)就是等同于return.
before,after =after,before + after
n = n+1
next(fbnq(10))
####
send方法
a.send('eeee')
def bar():
print("OK")
count=yield 1
print(count)
print("OK2'")
yield 2
g = bar()
next(g)
b = g.send('eee')
print(b)
####
迭代器
滿足兩個(gè)條件:1 有iter方法,2 有next方法
l = [1,2,3,4]
d = iter(l)
for 循環(huán)內(nèi)部三件事:
1 調(diào)用可迭代對對象的iter方法返回一個(gè)迭代器
2 不斷調(diào)用迭代器對象的next方法
3 捕獲異常(迭代器迭代結(jié)束)進(jìn)行退出
####
判斷是否為list,迭代器,可迭代對象
from collections import Iterator
isinstance([1,2,3,4],list)
isinstance([1,2,3,4],Iterator)
isinstance([1,2,3,4],Iterable)
###
f = open('abc123.txt','r)
for i in f.readlines(): 這里是將文件按行取出,把每一行當(dāng)成一個(gè)元素放入內(nèi)存,這樣文件很大時(shí),元素很多,占用內(nèi)存也用掉了很多。
for i in f(): 這里f是一個(gè)迭代器,放入內(nèi)存只是一個(gè)迭代器,這樣遍歷時(shí),每次拿出來一行就看一行,前一行就被內(nèi)存回收了,內(nèi)存里始終只有一行存在。
####
一句話實(shí)現(xiàn)查找文件里溫度最長的行
print(max(len(x) for x in open('日志記錄','r',encoding='utf8')))
總結(jié)
以上是生活随笔為你收集整理的python列表生成器语法_python语法_列表生成器_生成器_迭代器_异常捕获的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《卧龙:苍天陨落》PC 版优化翻车:St
- 下一篇: python arp攻击_ARP欺骗——