python函数高级话题二:迭代、解析、测试和嵌套循环

  • Post author:
  • Post category:python


python函数高级话题二:迭代、解析、测试和嵌套循环。

学着,记着,将来用上继续深入研究。做一遍,增加脑子深处记忆。for… for…

print("===========函数高级话题二:函数迭代和解析================")
res = []
for i in 'spam':
    res.append(ord(i))  #ord函数收集整个字符串中所有字符的ASCII编码
print(res)

res = [ord(i) for i in 'spam']
print(res)

res=list(map((lambda x:x**2),range(10)))
print('求平方:',res)

print("===========1、增加测试和嵌套循环,很有用的语句================")
l1=list(filter((lambda x:x%2==0),range(5))) #filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
print('l1:',l1)

l2=list(map((lambda x:x**2),filter((lambda x:x%2==0),range(10))))
print('l2:',l2)

res = [x+y for x in [1,2,3] for y in [100,200,300]]
print(res)

l3=[(x,y) for x in range(5) if x%2==0 for y in range(5) if y%2==1] #偶数和奇数之和
print('l3:',l3)

l4=[(x,y) for x in range(10) if x%2==0 for y in range(10) if y%2==1 and x+y==9] #偶数和奇数之和为9
print('l4:',l4,len(l4))

print("===========2、列表解析和矩阵,适合表和数据库排榜================")
m = [[1,2,3],
     [4,5,6],
     [7,8,9]]
n =[[2,2,2],
    [3,3,3],
    [4,4,4,]]
l5 = [row[1] for row in m] #行 123
print('l5:',l5)
l6 = [m[row][1] for row in (0,1,2)]
print('l6:',l6)
l7= [m[i][i] for i in range(len(m))]
print('l7:',l7)
l8=[m[row][col]*n[row][col] for row in range(len(m)) for col in range(len(n))]
print('l8:',l8)
l9=[[m[row][col]*n[row][col] for col in range(3)] for row in range(3)]
print('l9:',l9)
#速度:列表解析速度快于map,map速度是for速度2倍。
l10 = open('myfile.txt').readlines()
print('l10:',l10)
l11 = [line.rstrip() for line in open('myfile.txt').readlines()]
print('l11:',l11)
l12 = [line.rstrip() for line in open('myfile.txt')]
print('l12:',l12)
l13 = list(map((lambda line:line.rstrip()),open('myfile.txt')))
print('l13:',l13)

print("===========3、重访迭代器:生成器================")
"""
yield 和 return
return返回的是一个list列表,而yield每次调用只返回一个数值,毫无疑问,使用return空间开销比较大,尤其是操作巨量数据的时候,
操作一个大列表时间开销也会得不偿失
"""
def gen():
    for i in range(10):
        x=yield i
        print(x)
G=gen()
print('1:',next(G))
print('2:',G.send(77))
print('3:',G.send(88))
print('4:',next(G))

l14=sum(x**2 for x in range(4))
print('l14:',l14)
l15=sorted(x**2 for x in range(4))
print('l15:',l15)
l16=sorted((x**2 for x in range(4)),reverse=True)
print('l16:',l16)
import math
l17= list(map(math.sqrt,(x**2 for x in range(4))))
print('l17:',l17)

print("===========4、生成器函数与生成器表达式================")
l20=(x*4 for x in 'spam')
print(list(l20))

print("===========5、对模块的计时================")
#下面是分模块计数时间,有点慢就不运行了。
# import time
# import sys
# reps=1000
# repslist = range(reps)
# def timer(func,*pargs,**kargs):
#     start = time.perf_counter()
#     for i in repslist:
#         ret = func(*pargs,**kargs)
#     elapsed = time.perf_counter() -start
#     return (elapsed,ret)
#
# reps =10000
# repslist =range(reps)
# def forloop():
#     res =[]
#     for x in repslist:
#         res.append(x+10)
#     return res
#
# def listComp():
#     return [x+10 for x in repslist]
#
# def mapCall():
#     return list(map((lambda x:x+10),repslist))
#
# def genExpr():
#     return list(x+10 for x in repslist)
#
# def genFunc():
#     def gen():
#         for x in repslist:
#             yield x+10
#     return list(gen())
#
# print(sys.version)
# for test in (forloop,listComp,mapCall,genExpr,genFunc):
#     elapsed,result =timer(test)
#     print('-'*33)
#     print('%-9s: %.5f => [%s...%s]'%
#           (test.__name__,elapsed,result[0],result[-1]))
"""
1、Python的time模块允许访问当前时间,精度随着每个平台而有所不同。在 Windows上,这个调用号称能够达到微妙的精度,已经相当准确了。
2、range调用放到了计时循环之外,因此,它的构建成本不会计算到 Python2.6的计时函数中。在 Python3.0的range是一个迭代器,因此这个步骤是不需要的。
3、reps计数是一个全局变量,如果需要的话,导入者可以修改它: mytimer.reps=N
当这些完成后,所有调用的总的使用时间在一个元组中返回,还带有被计时的函数的最终返回值,以便调用者可以验证其操作。
"""
print("===========6、函数的陷阱================")
#本地变量是静态检测
x1=99
def selector():
    print(x1)
selector()

# def selector():
#     print(x2)
#     x2=88
# selector()  #出错,x2未定义
print("---1---")

x3=99
def selector():
    global x3
    print(x3)
    x3=88
selector()  #出错,x2未定义

print("---2---")
x4=99
def selector():
    import __main__ #得到全局变量x4
    print(__main__.x4)
    x4=88    #局部变量x4
    print(x4)
selector()

print("===========7、默认与可变对象================")
print("---1、陷进函数,每次递加---")
def saver(x5=[]):
    x5.append(1)
    print(x5)
saver([2])
saver()
saver()
saver()

print("---2、陷进函数,每次清空重新运行---")
def saver(x6=None):
    if x6 is None:
        x6=[]
    x6.append(1)
    print(x6)
saver([2])
saver()
saver()
saver()

print("===========8、没有teturn的函数================")
def proc(x7):
    print(x7)  #没有return 返回空 None对象
x7= proc('testing 123...')
print(x7)

list=[1,2,3]
list=list.append(4)
print('list:',list)

list=[1,2,3]
list.append(4)
print('list2:',list)

print("===========下次继续学习模块内容================")



版权声明:本文为hahahehe2020原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。