python语法技巧
目录:
7、python break continue用法
1、三元表达式
2、用列表推导式来取代map和filter
3、函数式编程
4、fluent python 阅读笔记
5、enum库用法
6、python直接赋值和for循环执行效率比较
7、python break 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)) #
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)) #
def f_reduce(x,y):
return 2*x+y
print(reduce(f_reduce,data_list)) #
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]) # 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])) #
def prod(L):
return reduce(lambda x,y:x*y,L)
print(prod([3, 5, 7, 9])) #
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函数:
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国国旗为参数,看起来比较别扭。
自己以后写代码要学习这种写法!
5、python中实现switch语法结构
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)
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 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): #
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): #
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循环快
python语法技巧的更多相关文章
- 初试Python语法小试牛刀之冒泡排序
Python很火,心里很慌,没吃过猪肉,也要见见猪走路. 看了几天Python的语法,大概初步了解了一点点,https://www.liaoxuefeng.com/wiki/0014316089557 ...
- 一些你需要知道的Python代码技巧
被人工智能捧红的 Python 已是一种发展完善且非常多样化的语言,其中肯定有一些你尚未发现的功能.本文或许能够让你学到一些新技巧. Python 是世界上最流行.热门的编程语言之一,原因很多,比 ...
- 鲜为人知的 Python 语法
所有人(好吧,不是所有人)都知道 python 是一门用途广泛.易读.而且容易入门的编程语言. 但同时 python 语法也允许我们做一些很奇怪的事情. 使用 lambda 表达式重写多行函数 ...
- 由ArcMap属性字段自增引出字段计算器使用Python的技巧
1.前言 前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQL Server中对于数值型字段可以设置自增.所以我打开ArcCatalog查看发现只提供默认值 ...
- 对 Python 语法不够了解导致的 bug
对 Python 语法不够了解导致的 bug. `in` '20' in '11264,6144,4096,3072,2048,1024,300,30' Out[7]: True a_list = ' ...
- python 笔记2:python语法基础
python语法学习笔记: 1 输入输出 input(),print(). name = input('input your name : ')print('hello ,'+name)print(& ...
- python语法快速入门(1)
http://www.runoob.com/python/python-tutorial.html Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节.类似于PHP和Perl语言 ...
- python语法笔记(四)
1.对象的属性 python一切皆对象,每个对象都可能有多个属性.python的属性有一套统一的管理方案. 属性的__dict__系统 对象的属性可能来自于其类定义,叫做类属性:还可能 ...
- python语法-[with来自动释放对象]
python语法-[with来自动释放对象] http://www.cnblogs.com/itech/archive/2011/01/13/1934779.html 一 with python中的w ...
随机推荐
- intent 跳转
一.不需要返回值的跳转 Intent intent=new Intent(); intent.setClass(目前的acitivy.this, 目标activity.class); startAct ...
- 「NOIP2011」聪明的质监员
传送门 Luogu 解题思路 第一眼肯定是没什么思路的 dalao勿喷,但我们仔细看一看式子就会发现 \(Y\) 是随着 \(W\) 的变大而变小的. 所以 \(Y\) 随 \(W\) 的变化是单调的 ...
- python笔记12
day12 今日内容 函数中高级(闭包/高阶函数) 内置函数 内置模块(.py文件) 内容回顾 函数基础概念 函数基本结构 def func(arg): return arg; v1 = func(1 ...
- 如何解决 Django 前后端分离开发的跨域问题
一.同源策略 1.先来说说什么是源 • 源(origin)就是协议.域名和端口号. 以上url中的源就是:http://www.company.com:80 若地址里面的协议.域名和端口号均相同则属于 ...
- mysql多实例双主部署
本文引自公司技术文档,仅作为记录. 背景 有的时候需要进行数据库环境的隔离,以及节省服务器资源一台mysql安装多个数据库实例,一个实例下构建多个数据库 安装mysql yum -y install ...
- Python测试进阶——(3)编写Python程序监控计算机的服务是否正常运行
用python写了个简单的监控进程的脚本,当发现进程消失的时候,立即调用服务,开启服务. 脚本的工作原理是这样的:脚本读取配置文件,读取预先配置好的调用系统服务的路径和所要监控的服务在进程管理器中的进 ...
- linux下python开发环境的安装
1.准备编译环境 yum groupinstall 'Development Tools' yum install zlib-devel bzip2-devel openssl-devel ncurs ...
- Scala match 变量
昨天写 Scala 的时候,使用 match(相当于 switch)时,运行结果很奇怪. var i: Int = 0 while (i < items.length) { i % width ...
- 自己写个tween
public Vector3 begin,end;//起始终止坐标 public float BtoE_time;//用时 float timer,lerp;//计时器和进度值 void Update ...
- SpringBoot-属性配置yaml自定义属性和值
SpringBoot-属性配置yaml自定义属性和值 SpringBoot-属性配置yaml自定义属性和值 在SpringBoot中yml/yaml文件可以自定义一些属性,以供注入给自定义bean对象 ...