Python PK JS 原生实现一些功能

简介: 近来,项目上,遇见了用Python编写的发布脚本,瞬间就被她迷人的眼神和身段迷上了。近来几天一直追随她,越发的喜爱。喜爱之余,拿她与我的前任(JS)最了一些对比。 当然纯语法的对比,那太单调。这里我就实现一些基本的功能来对比两者语法上的一些差异。

1.JPG


前言


近来,项目上,遇见了用Python编写的发布脚本,瞬间就被她迷人的眼神和身段迷上了。近来几天一直追随她,越发的喜爱。喜爱之余,拿她与我的前任(JS)最了一些对比。 当然纯语法的对比,那太单调。这里我就实现一些基本的功能来对比两者语法上的一些差异。


源码都放在github上面了: Python PK JS


新欢(Python) VS 前任(JS)


字符串截取


Python一点都不废话,直接[:]搞定。


Python


text = "你们都是坏人啊"
print(text[0:5])  # 你们都是坏
复制代码


JS


const print = console.log
const text = "你们都是坏人啊"
print(text.substring(0,5))  // 你们都是坏
复制代码


时间格式化


很明显,在没有借助第三方库的前提下,JS格式化时间的能力还是比较弱的。当然有些人会说,JS的 Date.prototype.toLocaleString 能做到一定的格式化,但毕竟能力有限。


还有字符串的填充问题,1月应该显示为 01。 而这种能力居然在Python时间格式化函数里面是现成的。


import time
def format(date):
    return time.strftime("%Y-%m-%d %H:%M:%S", date)
print(format((2020, 1, 1, 1, 1, 1, 0, 0, 0))) # 2020-01-01 01:01:01
复制代码
function padNum(num, length = 2, ch = "0") {
    return `${num}`.padStart(length, ch);
}
function formatDate(date) {
    const d = new Date(date);
    const fullYear = d.getFullYear();
    const month = padNum(d.getMonth() + 1)
    const day = padNum(d.getDate())
    const h = padNum(d.getHours())
    const m = padNum(d.getMinutes())
    const s = padNum(d.getSeconds())
    return `${fullYear}-${month}-${day} ${h}:${m}:${s}`
}
console.log(formatDate(new Date(2020, 0, 1, 1, 1, 1))); // 2020-01-01 01:01:01
复制代码


对象属性设置和遍历


Python把JS里面的对象叫做字典。


采用类似对象字面量形式申明的时候,属性名还必须是类似JSON的形式,必须以"包起来。


设置值的时候不能像JS那样 obj.name,而必须是obj["name"] 遍历自身属性的时候,比JS方便一些,而不用借助外力。


Python

obj = {
    "name": "Tom",
    "age": 10,
    "weight": 60,
    "height": 100
}
obj["name"] = "Tom +"
obj["age"] = 100
print(obj)
# 输出所有的属性键
print("keys:", obj.keys())
print()
print("----------------------")
for k in obj.keys():
    print("key:", k, " value:", obj[k])
复制代码
const print = console.log
const obj = {
    name: "Tom",
    age: 10,
    weight: 60,
    height: 100
}
obj.name = "Tom +";
obj["age"] = 100;
print(obj);
// 输出所有的属性键
print("keys:", Object.keys(obj))
for(let k in obj){
    print("key:", k, " value:", obj[k])
}
复制代码


正则替换和分组


Python中的正则替换使用的是re.sub,二这个能力在js里面是字符串自带的能力。虽然Python里面的字符串也有replace方法,是纯字符串的替换。


至于分组,Python这边的体验好太多了。


