Python 与 JavaScript: 实现同一功能的代码量对比

注: 举的例子不涉及复杂的逻辑, 不涉及第三方库, 主要是体现二者在语法表达上的差异. 内容有个人偏向, 阅读需谨慎.

列表, 字典操作

Q: 父对象有多个子对象, 对每个子对象赋值

// javascript

function setChildrenProps(parent, props) {
    for (let i in parent.children) {
        let child = parent.children[i]
        for (let j in props) {
            child[j] = props[j]
        }
    }
}

# python

def set_children_props(parent, props):
    for child in parent:
        child.update(props)

Q: 判断元素是否在列表中, 如果在则移除, 不在则添加

// javascript

function arrayOperation(arr, e) {
    const pos = arr.indexOf(e)
    if (pos != -1) {
        arr.splice(pos, 1)
    } else {
        arr.push(e)
    }
}

let myArr = ['a', 'b', 'c']
const p = 'b'
const q = 'd'

arrayOperation(myArr, p)
arrayOperation(myArr, q)

console.log(myArr)  // -> ['a', 'c', 'd']

# python

def list_operation(alist, e):
    if e in alist:
        alist.remove(e)
    else:
        alist.append(e)

my_list = ['a', 'b', 'c']
p = 'b'
q = 'd'

list_operation(my_list, p)
list_operation(my_list, q)

print(my_list)  # -> ['a', 'c', 'd']

Q: 获得字典第一个键值对 (获得对象的第一个属性和值), 并以 [键, 值] 形式返回

// javascript

function main(data) {
    // https://blog.csdn.net/soeben/article/details/78462090
    for (let k in data) {
        let v = data[k]
        let ret = [k, v]
        return ret
    }
}

# python

def main(data):
    for k, v in data.items():
        return [k, v]

字符串操作

Q: 字符串是否包含某个子字符串

// javascript

function isSubStr(a, b) {
    if (a.indexOf(b) != -1) {
        return True
    } else {
        return False
    }
}

# python

def is_sub_str(a, b) {
    if b in a:
        return True
    else:
        return False
}

Q: 将 “HELLO, world.” 中的空格去掉, 以及大写转小写, 变为: “hello,world.”

// javascript

var text = 'HELLO, world.'
var out = text
    .split('')
    .filter(char => char != ' ')
    .map(char => char.toLowerCase())
    .join('')
console.log(out)
# python

text = 'HELLO, world.'
out = text.lower().replace(' ', '')
print(out)

Q: 遍历并打印字符串中的每一个字符

// javascript

var text = 'abcd'

// == A ==
for (var i = 0; i < text.length; i++) {
    console.log(text[i])
}

// == B ==
text.forEach((char) => { console.log(char) })

// == C ==
for (const char of text) {
    console.log(char)
}

# python

text = 'abcd'

for char in text:
    print(char)

Q: 字符串插值 (模板)

// javascript

function calcPercent(a, b) {
    // e.g. a = 1, b = 3 -> return '33.33%'
    // https://www.runoob.com/w3cnote/javascript-two-decimal.html
    return (a / b * 100).toFixed(2) + '%'
}

function outputMessage(info) {
    let messages = []
    for (let user in info) {
        const borrow = info[user]['borrow']
        const read = info[user]['read']
        const percent = calcPercent(read, borrow)
        messages.push(
            `${user}借了${borrow}本书, 已读${read}本, 占比${percent}`
        )
    }
    let out = messages.join(';\n') + '.'
    return out
}

let info = {
    '张': {'borrow': 2, 'read': 1},
    '李': {'borrow': 3, 'read': 2},
}
console.log(outputMessage(info))
//  -> '张借了2本书, 已读1本, 占比50.00%;\n李借了3本书, 已读2本, 占比66.67%;'

# python

def output_message(info):
    messages = []
    
    for user_name, user_data in info.items():
        # == A ==
        # messages.append('{}借了{}本书, 已读{}本, 占比{}%'.format(
        #     user_name,
        #     a := user_data['borrow'],
        #     b := user_data['read'],
        #     round(b / a * 100, 2)
        # ))
        
        # == B ==
        borrow, read = user_data.values()
        percent = round(read / borrow * 100, 2)
        messages.append(f'{user_name}借了{borrow}本书, 已读{read}本, 占比{percent}%')
        
    out = ';\n'.join(messages) + '.'
    return out


info = {
    '张': {'borrow': 2, 'read': 1},
    '李': {'borrow': 3, 'read': 2},
}
print(output_message(info))
#   -> '张借了2本书, 已读1本, 占比50.0%;\n李借了3本书, 已读2本, 占比66.67%.'

简单运算

Q: 已知分子和分母, 求百分数. 如分母是 0 或 None (null, undefined), 则改为 1

// javascript

function main(a, b) {
    return a / (b ? b : 1)
}

# python

def main(a, b):
    return a / (b or 1)

Q: 将秒数转换为时分秒显示, 例如 5400 -> “01:30:00” (小于 10 的数在十位补零)

// javascript

function main(sec) {
    // https://www.bbsmax.com/A/kPzOgYaozx/
    let out = ''
    
    const h = Math.floor(sec / 3600)
    const m = Math.floor(sec / 60) % 60
    const s = sec % 60
    
    if (h < 10) { out += '0' + h + ':' } else { out += h + ':' }
    if (m < 10) { out += '0' + m + ':' } else { out += m + ':' }
    if (s < 10) { out += '0' + s } else { out += s }
    
    return out
}

# python

def main(sec: int):
    # https://blog.csdn.net/lxq_9532/article/details/85759673
    m, s = divmod(sec, 60)
    h, m = divmod(m, 60)
    return '{:0>2d}:{:0>2d}:{:0>2d}'.format(h, m, s)


个人的一些感受

我主要用 Python 开发项目, 对 JavaScript 接触有限, 只在写 QML 以及 AE 插件时用到过.

当我在 QML 中用到 JavaScript 时, 我常常对 JavaScript 在列表, 对象上的操作感到不方便 (特别是 for 循环时, QML 尚不支持 for of 语法). 与之相比, Python 在这方面表现出其语言特有的简洁和表达能力.

这是让我写这篇文章的原因.

相关阅读

  • Python 与 Java: 实现同一功能的代码量对比: TODO
  • 我对 Python 不满的地方: TODO
  • 一个将 Python 语法转换为 ES6 的 Python 库, 对比了二者在转换时的差异: https://pypi.org/project/javascripthon/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值