- 浏览: 117939 次
- 来自: ...
文章分类
最新评论
刚看完Python手册中的Tutorial部分,以类C程序员的角度观察了一下Python,文中涉及的所有Python与Java,C++不同的地方都只有一个原因:Python不是Java或C++,就像bitflying说的:“However, *DO* we really need another dynamic language just like JAVA? As a scripting language, it's important for users to keep it simple, clean and easy to use. ”
See Also: http://blog.csdn.net/chelsea/category/20285.aspx
一. 语法
1. 按名称调用,不是按类型调用
Python在一切可能的地方弱化了类型:不能/无需声明函数返回值类型,不能/无需声明函数参数类型,对名称的查找/检查在运行时进行;这样的机制带来了几个后果:
大部分情况下子类实际上将父类当作一个普通的类库来调用,而接口或者抽象基类几乎没有存在的理由;虽然Template Method之类的模式依然起作用,但在构建Framework方面,“继承”已不再重要如昔 一个例子就是for迭代,只需按约定提供__iter__()返回定义有next()的对象,即可用于for value in XXX 形式的迭代语句中 一个例外是Exception的继承,是因为try/except是少见的根据类型而不是名称来工作的,构建一个Exception的继承体系对于异常处理来说还是很方便的
|
2. Tuple Anywhere
牵强一点,Tuple几乎是传统的DTO(数据传输对象)模式在语言级别的直接支持;当然,这只是Tuple众多应用之一 Tuple是Python基本数据结构之一,其思想十分简单,就是用一个单一的量来代表一堆任意数据松散的集合,其显而易见的一个用处就是在一次函数调用中返回多个值; 在非单根结构,强类型的语言如C++中,是很难实现能够容纳任意多元素的Tuple的,标准库提供了一个退化的Tuple,std::pair<F,S>,只能容纳两个元素,boost和loki提供了能够容纳最多两位数元素的Tuple,绝大多数情况下也够用了; 或曰:在像Java这样的单根语言中,Tuple不就是Object[]吗?是的,如果Tuple仅限于容纳多个元素,它就是只读的Object[]; 然而,Python为Tuple配备了Automated Tuple Packing & Automated Sequence Unpacking (自动化的打包/拆包),使Tuple获得了及其方便和强大的表达能力
更多的时候,Tuple为其它的Python语法提供背后的支持
|
3. Decorator:面向属性编程
Python也有类似.Net的Attribute,Java的Annotation的机制,叫做Decorator,不过目前只能用于修饰function或method,不能用来修饰class;这类机制的用处不必多说,主要是用于正交的分离职责,最终各种运行时,平台,或者工具会将各种分离的职责合并成一个功能完整的可执行体;PEP 318给出的例子有:
|
4. 无可比拟的参数机制
1. Pass object reference by value, hehe2. 任意参数,避免了对参数个数的依赖,全面超越Unary,Binary的表达能力允许用一个参数占位符来表达运行时的多个参数,使Python可以写出不依赖参数个数的通用算法,将函数、过程、谓词区分为零元、一元、二元已经不像在其它语言中那样迫不得已 比如说通用算法map,C++提供了map的一元形式:map(unary_functor, begin, end),那么如何使map适用于二元算子呢?通常有两种做法:
Python使你可以写出map的通用形式: def map(oper, *sqs): #simulate standard map() 或者,使用内置的zip函数,更紧凑一点: def map(oper, *sqs): #another way to simulate standard map() 是的,这就是任意元都通吃的map,只有一行代码而已;我没有看过Python源代码,不知道真正的map是如何实现的 测试一下: def testUnaryMap(self): def testBinaryMap(self): ...... 3. Keyword参数,避免了位置依赖,极大提高可读性,降低错误倾向参数不宜过多基本是普适的,但不是人人都遵守,在C++, Java中,如果参数比较多,又都是同一类型,对客户程序员来说简直就是恶梦,他要仔细核对参数的位置,不要将相同类型的参数弄颠倒了,编译器和IDE都帮不上什么忙; 另一个不便之处就是无论你的函数声明、定义时参数的名字多么具有可读性和意义明显,编译之后就只剩类型信息了 然而Python提供了期待已久的根据参数名字传递参数的特性,基本解决了前面两个问题,观察一下下面这行代码: pathCtrl = wx.TextCtrl(self, -1, "", (30, 50), (150, 20)) 你知道,或者说你记得住(30, 50),(150, 20)哪一对是位置,那一对是大小吗?再看下面这一行 pathCtrl = wx.TextCtrl(self, -1, "", pos=(30, 50), size=(150, 20)) 真是清晰舒适啊
|
5. 语法糖衣
-
for/else, while/else: 适用于方便的指定集合中所有元素都不满足某谓词时的行为
传统代码 |
Python的for/else |
int i = 0; for(; i < len; i++){ if (xxx) break; } if (i == len) { ... } |
for x in range(n): |
-
try/except/else,try/finally:适用于方便的指定“清理”行为
这两组语句不可混合使用,给出的理由是当except子句和finally子句同时存在时逻辑上无法证明先执行哪个是普适的合理的,呵呵 else子句当try块没有抛出异常时被执行 finally则用于任何原因离开try块时执行,当然,断电除外 |
-
lambda
在函数是一级公民的语言中,lambda是可有可无的 善用是糖衣,滥用则是毒药,主要是影响可读性和可维护性 |
-
String Literals
现在流行的语言几乎都提供了丰富的String处理函数,但如何方便的表达String literal, 很多语言却重视不够,尤其是对于转义字符和换行、空白的处理; 即当字符串中需要转义的字符比较多或字符串很长需要换行时,如何使字符串依然能够方便直观的书写;C# 提供了 @,Python则提供了 r 和""" """,更为强大和方便
总结一下:
|
-
other
list comprehension generator expression yield... |
二、运行时
1. 函数是一等公民
函数本身是一对象,称作function object
可以用变量命名,可以提供给过程作为参数,可以由过程作为结果返回,可以包含在数据结构中 |
2. 类本身是对象,一切数据类型都是对象
与C++不同,在那里,类定义只存在于编译时,运行时只有实例化的对象;在Python中,类定义与类实例一样,都是对象,都在运行时平等的存在;事实上,Python所有数据类型都是对象; 在类中定义的一切对象都叫做类的“属性”,包括数据和method对象等;有效的“属性”是类对象被创建时所声明的对象,但类对象和实例对象都可以动态增删“属性”,对增删之前的已经创建的实例或对象没有影响,只影响增删之后的代码 类对象和实例对象都可以动态修改“属性”,即对属性重新赋值,对修改之前和之后创建的实例都有影响 通俗一点讲就是类可以动态的随时增删成员,对成员重新赋值(包括将函数对象指向另外的函数体),因此可以在运行时动态调整、重新组装类的行为,实现诸如mixin之类灵活机制
|
三. Python与软件工程
1. Built-in Unit Test
标准模块中包含doctest, unittest,test等用于进行各种测试 其中doctest允许你将测试写在函数的注释中,这对于阅读代码的人理解函数的使用有很大的帮助 unittest基本类似JUnit
|
2. 访问控制
不知为何Python没有提供像C++和Java那样的访问控制,无法控制在module中定义的function和class的可见性;class中定义的function和variable倒是可以通过不少于两个下划线的前缀和不多于一个下划线的后缀标明这是class“私有”的. 在Python中文邮件列表问了一下,感觉至少有三种workaround:
1, 对于class中打算私有的函数定义以两个下划线开头 class SomeClass: SomeClass().__private_func() #AttributeError: SomeClass instance has no attribute '__private_func' 2,对于module中打算私有的function或class,定义到单独的module中,在package的__init__.py中定义__all__,使其不包括这个单独的module 并且不能在其它module的全局空间中import这个单独的module;例如,包结构: util/__init__.py /private.py /pub.py in util/__init__.py: __all__=["pub"] in util/private.py def private_func(): in util/pub.py def pub_func(): import private private.private_func() 客户代码: from util import * 但如果客户from util import private 还是可以使用private module的
3, 将打算私有的代码以可交互语言编写扩展,并以二进制提供
以上方法都不尽如人意,基本上,问题是在Python中有没有访问控制的必要?什么情况下会有?如果有必要的话应该怎么控制呢? 我不知道 |
发表评论
-
The Object Primer
2004-12-11 11:21 5891,书名 被翻译成“ ... -
错误处理规范
2004-12-11 16:47 757错误处理规范 〇、概念澄清 概念 解释 错误 ... -
Java,误解为何如此之深
2005-08-24 13:50 593前几天被电话面试,问J ... -
Java:画蛇添足的编码规范
2005-09-02 13:13 607前几天公司培训编码规范: 第n条: ... -
synchronized : 规则, 推论与实践
2007-07-23 22:32 46414.3.Synchronization. Rule ... -
交互设计: 股市帮凶
2008-05-04 21:30 642同事 Y 在线操作股票时, 把"买入"点成 ... -
交互设计: 火车上的厕所
2008-05-26 17:17 606有人在动车组的厕所前等了很久, 直到乘务员路过说厕所是被锁住了 ... -
设计原则与模式: 案例介绍--CppUnit
2008-06-01 20:15 613设计原则与模式: 案例介绍--CppUnit CppUnit ... -
工作流:形参,实参,相关数据
2004-12-11 11:40 671关于形参,实参,相关数据 一、形参(FormalParame ... -
工作流:第一次发版,过程总结
2004-12-11 11:42 709交流 即时讨论:小组成员咫尺之遥,有问题立即提出并解决 ... -
工作流:第一次发版,设计总结
2004-12-11 11:43 610整体 面向接口:消息系统,持久系统等,其实现都是可替换 ... -
Beyond Workflow : An Introduction to Vitria BusinessWare
2005-09-26 10:13 803一、简介 Busines ... -
Vitria BusinessWare: 存储与访问安全
2006-03-26 15:45 746事实上,BusinessWare使用LDAP做为存储机制和 ... -
Vitria BusinessWare: 平台与软件总线
2006-04-01 12:59 838经过一段时间的使用 ... -
Vitria BusinessWare: Web Services
2006-04-01 14:30 739BusinessWare的Web Services ... -
Web Services:自洽,编码,交换模型
2006-04-01 16:02 6731, 自洽 以前曾经写过: 目前WebServi ... -
Web Services:WSDL 1.1 规范中的几个错误
2006-04-01 16:40 720读完了WSDL 1.1的规范,令人惊讶的是发现似乎例子中有几个 ... -
C++/CLI:被忽视的集成技术
2006-05-17 20:02 755十几行代码,就使一个重要的旧系统组件,完全融入了基于.Ne ... -
AJP/JK:异构Web平台的集成技术
2006-05-25 21:44 708Tomcat Connector 可以将Tomcat ... -
Vitria BusinessWare: 事件与端口
2006-05-27 17:24 656Event BusinessWare是一个事件驱动的系统 ...
相关推荐
CHAPTER 12: THE PYTHON PROGRAMMING LANGUAGE CHAPTER 13: THE MARIADB SQL DATABASE MANAGEMENT SYSTEM CHAPTER 14: THE AWK PATTERN PROCESSING LANGUAGE CHAPTER 15: THE SED EDITOR PART V: SECURE NETWORK ...
This edition also incorporates notes about prominent enhancements in the imminent Python 3.1 release, which is intended to subsume Python 3.0 (in this book, Python 3.0 generally refers to the language...
Python is a popular general purpose programming language which is well suited to a wide range of problems. 1 Recent developments have extended Python’s range of applicability to econometrics, ...
PEP 486: Make the Python Launcher aware of virtual environments PEP 488: Elimination of PYO files PEP 489: Multi-phase extension module initialization Other Language Changes New Modules typing ...
Python has become the de facto standard scripting language in the computer graphics industry due to its simplicity, readability, and extensibility. It is supported by a wide range of software ...
Programming Python, 2nd Edition 目录如下,需要下载的朋友不要错过哦~ Programming Python, 2nd Edition By Mark Lutz Publisher : O'Reilly Pub Date : March 2001 ISBN : 0-596-00085-5 Pages : 1256 ...
The Python Language **2.1 First Steps** Getting started with Python involves familiarizing yourself with basic syntax and semantics. Python emphasizes code readability and allows programmers to ...
The chapter introduces programming as a set of instructions, or statements, written in a specific programming language that a computer follows to convert raw data into meaningful information....
15.4 The First Functional Programming Language: LISP 624 15.5 An Introduction to Scheme 628 15.6 COMMON LISP 645 15.7 ML 645 15.8 Haskell 649 15.9 Applications of Functional Languages 653 ...
Assembly Language for Beginners.pdf Bayesian Networks & Bayeslab.pdf Category Theory for Programmers.pdf Computer Vision Algorithms and Applications.pdf Data Science and Analytics for Ordinary People....
'Answer': 'Python is a high-level programming language.', }, ] ``` 4. **打包和导出** 最后,我们可以使用genanki将模型和卡片打包成一个Anki导入文件(.apkg格式): ```python my_deck = genanki.Deck...
[Language](https://img.shields.io/badge/language-Python%20%2F%20C++%2011-orange.svg) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE.md) ![Progress]...
Programming Language jieba分词中的generator: TorchText中新的API python中的@: PyTorch中的ganter() PyTorch内存够用但是显示out of memory: 尝试一下清空缓存:torch.cuda.empty_cache() 待整理文章 推荐系统 ...
Note that this guide is not a C++ tutorial: we assume that the reader is familiar with the language. Header Files In general, every .cc file should have an associated .h file. There are some common ...
1. **Maya的编程语言**: Maya主要支持两种编程方式,MEL(Maya Embedded Language)和Python。MEL是一种基于命令行的脚本语言,早期版本的Maya主要依赖MEL。Python自Maya 8.5版本开始引入,并在后续版本中逐渐成为...
程序设计语言(Programming Language)是人与计算机之间沟通的桥梁。它们允许我们用易于理解的方式描述算法,然后由编译器或解释器转换为机器可以执行的指令。程序设计语言分为编译型和解释型两种类型,编译型语言如...
基于项目的学习编程:通过构建项目和提高技能来学习每种编程语言