1. 生成器
  • 什么是生成器:Python社区,生成器与迭代器看成一种。生成器的本质就是迭代器。
  • 唯一的区别:生成器是我们自己用python代码构建的数据结构。迭代器都是提供的,或者是转化的来的。
  • 获取生成器的三种方式:
  1. 生尘器函数
  2. 生成器表达式
  3. Python内部提供的一些
  • yield
  • 生成器函数获得一个生成器
# 生成器函数
def func():
    print(111)
    print(222)
    yield 3
    a=1
    b=2
    c=3
    print(c+b)
    yield 4
func() # 不执行
ret=func() # # 此时ret就是一个迭代器
print(next(ret))	# 对ret进行取值 3,此时程序停到了第五行,
print(next(ret))	# 程序接着运行 输出5,对ret进行取值 4,此时程序停到了第10行
# 一个next对应一个yield
  • yield与return
  • return和yield的区别
  • return:函数中值存在一个return结束函数,并且给函数的执行者返回值
  • yield:只要函数中有yield那么他就是生成器函数,而不是函数了
  • 生成器函数中可以存在多个yield,一个yield对应一个next,yield不会结束生成器函数。
  • 生成器的应用
# 传统 缺点:内存占用太大
def func():
    l1=[]
    for i in range(1,5000):
        l1.append(f"{i}号包子")
    return l1
ret=func()
print(ret)
---------------------------------------------------
# 使用生成器,利用了惰性机制,随用随生成
def gen_func():
    for i in range(1,5000):
        yield f"{i}号包子"
ret=gen_func()
for i in range(200)
	print(next(ret))
  • yield from,将一个可迭代对象使用yield挨个进行返回(将一个可迭代对象变成生成器进行返回)
# 不使用yeild from
def func():
    l1=[1,2,3,4,5]
    yield l1
ret=func()
print(next(ret)) # 此时得到的是一个列表
---------------------------------------------------
# 使用yeild from
def func():
    l1=[1,2,3,4,5]
    yield from l1
ret=func()
print(next(ret)) # 此时得到的是一个列表中的第一个元素,1
print(next(ret)) # 此时得到的是一个列表中的第二个元素,2
---------------------------------------------------
# 使用yeild from
def func():
    l1=[1,2,3,4,5]
    l2=[6,7,8,9,0]
    yield from l1
    yield from l2
ret=func()
for i in range(10):
    print(next(ret))
# 将两个列表中的元素顺序进行返回,即返回完yield form l1生成的迭代器中的元素后就返回yield from l2生成的迭代器中的元素
  1. 生成器表达式和列表推导式
  1. 列表推导式:
  • 用一行代码构架比较复杂有规律的列表。
# 常规
l1=[]
for i in range(1,11):
    l1.append(i)
print(l1)
---------------------------------------------------
# 列表推导式
l1=[i for i in range(1,11)]
print(l1)
  • 列表推导式分为两类
  1. 循环模式::[变量(加工后的变量)for 变量 in iterable]
# 将10以内所有整数的平方写入列表
lst1=[i**2 for i in range(1,11)]
# 将100以内所有的偶数写入列表
lst2=[i for i in range(2,101,2)]
# 从python1期到python100期写入列表
lst3=[f"python{i}期" for i in range(1,101)]
  1. 筛选模式:[变量(加工后的变量)for 变量 in iterable if 条件]
# 将30以内所有的被三整除的数写入列表
lst4=[i for i in range(1,31) if i%3==0]
# 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
lst5=['barry','ab','alex','wusir','xo']
lst6=[i.upper() for i in lst5 if len(i)>=3]
---------------------------------------------
# 找到嵌套列表总名字含有两个e的所有名字并大写列下来
lst7=[['Tom','Billy','Jefferson','Andrew','Weslew','Steven','Joe'],['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]
lst8=[j.upper() for i in lst7 for j in i if j.count("e")==2]
  1. 生成器表达式:
  • (将列表推导式中的[]替换成()即可),其余的全部一样
  • (变量(加工后的变量)for 变量 in iterable)
l1=(i for i in range(1,11))
print(next(l1))
# 迭代器也可以使用for循环进行打印
for i in lst9:
    print(i)
  1. 总结:
  • 列表推导式:
  • 缺点
  • 列表推导式只能构建比较复杂并且有规律的列表。不要太着迷
  • 超过三层循环才能构建成功的,就不见时使用列表推导式了
  • 只有一行,查找错误(debug模式)不行
  • 优点
  • 一行构建,简单。
  • 装13
  • 提升:
  • 构建一个列表:[2,3,4,5,6,7,8,9,10,'J','Q','K','A']
  • l1=[i for i in range(2,11)]+list("JQKA")
  1. 列表推导式和生成器表达式的区别
  1. 写法上:
  2. 本质:iterable(可迭代对象)和 iterator(迭代器)的区别
  1. 字典推导式(了解)
lst1=['jay','jj','meet']
lst2=['周杰伦','林俊杰','元宝']
# 键是中文,值是英文
dic={lst2[i]:lst1[i] for i in range(len(lst1))}
  1. 集合推导式(了解)
print({i for i in range(1,11)})
  1. 内置函数Ⅰ
  • 函数就是以功能为导向,一个函数封装一个功能,那么Python将一些常用的功能(比如len)给我们封装成了一个一个的函数,供我们使用,他们不仅效率高(底层都是用C语言写的),而且是拿来即用,避免重复造轮子,那么这些函数就称为内置函数,到目前为止,Python给我们提供的内置函数一共是68个。
  • 分散学习
  • 一带而过(今天学)
all()  any()  bytes() callable() chr() complex() divmod() eval() exec() format() frozenset() globals() hash() help() id() input() int()  iter() locals() next()  oct()  ord()  pow()    repr()  round()
  • eval() ,剥去字符串的外衣,运算里面的代码,有返回值
  • 很危险:网络传输的str input 输入的时候 sql诸如的时候等等,决不能使用eval()
  • 应用场景,把一个字典写入文件,再读取这个文件的时候就成为了字符串,此时使用eval()可以将这个字符串转换为原来的字典类型
s1='1+3'
print(s1)	# 1+3
print(eval(s1))	# 4
  • exec(),与eval()几乎一样,exec()是处理代码流的
msg="""
for i in range(10):
	print(i)
"""
print(msg) # 只是字符串,不会运行
exec(msg) # 剥去字符串的外衣,运行里面的代码
  • hash(),获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值,只能操作不可变的数据类型
    print(hash("abc"))
  • help(),获取帮助
    print(help(str.upper))
  • callable(),判断这个对象是否可调用,返回布尔值
s1='a'
def func():
    pass
print(callable(s1)) # False
print(callable(func)) # True
  • bin() 返回一个数字的二进制。
  • bin(10)
  • oct() 返回一个数字的八进制
  • oct(10)
  • hex()返回一个数字的十六进制
  • hex(10)
  • 重点学习
abs() enumerate() filter()  map() max()  min() open()  range() print()  len()  list()  dict() str()  float() reversed()  set()  sorted()  sum()    tuple()  type()  zip()  dir()
  • 以后学
classmethod()  delattr() getattr() hasattr()  issubclass()  isinstance()  object() property()  setattr()  staticmethod()  super()