import re
# 替换#后面的内容为空
text = "158000000#手机号码";
print(re.sub("#.*$","", text)); #158000000
# 分组
dateText = "2018-01-06";
reDate = re.compile("(\d{4})-(\d{1,2})-(\d{1,2})");
print(reDate.search(dateText).groups()) # ('2018', '01', '06')
复制代码
const print = console.log;
// 替换#后面的内容为空
const text = "158000000#手机号码";
print(text.replace(/#.*$/,"")); //158000000
// 分组
dateText = "2018-01-06";
execArray = /(\d{4})-(\d{1,2})-(\d{1,2})/.exec(dateText)
print(execArray)  // ['2018-01-06','2018','01','06',index: 0,input: '2018-01-06', groups: undefined ]
// /(\d{4})-(\d{1,2})-(\d{1,2})/.exec(dateText)
// print(":", RegExp.$1, RegExp.$2, RegExp.$3)
复制代码


数组


数组增加,删除,查找


Python里面对应的是list.


Python整体的语法还是相对简单一点,尤其是可以直接根据某个值删除。 JS里面的数组内置的方法更加的多,功能也相对强大一些。 Python有一个单独的array模块来增强。


arr = ["1", 2, "1", "3"];
# 尾部增加
arr.append(10000);
print(arr); # ['1', 2, '1', '3', 10000]
# 头部增加
arr.insert(0, -10000);
print(arr); # [-10000, '1', 2, '1', '3', 10000]
# 查找值的位置
index = arr.index(10000);
print("index", index) # index 5
# 修改
arr[2] = 3;
print(arr); # [-10000, '1', 3, '1', '3', 10000]
# 删除
arr.remove("1") 
print(arr); # [-10000, 3, '1', '3', 10000]
# 删除
arr.remove("1") 
print(arr); # [-10000, 3, '3', 10000]
复制代码
const print = console.log
const arr = ["1", 2, "1", "3"];
// 尾部增加
arr.push(10000);
print(arr); // [ '1', 2, '1', '3', 10000 ]
// 头部增加
arr.unshift(-10000)
print(arr);  // [ -10000, '1', 2, '1', '3', 10000 ]
// 查找值的位置
let index = arr.indexOf(10000)
print("index", index) // index 5
// 修改
arr[2] = 3;
print(arr); // [ -10000, '1', 3, '1', '3', 10000 ]
// 删除
index = arr.indexOf("1");
arr.splice(index, 1) 
print(arr); // [ -10000, 3, '1', '3', 10000 ]
// 删除
index = arr.indexOf("1");
arr.splice(index, 1) 
print(arr); // [ -10000, 3, '3', 10000 ]
复制代码


数组填充


Python自带的range这里就很亮眼。


还有这酷酷的 推导式[m for m in range(1, 101, 1)]


# arr = list(range(1, 101, 1));
arr = [m for m in range(1, 101, 1)]
print(arr) # [1,2,3 ......, 100]
复制代码
const print = console.log;
const arr = Array.from({
    length: 100
}, (v, i) => {
    return i + 1
});
print(arr); // [1,2,3 ......, 100]
复制代码


遍历文件夹和获取所有文件


遍历文件夹


Python是两层for循环,但是非常直接。 JS这边是传统的递归。


import os
import sys
def walk(dir):
    for root, dirs, files in os.walk(dir):
        for file in files:
            print(os.path.join(root, file))
        for dir in dirs:
            print(os.path.join(root, dir))
currentDir = os.path.split(os.path.realpath(sys.argv[0]))[0]
walk(currentDir);
复制代码
const path = require("path");
const fs = require("fs");
function walk(root) {
    const dirs = fs.readdirSync(root);
    dirs.forEach(dir => {
        const fullPath = path.join(root, dir);
        const sta = fs.statSync(fullPath);
        if(sta.isFile()){
            return console.log(fullPath);
        }
        console.log(fullPath);
        walk(fullPath);
    });
}
walk(__dirname);
复制代码


获取文件夹全部文件路径


哇,采用内置的glob一气呵成。


其实nodejs也是有相关模块的 glob,不过那是第三方的库了。


import os
import glob
import sys
def getFiles(dir):
    return glob.glob("%s/**/*.*" % (dir), recursive=True)
currentDir = os.path.split(os.path.realpath(sys.argv[0]))[0]
print("currentDir", currentDir)
files = getFiles(currentDir)
print(files)
复制代码
const path = require("path");
const fs = require("fs");
function getFiles(root, files) {
    const dirs = fs.readdirSync(root);
    dirs.forEach(dir => {
        const fullPath = path.join(root, dir);
        const sta = fs.statSync(fullPath);
        if(sta.isFile()){
            return files.push(fullPath);
        }
        getFiles(fullPath, files);
    });
    return files;
}
const files = [];
getFiles(__dirname, files);
console.log(files);
复制代码


网络请求


下面发送https请求获取百度首页的内容, Python使用内置库并不轻松。


如果发送的是http请求,Python会简单很多。


这里我发现一个很有意思的问题,Python和NodeJS发送的是get请求,但是返回的结果却不同。 有哪位要是知道原因和更多细节,麻烦请帮忙解惑。


import urllib.request
import urllib.parse
import os
import sys
import ssl
currentDir = os.path.split(os.path.realpath(sys.argv[0]))[0];
headers = {    
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
}
context = ssl._create_unverified_context()
request = urllib.request.Request('https://www.baidu.com', headers=headers)
res = urllib.request.urlopen(request, context=context)
html = res.read().decode('utf-8')
with open(os.path.join(currentDir, "./_py_baidu.html"), mode="w", encoding="utf-8") as f:
    f.write(html)
复制代码
const https = require('https');
const fs = require("fs");
const path = require("path");
https.get('https://www.baidu.com', (resp) => {
    let data = '';
    resp.on('data', (chunk) => {
        data += chunk;
    });
    resp.on('end', () => {
        console.log("data", data);
        fs.writeFileSync(path.join(__dirname, "./_js_baidu.html"), data);
    });
}).on("error", (err) => {
    console.log("Error: " + err.message);
});
复制代码


随机数


Python内置的random相当的强大。


JS其实也可以借助三角函数等来随机生成,爽感当然差一些。 虽然可以借助第三方random


import random
# 0-1随机数
print(random.random())
# 1-10随机整数
print(random.randint(1, 10))
# 随机偶数
print(random.randrange(0, 1000, 2))
# 随机浮点数
print(random.uniform(0.1, 3.6))
# 权重相等,选择3个
print(random.choices([1, 2, 3, 4, 5], [1, 1, 1, 1, 1], cum_weights=None, k=3))
复制代码
const print = console.log;
function randInt(min, max) {
    return Math.floor(Math.random() * (max - min)) + min
}
function rand(min, max) {
    return Math.random() * (max - min) + min;
}
// 0-1之间随机数
print(Math.random())
// 1-10之间随机整数
print(randInt(1, 10))
// 0-1000之间 随机偶数
let num = randInt(0, 1000);
num = num % 2 === 0? num : num -1;
print(num)
// // 随机浮点数
print(rand(0.1, 3.6))
// 权重相等,选择3个
// 难搞。。。。。 
复制代码


异常捕获


Python的异常捕获更直接和好懂一些, 而JS得额外通过错误的类型判断,再进行进一步的处理。


Python也是可以通过isinstance来进一步处理的。


try:
    raise TypeError("类型错误");
    open(".../xxxxxx.ts")
except IOError as ioe:
    print("io error", ioe)
except TypeError as te:
    print("type error", te);
except Exception as e:
    print("common error", e.args)
finally:
    print("执行完毕")
复制代码
const fs = require("fs");
const print = console.log;
try {
    throw new TypeError("无效的类型")
    fs.openSync("../sdasdas/x.ts")
} catch (err) {
    if (err instanceof TypeError) {
        print("type error", err)
    } else if (err instanceof Error) {
        print("common error", err)
    }
}
复制代码


类继承


JS的类继承,更加容易理解。和Java, C#等无太大区别。


Python的类,都是带着self奔跑的, 构造函数是 __init__。每个方法第一个参数也是self


class Animal():
    def __init__(self, sex):
        self.sex = sex;
    def eat(self):
        print("eat");
    def getSex(self):
        print("sex", self.sex)
class Human(Animal):
    def __init__(self, sex):
        super().__init__(sex)
    def walk(self):
        print("walk")
human = Human(1);
human.getSex();
human.eat();
human.walk();
复制代码
const print = console.log
class Animal {
    constructor(sex) {
        this.sex = sex;
    }
    getSex() {
        print("sex", this.sex);
    }
    eat() {
        print("eat")
    }
}
class Human extends Animal {
    constructor(sex) {
        super(sex)
    }
    walk() {
        print("walk");
    }
}
var human = new Human(1, 0);
human.getSex();
human.eat();
human.walk();
复制代码


其他有趣的


print(1 == "1")  # False
print([1] + [2])  # [1,2]
print([1, 2, 3] == [1, 2, 3])  # True
print(3 > 2 > 1) # True
复制代码
const print = console.log;
print(1 == "1") // true
print([1] + [2]) // 12
print([1, 2, 3] == [1, 2, 3]) // false
print(3 > 2 > 1); // false
复制代码


引用


python 与 javascript 简单对比

相关文章
|
13天前
|
安全 前端开发 数据库
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
|
1月前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
43 6
|
2月前
|
IDE 数据挖掘 开发工具
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
43 7
|
2月前
|
存储 缓存 测试技术
Python中的装饰器:功能增强与代码复用的利器
在Python编程中,装饰器是一种强大而灵活的工具,它允许开发者以简洁优雅的方式增强函数或方法的功能。本文将深入探讨装饰器的定义、工作原理、应用场景以及如何自定义装饰器。通过实例演示,我们将展示装饰器如何在不修改原有代码的基础上添加新的行为,从而提高代码的可读性、可维护性和复用性。此外,我们还将讨论装饰器在实际应用中的一些最佳实践和潜在陷阱。
|
7天前
|
JavaScript 前端开发
【Vue.js】监听器功能(EventListener)的实际应用【合集】
而此次问题的核心就在于,Vue实例化的时机过早,在其所依赖的DOM结构尚未完整构建完成时就已启动挂载流程,从而导致无法找到对应的DOM元素,最终致使计算器功能出现异常,输出框错误地显示“{{current}}”,并且按钮的交互功能也完全丧失响应。为了让代码结构更为清晰,便于后续的维护与管理工作,我打算把HTML文件中标签内的JavaScript代码迁移到外部的JS文件里,随后在HTML文件中对其进行引用。
28 8
|
27天前
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件
|
1月前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
45 11
|
1月前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
2月前
|
设计模式 监控 程序员
Python中的装饰器:功能增强与代码复用的利器####
本文深入探讨了Python中装饰器的工作原理、应用场景及其在提升代码可读性、减少重复劳动方面的优势。不同于传统方法的冗长和复杂,装饰器提供了一种优雅且高效的方式来增强函数或方法的功能。通过具体实例,我们将揭示装饰器如何简化错误处理、日志记录及性能监控等常见任务,使开发者能够专注于核心业务逻辑的实现。 ####
|
2月前
|
JavaScript 前端开发 容器
jQuery多功能滑块插件r-slider.js
r-slider.js是一款jQuery多功能滑块插件。使用该插件,可以制作出滑块、开关按钮、进度条、向导步骤等多种效果。
51 5