生成器 python0 1 8 27 64_python 生成式和生成器
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2017/10/17 21:46
# @Author : lijunjiang
# @File : test.py
"""
列表生成式
一個用來生成列表的特定語法形式的表達(dá)式。可以對一組元素進(jìn)行過濾或得到對列表元素進(jìn)行處理后得到的結(jié)果
可以快速的根據(jù)已存在的可迭代對象推導(dǎo)出一個新的list
語法格式:
[exp for val in collection if condition]
執(zhí)行過程:
先對傳入的列表進(jìn)行for循環(huán)得到將符合條件的元素再進(jìn)行if判斷返回給exp
執(zhí)行exp表達(dá)式,最后將處理后的結(jié)果以列表的形式返回一個列表
"""
tuple_test = [x*x for x in xrange(10) if x*x%2 == 0]
print(type(tuple_test))
print(tuple_test)
# 執(zhí)行結(jié)果:
#
# [0, 4, 16, 36, 64]
# 等價于
tuple_test1 = []
for i in xrange(10):
if i*i%2 == 0:
tuple_test1.append(i)
print(type(tuple_test1))
print(tuple_test1)
# # 執(zhí)行結(jié)果:
#
# [0, 2, 4, 6, 8]
"""
生成器
在Python中,這種一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器
生成器是按照某種算法不斷生成新的數(shù)據(jù),直到滿足某一個指定的條件結(jié)束
每次只生成一個元素,不必創(chuàng)建完整的list,從而節(jié)省大量的空間
構(gòu)造生成器的兩種方式:
1、使用類似列表生成式的方式生成 (2*n + 1 for n in range(3, 11)) 將生成式的[],換為()
2、使用包含yield的函數(shù)來生成
如果計(jì)算過程比較簡單,可以直接把列表生成式改成generator;
但是,如果計(jì)算過程比較復(fù)雜,就只能通過包含yield的函數(shù)來構(gòu)造generator。
"""
# 使用類似于列表生成式的方式來構(gòu)造生成器
print('使用類似于列表生成式的方式來構(gòu)造生成器')
print('generatot = (x*x for x in xrange(10) if x*x%2 == 0)')
generatot = (x*x for x in xrange(10) if x*x%2 == 0)
print(type(generatot))
print(generatot)
for i in generatot:
print(i)
print('使用包含yield的函數(shù)構(gòu)造生成器')
def func1():
for i in xrange(10):
if i*i%2 == 0:
yield i*i
generatot1 = func1()
print(type(generatot1))
print(generatot1)
for i in generatot1:
print(i)
# 執(zhí)行結(jié)果:
# 使用類似于列表生成式的方式來構(gòu)造生成器
# generatot = (x*x for x in xrange(10) if x*x%2 == 0)
#
# at 0x0000000002BA1480>
# 0
# 4
# 16
# 36
# 64
# 使用包含yield的函數(shù)構(gòu)造生成器
#
#
# 0
# 4
# 16
# 36
# 64
"""
生成式和生成器的區(qū)別:
生成式直接返回了表達(dá)式的結(jié)果列表,
生成器返回的是一個對象,該對象包含了對表達(dá)式結(jié)果的計(jì)算引用, 通過循環(huán)可以直接輸出
生成器不會一次性列出所有的數(shù)據(jù),當(dāng)你用到的時候,在列出來,更加節(jié)約內(nèi)存的使用率。
"""
"""
可迭代對象(Iterable)
即可直接用于for循環(huán)的對象統(tǒng)稱為可迭代對象(Iterable)。
類型有:list、tuple、dict、set、str、生成器
可以使用isinstance()來判斷一個對象是否是Iterable對象
迭代器(Iterator)
可以被next()函數(shù)調(diào)用并不斷返回下一個值的對象稱為迭代器:Iterator
Python中的Iterator對象表示的是一個數(shù)據(jù)流,
Iterator可以被next()函數(shù)調(diào)用被不斷返回下一個數(shù)據(jù),直到?jīng)]有數(shù)據(jù)可以返回時拋出StopIteration異常錯誤。
可以把這個數(shù)據(jù)流看做一個有序序列,但我們無法提前知道這個序列的長度。
同時,Iterator的計(jì)算是惰性的,只有通過next()函數(shù)時才會計(jì)算并返回下一個數(shù)據(jù)
http://www.cnblogs.com/yyds/p/6281453.html
"""
# 實(shí)現(xiàn)99乘法表
def func3():
for i in xrange(1, 10):
for j in xrange(1, i+1):
print('{0}*{1}={2}'.format(j, i, i*j)),
print('\n')
func3()
#執(zhí)行結(jié)果:
# 1*1=1
#
# 1*2=2 2*2=4
#
# 1*3=3 2*3=6 3*3=9
#
# 1*4=4 2*4=8 3*4=12 4*4=16
#
# 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
#
# 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
#
# 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
#
# 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
#
# 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
總結(jié)
以上是生活随笔為你收集整理的生成器 python0 1 8 27 64_python 生成式和生成器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正确的python变量名_在Python
- 下一篇: 【ES11(2020)】全局属性 glo