当前位置: 首页 > 编程日记 > 正文

简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他...

函数式编程

Lambda

exec,eval和assert语句,repr函数


lambda语句

用来创建简短的单行匿名函数

print_assign = lambda name, value: name + '=' + str(value)
等同于
def print_assign(name, value):
    return name + '=' + str(value)
 

lambda需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。注意,即便是print语句也不能用在lambda形式中,只能使用表达式。

>>> ftwice = lambda s:s*2 
>>> ftwice(2) 
4

再如make_repeater函数在运行时创建新的函数对象,并且返回它。

image

image

yield表达式

类似于迭代器,生成器允许处理数据序列

不同的是生成器通过使用yi e l d表达式,可以尽量减少程序耗费的内存,同时还能在大规模数据集上提供类似迭代器的功能

map()函数
从iterA,iterB...中取出对应元素应用map

map(f, iterA, iterB, ...)

built-in functions often used with iterators.

returns a list containing f(iterA[0], iterB[0]), f(iterA[1], iterB[1]), f(iterA[2], iterB[2]), ....

map(f, iterable)基本上等于[f(x) for in iterable]

但在多元的情况下不同:


>>> list1 = [11,22,33]
>>> list2 = [44,55,66]
>>> list3 = [77,88,99]

map()只做了列内运算
>>> def abc(a, b, c):
... return a*10000 + b*100 + c
...

>>> map(abc,list1,list2,list3)
[114477, 225588, 336699]

列表解析做的是笛卡尔乘积

>>> [abc(a,b,c) for a in list1 for b in list2 for c in list3]

[114477, 114488, 114499, 115577, 115588, 115599, 116677, 116688, 116699, 224477, 224488, 224499, 225577, 225588, 225599, 226677, 226688, 226699, 334477, 334488, 334499, 335577, 335588, 335599, 336677, 336688, 336699]

等同于

result = []

for a in list1:
  for b in list2:
    for c in list3:
      result.append(abc(abc))

filter()函数

(可以被列表解析替代)


从iter中选择满足predicate条件的元素
filter(predicate, iter) 
returns a list that contains all the sequence elements that meet a certain condition
形式非常简洁 
existing_files = filter(os.path.exists, file_list)
 
reduce()函数
对iter中每个元素依次两两使用func
reduce(func, iter, [initial_value])

func must be a function that takes two elements and returns a single value. 

先算init=func(initial_value,A)再算func(init,B)再算func(func(init, B), C)...



sorted()函数
sorted(iterable, [cmp=None], [key=None], [reverse=False]) 
参考 http://wiki.python.org/moin/HowTo/Sorting
any()和all()函数
any() returns True if any element in the iterable is a true value 

all() returns True if all of the elements are true values
>>> any([1,1,1]) True >>> all([0,1,0]) False
Generator expressions
和list comprehensions的语法稍有不同
( expression for expr1 in sequence1if condition1...for exprN in sequenceNif conditionN)

Output: the successive values of expression

obj_total sum(obj.count for obj in list_all_objects())

Generators
functions that simplify the task of writing iterators, which

functools.partial()

partial function application
exec语句用来执行储存在字符串或文件中的Python语句。 

例如,可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。

>>> exec 'print "Hello World"' 
Hello World

eval语句用来计算存储在字符串中的有效Python表达式。 

>>> eval('2*3') 
6

assert语句用来声明某个条件是真的。 
当assert语句失败的时候,会引发一个AssertionError。 
image
repr函数用来取得对象的规范字符串表示。 
反引号(也称转换符)可以完成相同的功能。 
注意,在大多数时候有eval(repr(object)) == object。 

>>> i = ['item'] 
>>> `i` 
"['item']" 
>>> repr(i) 
"['item']"

函数修饰符通过介入函数的启动和关闭机制,调整一个已存在函数的行为

类的特殊方法


__init__(self,...)

在新建对象恰好要被返回使用之前被调用。

__del__(self)

恰好在对象要被删除之前调用。

__str__(self)

对对象使用print语句或是使用str()的时候调用。

__lt__(self,other)

当使用 小于 运算符(<)的时候调用。类似地,对于所有的运算符(+,>等等)都有特殊的方法。

