python学习第十二天,生成器,列表推导式

2021-07-15 13:07

阅读:684

标签:toolbar   更改   简单   优缺点   函数对象   bsp   span   问题   迭代器   

----->约定俗成:

  函数中,只有一个位置参数时用argv表示

def func(argv):

  pass

1.生成器:自定义的迭代器

  生成器有两种形式:

    a.生成器函数

    b.生成器表达式

  a.

技术分享图片
def func1(x):
    x += 1
    print(111111)
    yield x #有yield的叫生成器函数
    print(222222)
    yield ‘alex‘

s = func1(5) # 叫生成器函数对象,这样不执行函数
s = s.__next__() #一个next对应一个yield
#yield 将值返回给 s.__next__()
技术分享图片

   比较send()和yield的区别:

    send()可以当yield来用,send()括号内需要有元素,向上一个yield发送数据,更改上一个yield的返回值,

       所以第一次取值不能用send(),最后一个yield永远得不到send()传的值

技术分享图片
def func1():
    print(111)
    count = yield 1
    print(count)
    print(222)
    yield 2
    print(333)
    yield 3
g = func1()
a = g.__next__()
print(a)
print(g.send(‘alex‘)) #----> send 可以当__next__ 用,同时将send(‘alex‘)内的元素发送给上一个yield
print(g.__next__())
技术分享图片

    比较yeild和return的区别:

      区别:return:在函数中遇到return,则结束函数,给函数执行者一个返回值

         yield:在函数中有yield,调用函数时不执行函数,只有当函数名().__next__时才执行一个yeild,并将值返回给它

             一个next对应一个yeild,可以多次调用,生成器函数本质是一个迭代器.

    内存级别对比iter()和生成器函数;

      iter()将可迭代函数转换为迭代器时,需要将可迭代函数的所有数据都加载到内存中才能转换,,这样会占用内存,不能处理大数据

      生成器函数则不需要将数据都加载,而是要一个拿一个      

 

生成器的基本应用:可分段生成无缝衔接

   比较

技术分享图片
1.
def func(argv):
    for i in range(1,argv):
        print(‘骑士班%s期‘%i)
func(5)

2.
def func(argv):
    for i in range(1,argv):
        yield ‘骑士班%s期‘%i
g = func(5)
for j in range(1,5):
    print(g.__next__())

3.
def func(argv):
    for i in range(1,argv):
        yield ‘骑士班%s期‘%i
for j in range(1,5):
    print(func(5).__next__())
技术分享图片

  注意:

技术分享图片
def func(argv):
    for i in range(1,argv):
        yield ‘骑士班%s期‘%i
g = func(10)
for j in range(1,5):
    print(g.__next__())
for j in range(1,6):
    print(g.__next__())
技术分享图片

   b. 生成器表达式

    g = [i for i in range(100)] 是列表推导式

    g = (i for i in range(100)) 是生成器表达式

g = (i for i in range(100))
print(g.__next__()

 

2.列表推导式:

  一行代码机会可以表示任何有规定的列表

  有两种模式:

     1.循环模式 : 变量(加工后的变量) + for i in iterable

技术分享图片
list1 = [‘python %s 期‘%i for i in range(1,21)]
print(list1)
[‘python 1 期‘, ‘python 2 期‘, ‘python 3 期‘, ‘python 4 期‘]

list1 = [i*i for i in range(1,11)]
print(list1)
[1, 4, 9, 16]
技术分享图片

     2.筛选模式: 变量(加工后的变量) + for i in iterable + if条件

一次循环:

list1 = [‘python %s 期‘%i for i in range(1,21) if i % 2 == 0]
print(list1)

两次循环(循环不宜超过两次):

names = [[‘Tom‘, ‘Billy‘, ‘Jefferson‘, ‘Andrew‘, ‘Wesley‘, ‘Steven‘, ‘Joe‘],
         [‘Alice‘, ‘Jill‘, ‘Ana‘, ‘Wendy‘, ‘Jennifer‘, ‘Sherry‘, ‘Eva‘]]
list1 = [j for i in names for j in i if j.count(‘e‘) == 2]
print(list1)
# 比较
print(list(j for i in names for j in i if j.count(‘e‘) == 2))

  列表推导式的优缺点:

    优点: 一行解决一个列表,简单方便

    缺点:不易排错,不能解决所有列表问题问题,不要刻意使用

 

python学习第十二天,生成器,列表推导式

标签:toolbar   更改   简单   优缺点   函数对象   bsp   span   问题   迭代器   

原文地址:https://www.cnblogs.com/jiandanxie/p/9536477.html


评论


亲,登录后才可以留言!