生成器和列表(字典、集合)推导式

白昼怎懂夜的黑 提交于 2020-03-26 17:51:56

生成器初始

生成器本质就是迭代器。python社区生成器与迭代器是一种。生成器与迭代器的唯一区别:生成器是我们自己用python代码构建的。

生成器产生方式

生成器函数。

生成器表达式。

python给你提供的一些内置函数,返回一个生成器。

生成器函数。

之前接触的函数:

def func():
print(111)
return 2
ret = func()
print(ret)
执行此函数,遇到return结束函数。
将数字2返回给ret。

生成器函数: 只要函数中出现了yield那么他就不是函数,它是生成器函数

def func():
print(111)
print(111)
print(111)
print(111)
print(111)
print(111)
yield 2,4,5
yield 3
yield 4
yield 5
ret = func() # 生成器对象
print(ret) # <generator object func at 0x0000000001E10F68>
'''
类比
l1 = [2,] [2,3,4,5]
obj = iter(l1)

'''
只要函数中出现了yield那么他就不是函数,它是生成器函数。
一个next对应一个yield.
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))

yiled与return的区别

return 结束函数,给函数的执行者返回值(多个值通过元组的形式返回)。
yield 不结束函数,对应着给next返回值(多个值通过元组的形式返回)。

send(了解)

pass

生成器的举例

def eat_baozi():
list1 = []
for i in range(1,2001):
list1.append(f'{i}号包子')
return list1

print(eat_baozi())

def eat_baozi_gen():
for i in range(1,2001):
# print(11)
yield f'{i}号包子'

'''
ret1 = eat_baozi_gen()
ret2 = eat_baozi_gen()
print(ret1)
print(ret2)
print(next(ret1))
print(next(ret1))
print(next(ret1))

print(next(ret2))
print(next(ret2))
print(next(ret2))
print(next(ret))
print(next(ret))
'''

ret = eat_baozi_gen()

for i in range(200):
print(next(ret))

for i in range(200):
print(next(ret))

yiled与yiled from。

yield from

def func():
l1 = [1, 2, 3]
yield l1
ret = func()
print(next(ret))
print(next(ret))
print(next(ret))

def func():
l1 = [1, 2, 3]
yield from l1

yield 1
yield 2
yield 3

ret = func()
print(next(ret))
print(next(ret))
print(next(ret))

yield : 对应next给next返回值
yield from 将一个可迭代对象的每一个元素返回给next
yield from 节省代码,提升效率(代替了for循环)

列表推导式,生成器表达式(字典推导式,集合推导式)。

列表推导式:一行代码构建一个有规律比较复杂的列表。

列表推导式与之前写法对比

l1 = [1,2,3......100]
l1 = []
for i in range(1,101):
l1.append(i)
print(l1)

列表推导式
l1 = [i for i in range(1, 101)]
print(l1)

两种构建方式:
1.循环模式: [变量(加工后的变量) for 变量 in iterable]
2.筛选模式: [变量(加工后的变量) for 变量 in iterable if 条件]

循环模式:

循环模式:
将10以内所有整数的平方写入列表。
print([i**2 for i in range(1, 11)])
100以内所有的偶数写入列表.
print([i for i in range(2, 101, 2)])
从python1期到python100期写入列表list
print([f'python{i}期' for i in range(1, 101)])

筛选模式:

print([i for i in range(1, 101) if i > 49])
三十以内可以被三整除的数。
print([i for i in range(1, 31) if i % 3 == 0])
过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
l1 = ['barry', 'fdsaf', 'alex', 'sb', 'ab']
print([i.upper() for i in l1 if len(i) > 3])
找到嵌套列表中名字含有两个‘e’的所有名字(有难度)
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
l1 = []
for i in names:
for j in i:
if j.count('e') > 1:
l1.append(j)
print(l1)

print([j for i in names for j in i if j.count('e') > 1])

