目录:

7、python break continue用法

1、三元表达式

2、用列表推导式来取代map和filter

3、函数式编程

4、fluent python 阅读笔记

5、enum库用法

6、python直接赋值和for循环执行效率比较

7、python break continue用法

1.break   意思为结束循环
2.continue  意思为结束当前循环进入下一个循环

1、三元表达式:

value=  true-expr if condition else false-expr

例如:a='positive' if 3>0 else 'negative'

2、用列表推导式来取代map和filter

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}

3、函数式编程

能接收其他函数作为参数的函数,被称为高阶函数(high-order function)

代表性高阶函数: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把结果

继续和序列的下一个元素做累积计算。感觉用处不大!自己也能写,会麻烦一些,如果需要,还是可用。

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]) #15def 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

3、filter() ,和map()类似,也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,

然后根据返回值是True还是False决定保留还是丢弃该元素

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'}

4、fluent python 阅读笔记

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)

简单的一个代码,写的比较好!将一个脚本任务按照实现流程分为几个动作,每个动作写一个函数,有如下优点:

1、代码清晰

思路清晰,而非胡子眉毛一把抓,整体任务分为若干个小动作,一个动作用一个函数来实现。

2、易于扩展

如果代码某一块需要修改,可以仅修改部分函数即可,对其他函数无影响,也可以增加其他功能。

3、写主函数

代码中包含有主函数,从主函数开始,便于程序的阅读,一看到main(),知道从这里开始阅读起。

4、不同函数之间变量名称

写函数的时候可以以变量名称、类型方式写,注意函数内变量一致即可,调用时则使用全局变量中名称,两者要不一样吗?为什么呢??

比如这样改写download_many函数:

def download_many(POP20_CC):
    for cc in sorted(POP20_CC):image=get_flag(cc)show(cc)save_flag(image,cc.lower()+'.gif')return len(POP20_CC)

如果我们修改主函数,下载10个国家国旗图片

POP10_CC=('CN IN US ID BR PK NG BD RU JP').split()
def main(download_many):t0=time.time()count=download_many(POP10_CC)elapsed=time.time()-t0msg='\n{} flags downloaded in {:.2f}'print(msg.format(count,elapsed))

结果是主函数的修改对download_many函数还是起作用,因为download_many函数中变量只是相当于x,真正起作用还是调用时主函数中输入的参数值,所以你这样写也没有问题。不过用变量cc_list好,阅读起来不会引起混淆,不管你是下10国国旗还是20国国旗。如果你download_many中是20国国旗作为变量,调用时输入10国国旗为参数,看起来比较别扭。

自己以后写代码要学习这种写法!

5、python中实现switch语法结构

https://www.zhihu.com/question/21123544

def case1(somearg):pass
def case2(somearg):pass
def case3(somearg):passswitch={
1: case1,
2: case2,
3: case3
}switch[case](arg)

5、enum库用法

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

6、python直接赋值和for循环执行效率比较

结论:直接赋值比for循环要快

# 下面代码为 将一个对象所有属性 给 另一个对象,注意test1不行。

from datetime import datetimeclass 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 = vdef test2(a, b):b.a = a.ab.b = a.bb.c = a.cb.d = a.db.e = a.eb.f = a.fdef 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 datetimeclass 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循环快

转载于:https://www.cnblogs.com/bawu/p/7793915.html

python语法技巧相关推荐

  1. python语法怎么读-python语法技巧

    目录: 7.python break continue用法 1.三元表达式 2.用列表推导式来取代map和filter 3.函数式编程 4.fluent python 阅读笔记 5.enum库用法 6 ...

  2. python使用复合语句def创建函数对象_【收藏】Python实用技巧-成为Pythoner必经之路...

    前言 本文主要记录 Python 中一些常用技巧,所描述的是告诉你怎么写才是更好?  如果你并不熟悉Python语法,希望你能在下面代码片段中看到Python的简单.优雅; 如果你象我这样,对 Pyt ...

  3. python语法详解大全_笔记:Python 语法要点汇总

    Python 是一门解释型语言,无需编译和链接 Python 解释器 交互模式 脚本模式 源码编码 默认情况下,Python 源文件是 UTF-8 编码 指定源文件的字符编码 # -*- coding ...

  4. python工程技巧_python 19个值得学习的编程技巧

    Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净.整洁.一目了然.要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀 ...

  5. python面试技巧和注意事项_Python 程序员面试须知须会的5个问题

    原标题:Python 程序员面试须知须会的5个问题 作为一个程序员,可能或多或少经历过一些技术面试,有些是编程语言本身的问题,有些是跟工程相关的问题.今天我们来总结关于Python程序员面试的时候经常 ...

  6. 分享几个Python小技巧函数里的4个小花招

    前面讲了很多内容都是关于python的变量,数据结构,下面我们来谈一谈python的函数.python里的函数知识点大概分为 基础的定义使用 , 作用域 和 参数传递 , 高级用法 ,其中参数传递最为 ...

  7. 这些Python代码技巧,你肯定还不知道

    被人工智能捧红的 Python 已是一种发展完善且非常多样化的语言,其中肯定有一些你尚未发现的功能.本文或许能够让你学到一些新技巧. Python 是世界上最流行.热门的编程语言之一,原因很多,比如: ...

  8. Python语法--Mooc七月

    参考资料备用: python ABC 3.8.2Documentation python cookbook 3rd pip安装超时解决办法 vscode小技巧 打开命令窗口:Ctrl+` 注释:单行 ...

  9. 最新总结:2021那些小众精巧的 Python 语法汇总

    2020 年 python2 停止维护,公司代码规范也鼓励使用 python3.6+版本,而随着 Python 版本的不断更新,许多旧的语法在可读性与效率上都已经有更好的替代了.当然,大部分的重要特性 ...

最新文章

  1. Linux服务器网络开发模型
  2. 3.4.3 嵌套查询
  3. c语言scanf结果在printf前,C语言中的scanf与printf
  4. android 自定义 styleable 属性
  5. Javascript设置cookie和获取cookie
  6. boost::hana::id用法的测试程序
  7. 32添加组件_软件开发32条法则:经过实践检验的实用建议和经验教训
  8. 诺基亚Nokia的PC套件导出短信乱码问题解决(转)
  9. POI读取word模板,根据list动态添加表格,按照字段填充
  10. Linux系统安装(超级详细教程)
  11. pcl::MovingLeastSquares滑动最小二乘
  12. 如何在IntelliJ IDEA 中新建一个项目Project
  13. java ftp传图片_Java 图片上传方式一 : ftp 图片服务器
  14. ZCloud-搭建开发环境
  15. Nuke里的包围曝光合成节点---BracketStacker (source!)
  16. Spring框架学习(四):聊一聊xml配置和Java配置
  17. 群晖mysql默认密码忘记_群辉root密码
  18. 相容问题——贪心算法
  19. USACO Spinning Wheels
  20. 基于PanoSim仿真开发平台AEB算法的实现和FCW的构想

热门文章

  1. 服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?
  2. 程序员为维持游戏开发被迫炒股,一年内反赚1600万;雷军退任天星银行董事会主席;华为开源Karmada将捐赠CNCF...
  3. Spark全套知识体系,终于搞到了!
  4. 急!急!急!有偿求助
  5. 哈理工 第五届程序设计大赛——B.沼跃鱼
  6. 第十二章 HTTAPI – FreeSWITCH向Webserver寻问下一步操作
  7. Microsoft Edge右下角烦人的广告
  8. 阅文java服务端开发_阅文笔试复盘
  9. 哪个牌子手持洗拖一机好?热门洗地机盘点
  10. tableau:表计算