python列表生成器语法_python语法_列表生成器_生成器_迭代器_异常捕获
列表生成式
a = [x for x in range(10)]
print(a)
x 可進行操作
a = [x*2 for x in range(10)]
print(a)
x甚至可以為函數,
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
這個時候打印出來的結果是一個生成器對象,并沒有生成序列且將里面的元素并全部存進內存(列表生成器時生成的列表,列表里的元素已經全部存進內存了)
類比于之前是廚師做了N道菜出來(列表),菜(元素)全部吃進了肚子(內存),這里只是生成了一個廚師(生成器),想吃什么菜(元素)就調用廚師進行生成。
print(next(a)) 這樣就可答應序列的第一個值了,next(a)等價于 a.__next__() a.next()
生成器里能迭代多少次,就能取多少次值,只能按順序一個一個區,不能隔取,反順序取,取完不能再進行曲了,會返回迭代錯誤的報錯。
生成器就是一個可迭代對象Iterable object
for i in s:
print(i)
這里for循環其實就是調用了next(s),循環時,第一次i打印0 ,第二次打印1,第二次打印的時候0對象由于沒人引用,已經被回收了。
####
生成器第二種生成方法:使用yield
def foo():
print("Ok1")
yield 1
print("OK2")
yield 2
foo() 直接調用foo() 是不會打印的,因為這是一個生成器函數,碰到yield 就會創建一個生成器
g = foo()
next(g) 采用next(g) 調用,遇到yield 則返回生成器里定義的第一個值。
next(g) 再次采用next(g)進行調用,會yield 1開始,返回值
##
凡是能進行for循環的 都是可迭代的。
凡是有擁有__iter__方法的都是可迭代對象。
###
使用斐波那契數列進行生成器的例子
def fbnq(max):
n,before,after = 0,0,1
while n < max:
yield after #將需求里需要的值設置為yield 返回的即可,yield 其實就是等同于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)
####
迭代器
滿足兩個條件:1 有iter方法,2 有next方法
l = [1,2,3,4]
d = iter(l)
for 循環內部三件事:
1 調用可迭代對對象的iter方法返回一個迭代器
2 不斷調用迭代器對象的next方法
3 捕獲異常(迭代器迭代結束)進行退出
####
判斷是否為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(): 這里是將文件按行取出,把每一行當成一個元素放入內存,這樣文件很大時,元素很多,占用內存也用掉了很多。
for i in f(): 這里f是一個迭代器,放入內存只是一個迭代器,這樣遍歷時,每次拿出來一行就看一行,前一行就被內存回收了,內存里始終只有一行存在。
####
一句話實現查找文件里溫度最長的行
print(max(len(x) for x in open('日志記錄','r',encoding='utf8')))
總結
以上是生活随笔為你收集整理的python列表生成器语法_python语法_列表生成器_生成器_迭代器_异常捕获的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《卧龙:苍天陨落》PC 版优化翻车:St
- 下一篇: PHP实现指定时间的n月之前的这一天的两