生成器
-
什么是生成器:生成器与迭代器看成是一种,生成器的本质就是迭代器
-
产生或者获取生成器的三种方式
- 生成器函数
- 生成器表达式
- python内部提供的
-
生成器函数获取生成器
"""
return yield的区别
return:一个函数中只能存在一个return函数,可以通过return来返回数据,程序读到return代表了本函数已经结束
yield:当函数中存在一个yield,那么这个函数就成为了生成器函数
在生成器函数中可以存在多个yield,一个yield对应一个next
next一次,执行一个yield
生成器的作用:
虽然可以将可迭代对象转换为迭代器,但是如果可迭代对象足够大,
在其转换时需要将可迭代对象的数据转入内存,在这时就可能会将
内存引爆.
可迭代对象和生成器的区别
可迭代对象是一次性使用
生成器是用一个取一个
"""
# 通过生成器函数获取生成器
def func():
print(111)
yield 3
yield 4
print(123)
yield 5
yield 6
print(next(func())) # 111 3
print(next(func())) # 4
print(next(func())) # 123 5
print(next(func())) # 6
- 生成器表达式:跟列表推导式的区别就是,列表推导式为[],生成器表达式为()
# 生成器表达式也分为循环模式和筛选模式
# 生成器表达式
# 循环模式
res01 = (i for i in range(1, 5))
print(next(res01)) # 1
print(next(res01)) # 2
print(next(res01)) # 3
print(next(res01)) # 4
# 筛选模式
res02 = (i for i in range(1, 11) if i % 2 == 0)
print(next(res02)) # 2
print(next(res02)) # 4
print(next(res02)) # 6
print(next(res02)) # 8
print(next(res02)) # 10
- yield from
# 通过对比以下两段代码来比较yield和yield from的区别
# yield
def func1():
l1 = [1, 2, 3, 4]
yield l1
print(next(func1())) # [1, 2, 3, 4]
# yield from
def func2():
l1 = [1, 2, 3, 4]
yield from l1
print(next(func2())) # 1
print(next(func2())) # 2
print(next(func2())) # 3
print(next(func2())) # 4
列表推导式
-
列表推导式:
缺点:
-
构建一个比较复杂但是有规律的列表
-
超过层循环才能构建成功的,就不建议使用列表推导式
-
排错不行(开启debug时看不出错误)
优点:
- 一行构建,简单
- 循环模式:[变量(加工后的变量) for 变量 in interable]
# 列表推导式 # 普通方式在列表中添加1到10 l1 = [] for i in range(1, 11): l1.append(i) print(l1) # 使用列表推导式添加1到10 l2 = [i for i in range(1, 11)] print(l2) # 将10以内所有整数的平方添加到列表 l4 = [i**2 for i in range(1, 10)] print(l4)
- 筛选模式:[变量(加工后的变量) for 变量 in interable if 条件]
# 使用列表推导式将10以内的偶数添加到列表 l3 = [i for i in range(1, 11) if i % 2 == 0] print(l3) # 将python1期到python100期写入列表 l4 = [f'python{i}期' for i in range(1, 101)] print(l4)
-
其他相关推导式
- 字典推导式
lst1 = ['jay','jj','meet']
lst2 = ['周杰伦','林俊杰','郭宝元']
dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
print(dic)
- 集合推导式
lst = [1,2,3,-1,-3,-7,9]
s = {abs(i) for i in lst}
print(s)
内置函数
-
python提供了63个内置函数
- 常用
all():可迭代对象中,全都是True才是True print(all([1,2,True,0]))
any():可迭代对象中,有一个True 就是True print(any([1,'',0]))
bytes(): 用于不同编码之间的转化
callable():判断这个对象是否可调用
complex():函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数
divmod():计算除数与被除数的结果,返回一个包含商和余数的元组 print(divmod(7,2)) # (3, 1)
eval():剥去字符串的外衣,运算里面的代码 例:s1 = '1+2' print(eval(s1)) #3
exec():与eval几乎一样,用于处理代码流
format():格式化
frozenset():生成一个新的不可变集合
globals():返回的是字典,字典里面的键值对是全局作用域的所有内容
locals():返回的是字典,字典里面的键值对是当前作用域的所有内容
hash():获取一个对象的hash值,只能操作不可变的数据类型
help():帮助,print(help(str.upper))会返回str的upper的用法
id():返回对象内存地址值
input():输入函数
int():将字符串或者数字转换为整数
iter():返回一个迭代器
next():迭代器取下一个
ord():输入字符找该字符编码的位置
chr():输入位置数字找出其对应的字符
pow():求x**y次幂。print(pow(2,3)) # 两个参数为2**3次幂 print(pow(2,3,3)) # 三个参数为2**3次幂,对3取余。
repr():返回一个对象的string形式
round():保留浮点数的小数位数,默认保留整数。 print(round(7/3,2)) # 2.33
bin():将十进制转换成二进制并返回。
oct():将十进制转化成八进制字符串并返回。
hex():将十进制转化成十六进制字符串并返回。
- 最常用:
abs(number):函数返回数字的绝对值。
enumerate():函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
list(enumerate(seasons))
# [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
list(enumerate(seasons, start=1)) # 小标从 1 开始
# [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
print(i, element)
输出结果:
0 one
1 two
2 three
filter(function, iterable):函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中
def is_odd(n):
return n % 2 == 1
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist) # [1, 3, 5, 7, 9]
map(function, iterable, ...):会根据提供的函数对指定序列做映射。
def square(x) : # 计算平方数
return x ** 2
list(map(square, [1,2,3,4,5])) # 使用 list() 转换为列表
# 输出结果:[1, 4, 9, 16, 25]
max(str):返回字符串中最大的字母
min(str):返回字符串中最小的字母。
open():打开一个文件并返回文件对象
file: 必需,文件路径(相对或者绝对路径)。
mode: 可选,文件打开模式
buffering: 设置缓冲
encoding: 一般使用utf8
errors: 报错级别
newline: 区分换行符
closefd: 传入的file参数类型
range(start, stop[, step]):函数可创建一个整数列表,一般用在 for 循环中。
print():用于打印输出
len():计算长度
list():将其转换为集合
dict():将其转换为字典
str() :将其转换为字符串
float():将整数和字符串转换为浮点数
reversed():返回一个反转的迭代器。
set():转换为集合
sorted():
sum():方法对序列进行求和计算。
sum([0,1,2]) # 3
sum((2, 3, 4), 1) # 元组计算总和后再加 1 10
sum([0,1,2,3,4], 2) # 列表计算总和后再加 2 12
tuple():
tuple([1,2,3,4])
(1, 2, 3, 4)
tuple({1:2,3:4}) #针对字典 会返回字典的key组成的tuple
(1, 3)
tuple((1,2,3,4)) #元组会返回元组自身
(1, 2, 3, 4)
type():返回该对象的类型
zip():将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
a = [1,2,3]
b = [4,5,6]
c = [4,5,6,7,8]
zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]
dir():返回该对象的所有方法的字符串形式
- 以后可能会用
classmethod()
delattr()
getattr()
hasattr()
issubclass()
isinstance()
object()
property()
setattr()
staticmethod()
super()
闭包
- 封闭的东西,保证数据的安全
"""
闭包:封闭的数据,保证数据的安全.
定义:内层函数对外层函数的非全局变量的使用,闭包只能存在嵌套函数中.
特点:被引用的外层函数非全局变量的称作自由变量,这个自由变量会与内层函数产生一个关系,自由变量不会在内存中消失.
闭包的作用:保证数据的安全.
"""
def make_averager():
l1 = []
def average(new_value):
l1.append(new_value)
return sum(l1) / len(l1)
return average
res = make_averager()
print(res(1000))
print(res(1200))
print(res(1300))
print(res(1400))