python笔记-函数3
- 生成器
生成器的本质就是迭代器,唯一的区别是生成器是我们自己用Python代码构建出来的数据结构,而迭代器是Python内部提供的或者通过其他对象转化而来的。
- 获取生成器的三种方式
[1]通过生成器函数获取
[2]通过生成器表达式获取
[3]Python内部提供了一些
- 生成器函数说明
有yield关键字存在的函数,就是生成器函数,它即有函数的特性,也有生成器的特性。
def func():
print(666)
yield 3
yield 4
ret = func() #func()不会执行,会返回生成器的内存地址给ret
print(next(ret)) #一个next()对应一个yield值,如果超出函数内yield的个数会报stopinteraction
- return与yield的区别
[1]return:
函数中只存在一个return,并且return是用来终止函数,并将返回值返回给函数的调用者。
[2]yield:
生成器函数中可以包含多个yield,yield也不会终止生成器函数,一个yield对应一个next
- 生成器的作用
生产大量信息的数据集
- yield from
l1 = [1,2,3,4,5]
def func():
yield from l1
ret = func()
print(next(ret))
print(next(ret))
结果:
1
2
#将yield from 其后所跟的可迭代对象转化为迭代器,一次next取一个值
- 列表推导式
列表推导式是用一行代码生成一个比较复杂且有规律的列表
- 列表推导式分类
[1]循环模式:
[变量(加工过得变量) for 变量 in interable]
-------------------举例---------------------
将10以内所有整数的平方写入列表
l1 = [i**2 for i in range(1, 11)]
100以内所有的偶数写入列表
l1 = [i for i in range(2,101,2)]
从Python1期到Python100期写入列表lst
lst = [f'python{i}期' for i in range(1, 101)]
[2]筛选模式
[变量(加工过得变量) for 变量 in interable if 条件]
-------------------举例---------------------
30以内能被3整数的数
l1 = [for i in range(1,31) if i % 3 == 0]
过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
l = ['wusir', 'laonanhai', 'aa', 'b', 'taibai']
l2 = [i for i in l if len(i) > 3]
[3]嵌套模式
-------------------举例----------------------
找到嵌套列表中名字含有两个'e'的人名留下来
names = [
['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']
]
l3 = [a for i in names for a in i if i.count('e') == 2]
- 内置函数
[1]eval():脱掉字符串的外衣运行其内部的代码
s = '1+3'
print(eval(s))
结果:
4
[2]exec():功能同eval,但他是用来处理数据流的
msg = '''
for i in range(4):
print(i)
'''
exec(msg)
结果:
0
1
2
3
[3]hash() #只能操作不可变的数据类型,生成哈希值
s = '123'
print(hash(s))
结果:
-7596256245721939498
[4]help():帮助命令
help(str.upper)
结果:
upper(...)
S.upper() -> str
Return a copy of S converted to uppercase.
[5]callable():判断一个对象是否可以调用
s = 'hello'
def func():
pass
print(callable(s))
print(callable(func))
结果:
False
True