09.生成器,内置函数,列表推导式

生成器

  • 什么是生成器:生成器与迭代器看成是一种,生成器的本质就是迭代器

  • 产生或者获取生成器的三种方式

    • 生成器函数
    • 生成器表达式
    • 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

列表推导式

  • 列表推导式:

    缺点:

    1. 构建一个比较复杂但是有规律的列表

    2. 超过层循环才能构建成功的,就不建议使用列表推导式

    3. 排错不行(开启debug时看不出错误)

    优点:

    1. 一行构建,简单
    • 循环模式:[变量(加工后的变量) 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):函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 TrueFalse,最后将返回 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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值