__getitem__(self,key)

使用x[key]索引操作符的时候调用。

__len__(self)

对序列对象使用内建的len()函数的时候调用。

测试


对于规模更大的程序,测试框架必不可少。

在标准库中,unittest模块基于流行的xunit测试框架。doctest允许从shell会话取得输入。

参考:

Python中map()函数浅析

http://docs.python.org/2/howto/functional.html

Python特殊语法:filter、map、reduce、lambda、yield

http://www.dataguru.cn/blog-10716-1133.html

http://jgy3.ggclk.com/url?url=http%3A%2F%2Fmikecvet.wordpress.com%2F2010%2F07%2F02%2Fparallel-mapreduce-in-python%2F&v=4&i=6&q=map%20python%20lambda%20%20yield%20reduce%20filter&p=0&tr=0&at=0&ar=0&ab=0&mr=0&ir=0&kgr=0&nr=0&iar=0&sr=0

from: http://www.cnblogs.com/wei-li/p/3439182.html

转载于:https://www.cnblogs.com/GarfieldEr007/p/5280782.html

相关文章:

防止重复提交订单-(转)

防止重复提交 Button1.Attributes.Add("onclick", "this.value正在提交中&#xff0c;请等待……;this.disabledtrue;" this.GetPostBackEventReference(Button1)); 于是根据这个写了个只能提交一次的控件&#xff1a; publicclassButtonSubmitOn…

linux pps 包 网卡,linux下安装PPS

到官方下载FEDORA版RPM包。[talenliangshan Downloads]$ sudo yum localinstall PPStream.rpm已加载插件&#xff1a;axelget, fastestmirror, presto, priorities, refresh-packagekit, remove-with-leaves设置本地安装进程诊断 PPStream.rpm: PPStream-1.0.2-11.i386PPStream…

C#设置本地网络(DNS、网关、子网掩码、IP)

如今网络在我们的生活工作中所起的作用越来越大&#xff0c;可以说离开了网络我们就无法正常的工作和生活。作为程序员我们写的程序大多数也会跟网络相关&#xff0c;而想要使用网络首先要将机器的网络配置设置好。而手动设置的方法显然很不可取&#xff0c;所以我们要让程序帮…

Dynamics CRM2016 Web API之创建记录

前篇介绍了通过primary key来查询记录&#xff0c;那query的知识点里面还有很多需要学习的&#xff0c;这个有待后面挖掘&#xff0c;本篇来简单介绍下用web api的创建记录。 直接上代码&#xff0c;这里的entity的属性我列了几个比较典型的&#xff0c;和原来相比有区别的是选…

bootstrap轮播如何支持移动端滑动手势

1.下载滑动手势 js 插件&#xff1a;hammer.js //cdn.bootcss.com/hammer.js/2.0.8/hammer.min.js 2.写一个javascript命令调用hammer.js中的swipe功能 <script>$(function(){//添加移动端滑动var myElement document.getElementById(myCarousel)//id为轮播的idvar hmnew…

linux程序计数器,如何在C中打印程序计数器的确切值

小编典典您应该能够使用ARM编译器工具链中的__current_pc()内在函数来确定PC(ARM编译器支持许多与GCC相同的扩展)。*这是ARM特有的&#xff1a;int main () {printf("%#x\n", __current_pc());printf("%#x\n", __current_pc());printf("%#x\n", …

『转载』Debussy快速上手(Verdi相似)

『转载』Debussy快速上手&#xff08;Verdi相似&#xff09; Debussy 是NOVAS Software, Inc(思源科技)发展的HDL Debug & Analysis tool&#xff0c;这套软体主要不是用来跑模拟或看波形&#xff0c;它最强大的功能是&#xff1a;能够在HDL source code、schematic diagra…

大家好,新年快乐。

刚申请了个博客&#xff0c;祝大家新年快乐。 &#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d; So many children are playing zhu zhu pets at home.This t…

maven项目找不到pom.xml配置的dependency jar中的类问题解决方法

