Python之第十五天的努力--生成器,列表推导式,生成器表达式,内置函数1(了解)
Posted szheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之第十五天的努力--生成器,列表推导式,生成器表达式,内置函数1(了解)相关的知识,希望对你有一定的参考价值。
01 生成器
-
Python社区,生成器与迭代器看成是一种。生成器的本质就是迭代器。
唯一的区别:生成器是我们自己用Python代码构建的数据结构。迭代器都是提供的,或者转化得来的。
- 获取生成器的三种方法:
- 生成器函数。
- 生成器表达式。
- Python内部提供的一些。
- 获取生成器的三种方法:
-
生成器函数获取生成器:
# 生成器函数 def func(): print(111) print(222) yield 3 print(333) print(444) yield 4 ret = func() print(ret) # <generator object func at 0x0BDF15B0> print(next(ret)) # 111 222 3 print(next(ret)) # 333 444 4 # 一个next 对应一个yield # return yield 区别 # return:函数中只存在一个return结束函数,并且给函数的执行者返回值。 # yield:只要函数中有yield那么他就是生成器函数而不是函数了 # 生成器函数中可以存在多个yield,yield不会结束生成器函数,一个yield对应一个next。
# def func(): # l1 = [] # for i in range(1,5001): # l1.append(f‘{i}号包子‘) # return l1 # ret = func() # print(ret) def gen_func(): for i in range(1,5001): yield f‘{i}号包子‘ ret = gen_func() for i in range(200): print(next(ret)) # 1~200 for i in range(200): print(next(ret)) # 201~400
-
yield from
# yield from # def func(): # l1 = [1,2,3,4,5] # yield l1 # # 将l1 这个列表变成了迭代器返回 # ret = func() # print(next(ret)) # [1, 2, 3, 4, 5] # def func(): l1 = [1,2,3,4,5] yield from l1 # 将l1 这个列表变成了迭代器返回 ret = func() print(next(ret)) # 1 print(next(ret)) # 2 print(next(ret)) # 3 print(next(ret)) # 4 print(next(ret)) # 5 def func(): lst1 = [‘卫龙‘, ‘老冰棍‘, ‘北冰洋‘, ‘牛羊配‘] lst2 = [‘馒头‘, ‘花卷‘, ‘豆包‘, ‘大饼‘] yield from lst1 yield from lst2 g = func() for i in g: print(i) # 卫龙 # 老冰棍 # 北冰洋 # 牛羊配 # 馒头 # 花卷 # 豆包 # 大饼
02 列表推导式
-
用一行代码构建一个比较复杂有规律的列表。
-
列表推导式
-
循环模式:[标量(加工后的变量) for 变量 in iterable]
-
筛选模式:[标量(加工后的变量) for 变量 in iterable if 条件]
-
循环模式:
# 循环模式 # 将10以内所有整数的平方写入列表。 l1 = [i*i for i in range(1,11)] print(l1) # 100以内所有的偶数写入列表. l2 = [i for i in range(2,101,2)] print(l2) # 从python1期到python100期写入列表lst l3 = [‘python‘+str(i)+‘期‘ for i in range(1,101)] l3 = [f‘python{i}期‘for i in range(1,101)] print(l3)
-
筛选模式
# 30以内能被三整除的数 l1 = [i for i in range(1,31) if i%3 == 0] print(l1) # 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母 l2 = [‘aaaaa‘,‘bb‘,‘cccc‘,‘ddddd‘,‘kk‘] print([i.upper() for i in l2 if len(i) >= 3]) # 找到嵌套列表中名字含有两个‘e’的所有名字(有难度) names = [[‘Tom‘, ‘Billy‘, ‘Jefferson‘, ‘Andrew‘, ‘Wesley‘, ‘Steven‘, ‘Joe‘], [‘Alice‘, ‘Jill‘, ‘Ana‘, ‘Wendy‘, ‘Jennifer‘, ‘Sherry‘, ‘Eva‘]] print([name for lis in names for name in lis if name.count(‘e‘) == 2])
-
03 生成器表达式
# 生成器表达式:
# 与列表推导式的写法几乎一模一样。把[]换成() 也有筛选模式,循环模式,多层循环构建
print([i for i in range(1,11)]) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print((i for i in range(1,11))) # <generator object <genexpr> at 0x0C6015B0>
obj = (i for i in range(1,11))
for i in obj:
print(i)
04 内置函数1(了解)
# 了解
# eval 剥去字符串的外衣运算里边的代码。有返回值
# s1 = ‘1 + 3‘
# print(s1)
# print(eval(s1)) # 4
# s = ‘{"name":"kkk"}‘
# print(eval(s),type(eval(s))) # {‘name‘: ‘kkk‘} <class ‘dict‘>
# 网络传输的str input 输入的时候,sql注入等等绝对不能使用eval。
# exec 与eval几乎一样, 代码流
# msg = ‘‘‘
# for i in range(10):
# print(i)
# ‘‘‘
# print(msg)
# exec(msg)
# hash 哈希值
# help 帮助
# print(help(str))
# callable 判断能否调用
# s1 = ‘asdfg‘
# print(callable(s1)) # False
# def func():
# pass
# print(callable(func)) # True
# bin:将十进制转换成二进制并返回。
# oct:将十进制转化成八进制字符串并返回。
# hex:将十进制转化成十六进制字符串并返回。
# print(bin(10),type(bin(10))) # 0b1010 <class ‘str‘>
# print(oct(10),type(oct(10))) # 0o12 <class ‘str‘>
# print(hex(10),type(hex(10))) # 0xa <class ‘str‘>
以上是关于Python之第十五天的努力--生成器,列表推导式,生成器表达式,内置函数1(了解)的主要内容,如果未能解决你的问题,请参考以下文章
Python入门-4控制语句:10推导式创建序列-列表推导式-字典推导式-集合推导式-生成器推导式