python 2.083 生成式

面向过程

面向过程的思想编程

基于该思想写程序就好比 设计一条条的流水线

优点:
  可以把复杂的问题流水化,进而简单

缺点:
   扩展性差,牵一发而动全身


应用场景:
框架的设计的思想就是过程的思想
不要装逼,能简单就简单

服务器的脚本
函数的编写

生成式

生成式

列表生成式 : 在不影响可读性的前提下,尽量简写

给列表L  加5个数字?

L =[]
for  i  in range(5):
    L.append(i)

print(L)

如何简写

L =[ i for i in range(5)]

print(L)


L =[ 111 for i in range(5)]

print(L)

L =[ len('hello') for i in range(5)]  不懂

print(L)

L =[ i**2 for i in range(5) if i > 2]

print(L)


需求 取出一个列表的中的元素,已sb 结尾的,放到一个新的列表内

old_list = [ 'yellow_sb','uuuuu_sb','aaa_sb','kkkk_sb','aaa','lll']


print(old_list)

new_list = [ name for name in old_list if name.endswith('_sb')]

print(new_list)



集合生成式 : 在不影响可读性的前提下,尽量简写

res = {  i for i in range(5)}

print(res)


字典生成式 : 在不影响可读性的前提下,尽量简写

res = {f'k{i}':i**2 for i in range(5)}

print(res)


生成器表达式
res = (i for i in range(5))
# 不能运行

print(res.__iter__().__next__())
print(res.__iter__().__next__())
print(res.__iter__().__next__())
print(res.__iter__().__next__())


为什么需要使用生成器,在计算大范围的数学运算的时候,需要做N个数字声明,然后一个一个的计算,容易造成内存溢出。
但是使用 yield函数 或者是生成器 ,就不会发生这个问题,使用函数的iter功能赋值给一个对象,然后使用对象的next的功能
就能解决这个大数量运算的问题

需求 1 +20万 的和

numb  = (i for i in range(200000))

res = sum(numb) # sum 函数参数就是要一个生成器
print(res)

问题 统计一个文件的字符的个数
需求拆分  文件有可能很小,有可能很大,那就要分成2种情况,全部读到内存,还是一行一行的读到内存

方法一 全部读到内存

with open('log.txt','r',encoding='utf-8') as f:
    data = f.read()
    res = len(data)
    print(res)

方法二 一行一行的读

with open('log.txt','r',encoding='utf-8') as f:
    res =0
    for line in f:
       res +=  len(line)
    print(res)

方法二 一行一行的读 简化代码

with open('log.txt','r',encoding='utf-8') as f:

    # res= sum( (len(line )for line in f))  # 简化代码 ,可以去掉一对括号
    res = sum(len(line) for line in f)   # 语法简洁
    print(res)

posted @ 2022-01-24 08:46  mmszxc  阅读(39)  评论(0)    收藏  举报