Python第十二天
今日大纲
1 生成器
yield
yield return
yield from
2 生成器表达式、列表推导式
3 内置函数
1 生成器
生成器:Python社区,生成器与迭代器看成是一种,生成器的本质就是迭代器
唯一的区别:生成器是我们自己用Python代码构建的数据结构,迭代器都是提供的 活着转化得来的
获取生成器的三种方式
1 生成器函数
2生成器表达式
3Python内部提供的
A 生成器函数
def func():
print(111)
print(222)
return 3
ret=func()
print(ret)这是函数 有return就是函数
def func():
print(111)
print(222)
yield 3
ret=func()
print(next(ret))这是生成器函数 有yield就是生成器函数
一个next 对应一本yield
return和yield的区别:函数中只存在一个return结束函数的运行 并且给函数的执行者返回值
yield:只要函数中有yield那么他就是生成器函数而不是函数了
生成器函数中可以存在多个yield, yield不会结束生成器函数 一个yield对应一个next
# def eat():
# l1=[]
# for i in range(1,5001):
# l1.append(f'{i}haobaozi')
# return l1
#
# ret=eat()
# print(ret)
def eat():
for i in range(1,5001):
yield f'{i}haobaozi'
ret=eat()
for i in range(200):
print(next(ret))#打印前200个
for i in range(100):
print(next(ret))#从201继续打印到300
yield from
def func():
l1=[1,2,3,4,5]
yield l1
ret=func()
print(next(ret))#[1, 2, 3, 4, 5]将l1这个列表返回
def func():
l1=[1,2,3,4,5]
yield from l1
ret=func()
for i in range(5):
print(next(ret))#返回的是列表中的元素
# 1
# 2
# 3
# 4
# 5
def func():
lst1=['1','2','3','4']
lst2=['5','6','7','8']
yield from lst1
yield from lst2
ret=func()
for i in range(8):
print(next(ret))
# for i in ret:这两句和上面两句结果一样
# print(i)
结果
# 1
# 2
# 3
# 4
# 5
# 6
# 7
#
2 生成器表达式 列表推导式
列表推导式:用一行代码构建一个比较复杂有规律的列表
列表推导式:1 循环模式 2 筛选模式
1 循环模式 【变量或加工后的变量 for 变量 in iterable】
2 筛选模式 【变量或加工后的变量 for 变量 in iteralbe if 条件】
这个就是循环模式
l1=[i for i in range(1,11)]
print(l1)
#将10以内所有整数的平方写入列表
l1=[i**2 for i in range(1,10)]
print(l1)
#100以内所有的偶数写入列表.
l1=[i for i in range(2,101,2)]
print(l1)
#从python1期到python100期写入列表lst
lst=[f'di{i}qi' for i in range(1,101)]
print(lst)
2 筛选模式
l1=[i for i in range(1,31) if i%3==0]
print(l1)
两种方法都成 列表推导式简单
l1=['barry','ab','slex','wusir','xo']
# l2=[i.upper() for i in l1 if len(i)>3]
# print(l2)
l2=[]
for i in l1:
if len(i)>3:
l2.append(i.upper())
print(l2)
多看几遍
#找到嵌套列表中名字含有两个‘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')==2:
# l1.append(j)
#
# print(l1)
l1=[j for i in names for j in i if j.count('e')==2]#把上边的代码从上向下抄
print(l1)
生成器表达式:与列表推导式的写法几乎一模一样 只是把方括号变成了小括号 就成了生成器
生成器就是非常节省内存
生成器表达式:循环模式 筛选模式 多层循环构建
print([i for i in range(1,11)])#这叫列表推导式
print(next((i for i in range(1,11))))#这叫生成器表达式
obj=(i for i in range(1,11))
for i in obj:
print(i)
总结:
列表推导式:
缺点:1 有毒 会着迷,列表推导式只能构建比较复杂并且有规律的列表
没规律 不负责就不要用
2 超过三层循环才能构建成功的 就不建议用列表推导式
3 查找错误不行
优点:简单 一行构建
#构建一个列表:[2,3,4,5,6,7,8,9,10,'j','q','k','a']
l1=[i for i in range(2,11)] +list('JQKA')#利用了列表的相加 , list方法把字符串转成列表的元素
print(l1)
列表推导式与生成器表达式的区别
写法上:【 】 ()
iterable iterator
理解
字典推导式
lst1 = ['jay','jj','meet']
lst2 = ['周杰伦','林俊杰','郭宝元']
dic={lst2[i]:lst1[i] for i in range(len(lst2))}
print(dic)
集合推导式
print({i for i in range(1,11)})
3 内置函数:Python提供了68个内置函数
重点记这些:abs() enumerate() filter() map() max() min() open() range() print() len() list() dict() str() float() reversed() set() sorted() sum() tuple() type() zip() dir()
今天讲的不重点一遍就可以
eval:剥去字符串的外衣 , 运算里面的代码 有返回值
s='1+3'
print(s)#1+3
print(eval(s))#4
网络传输的str input输入的时候 SQL注入等等绝对不能使用eval
exec 和eval几乎一样 他是处理代码流
msg='''
for i in range(10):
print(i)
'''
exec(msg)
hash:可哈希的是不可变的数据类型 在密码中使用
help:帮助
callable:调用 判断一个变量是否能被调用

浙公网安备 33010602011771号