成功创建一个web项目后&#xff0c;假如我们在web.xml文件中&#xff0c;配置了spring的listener&#xff0c;在pom.xml中也已经作了依赖配置。部署 完项目后&#xff0c;启动项目&#xff0c;发现找不到spring配置的listner 类&#xff1a;org.springframework.web.context.Co…

红旗linux yum,更换红旗Linux: Asianux的yum源为网易源

测试环境&#xff1a;Linux系统版本Asianux4_x64&#xff1a;Linux localhost.localdomain 2.6.32-279.2.1.el6.x86_64 #1 SMP Tue Aug 14 11:42:24 CST 2012 x86_64 x86_64 x86_64 GNU/Linux本质上Asianux4_x64就是基于Redhat6企业版的。出现问题&#xff1a;安装完系统之后&a…

Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...

此人博客挺好的&#xff0c;推荐一个&#xff01; 一个基于Java Socket协议之上文件传输的完整示例&#xff0c;基于TCP通信完成。 除了基于TCP的二进制文件传输&#xff0c;还演示了JAVA Swing的一些编程技巧&#xff0c;Demo程序 实现主要功能有以下几点&#xff1a; 1. …

SuSE下VNCVIEWER没有出现界面,只有shell窗口的问题

首先正确配置&#xff0c;打开vncserver &#xff1a;1&#xff0c;实际上有三个服务&#xff0c;vnc1&#xff0c;vnc2&#xff0c;vnc3&#xff0c;对应着三个服务&#xff0c;先打开。 可以直接在shell下输入 #vncserver :1.也可以使用界面打开Network Service (xinetd),将服…

docker容器互联

link方式 http://blog.csdn.net/halcyonbaby/article/details/42112325 通过link方式创建容器&#xff0c;然后我们可以使用被link容器的别名进行访问。从而解除应用对IP的依赖。不幸的是,link方式只能解决单机容器间的互联。多机情况下&#xff0c;容器的互联需要其他的方式。…

glib 2.0 arm linux,glib源码安装使用方法

glib库是GTK和GNOME工程的基础底层核心程序库&#xff0c;是一个综合用途的实用的轻量级的C程序库&#xff0c;它提供C语言的常用的数据结构的定义、相关的处理函数&#xff0c;有趣而实用的宏&#xff0c;可移植的封装和一些运行时机能&#xff0c;如事件循环、线程、动态调用…

iOS 用自签名证书实现 HTTPS 请求的原理实例讲解

在16年的WWDC中&#xff0c;Apple已表示将从2017年1月1日起&#xff0c;所有新提交的App必须强制性应用HTTPS协议来进行网络请求。默认情况下非HTTPS的网络访问是禁止的并且不能再通过简单粗暴的向Info.plist中添加NSAllowsArbitraryLoads设置绕过ATS(App Transport Security)的…

WordPress Editorial Calendar插件权限安全绕过漏洞

漏洞名称&#xff1a;WordPress Editorial Calendar插件权限安全绕过漏洞CNNVD编号&#xff1a;CNNVD-201302-369发布时间&#xff1a;2013-02-22更新时间&#xff1a;2013-02-22危害等级&#xff1a; 漏洞类型&#xff1a;权限许可和访问控制威胁类型&#xff1a;远程CVE编号…

文件操作(ifstream、ofstream、fstream)

原文链接&#xff1a;http://blog.csdn.net/soar_ersa/article/details/3908943 转载于:https://www.cnblogs.com/MrYuan/p/5288264.html

linux error log 换行,日志提示

日志提示线上问题&#xff0c;需要看日志。控制台可以打印Mybatis操作的SQL语句。开发流程&#xff1a;第一步&#xff1a;加入依赖image.png第二步&#xff1a;在项目的resources中加入log4j属性文件image.png第三步&#xff1a;演示image.png扩展了解一、日志概念的介绍Log4j…

本页面添加至收藏夹

