目录:

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)) #
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函数:

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()-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语法技巧的更多相关文章

  1. 初试Python语法小试牛刀之冒泡排序

    Python很火,心里很慌,没吃过猪肉,也要见见猪走路. 看了几天Python的语法,大概初步了解了一点点,https://www.liaoxuefeng.com/wiki/0014316089557 ...

  2. 一些你需要知道的Python代码技巧

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

  3. 鲜为人知的 Python 语法

    所有人(好吧,不是所有人)都知道 python 是一门用途广泛.易读.而且容易入门的编程语言.   但同时 python 语法也允许我们做一些很奇怪的事情.   使用 lambda 表达式重写多行函数 ...

  4. 由ArcMap属性字段自增引出字段计算器使用Python的技巧

    1.前言       前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQL Server中对于数值型字段可以设置自增.所以我打开ArcCatalog查看发现只提供默认值 ...

  5. 对 Python 语法不够了解导致的 bug

    对 Python 语法不够了解导致的 bug. `in` '20' in '11264,6144,4096,3072,2048,1024,300,30' Out[7]: True a_list = ' ...

  6. python 笔记2:python语法基础

    python语法学习笔记: 1 输入输出 input(),print(). name = input('input your name : ')print('hello ,'+name)print(& ...

  7. python语法快速入门(1)

    http://www.runoob.com/python/python-tutorial.html Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节.类似于PHP和Perl语言 ...

  8. python语法笔记(四)

    1.对象的属性     python一切皆对象,每个对象都可能有多个属性.python的属性有一套统一的管理方案. 属性的__dict__系统     对象的属性可能来自于其类定义,叫做类属性:还可能 ...

  9. python语法-[with来自动释放对象]

    python语法-[with来自动释放对象] http://www.cnblogs.com/itech/archive/2011/01/13/1934779.html 一 with python中的w ...

随机推荐

  1. mind map 思维导图

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. JAVA字符串与整形、浮点类型之间的相互转换总结

    1.字符串转化为整形.浮点类型 String s = "100"; //方法一 int a = Integer.parseInt(String s); Long.parseLong ...

  3. springboot#配置文件处理

    1. 加载自定义属性文件 2. 通过bean聚合相关属性 1. 在启动类上通过如下注解可以加载自定义的属性文件 @PropertySource(value = {"classpath:pro ...

  4. 同源策略、跨域、json和jsonp

    同源策略 源(origin)就是协议.域名和端口号.若地址里面的协议.域名和端口号均相同则属于同源. 以下是相对于 http://www.a.com/test/index.html 的同源检测 • h ...

  5. 078、Java数组之数组的引用传递

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  6. 题解 P3258 【[JLOI2014]松鼠的新家】

    树链剖分板子题 先说点别的 小熊维尼啊,嘿嘿嘿. 写题经历 悲惨命运:树剖调了2天,一直90分,死活不AC,调出了心病,快下课时改了一下数据范围,A了--.(刚开始数组开了800100,改120010 ...

  7. python-python基础6(面向对象)

    一.面向对象编程 编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马 ...

  8. python2学习------基础语法3(类、类的继承、类成员函数、防御式编程)

    1.类的定义以及实例化 # 类定义 class p: """ this is a basic class """ basicInfo={&q ...

  9. Centos上安装FastDFS

    更新yum源 cd /etc/yum.repos.d wget http://mirrors.aliyun.com/repo/Centos-7.repo yum update 安装gcc(编译时需要) ...

  10. 【pwnable.kr】 brainfuck

    pwnable.kr第二关第一题: ========================================= Download : http://pwnable.kr/bin/bfDownl ...