日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python生成1到100的列表_python列表生成式与列表生成器的使用

發(fā)布時(shí)間:2025/3/15 python 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python生成1到100的列表_python列表生成式与列表生成器的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

列表生成式:會(huì)將所有的結(jié)果全部計(jì)算出來,把結(jié)果存放到內(nèi)存中,如果列表中數(shù)據(jù)比較多,就會(huì)占用過多的內(nèi)存空間,可能會(huì)導(dǎo)致MemoryError內(nèi)存錯(cuò)誤或者導(dǎo)致程序在運(yùn)行時(shí)出現(xiàn)卡頓的情況

列表生成器:會(huì)創(chuàng)建一個(gè)列表生成器對(duì)象,不會(huì)一次性的把所有結(jié)果都計(jì)算出來,如果需要獲取數(shù)據(jù),可以使用next()函數(shù)來獲取,但是需要注意,一旦next()函數(shù)獲取不到數(shù)據(jù),會(huì)導(dǎo)致出現(xiàn)StopIteration異常錯(cuò)誤,可以使用for循環(huán)遍歷列表生成器,獲取所有數(shù)據(jù)

需要視情況而定,如果數(shù)據(jù)量比較大,推薦使用生成器

python2.7中就是range(生成式) 和 xrange(生成器)的區(qū)別

列表生成式是快速生成一個(gè)列表的一些公式

在列表中存放0~100的數(shù):

普通的列表生成:

numbers=[]

for x in range(0,101):

numbers.append(x)

print(numbers)

用列表生成式生成列表:[要放入列表的數(shù)據(jù) 簡單的表達(dá)式1 表達(dá)式2]

#x for x in range(0,101) for循環(huán)遍歷出來的值,放入列表中

numbers=[x for x in range(0,101)]

print(numbers)

列表中存放0~100的偶數(shù):

普通方法生成列表:

for x in range(0,101):

if x%2==0:

numbers.append(x)

print(numbers)

用列表生成式生成列表:

#for循環(huán)遍歷0~101的數(shù)字,如果數(shù)字對(duì)2取余==0,表示是偶數(shù),x放在列表中

numbers=[x for x in range(0,101)if x%2==0]

print(numbers)

找出列表list1=['asd','adf','dafg','acbo']帶有a的字符

普通寫法:

rs_list=[]

for s in list1:

if 'a' in s:

rs_list.append(s)

print(rs_list)

列表生成式:

list2=[x for x in list1 if 'a' in x]

列表生成式支持雙層for循環(huán)

list3=[x*y for x in range(0,10) for y in range(20)]

print(list3)

生成器構(gòu)造實(shí)例

# 使用類似列表生成式的方式構(gòu)造生成器

g1 = (2*n + 1 for n in range(3, 6))

# 使用包含yield的函數(shù)構(gòu)造生成器

def my_range(start, end):

for n in range(start, end):

yield 2*n + 1

g2 = my_range(3, 6)

print(type(g1))

print(type(g2))

輸出結(jié)果:

生成器的調(diào)用方式

要調(diào)用生成器產(chǎn)生新的元素,有兩種方式:

調(diào)用內(nèi)置的next()方法

使用循環(huán)對(duì)生成器對(duì)象進(jìn)行遍歷(推薦)

調(diào)用生成器對(duì)象的send()方法

實(shí)例1:使用next()方法遍歷生成器

print(next(g1))

print(next(g1))

print(next(g1))

print(next(g1))

輸出結(jié)果:

7

9

11

Traceback (most recent call last):

File "***/generator.py", line 26, in

print(next(g1))

StopIteration

print(next(g2))

print(next(g2))

print(next(g2))

print(next(g2))

輸出結(jié)果:

7

9

11

Traceback (most recent call last):

File "***/generator.py", line 31, in

print(next(g2))

StopIteration

可見,使用next()方法遍歷生成器時(shí),最后是以拋出一個(gè)StopIeration異常終止。

實(shí)例2:使用循環(huán)遍歷生成器

for x in g1:

print(x)

for x in g2:

print(x)

兩個(gè)循環(huán)的輸出結(jié)果是一樣的:

7

9

11

