python和ruby语法的简单对比



进入交互解释器

python
irb / pry

设置编码

#coding=utf-8
#coding:utf-8

包管理

easy_install/pip gem
pip install Markdown

gem install Markdown

注释

python单行注释# 开头
python多行注释使用三个单引号(''')或三个单引号()。
'''
多行注释1
多行注释1
'''


ruby单行注释用#开头
ruby多行注释使用 =begin =end
=begin
多行注释1
多行注释1
=end


数据类型

python的数据类型有:数字、字符串、列表、元组、字典等
ruby的数据类型有:数字、字符串、数组、哈希表、区间、符号等


ruby的区间
.. 闭合区间, 包括右端的值
...半闭合区间, 不包括右端的值




String
都可以用单引号或者双引号,s = 'hello,dear!!!'
python
从左到右索引默认0开始的,最大范围是字符串长度少1
从右到左索引默认-1开始的,最大范围是字符串开头
获取字串 s[头下标:尾下标] 不包含尾下表元素


ruby
获取字串 s[头下标,长度]
获取字串 s[头下标..尾下标] 包含尾下表元素 ;s[头下标...尾下标] 不包含尾下表元素




Array
都可以用[],array = [1,2,3,4]


python获取子列表
array[0] 第一个元素
array[1:] 第二个到末尾的所有元素
array[1:3] 第二个到第三个元素(第二个到第四个之间的元素,不包括第四个)


ruby获取子列表
array[0] 第一个元素
array[1..-1] 第二个到末尾的所有元素
array[1..3] 第二个到第四个元素(第二个到第四个之间的元素,包括第四个)
array[1...3] 第二个到第三个元素(第二个到第四个之间的元素,不包括第四个)



python的元组
元组类似于List(列表),用()标识,内部元素用逗号隔开。但是元素不能二次赋值,相当于只读列表
tuple = (1,2,3,4)


哈希
python
dic = {k1:v1,k2:v2}
dic[k1]


ruby
dic = {k1 => 'v1','k2' => 'v2'}
dic = {:k1 => 'v1',:k2 => 'v2'}
dic = {k1: 'v1',k2: 'v2'}
dic[k1]
dic[:k1]



条件判断

python程序语言指定 0 、null、false 为假
ruby程序语言指定 nil、false 为假


python
if condition :
code..
elif codition :
code..
else :
code..


ruby
if/unless condition [then]
code..
elsif condition [then]
code..
else
code..
end


简单语句
python
if codition : code
ruby
code if condition


循环

python
while condition :
code..
else :
code..


for var in sequ:
code..
else :
code..




ruby
while conditin [do]
code
end


for var in sequ [do]
code
end




函数

python
函数代码块以def关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
Return[exp]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。


所有参数(自变量)在Python里都是按引用传递。如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。
def say(sth,age = 10,*var_params):
'函数说明文档'
code
return [exp]


匿名函数
python 使用 lambda 来创建匿名函数。
lambda只是一个表达式,函数体比def简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda [arg1 [,arg2,.....argn]]:expression






ruby
Ruby 中的每个方法默认都会返回一个值,这个返回的值是最后一个语句的值.
def say(sth,age = 10,*var_params)
code
end



在Ruby中,{}或do...end之间的代码是一个代码块。
代码块只能出现在一个方法的后边,它紧接在方法最后一个参数的同一行上,一般由yield关键字调用代码块中的代码。






模块

python
模块让你能够有逻辑地组织你的Python代码段。
把相关的代码分配到一个 模块里能让你的代码更好用,更易懂。
模块也是Python对象,具有随机的名字属性用来绑定或引用。
简单地说,模块就是一个保存了Python代码的文件。模块能定义函数,类和变量。模块里也能包含可执行的代码




ruby
模块(Module)是一种把方法、类和常量组合在一起的方式。模块(Module)为您提供了两大好处。
模块提供了一个命名空间和避免名字冲突。
模块实现了 mixin 装置。
模块(Module)定义了一个命名空间,相当于一个沙箱,在里边您的方法和常量不会与其他地方的方法常量冲突。


python
如果一个 Python 函数,类方法,或属性的名字以两个下划线开始 (但不是结束),它是私有的;其它所有的都是公有的。


类方法
Python2.2以后可以使用@classmethod装饰器来创建类方法.其第一个参数是类,约定写为cls


实例方法
当定义你自已的方法时,你必须将 self 作为每个方法的第一个参数列出,包括 __init__。


在 Python 中没有常量


class Vector:


class_var = 0#类变量
def __init__(self,a,b):
'构造函数'
self.instance_var = a #实例变量
code


def __del__(self):
'析构函数'
code




@classmethod
def say(cls):
code..



继承
python
支持多继承
class A:
...
class B:
...
class C(A,B):
...






Ruby
Ruby中一切都是对象,包括一个常数.
比如可以用.class属性来查看一个对象的类型,你可以看下1.class,会发现常数1的类型是Fixnum,1不过是Fixnum的一个实例。


Ruby中的类以class开始 以end结束,类名首字母的约定是大写。
Ruby中的方法以def开始 以end结束,方法名首字母的约定是小写。
Ruby中的局部变量名首字母的约定是小写。
Ruby中的构造函数名称为initialize。
Ruby中的成员变量(实例变量)前导@符,在initialize里进行声明与初始化。
Ruby中的属性用attr, attr_reader, attr_writer, attr_accessor。
Ruby中的全局变量前导$符。
Ruby中的常数(常量)用大写字母开头,约定是全部大写。


initalize方法


当Ruby创建一个新对象时,它总是会寻找一个名为 initialize 的方法并执行它.因此,我们可以简单通过一个initialize方法向实变量中加入缺省值。


class Person


def initialize()
puts hello!
end


# def initialize #()省略一样
# puts hello!
# end


#参数默认值
# def initialize (param = 1900lab) # 参数带有默认值
# puts hello! + param
# end


#可变长参数
def youInput(*names)
puts input #{names.join(,)}!
end
end


p = Person.new()
和 p = Person.new 一样,没有参数()可以省略。


属性
目的是快速生成读写方法


attr :attr1, key
attr_reader :attr1, :attr2
attr_writer :attr1, :attr2
attr_accessor :attr1, :attr2


attr 一般后跟一个符号参数, 第二个参数是一个 bool 参数,用于指示是否为符号参数产生写方法。它的默认值是 false,只产生读方法,不产生写方法。
attr_reader 一般后跟一个符号参数,定义一个或多个只读的属性,用于指示为符号参数产生读方法。
attr_writer 一般后跟一个符号参数,定义一个或多个只写的属性,用于指示为符号参数产生写方法。
attr_accessor 一般后跟一个符号参数,定义一个或多个可读写的属性,用于指示为符号参数产生读写方法。



 

评论关闭