生成器 内置函数I 12
生成器
-
生成器:python 社区,生成器与迭代器看成是一种。生成器的本质就是迭代器,唯一的区别:生成器是我们利用python 代码构建 数据结构。迭代器都是提供的,或者转化得来的。
-
获取生成器的三种方式:
- 生成器函数。
- 生成器表达式。
- python内部提供的一些。
-
生成器函数获得生成器:
函数 def func(): print(111) print(222) return 3 ret = func() print(ret) 生成器函数: def func(): print(111) print(222) yield 3 a = 1 b = 2 c =a +b print(c) yield 4 ret =func() print(next(ret)) print(next(ret)) print(next(ret)) 一个next 对应一个yield
-
yield return
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)) for i in range(200): print(next(ret))
-
yield from
def func(): l1 = [1, 2, 3, 4, 5] yield l1 ret = func() print(next(ret)) def func(): l1 = [1,2,3,4] yield from l1 ''' yield 1 yield 2 yield 3 yield 4 yield 5 ''' 将l1 这个列表变成了迭代器返回。 ret = func() print(next(ret)) print(next(ret)) print(next(ret)) print(next(ret))
-
生成器表达式,列表推导式
-
用一行代码构建一个比较复杂有规律的列表。
-
列表推导式:
- 循环模式:[变量(加工后的变量) for 变量 in iterable]
- 筛选模式:[变量(加工后的变量) for 变量 in iterable if 条件]
# l1 = [i**2 for i in range(1,11)] # print(l1) # l1 = [i for i in range(2,101) if i %2 == 0] # print(l1) # l1 = [f'python{i}期 ' for i in range(1,101)] # print(l1) # l1 = ['barry','holting','ab','xo'] # l = [i.upper() for i in l1 if len(i) <3 ] # print(l) l1 = [i for i in range(2,11)] + list('JQKA') print(l1) # 含有两个'e'的所有的人名全部大写留下来 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] l1 = [] for i in names: for name in i: if name.count('e') == 2: l1.append(name) print(l1) print([name.upper() for i in names for name in i if name.count('e') == 2])
-
生成器表达式
# 生成器表达式: # 与列表推导式的写法几乎一模一样,也有筛选模式,循环模式,多层循环构建。写法上只有一个不同: # [] 换成 (). # print([i for i in range(1,11)]) # print((i for i in range(1,11))) # obj = (i for i in range(1,11)) # print(next(obj)) # print(next(obj)) # print(next(obj)) # print(next(obj)) # print(next(obj)) # for i in obj: # print(i)
-
循环模式讲解
练习题:
-
-
总结:
列表推导式: # 缺点: # 1,有毒。列表推导式只能构建比较复杂并且有规律的列表。 不要太着迷。 # 2,超过三层循环才能构建成功的,就不建议用列表推导式。 # 3,查找错误(debug模式)不行。 # 优点: # 一行构建,简单。 # 装逼。 # 构建一个列表: [2,3,4,5,6,7,8,9,10,'j','Q','K','A'] # l1 = [i for i in range(2,11)] + list('JQKA') # print(l1) 列表推导式与生成器表达式区别。 写法上: [] ( ) iterable iterator 字典推导式:(了解) lst1 = ['jay', 'jj', 'meet'] lst2 = ['周杰伦','林俊杰','元宝'] dic ={lst2[i]:lst1[i] for i in range(len(lst1))} print(dic) 集合推导式(了解) print({i for i in range(1,11)})
-
内置函数 I (此处了解)
# python 提供了68个内置函数。 # 今天讲的这部分大部分了解即可。 # eval 剥去字符串的外衣运算里面的代码,有返回值。 bin:将十进制转换成二进制并返回。 oct:将十进制转化成八进制字符串并返回。 hex:将十进制转化成十六进制字符串并返回。 s1 = '1 + 3' # print(s1) # print(eval(s1)) ** # s = '{"name": "alex"}' # print(s,type(s)) # print(dict(s)) # 不行 # print(eval(s),type(eval(s))) # 网络传输的str input 输入的时候,sql注入等等绝对不能使用eval。 # exec 与eval几乎一样, 代码流。 msg = """ for i in range(10): print(i) """ # print(msg) # exec(msg) # hash 哈希值 # print(hash('fsjkdafsda')) # help 帮助 # s1 = 'fjdsls' # print(help(str)) # print(help(str.upper)) # s1 = 'sfsda' # s1.upper() s1 = 'fdsklfa' # s1() def func(): pass # func # # callable 判断一个对象是否可被调用 *** # print(callable(s1)) # print(callable(func))
16.看代码求结果:(面试题)
def demo():
for i in range(4):
yield i
g=demo()
g1=(i for i in g)
g2=(i for i in g1)
print(list(g1))
print(list(g2))
17.看代码求结果:(面试题)
def add(n,i):
return n+i
def test():
for i in range(4):
yield i
g=test()
for n in [1,10]:
g=(add(n,i) for i in g)
print(list(g))