经常在网站页面上需要把本页面添加至收藏夹 <script type"text/javascript">function addMe() {var url document.location.href;var wTitle document.title;if (document.all) {window.external.addFavorite(url, wTitle);} else if (window.sidebar) {wind…

javascript——Array类型

今天这节教程不仅仅是阐述ECMAScript3的部分功能&#xff0c;同时也会阐述有关EXMASctip5的很多新的功能。 一、创建 因为它是一个引用类型&#xff0c;自然就需要在使用前先构造它。 我将分成两种方式来讲述 I、构造函数 1.空的Array实例 var colors new Array(); 2.初始化存…

iOS使用自签名证书实现HTTPS请求

原文链接:http://www.jianshu.com/p/e6a26ecd84aa 由于苹果规定2017年1月1日以后&#xff0c;所有APP都要使用HTTPS进行网络请求&#xff0c;否则无法上架&#xff0c;因此研究了一下在iOS中使用HTTPS请求的实现。相信大家对HTTPS都或多或少有些了解&#xff0c;这里我就不再介…

蜜蜂实训平台c语言考试答案,北理c语言上机答案(全)

小蜜蜂的不过,麻烦大家上百度找一下~1 Hello world让我们用C语言向世界问好。 最早的程序基本是这个样子的&#xff1a; 程序一&#xff1a;#include void main() {printf("Hello world.\n"); }程序二&#xff1a;#include int main() {printf("Hello world.\n&…

ecshop目录结构

ECShop 最新程序 的结构图及各文件相应功能介绍ECShop文件结构目录┣ activity.php 活动列表┣ affiche.php 广告处理文件┣ affiliate.php 生成商品列表┣ article.php 文章内容┣ article_cat.php文章分类┣ auction.php 拍卖前台文件┣ brand.php 品牌列表┣ captcha.php 生…

一劳永逸,iOS 网页视图控制器通用类封装

原文链接&#xff1a;http://www.jianshu.com/p/553424763585随着 H5 的发展&#xff0c;在 iOS 开发中&#xff0c;网页视图的使用率逐渐提升&#xff0c;为了增加代码封装度、减轻开发负担&#xff0c;因此通常会对网页视图进行通用类的封装&#xff0c;本文简单讲述网页视图…

enyo官方开发入门教程翻译一Layout之Fittables

Fittables Fittable包帮助你创建布局更合理的使用可用空间&#xff08;app都有这样的布局需求&#xff0c;但使用以前的web技术很难做到这一点&#xff09;。个人观点&#xff0c;现在移动Web开发框架中有很多都支持自适应布局&#xff0c;如senchatouch&#xff0c;但是enyo的…

c语言 栈结构存放数据类型,数据结构——栈的详解

栈和队列是两种重要的线性结构&#xff0c;从数据结构的角度看&#xff0c;栈和队列也是线性表&#xff0c;其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表&#xff0c;因此&#xff0c;可称为限定性的数据结构。但从数据类型角度看&#xff0c;他们是…

Verlet Integration

Verlet Integration Verlet 积分法是一种用于求解牛顿运动方程的数值方法&#xff0c;被广泛运用于动力学模拟以及视频游戏中。尔莱算法的优点在于&#xff1a;数值稳定性比简单的欧拉方法高很多&#xff0c;并保持了物理系统中的时间可逆性与相空间体积元体积守恒的性质。 基本…

[译] iOS 开发之新版 APNs 搭建必备知识

原文链接&#xff1a;http://www.jianshu.com/p/d8dba6c2c07a本文的大部分内容是对苹果关于 APNs 官方文档的翻译以及整理。 —— 由 稀土君 分享本文的大部分内容是对苹果关于APNs官方文档的翻译以及整理。 一、设备token和消息的生命周期 关于设备token以及推送消息的生命周期…

使用Application.GetResourceStream从XAP安装包加载任意资源

不得不说&#xff0c;WP7开发的资料真的是太少了&#xff0c;国内有句话叫“天下文章一大抄”&#xff0c;查Application.GetResourceStream的用法&#xff0c;找遍了整个网络&#xff0c;无非就那一两篇&#xff0c;而且写得还不完整&#xff0c;包括微软官方的例子。在花了近…

c语言知道算法写不出代码,这个代码怎么写算法啊,求教,我真的不会写算法怎么办#incl...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这个代码怎么写算法啊&#xff0c;求教&#xff0c;我真的不会写算法怎么办#include "stdio.h"#define N 3 //学生数3。struct Student //建立结构体。{int num;char name[20];float score[3];float aver;};int main(){v…