今日内容
-
生成器
-
生成器: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 yield 4 ret = func() print(next(ret)) print(next(ret)) 一个netx对应一个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 func(): for i in range(1,5001): yield f'{i}号包子' for z in range(200): print(next(func))
-
yield from
def func(): l1 = [1,2,3,4,5] yield l1 ret = func() print(next(ret)) def func(): l1 = [1,2,3,4,5] yield from l1 #将l1这个列表变成了迭代器返回。 ret = func() print(next(ret)) print(next(ret)) print(next(ret)) print(next(ret)) print(next(ret))
-
生成器表达式,列表推导式
-
用一行代码构建一个比较复杂有规律的列表。
-
列表推导式:
- 循环模式:[变量(加工后的变量) for 变量 in iterable]
- 筛选模式:[变量(加工后的变量) for 变量 in iterable if 条件]
-
循环模式
#将10以内所有的整数的平方根写入列表 ret = [i**2 for i in range(1,11)] print(ret) #100以内所有的偶数写入列表。 print([i for i in range(2,101,2)]) 从python1期到pyython100期写入列表lst print([f'python{i}期'for i in range(1,101)])
-
筛选模式
筛选模式:[变量(加工后的变量)for 变量 in iterable if 条件] 30以内能被3整除的数 l1 = [i for i in range(1,31)if i%3 == 0] print(l1) #过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母 l1 = ['barry', 'ab', 'alex', 'wusir', 'xo'] 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']] print([z.upper for i in names for z in i if z.count('e')==2])
-
生成器表达式
-
与列表推导式的写法几乎一模一样,也有筛选模式,循环模式,多层循环结构。写法上只有一个不同[]换成()
obj = (i for i in range(1,11)) print(next(obj)) for i in obj: print(i)
-
总结:
-
列表推导式:
缺点:
- 列表推导式只能构建比较复杂并且有规律的列表。不要太着迷。
- 如果超过三成循环才能构建成功,就不建议用列表推导式。
- 查找错误(debug模式)不行
优点:
1.一行构建.简单
2.装逼
-
-
内置函数
#eval 剥去字符串的外衣运算里面的代码,有返回值。 s1 = '1 + 3' print(eval(s1)) s = '{"name":"alex"}' print(eval(s)) #网络传输的str input 输入的时候,sql注入等等绝对不能使用eval。 #exec 与eval几乎一样,代码流 msg = ''' for i in range(10): print(i) ''' exec(msg) #hash 哈希值 print(hash('fhadjkdh')) help 帮助 s1 = 'fshjak' print(help(str)) print(help(str.upper)) s1 = 'fjda' def func(): print('a') #callable 判断一个对象是否可别调用 print(callable(s1)) print(callable(func))
-