zoukankan      html  css  js  c++  java
  • From Cpp to Python

     

    C++程序员的Python初学指南

    ::-- Roka [2007-03-26 14:46:55]

    Contents

    1.    说在前面

    2.    正文

    1.    Python对于C++的特色

    3.    说在后面

    4.    交流

    1. 说在前面

    这篇短小的文章只是把一时想到的东西记了下来,肯定有很多不足,大家就作为娱乐吧:)

    首先不要太多考虑怎样开始Python,你仅仅需要的只是开始的行动。Python是及其直观的语言,特别是当你有其他相关语言编程经历时。

    现在就下载适合你系统平台的Python分发版。(是Linux?那你可能已经准备好了;是Windows?那就下载二进制安装文件[python.org]或是activestate安装文件吧)

    按照一些网上的教程你就可以开始你的手指运动了。你可能需要一个编辑集成环境。

    -- 我发现SciTEPyScripter对于初学者是个不错的选择。

    2. 正文

    == C++Python ==

    你了解C++,C或是Pascal

    那么你已经了解了if-then-elsewhile,和for等结构控制语句了。

    下面有一些对于熟悉C++的你应该注意的。

    Python里没有switch语句。

    你只能使用分段的if/elif/else语句直到你希望的结束。

    Python里没有操作符。

    如果你下载的是2.5版本,那么在这个版本里提供了一个

    x = true_value if condition else false_value用法来对应操作符。

    更一般的技巧是使用

    condition and true_vale or false_value

    忘记new/delete吧。

    要建立一个对象的实例,使用new A = A()

    要删除一个存在的实例只要让它的名字空间失效或显式的绑定到None上:new A = None

    忘记"for(x = 0; x < 10; x++)"吧。

    Python使用迭代式的循环。

    这有点像C++里面的"for(listiter = mylist.first();listiter != mylist.end(); ++listiter)"

    强制执行到n次循环可以使用"for i in range(n):"语法。

    内置的range生成一个序列[0,1,2...,n-1]

    注意下面初学者常见的不正常用法:

     list1 = [ 1, 2, 3 ]

     for i in range(len(list1)):

          # list1[i]进行某些操作

    Instead do:

     for elem in list1:

          # 对在每次循环中指向list1中一个元素的elem进行某些操作。

    如果真的想得到list的索引,请用enumerate,如:

     for i,elem in enumerate(list1):

          print "The %d item of the list is %s" % (i,elem)

    (注意到输出字符串时使用的占位符了吗?他们就是从C里面借鉴的。)

    忘记大括号{}表达吧。

    由于某些原因,这个问题对于一些人很重要,但同时也是一次机会-让你的程序

    正常的缩进,并且远离括号。

    个人认为最好把你的编辑器设置为替换所有的tab为空格(这也是Python官方的推荐)。

    你也可以全部使用Tab,但切忌不要混用。

    如果你制定过项目的编程规范,那你会发现这会帮助你节约不少时间。

    (至少免去了30分钟以上关于括号位置的争论)

    不能忘记的小括号()

    调用一个对象的方法时你必须使用小括号。(不用多说了)

    不要再使用变量去思考地址和存储位置,学会考虑为绑定在一个名字上的值。

    尽管这样我还是经常使用变量赋值,当然我应该使用的是命名绑定

    2.1. Python对于C++的特色

    有什么是Python超越C++独特的功能呢?

    高级特性:动态验证(dynamic typing)(又被称为“duck typing”

    动态验证能大幅度提高开发效率。

     - 没有变量定义

     - 没有方法类型验证

     - 没有必要定义接口

     - 没有模版化的集合

     - 没有不同参数类型的方法重载验证

    (如果可以的话,你可以认为没有类型的概念。)

    什么?没有在编译时的静态类型检查??

    确实,没有。

    如果你的方法需要一个类型X的对象,你尽管像X一样的使用它。

    如果这不是一个X,你可能会吃惊这也许不会是一个问题。

    这里是一个简单的调试例:

    def printLengthOf(x):

        print "Length of x is", len(x)

    每一个对象都有一个__class__属性,每个类都有一个__name__属性。C++里面,我不得不通过

    复杂的变形来避免写出变量名,可能不直观的用“void*”调用。或看下面的例子:

    def printLengthOf(x):

        print "Length of x is", len(x)

    x可能会是一个集合类,或者是一个十分类似集合的用户定义类来支持len(如__len__方法的实现)。

    这个类甚至不需要在你编写printLengthOf时实际存在,它可能在几年后才有真正的实现。

    一个互动解释器。

    这是一个很好的调试工具,不必进入编译/连接/调试循环。

    同时也是一个很好的文档系统,可以通过键入help(obj)来得到obj函数或方法的帮助。

    语言的内嵌类型list, tuple(一种不可变list, dict(类似在C++ STL里面的map<x,y>)和 set

    Python是动态验证语言,不必模版化类型的集合,只用迭代它们并使用它们的对象。

     list看起来像:[123“aaa", [1,2]]

     tuple看起来像:("Bob", "Roka", "12 34")

     dict看起来像:1”jack", 2:"bob"

     set看起来像: set("a","b","c")

    语言内嵌stringunicode类型

    多从变量赋值。能分解一个list为独立变量:

     a,b,c = 1,2,3

     a,b,c = [1,3,5] (会把1赋值给a2赋值给b3赋值给c

    忘记C语言里老土的变量值a,b交换方法: a ^= b; b ^= a; a ^= b;

    我们只要:a,b = b,a 就好了。

    复合返回类型。

    想在函数a里返回34个值?那就返回它们把!

    不用再make_pair<>模版,或使用结构体来处理复杂的返回类型等,

    会像下面的样子:

     def func():

          return 4,5,6

     a,b,c = func()

    灵活的多行引用。

    引用字符串能使用""s, ''s (""" """, ''' '''),三重引用能使用于多行。

    内嵌文档字符串。

    如果有一个如下写法的函数:

     def func():

          """A function that returns 3 consecutive ints, starting with 4"""

          return 4,5,6

    那么在互动解释器里键入help(func),你就能看到刚刚的说明文字。这叫作文档字符串,

    只能是对象(类,函数,模块)才能拥有。

    一个极大的通用模块库。

    包括SQLite数据库和TK图形库

    3. 说在后面

    PS:你会比学习Java,Perl跟快的掌握Python,学习那些语言你一定会问如何掌握XX语言?”

    我用过Jave并且深受Perl折磨。比起PerlPython 1)没有什么变态的符号和语法,2)性格会更成熟(Perl“open x or die”呵呵)

    Java代码又是如此臃肿(大量不必要的垃圾代码)。

    但这决不说明精通Python是容易的,记住下面的信条吧:

    "mastering" a language takes years, whatever the language.

    你还在看吗?不要浪费时间了,快下载一个python开始吧。

    4. 交流

    ·         好的!建议归类到FromXxxToPython -- XX Python 系列文章 -- ZoomQuiet

  • 相关阅读:
    C++中用Int转成bool时,只有0是false,其他都是true。这个和其他语言很不一样,注意不要掉坑里了。
    C# 获取动态验证码?
    Silverlight单元格事件
    LDAPHelper
    Perl内部保留变量(系统变量)
    WebSphere MQ基础命令
    老鼠, 老虎傻傻分不清楚之Double.NaN
    TextBlock or Label?
    如何阅读代码
    EDID
  • 原文地址:https://www.cnblogs.com/SunWentao/p/1188745.html
Copyright © 2011-2022 走看看