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:调用 判断一个变量是否能被调用






 

posted @ 2020-05-04 19:05  daoda  阅读(162)  评论(0)    收藏  举报