JS思维实现Python的API

126 阅读2分钟

引言

去年国庆开始,接触到PyQt项目,学习了Python3的API语法,涉及到一些处理数据的基本操作,以之前学习JavaScript的思维方式,来实现这些API效果。

JavaScript的数组=>近似于Python的列表,JavaScript的对象=>近似于Python的字典

①Python列表切片

列表切片方法

lst = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]
print(lst[0:3:2]) # ['鼠', '虎'] 
print(lst[2:12:4]) # ['虎', '马', '狗']

JavaScript实现方法

const list = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"];
const log = console.log;
let pyList = (arr, start, stop, step) => {
  let res = [];
  if (stop > arr.length) throw new Error("已超出范围");
  for (let i = start; i < stop; i += step) {
    res.push(arr[i]);
  }
  return res;
};
/*方法2*/
let pyList2 = (arr, start, stop, step) => {
  let res = [];
  if (stop > arr.length) throw new Error("已超出范围");
  //len为res数组的长度
  let len = Math.ceil((stop - start) / step); 
  for (let i = 0; i < len; i++) {
    res.push(arr[start + step * i]);
  }
  return res;
};
log(pyList(list, 0, 3, 2));
log(pyList2(list, 2, 12, 4));

②Python生成随机列表

random.sample 无放回抽样

import random
# 列表中包含0~9的整数
lst2 = random.sample([_ for _ in range(0, 10)], 10)
print(lst2) # [3, 8, 2, 0, 5, 9, 1, 6, 4, 7]

JavaScript实现方法

let randSp = [];
do {
  let ranNum = parseInt(Math.random() * 10);
  if (randSp.indexOf(ranNum) === -1) randSp.push(ranNum);
} while (randSp.length < 10);
console.log(randSp); // [7, 2, 5, 4, 9, 8, 6, 0, 1, 3];

random.choices 有放回抽样

lst3 = random.choices([_ for _ in range(0, 10)], k=10)
print(lst3) # [1, 6, 7, 5, 8, 8, 1, 1, 2, 2]

JavaScript实现方法

let randSp = [];
do {
  let ranNum = parseInt(Math.random() * 10);
  randSp.push(ranNum);
} while (randSp.length < 10);
console.log(randSp); // [6, 4, 4, 4, 9, 6, 0, 4, 7, 1];

③JavaScript的arguments和剩余参数

function my_var_func(a, ...lst) {
  console.log(arguments.length, Array.from(arguments));
  console.log(lst, Array.isArray(lst));
  console.log(arguments, Array.isArray(arguments));
  for (const value of arguments) {
    console.log(value);
  }
}
my_var_func(10, 20, 30, 40);

近似于Python定义函数的 * 收集参数(元组)

def my_var_func(*args):
    print('The number of args is', len(args))
    for ele in args:
        print(ele)
my_var_func(10, 20, 30, 40)

④Python生成固定长度列表

scores = [[0]*3 for _ in range(5)]
scores[0][0] = 1
print(scores)

JavaScript实现方法

let lst = Array.from({ length: 5 }).map((_) => Array(3).fill(0));
lst[0][0] = 1;
console.log(lst);

⑤JavaScript实现10!的阶乘

let sum = 1;

用for循环

for (let i = 2; i <= 10; i++) {
  sum *= i;
}
console.log(sum); // 3628800

或者while循环

i = 1;
while (i < 10) {
  i++;
  sum *= i;
}
console.log(sum);

或者用ES6方法

let res = Array(10).fill().map((_, i) => i + 1).reduce((acc, cur) => ((acc *= cur), acc), 1);

Python导入functools模块的reduce方法和operator基本运算符函数

import operator
import functools
def fac(num): return functools.reduce(operator.mul, range(1, num+1), 1)
print(fac(10))

⑥其余 JavaScript的API 同 Python的API

JavaScript数组 => Python列表

/*
JavaScript数组 => Python列表

splice(index, 0, ele) 同 insert,但insert只能插入一个元素
push 同 append,但append只能末尾添加一个元素
push展开符 同 extend,可迭代
splice(index, 1) 同 pop(index)
splice(0, arr.length) 同 clear()

Python的del方法 删除列表,列表名未定义
sorted(list) 不改变原列表
sort()函数 改变原列表
reverse=True 指定降序
*/

JavaScript对象 => Python字典

/*
Object.assign(dict1, dict2)对象浅拷贝 同 字典dict1.update(dict2)
Object.entries(dict2)对象键值对生成二维数组 同 dict2.items()
*/

xxx.js文件

let dict2 = { a: 1, b: 2, c: 3 };
console.log(Object.entries(dict2));
for (const [k, v] of Object.entries(dict2)) {
  console.log(k, v);
}

xxx.py文件

dict2 = {'a': 1, 'b': 2, 'c': 3}
for k, v in dict2.items():
    print(k, v)

Python固然简洁,但不建议无脑学,不求甚解,拿来主义要不得,诸如Python少儿编程这类,更不必以此圈钱,不如多培养些奥数人才

作为解释型语言,编译过程较慢,码农在开发过程中,应发挥主观能动性,优化代码结构

千里之行,始于足下,与诸君共勉。

7b2b03f3af6e73b90f6e482acef616c.jpg

4d1d99fd4de7ef4820cff1df9840bd6.jpg