p72-73

补充

  • 生成器就是迭代器
  • 生成器是用python代码构建的
  • 1、生成器函数
  • 2、生成器表达式
  • 3、python内部提供
  • 生成器函数 yield
  • yield from 将一个可迭代对象,变成一个生成器
  • 列表推导式,生成器表达式
    • 循环模式 for循环
    • 筛选模式 if条件
  • 内置函数,内部功能,拿来就用
#过滤掉长度小于3的字符串列表,并剩下的转换成大写字母
l1=['tom','su','Lee','Jerry','mt']
print([s.upper() for s in l1 if len(s)>=3]) #return ['TOM', 'LEE', 'JERRY']
#求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表
print([(x,y) for x in range(0,6,2) for y in range(1,6,2)])
#return [(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]
#求M中3,6,9组成的列表M=[[1,2,3],[4,5,6],[7,8,9]]
M=[[1,2,3],[4,5,6],[7,8,9]]
print([i[-1] for i in M ]) #[3, 6, 9]
#求出50以内能被3整除的数的平方,并放入到一个列表
print([i**2 for i in range(50) if i%3==0])
#return [0, 9, 36, 81, 144, 225, 324, 441, 576, 729, 900, 1089, 1296, 1521, 1764, 2025, 2304]
#构建一个列表 ['python1期',‘python2期’,。。。,‘python10期’]
print([f'python{i}期' for i in range(11) ])
#构建一个列表[(0,1),(1,2),(2,3),(3,4),(4,5),(5,6)]
print([(x,x+1) for x in range(6)])
#return [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
# 构建一个列表[0,2,4,6,8,10,12,14,16,18]
print([x*2 for x in range(10)])
#return [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
#完成笛卡尔积 [8,10,14,12,15,21]
l1 = [2,3]
l2 = [4,5,7]
print([x*y for x in l1 for y in l2])
#return [8, 10, 14, 12, 15, 21]
def demo():
    for i in range(4):
        yield i
g = demo()
g1 = (i for i in g)
g2 = [i for i in g1]

print(list(g1)) #[]
print(list(g2)) #return [0, 1, 2, 3]
def add(n,i):
    return n+i
def test():
    for i in range(4):
        yield i
g=test()
for n in [1,10]:
    g=(add(n,i) for i in g)
print(list(g)) #return [20, 21, 22, 23]

匿名函数

  • 一句话函数
  • 构建 func = lambda a,b:a+b

内置函数

#callable	
name = 'Tom'
def func():
    return
print(callable(name))  #return False  判断变量是否可调用
print(callable(func))  #return True
#int 取整
print(int(3.5)) #return 3
#complex 复数
print(complex(1,2)) #return (1+2j)
#repr 返回一个对象的字符串形式
s1 = 'hello'
print(s1)  #return  hello
print(repr(s1)) #return 'hello'
#repr 返回一个对象的字符串形式
s1 = 'hello'
print(s1)  #return  hello
print(repr(s1)) #return 'hello'
msg = '你好也是%r' %(s1)
print(msg) #return 你好也是'hello'
#all 迭代对象的元素中有一个为False 即为False
l1 = [1,2,3,True,0,'hello']
print(all(l1)) #return False
#any 迭代对象的元素中有一个为True 即为True
l2=[1,2,3,4,0,False,'111']
print(any(l2)) #return True
#dict 创建字典的方式
dic = dict([('one',1),('two',2),('three',3)])
dic2 = dict(one=1,two=2,three=3)
#fromkeys
#update
print(dic)
#reversed 得到的是迭代器
l1 = [i for i in range(10)]
obj = reversed(l1) # obj 是迭代器
print(list(obj)) #return [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
#zip 拉链方法
l1 = [1,2,3,4,5]
tu1 = ['tom','jerry','lucy','lily']
s1 = 'abc'
obj = zip(l1,tu1,s1)
print(obj) #return <zip object at 0x00F6D5C8>
print(list(obj)) #return [(1, 'tom', 'a'), (2, 'jerry', 'b'), (3, 'lucy', 'c')]
# min  max
l1 = [1,2,3,4,33,-1,0,-8]
print(min(l1)) #return -8
print(min(l1,key=abs)) #return 0 以绝对值方式获取最小值
dic = {'a':2,'b':1}
print(min(dic))  #return a 默认按照键比大小
#获取值最小的键
print(min(dic,key=lambda a:dic[a])) #return b
# #首先dic挨个传进来字典dic的键,用键通过lambda函数获取值,对值筛选最小值,返回的是最小值的键
#返回 l1 年龄最小的元组
l1 = [('lucy',21),('jerry',25),('tom',22)]
print(min(l1,key=lambda x:x[1])) #return ('lucy', 21)
#sorted 排序
l1 = [11,33,22,6,63,8]
l2 = sorted(l1)
print(l2) #return [6, 8, 11, 22, 33, 63]
#sorted 把l2 按照成绩从低到高排序
l2 = [('tom',90),('lily',85),('jerry',77)]
print(sorted(l2,key=lambda x:x[1])) #return[('jerry', 77), ('lily', 85), ('tom', 90)]
#从高到低排
print(sorted(l2,key=lambda x:x[1],reverse=True)) #return [('tom', 90), ('lily', 85), ('jerry', 77)]
#filter  大于3的留下 filter 返回的是个迭代器
l1 = [2,3,4,1,6,7,9]
print([i for i in l1 if i>3]) #return [4, 6, 7, 9]
ret = filter(lambda x:x>3,l1)
print(ret) #return <filter object at 0x00B4F520>
print(list(ret)) #return [4, 6, 7, 9]
#偏函数
#函数在执行时,要带上所有必要的参数进行调用。但是,有时参数可以在函数被调用之前提前获知。
# 这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用。
#比如定义一个求余的函数,每次都提供一个1-100的数num,让100%num 求余
from functools import partial
def mod(n,m):
    return n%m
#我已经确定了,以后每次都拿100 来求余,就可以在mod函数的基础上再定义一个偏函数mod_by_100,原函数第二个参数开始,就从新函数第一个参数开始
mod_by_100 = partial(mod,100)
print(mod(100,7))#2
print(mod_by_100(7)) #2
#再比如以后学到GUI中,每次创建Button控件的时候都会用主窗口对象top作为第一个参数,
Button(top,command=.....)
MyButton = partial(Button,top)
MyButton(command=callBack,bg='red',fg='white')#command 是回调函数,单击按钮触发的,bg 和fg是背景色和前景色
#没觉得有什么好处,官方的意思是可以有效的’冻结'哪些预先确定的参数来缓存函数参数,比如top冻结了,运行时只需要获取剩余的参数后,在把top解冻,传递到最终的参数中
#网上说,偏函数可以很好的执行DRY(Donot Repeat Yourself)原则,并节省编程成本
#在实际应用中,可以参考《重构》(Refactoring)中说的三次原则(Rule of three),即同样的代码将要出现第三次前,考虑抽象它。
# 违背DRY原则的代码,程序员称之为WET(直译:潮湿,因为DRY是干燥的意思)的,可以理解为Write Everything Twice(任何东西写两遍),We Enjoying Typing(我们享受敲键盘)或Waste Everyone’s Time(浪费所有人的时间)。

#偏函数可以对现有函数进行加强
posted on 2020-07-09 20:23  94小渣渣  阅读(159)  评论(0)    收藏  举报