[原創][連載]nim與python的異同1

德熀發表於2019-02-16

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

相關文章