[原创][连载]nim与python的

发布时间:2019-10-15 09:03:58编辑:auto阅读(1877)

    nim与python的异同

    名词:方法与函数同义.仅仅是语言规定差异.在本文中不做区别.
    1. python都是指def定义的处理过程
    2. nim的 proc有返回值, func没有返回值(0.19版之后出现)
    3. c++的[方法(method)]专指类中的函数.
    4. pascal的方法(procedure)指无返回值的处理,函数(function)指有返回值的处理
    5. c中的方法(function)指无返回值的处理,函数(function)指有返回值的处理
    

    主模块的判断

    • python
      if __name__ == “__main__”:
        pass
    • nim
      if isMainModule:
        discard

    空代码-为保持缩进的占位符

    • python
      pass
    • nim
      discard

    缩进:

    • python用4个空格
    • nim用2个空格

    文字串的格式化常用形式:

    • python:
    1. print “hello, %s!”%(“ world”) #python2
      print(“hello, %s!”%(“ world”)) #python3
      print(“hello, {}!”.format(“ world”)) #python3
    2. print("hello, {0}! your name is {1}.".format(" world","rock")) #python3
    • nim也有类似用法:
    1. echo(“hello, $1!” % “ world”)
      或者不加括号也可以
      echo “hello, $1!” % “ world”
    2. echo "Hello, $2! your name is $1." % ["rock","world"] #输出顺序变化了
    nim里文字串的操作符%不是默认操作符,需要在使用前引入strutils包.否则不能使用,在编译时会报错.
    import strutils
    这样就会给为文字串增加很多功能, 比如上面的%操作符

    方法调用:

    • python是传统的[对象.方法]调用写法
    • nim 既可以用传统OOP风格的[对象.方法],也可以用[方法(对象)/方法 对象]调用,这被称为UFCS(Uniform Function Call Syntax-通用方法调用语法).后一种风格类似C或pascal等命令/指令编程语言,两者效力与结果相同, 比较灵活.
    UFCS
    1. 要求方法(proc)或函数(func)的第一个参数是要操作的类型.

      proc len2(value:string):int =
          处理过程省略
      let a = “” #a的类型自动推导. 等同于 let a:string = ""
      len2(a) == a.len2 #nim可以不写函数调用的括号
    2. 类的方法(proc/func/method)要求第一个参数是类的类型.
    • python

      class Person:
          def makelove(self, spouse)→Person: # python3写法
              省略
      person = Person()
      baby = person.makelove(spouse)
    • nim

      type
          Person = object
      
      proc makelove(self:Person, spouse:Spouse):Person =
          省略
      person = Person()
      baby = person.makelove(spouse)
      #或者
      baby = makelove(person)

    模块导入

    • python
    1. import os

      os.exists(“./testfile”)
    2. from os import *

      导入该模块下的所有内容
      exists(“.testfile”) # 这里使用os模块内的函数[exists]不需要加上模块名前缀
    3. import json as jn #将模块引入后起个别名使用
    4. from os import path
    5. from os import path as syspath
    • nim
    1. from os import nil #等同于python的[import os].这里不导入模块内的内容,而只是将模块本身导入.

      os.existsFile(“./testfile”)

      如果不加上[import nil]那么默认是导入该模块下的所有内容,而不需要在调用之前加上模块名

    2. import os

      import os # 这里导入os模块
      existsFile(“.testfile”) # 这里直接使用os模块内的函数[existsFile].
      等同于python的[from os import *]
    3. import parseutils as pu import nil #将模块引入后起个别名使用
    4. from os import existsFile
    5. from os import existsFile as exfile

关键字