value= true-expr if condition else false-exprpython
例如:a='positive' if 3>0 else 'negative'编程
a=[1,2,3,4,5] squares=list(map(lambda x:x**2,a)) print(squares) #[1, 4, 9, 16, 25] squares=[x**2 for x in a] print(squares) #[1, 4, 9, 16, 25] data=list(map(lambda x:x**2 ,filter(lambda x:x%2==0,a))) print(data) #[4, 16] data_one=[x**2 for x in a if x%2==0] 等价于data_one=[x**2 for x in a and x%2==0]
print(data_one) #[4, 16] #字典与集合也有相似的推导机制 chile_ranks={'ghost':1,'habanero':2,'cayenne':3} rank_dict={rank:name for name,rank in chile_ranks.items()} chile_len_set={len(name) for name in rank_dict.values()} print(rank_dict) #{1: 'ghost', 2: 'habanero', 3: 'cayenne'} print(chile_len_set) #{8, 5, 7}
能接收其余函数做为参数的函数,被称为高阶函数(high-order function)app
表明性高阶函数:map() filter() 和 reduce()函数式编程
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次做用到序列的每一个元素,函数
并把结果做为新的Iterable返回。学习
lambda_sum=lambda x,y:x+y print(lambda_sum(3,4)) #7
data_list=[1,3,5,6] result=map(lambda x:x+3,data_list) print(list(result)) #[4, 6, 8, 9]
def f(x): return x+3 result_one=list(map(f,data_list)) print(result_one) #[4, 6, 8, 9]
reduce():把一个函数做用在一个序列[x1,x2,x3,...]上,这个函数必须接收两个参数,reduce把结果url
继续和序列的下一个元素作累积计算。感受用处不大!本身也能写,会麻烦一些,若是须要,仍是可用。spa
from functools import reduce data_list=[1,3,5] print(reduce(lambda x,y:2*x+y,data_list)) #15
def f_reduce(x,y): return 2*x+y print(reduce(f_reduce,data_list)) #15
new_list=data_list[:1] for i in range(1,len(data_list)): new_list.append(2*new_list[i-1]+data_list[i]) print(new_list) #[1, 5, 15]
print(new_list[-1]) #15
def prod(L): new_list=L[:1] for i in range(1,len(L)): new_list.append(new_list[i-1]*L[i]) return new_list[-1] print(prod([3, 5, 7, 9])) #945
def prod(L): return reduce(lambda x,y:x*y,L) print(prod([3, 5, 7, 9])) #945
三、filter() ,和map()相似,也接收一个函数和一个序列。和map()不一样的是,filter()把传入的函数依次做用于每一个元素,code
而后根据返回值是True仍是False决定保留仍是丢弃该元素orm
list(filter(lambda x:x%2==0,[3,4,5])) #[4]
list(filter(lambda x:x%2==1,[3,4,5])) #[3,5]
lst=[x**2 for x in range(10)] #[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
x1=[1,3,5] y1=[9,12,13] lst1=[x**2 for (x,y) in zip(x1,y1) if y>10] print(lst1) #[9, 25]
dict={k:v for k,v in enumerate('vamei') if v not in 'vi'} print(dict) #{1: 'a', 2: 'm', 3: 'e'}
import os,time,sys,requests POP20_CC=('CN IN US ID BR PK NG BD RU JP ' 'MX PH VN ET EG DE IR TR CD FR').split() BASE_URL='http://flupy.org/data/flags' DEST_DIR='E://' def save_flag(img,filename): path=os.path.join(DEST_DIR,filename) with open(path,'wb') as fp: fp.write(img) def get_flag(cc): url='{}/{cc}/{cc}.gif'.format(BASE_URL, cc=cc.lower()) resp=requests.get(url) return resp.content def show(text): print(text,end=' ') sys.stdout.flush() def download_many(cc_list): for cc in sorted(cc_list): image=get_flag(cc) show(cc) save_flag(image,cc.lower()+'.gif') return len(cc_list) def main(download_many): t0=time.time() count=download_many(POP20_CC) elapsed=time.time()-t0 msg='\n{} flags downloaded in {:.2f}' print(msg.format(count,elapsed)) if __name__=='__main__': main(download_many)
简单的一个代码,写的比较好!将一个脚本任务按照实现流程分为几个动做,每一个动做写一个函数,有以下优势:
一、代码清晰
思路清晰,而非胡子眉毛一把抓,总体任务分为若干个小动做,一个动做用一个函数来实现。
二、易于扩展
若是代码某一块须要修改,能够仅修改部分函数便可,对其余函数无影响,也能够增长其余功能。
三、写主函数
代码中包含有主函数,从主函数开始,便于程序的阅读,一看到main(),知道从这里开始阅读起。
四、不一样函数之间变量名称
写函数的时候能够以变量名称、类型方式写,注意函数内变量一致便可,调用时则使用全局变量中名称,二者要不同吗?为何呢??
好比这样改写download_many函数:
for cc in sorted(POP20_CC):
image=get_flag(cc)
show(cc)
save_flag(image,cc.lower()+'.gif')
return len(POP20_CC)
若是咱们修改主函数,下载10个国家国旗图片
def main(download_many):
t0=time.time()
count=download_many(POP10_CC)
elapsed=time.time()-t0
msg='\n{} flags downloaded in {:.2f}'
print(msg.format(count,elapsed))
结果是主函数的修改对download_many函数仍是起做用,由于download_many函数中变量只是至关于x,真正起做用仍是调用时主函数中输入的参数值,因此你这样写也没有问题。不过用变量cc_list好,阅读起来不会引发混淆,无论你是下10国国旗仍是20国国旗。若是你download_many中是20国国旗做为变量,调用时输入10国国旗为参数,看起来比较别扭。
本身之后写代码要学习这种写法!
https://www.zhihu.com/question/21123544
def case1(somearg): pass
def case2(somearg): pass
def case3(somearg): pass switch={ 1: case1, 2: case2, 3: case3 } switch[case](arg)
from enum import Enum EventType=Enum('EventType','tick bar signal') EventType.tick Out[29]: <EventType.tick: 1> dir(EventType) Out[30]: ['__class__', '__doc__', '__members__', '__module__', 'bar', 'signal', 'tick']
dic ={'a': 1, 'b': 2, 'c': 3} for n,buf in enumerate(dic): print(n,buf) # 0 a # 1 b # 2 c
结论:直接赋值比for循环要快
# 下面代码为 将一个对象全部属性 给 另外一个对象,注意test1不行。
from datetime import datetime class A(): name = "runoob" def test(a, b): for k, v in a.__dict__.items(): setattr(b, k, v) def test1(a, b): for k, v in a.__dict__.items(): b.k = v def test2(a, b): b.a = a.a b.b = a.b b.c = a.c b.d = a.d b.e = a.e b.f = a.f def run(f, a, b): start = datetime.now() for i in range(10000): # 0000000 f(a, b) end = datetime.now() print(end - start) dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'aa': 1, 'ba': 2, 'ca': 3, 'da': 4, 'ea': 5, 'fa': 6} a = A() for k, v in dic.items(): setattr(a, k, v) print(a.__dict__) b = A() run(test, a, b) print(b.__dict__) # test # {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6} # 0:00:09.460686 # {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6} # test1 # {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6} # 0:00:05.086406 # {'k': 6} # test2 # {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6} # 0:00:03.672156 # {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
# 下面代码为 将一个字典全部键值对 做为 一个对象的属性
print('ok') from datetime import datetime class A(): name = "runoob" def test(a, b): for k, v in a.items(): setattr(b, k, v) def test1(a,b): for k,v in a.items(): b.__setattr__(k,v) def test2(a, b): b.a = a['a'] b.b = a['b'] b.c = a['c'] b.d = a['d'] b.e = a['e'] b.f = a['f'] b.aa = a['aa'] b.ba = a['ba'] b.ca = a['ca'] b.da = a['da'] b.ea = a['ea'] b.fa = a['fa'] def run(f, a, b): start = datetime.now() for i in range(10000): # 0000000 f(a, b) end = datetime.now() print(end - start) a = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'aa': 1, 'ba': 2, 'ca': 3, 'da': 4, 'ea': 5, 'fa': 6} b = A() run(test1, a, b) print(b.__dict__) # 结果:赋值比for循环快