可見,使用循環(huán)遍歷生成器時(shí)比較簡潔,且最后不會(huì)拋出一個(gè)StopIeration異常。因此使用循環(huán)的方式遍歷生成器的方式才是被推薦的。

需要說明的是:如果生成器函數(shù)有返回值,要獲取該返回值的話,只能通過在一個(gè)while循環(huán)中不斷的next(),最后通過捕獲StopIteration異常

實(shí)例3:調(diào)用生成器對(duì)象的send()方法

def my_range(start, end):

for n in range(start, end):

ret = yield 2*n + 1

print(ret)

g3 = my_range(3, 6)

print(g3.send(None))

print(g3.send('hello01'))

print(g3.send('hello02'))

輸出結(jié)果:

7

hello01

9

hello02

11

print(next(g3))

print(next(g3))

print(next(g3))

輸出結(jié)果:

7

None

9

None

11

結(jié)論:

next()會(huì)調(diào)用yield,但不給它傳值

send()會(huì)調(diào)用yield,也會(huì)給它傳值(該值將成為當(dāng)前yield表達(dá)式的結(jié)果值)

需要注意的是:第一次調(diào)用生成器的send()方法時(shí),參數(shù)只能為None,否則會(huì)拋出異常。當(dāng)然也可以在調(diào)用send()方法之前先調(diào)用一次next()方法,目的是讓生成器先進(jìn)入yield表達(dá)式。

生成器與列表生成式對(duì)比

既然通過列表生成式就可以直接創(chuàng)建一個(gè)新的list,那么為什么還要有生成器存在呢?

因?yàn)榱斜砩墒绞侵苯觿?chuàng)建一個(gè)新的list,它會(huì)一次性地把所有數(shù)據(jù)都存放到內(nèi)存中,這會(huì)存在以下幾個(gè)問題:

內(nèi)存容量有限,因此列表容量是有限的;

當(dāng)列表中的數(shù)據(jù)量很大時(shí),會(huì)占用大量的內(nèi)存空間,如果我們僅僅需要訪問前面有限個(gè)元素時(shí),就會(huì)造成內(nèi)存資源的極大浪費(fèi);

當(dāng)數(shù)據(jù)量很大時(shí),列表生成式的返回時(shí)間會(huì)很慢;

而生成器中的元素是按照指定的算法推算出來的,只有調(diào)用時(shí)才生成相應(yīng)的數(shù)據(jù)。這樣就不必一次性地把所有數(shù)據(jù)都生成,從而節(jié)省了大量的內(nèi)存空間,這使得其生成的元素個(gè)數(shù)幾乎是沒有限制的,并且操作的返回時(shí)間也是非常快速的(僅僅是創(chuàng)建一個(gè)變量而已)。

我們可以做個(gè)試驗(yàn):對(duì)比一下生成一個(gè)1000萬個(gè)數(shù)字的列表,分別看下用列表生成式和生成器時(shí)返回結(jié)果的時(shí)間和所占內(nèi)存空間的大小:

import time

import sys

time_start = time.time()

g1 = [x for x in range(10000000)]

time_end = time.time()

print('列表生成式返回結(jié)果花費(fèi)的時(shí)間: %s' % (time_end - time_start))

print('列表生成式返回結(jié)果占用內(nèi)存大小:%s' % sys.getsizeof(g1))

def my_range(start, end):

for x in range(start, end):

yield x

time_start = time.time()

g2 = my_range(0, 10000000)

time_end = time.time()

print('生成器返回結(jié)果花費(fèi)的時(shí)間: %s' % (time_end - time_start))

print('生成器返回結(jié)果占用內(nèi)存大小:%s' % sys.getsizeof(g2))

輸出結(jié)果:

列表生成式返回結(jié)果花費(fèi)的時(shí)間: 0.8215489387512207

列表生成式返回結(jié)果占用內(nèi)存大小:81528056

生成器返回結(jié)果花費(fèi)的時(shí)間: 0.0

生成器返回結(jié)果占用內(nèi)存大小:88

可見,生成器返回結(jié)果的時(shí)間幾乎為0,結(jié)果所占內(nèi)存空間的大小相對(duì)于列表生成器來說也要小的多。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

總結(jié)

以上是生活随笔為你收集整理的python生成1到100的列表_python列表生成式与列表生成器的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。