注: 举的例子不涉及复杂的逻辑, 不涉及第三方库, 主要是体现二者在语法表达上的差异. 内容有个人偏向, 阅读需谨慎.
列表, 字典操作
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/