地道的 Python(二)
作者: Zhang Yang
列表推导
上文介绍了一个高逼格的创建字典的方法。那列表呢?依据蛋痛定律,它也一定有,可是它被起了一个很蛋痛的名字,叫列表推导:
先看看这种代码:
li = []
for a in A:
if a%2 != 0:
li.append(a)
看到代码第一行的时候,小编已经不想再看下去了,是的,这才真正的万变不离 C 语言。蛋痛指数直冲云霄了。
Python 里一行就应该搞定它
li = [a for a in A if a%2 != 0]
上文产生的列表包括:从列表A里挑出来的奇数的元素。高逼格吗?一行搞定。由于。这里的循环推断语句不是给 机器 看的,而是让 人 来理解的。
从左向右读就能够了:列表中包括元素a一方面来自于列表A,同一时候它符合除以2余数不为0的条件。
说了这么多。列位看官能够动手改改样例1。让它得到它应得逼格了吗?
def reach_age_limit(personal_info):
name, age, sex, yow, salary, tax, bonus = personal_info>split(',')
return f( sex == 'Male' and int(age) > 60 ) or
( sex == 'Female' and int(age) > 55 )
def calculate_person(personal_info):
name, age, sex, yow, salary, tax, bonus = personal_info>split(',')
return int(yow) * ( int(salary) - int(tax) + int(bonous) ) * 0.9
def get_name(personal_info):
name, age, sex, yow, salary, tax, bonus = personal_info>split(',')
return name
def count_person():
with open('data.csv') as f:
data = f.read()
target_persons = [ d for d in data.splitlines() if reach_age_limit(d) ]
groups = {}
for person in target_persons:
groups.setdefault(get_name(person),[]).append(calculate_person(person))
for key, value in groups.items():
print key, '--->', value
这就能够了吗?还有别的方法吗?另一个更高逼格的样例:
def count_person():
with open('data.csv') as f:
data = f.read()
groups = {get_name(person):caculate_person(person)
for person in data.splitlines()
if reach_age_limit(person)}
for key, value in groups.items():
print key, '--->', value
抽取出来的三个函数,如果聚集到某个类中,就更高 perfect 了。
样例讲评完了。本文就该结束了吗?不,不,不。让你猜到结局。小编的要蛋痛了。。。
如今业界火热的函数式编程,Python 怎么支持的? 一定有蛋痛的 Python 人做了些什么,让我们能够更高逼格一些。
Cache
从以下的样例開始。
def web_lookup(url, cache={}):
if url not in cache:
cache[url] = urllib.urlopen(url).read()
return cache[url]
这个函数有一个功能:打开指定的url;另一个附属功能:缓存之前打开过的url。严格来说,这违反了单一职责原则;蛋痛的 Python 人给出了例如以下的方案:
@cache
def web_lookup(url)
return urllib.urlopen(url).read()
def cache(func)
saved = {}
@wraps
def new_func(*args):
if args not in saved:
saved[args] = func(*args)
return saved[args]
return new_func
cache 函数里。针对被cache修饰的函数。做了一个针对输入參数和返回值的缓存。产生的新函数被返回。这样,每次web_lookup被调用的时候。实际上被调用的是输入、输出被缓存后的新函数,而不是字面原来的那样的函数。Python 支持同名函数,看官们还记得吗?
Combine
如果实现一个计算器,接收到按键序列28++32+++32+39
,使用 Python 得出计算结果
expr, res = '28++32+++32+39', 0
for token in expr.split('+'):
if token:
res += int(token)
这是 C 语言逻辑下的代码。而 Python 中蛋痛的人们全然能够不适用不论什么新增变量,直接使用三个函数进行组合:
res = sum(map(int, filter(bool, expr.split('+'))))
第一个函数filter(pred, seq) –> [t for t in seq if pred(t)],剔除不符合bool条件的元素。
第二个函数map(fun, seq) –> [func(t) for t in seq],这个实际上就是数学上的映射的定义,对于机器来说就是循环。可是 人 更关注的是映射关系(很高层次的领域),这样编译器更easy去优化(比如并行计算全部的序列)。
第三个函数sum。顾名思义就是对列表里全部元素。求和。
此时小编已满脑数学名词了,程序语言已经全然被抛弃:先剔除列表中的空串,然后映射字符串为整数,最后对全部元素求和。
All
之前介绍循环时用过一个样例。实际上它还能够更高逼格的实现:
ages = [42, 21, 18, 33, 19]
if all(map(lambda a:a>=18, ages)):
print 'All are adults!'
lambda用来构造一个函数,输入參数a,返回a>=18;
map将ages里全部元素映射为由True/False组成的列表;
all返回列表内全部元素是否都为True
看到这里。列位看官有感觉了吗?循环是给 机器 使用的绝低逼格东东,Python 程序猿们应该疏远它,避免它。
如今真的要说再见了,最后一句:
Python 装X之路其修远兮,吾辈将上下而求索。
地道的 Python(二)的更多相关文章
- python 二维数组读入
study from : https://www.cnblogs.com/reaptomorrow-flydream/p/9613847.html python 二维数组键盘输入 1 m = int( ...
- Python 二维码制作
Python 二维码制作 先介绍python 二维码制作的第三方库 QRCode .MyQR QRCode 生成这个二维码只用三行 import qrcode img = qrcode.make ...
- 如何写出优雅又地道的Python代码?【转载】
在Python社区文化的浇灌下,演化出了一种独特的代码风格,去指导如何正确地使用Python,这就是常说的pythonic.一般说地道(idiomatic)的python代码,就是指这份代码很pyth ...
- 你可能不知道的python
1.如何循环获得下标,使用 enumerate ints = ['a','b','c','d','e','f'] for idx, val in enumerate(ints): print idx, ...
- 【转】你需要知道的Python用法
在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性.一些可以说是非常有用,但却没有充分利用.考虑到这一点,我编辑了一些的你应该了解的Pyghon功能特色. 带任意数量参数的函数 你 ...
- 不得不知道的Python字符串编码相关的知识
开发经常会遇到各种字符串编码的问题,例如报错SyntaxError: Non-ASCII character 'ascii' codec can't encode characters in posi ...
- Python 基础系列一:初识python(二)基本数据类型
上节拾遗 1.编码转换过程,utf-8转换gbk 过程 经过解码(py27): x.decode('utf-8')-->unicode-->编码x.encode('gbk') ps:py3 ...
- python二维码生成器
周小董简书主页二维码.png 周小董博客主页二维码.png 现在,我们生活中到处可以看到二维码.它有啥好处呢?它具有信息容量大.可靠性高.可表示汉字及图象多种文字信息.保密防伪性强等优点. 我们生 ...
- Python二次编码、小数据池之心照神交
二次编码.解码.小数据池: encode(str:编码):参数编码方式,返回字节码. str_1 = "编码" str_2 = str_1.encode("utf-8&q ...
随机推荐
- [USACO07DEC]道路建设Building Roads
题目:洛谷P2872.POJ3625. 题目大意:给你n个点的坐标,有些点已经有边连通,现在要你连上剩下的所有点,求这些边的最小长度是多少(不包括原来的边). 解题思路:最小生成树,把所有边处理出来, ...
- lsof---查看你进程开打的文件
lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户 ...
- python 调试大法-大笨蛋的笔记
说在前面 我觉得没有什么错误是调试器无法解决的,如果没有,那我再说一遍,如果有,那当我没说 一.抛出异常 可以通过 raise 语句抛出异常,使程序在我们已经知道的缺陷处停下,并进入到 except ...
- 紫书 例题 10-23 UVa 10213(欧拉公式+高精度)
用欧拉公式V-E+F=2 V是顶点数,E是边数,F是面数 具体推导见https://blog.csdn.net/QWsin/article/details/53635397 要用高精度 #includ ...
- 【UVa 1347】Tour
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- Java Web学习总结(20)——基于ZooKeeper的分布式session实现
1. 认识ZooKeeper ZooKeeper-- "动物园管理员".动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始 ...
- springMVC的rest风格的url请求
rest是一个架构风格,用url来访问网络上的任何资源.rest的一种思想就是用http中的动作get,post,put,delete,来进行增删改查. 这里介绍的是springMVC的rest请求. ...
- POJ 2826 An Easy Problem!(简单数论)
Description Have you heard the fact "The base of every normal number system is 10" ? Of co ...
- CentOS 配置防火墙操作实例(启、停、开、闭port)
CentOS 配置防火墙操作实例(启.停.开.闭port): 注:防火墙的基本操作命令: 查询防火墙状态: [root@localhost ~]# service iptables status& ...
- [Java开发之路](6)File类的使用
1. 构造方法 构造方法 描写叙述 File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建一个新的文件实例. File(String parent , String ...