列表推导式的优缺点:

列表推导式的优缺点:
优点:

1, 简单,快捷,装b。

缺点:

  1. 可读性不高,不好排错。

慎用,不要入迷。

生成器表达式:

与列表推导式几乎一模一样。

循环模式,筛选模式。

obj = (i for i in range(1, 11))

print(obj)

print(next(obj))

print(next(obj))

print(next(obj))

print(next(obj))

print(next(obj))

print(next(obj))

print(next(obj))

如何触发生成器(迭代器)取值?

  1. next(obj)
  2. for 循环

for i in obj:

print(i)
  1. 数据转化

print(list(obj))

生成器表达式:生成器 节省内存。

  • 字典推导式,集合推导式

eval exce

慎用

s1 = "{1: 'alex'}"

s2 = '1 + 3'

eval 剥去字符串的外衣,返回里面的本质

ret = eval(s1)

print(ret,type(ret))

print(eval(s2))

exec 代码流,过程。

s3 = '''

for i in range(3):

print(i)

'''

exec(s3)

s3 = input('>>>')

print(eval(s3))

hash()

print(hash(123214134))

print(hash('fkljdsaklgjdfs'))

print(hash('gjdfs'))

help()

print(help(str.count))

callable **

def a():

pass

b = 3433

a()

b()

print(callable(a))

print(callable(b))

int **

print(int(3.14))

print(int('123'))

print(float(100))

print(complex(1,2))

print(bin(100)) # 将十进制转化成二进制。 **

print(oct(10)) # 将十进制转化成八进制字符串并返回。

print(hex(17)) # 将十进制转化成十六进制字符串并返回。 **

print(hex(15))

计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)分页用到

print(divmod(10, 3)) # **

保留小数的有效位置

print(round(3.1485926,2))

print(pow(3, 3)) # 333

print(pow(3, 3, 2))

输入字符寻找其在unicode的位置。

print(ord('a'))

print(ord('中'))

输入位置数字找出其对应的字符

print(chr(98)) # **

print(chr(20104)) # 予

repr 原形毕露 **

print('太白')

print(repr('太白'))

msg = '我叫%r' %('太白')

print(msg)

all any **

0,'',[],{},set(),(),None

l1 = [1, 'fgdsa', [], {1: 2}]

l2 = [0, '', [], {}]

print(all(l1)) # 判断可迭代对象元素全部都为True,返回True

print(any(l2)) # 判断可迭代对象元素只要有一个True返回True

字典推导式,集合推导式: 两种模式: 循环模式,筛选模式

l1 = ['小潘', '怼怼哥', '西门大官人', '小泽ml亚']

{0: '小潘', 1: '怼怼哥', 2: '西门大官人'}

dic = {}

for index in range(len(l1)):

dic[index] = l1[index]

print(dic)

print({i:l1[i] for i in range(len(l1))})

1~100

print({i for i in range(1, 101)})

内置函数I。

内置函数:python中有内置函数68种。

![python的内置函数](D:\用到的文件\1008059 - 20160909103224348 - 1891953283.
png)

  1. 匿名函数。

匿名函数:没有名字的函数
匿名函数只能构建简单的函数,一句话函数。
def func(x,y):
return x + y

print(func(1, 2))

匿名函数构建
func2 = lambda x,y: x + y
print(func2(1, 2))

匿名函数最常用的就是与内置函数结合使用。

写匿名函数:接收一个可切片的数据,返回索引为 0与2的对应的元素(元组形式)。

func = lambda x: (x[0],x[2])
print(func('太白金星'))
写匿名函数:接收两个int参数,将较大的数据返回。

func1 = lambda x, y: x if x > y else y
print(func1(100,2))

func2 = lambda : 3
print(func2())
str() dir() range() len() print() max() min() open()
input() type() int() enumerate() list() id() set() dict()
iter() next() tuple() bool() globals() locals() frozenset()

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!