JavaScript】如下javascript如何改写成C或python?

2020-03-30 20:42发布

function trans(a) {var b = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=for (var...

function trans(a) {
var b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
for (var d, e, f = 0, g = b, h = "";
a.charAt(f | 0) || (g = "=", f % 1);
h += g.charAt(63 & d >> 8 - f % 1 * 8)
)
{
e = a.charCodeAt(f += .75);
if (e > 255) throw c;
d = d << 8>
}
return h
};

1条回答
卡卡
2楼 · 2020-09-08 09:24



转眼间,2018年已进入倒计时阶段,回忆起这一年中编程语言界的发展,过得风生水起的语言非Python莫属。而它的火热和人工智能产业的爆发不无关系,但全局来看,得益于AI的Python并非止于AI,Python还在系统编程、多媒体应用、数据库编程、Web、爬虫等多个场景中均有应用。不仅如此,这一年的Python在TIOBE编程语言排行榜中,两度超越了C++,涌进排行榜的前三甲。 


但当前的Python是否真的如此完美?






作者|DanielKats

译者|弯月

出品|CSDN(ID:CSDNnews)



我刚刚从本月早些时候在PyConCanada上演讲的兴奋中平静下来。在会议上我见到了许多聪明的人,似乎每个人都在谈论着同样的痛点和希望。在这篇文章中,我将总结当前最为流行的编程语言Python的趋势,以及所面临的现状。


我喜欢Python,且在个人项目和专业项目上使用Python也将近10年了。我的工作一半是数据分析,另一半是快速原型创建,所以Python是个绝佳的工具。Python本身最大的优点就是它有大量的库,可以用来干任何事情:机器学习、数据探索、可复现的研究、可视化、云功能、WebAPI、以及其他所有你能想到的东西。


我离不开Python的原因之一就是Python的社区非常好,在StackOverflow和GitHub上与他人交流是一件非常愉快的事情。2015年,我的一个朋友在我们学校组织PyConCanada,拉着我去做志愿者。我发现社区非常友好,也非常有创造力。今年,我觉得我应该做一些回馈,在我的家乡多伦多举行的PyCon上做一次演讲。短短三年内社区成长了很多,我对此感到十分震惊。


和以前一样,我发现社区里到处都是聪明又富有创造力的人。一个例子就是在这次演讲中,有一位嘉宾分享了:用Python发现哈利波特中的性别偏差”,不管你觉得这个题目如何,但确实是个非常抓人眼球又非常好笑的题目。


但是,像任何工程一样,Python依然在建设中。我们对于Python语言的感受甚至不同于五年前,因此当时一些看似不熟悉的事情,今天不仅成为了可能,甚至成为了理所当然。这篇文章将阐述一些Python的发展方向,以及我对于它们成长的看法。


一、优点


2018年的Python世界中出现了许多新东西,一些甚至度过了成长的烦恼期。下面是我个人喜爱的一些:


JupyterLab


JupyterNotebook是一个可以执行Python(及其他语言)的Web应用程序,并能立即以嵌入的方式查看执行结果,包括图表、格式化后的表格以及Markdown各式的文字等。它还会自动保存中间结果(像REPL一样),可以导出成多种格式,还有上百种其他功能。


JupyterNotebook在社区中被广泛使用,特别是在研究和科学领域。Jupyter团队毫无争议地赢得了2017年的ACM软件系统奖。


JupyterLab是在传统Jupyternotebook上进行了改进。它包含一些非常好的功能,如单元格拖拽、嵌入式查看数据文件(如CSV)、标签页式的环境,以及一个以命令为中心的界面。当然它仍然在beta阶段,还有一些小问题,如Revea.js幻灯片导出功能,单元格折叠功能等都不能正常使用。但整体来说,它表明一个好的工具会不断成长并进步,以满足用户的复杂需求。


mypy


mypy是一个Python的静态类型检查工具,它已经出现有一段时间了。但是,这几年它发展得很好了,你甚至可以把它通过githooks或其他CI流程来集成到产品的项目中。我发现它对所有代码都非常有用,甚至能在我编写单元测试之前捕获到我的各种错误。当然它也不是没有陷阱。许多情况下你得写一些看似多余的注释:



__init__(self, *args) -> None



其他行为我也认为有些奇怪。而且,许多常用的模块都没有类型文件,如:



    flask:https://github.com/python/typeshed/issues/28

    

    

    msgpack:https://github.com/msgpack/msgpack-python

    

    

    coloredlogs:https://github.com/xolox/python-coloredlogs

    

    

    flask-restplus:https://github.com/noirbizarre/flask-restplus

    

    

    sqlalchemy:https://github.com/zzzeek/sqlalchemy

    

    

    nacl:https://github.com/pyca/pynacl

    

因此这些库会阻碍你将mypy集成到你的CI系统中,除非你做出大量配置。--ignore-missing-imports选项基本上是必须的。我希望以后为各种库的模块提供类型文件能成为社区的基本标准。


pipfile和pipenv


pipfile让我感到非常激动!pipfile是PEP508的一个实现,它的动机是用依赖管理系统替换requirements.txt。


最原始的动机就是,使用pip进行的依赖管理与其他Rust、Javascript等语言中类似的系统比起来太落后了。虽然pip/requirements.txt的缺点众所周知的,但我见过总结得最全面的就是这篇文章(https://www.kennethreitz.org/essays/a-better-pip-workflow)。我建议阅读一下全文,不过大致内容如下:


requirements.txt没有标准:它应该列出所有直接和间接的依赖,或者只是直接的依赖?是否应该包括固定的版本号?另外,开发时所需的依赖也非常依赖个人喜好。不同的开发团队会使用不同的规则,会让构建的重现成问题。


为了保证依赖列表最新,就要在pipinstall$package之后立即执行pipfreeze>requirements.txt,这个流程非常难用,而且有许多问题。


依赖管理系统包含三个工具和标准(virtualenv,pip和requirements.txt),它们之间并没有明确的互操作性。它们的存在都是为了完成单一的任务,那么为什么没有单一的工具来做这件事呢?


使用pipenv吧。


pipenv会自动创建virtualenv,安装并管理该virtualenv下的所有依赖,并自动保持pipfile最新。


尽管这个想法很好,但使用起来很麻烦。我在实际使用中遇到了许多问题,经常得回到前一种方式,比如显式地使用virtualenv。我还发现locking操作非常慢(部分源自setup.py的标准,也是工具链生态标准中的许多问题之一)。


f-strings


f-strings 太棒了!许多人都写过f-strings 的好处,包括它们自然的语法和带来的性能提升。我没有必要重复这些点,我只想说,这个功能非常棒,从它一出现我就一直在用。


f-strings 带来的一个有点讨厌的地方就是书写print语句和logging语句之间的区别。logging模块很好,而且默认情况下,如果日志消息被关闭,那么格式化就不会进行。所以你可以写:



x = 3


logging.debug(‘x=%d’, x)


如果日志级别设置为DEBUG,就会输出x=3,但如果日志级别更高,就不会进行字符串插值。这是因为logging.debug是函数,而字符串作为参数传递。可以在这篇“非常容易理解的C源代码”文章(https://github.com/python/cpython/blob/master/Lib/logging/__init__.py#L1419)中看到它的工作原理。但是,如果这样写,这个功能就消失了:



x = 3


logging.debug(f’x={x}’)



不管日志级别是什么,字符串插值必然会执行。从语言层面来看这是合理的,但实际的结果却让人感到不安。调试时我会首先使用print语句,如果一切看起来正常,我就会将print转成logging语句。所以每个print语句都需要手动改写,以便匹配不同类型的字符串插值。我不知道应该如何解决这个问题,但我想指出这个问题,因为别人没说过。


二、缺点


像许多与Python一样老的项目一样(Python都和我一样老了),一些模块和思想也上了年纪。这不是吐槽大会,我只是想说Python的社区可以做得更好。


tox


Tox依然是Python世界中最好的测试执行器,而且它也非常糟糕。不仅是因为tox.ini的语法很不直观,工具本身也非常慢。当然这并不是tox自己的错误,而是整个setup.py系统就有设计缺陷。因为这些文件定义了包之间的依赖,而它们执行代码查找依赖继承关系就非常慢。这导致一系列工具都很慢。我相信2019年我们的社区应该尝试解决这个问题。


此外,它依然不支持pipfile,让它变得更慢。像许多东西一样,并不是说它本身好坏,而更大程度上取决于它周围工具的好坏。


类型标注只能用于工具


引用自PEP0484:



使用类型提示进行性能优化作为读者练习。



考虑到该PEP出现时Python的状态,这一点也是可以理解的,但现在应该更进一步了。我们已经成功地转移到了Python3,360个PyPi上下载次数最多的包中有359个都兼容Python3。类型提示深受社区欢迎。更进一步,Python 的类型提示应该带来更多好处,如类型优化、自动运行时类型断言等。我发现运行时类型断言非常有用(特别是在函数库中),但手工编写非常麻烦。再加上类型提示,维护多个类型系统就变得特别麻烦。


就像其他提到的那样,Python4很可能会把JIT当做最优先的功能。似乎这是个给类型标注进行性能优化的好地方。


变量可修改性


对于现在的Python我最大的不满就是它没有const或类似的东西。在我犯过的所有编码错误中,90%都是类型相关的错误(现在可以通过mypy捕获大部分),或是以为自己创建了新变量,实际上却错误地使用了同一个函数中定义过的变量。我知道有些包能实现这一点,但我希望Python自身能支持const。


nbconvert


nbconvet项目非常赞。它可以将Jupyternotebook转换成其他各种格式,包括PDF、Reveal.js幻灯片,或者可执行脚本。在过去几个月内我经常使用后两者,它们真的改变了我的工作流程。我可以把一切都放在一个notebook中,最后再将其转换成幻灯片在每周会议上把我的进度演示给同事。类似地我也可以在notebook中规划一个想法,然后只需最小的代价将其转换成脚本并用在产品中。


当然这只是想法。现实是,任何大小的notebook转换成脚本都需要大量手工操作才能成功转换,有时还不如手动复制粘贴。我听说许多公司创建了nbconvert的wrapper使它更容易使用。我希望这些人能开源,这样就能解决我的痛苦了。


三、结论


许多优秀的人鼓励我写这篇文章,我感谢他们的反馈和支持。如果你有不同意见,欢迎留言分享你的看法。



原文:https://medium.com/@dbkats/state-of-python-in-2018-68fe478f8bb6


本文为CSDN翻译,如需转载,请注明来源出处。


相关问题推荐

  • 回答 8

    向一个对象数组里面添加新的属性var arry= [{a:11,b:22,c:33,d:44},{a:11,b:0,c:0,d:44},{a:11,b:22,c:99,d:99}];var arry2=[];arry.map(((item, index)=> {arry2.push(Object.assign({},item,{mess1:item.c,mess2:item.d}))}))cons...

  • 回答 2

    我觉得getTopWindow() 应该是他自己写的函数 mask  应该是getTopWindow()函数中 return 出的一个什么玩意show()  jQuery的显示

  • 回答 9

    如图所示

  • 回答 12

    1、原型对象也是普通的对象,是对象一个自带隐式的 __proto__ 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为 null 的话,我们就称之为原型链 2、 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链...

  • 回答 6

    使用VS code对JS进行Debug,需要安装一个插件,这个插件是根据你所使用的浏览器来的,不同浏览器对应插件不同,以下是插件对应情况,下载完相应的插件以后还要下载一个live server在浏览器下查看你界面运行效果,记得在到设置里修改下live server的端口号,然...

  • 回答 8
    已采纳

    没有基础,是可以学Java的,在网上也能找到很多免费的视频、学习资料等资源,只不过想要光靠自己摸索学透Java并不容易,最好是找一个比较靠谱的有实训的培训机构。不过,我给你点建议:1.脑子里要有编程思维,2.学习态度要有,3.了解了基本概念后,从图形界面...

  • 回答 7

    假设文本框的id=text1js:document.getElementById(text1).value = 测试;//即可

  • 回答 2

    这两个事件都是在js原生开发时经常会用到的,比如需要对页面dom进行动态处理,这时就需要用到DOMContentLoaded和[removed]事件,大家都知道,就是在dom构建完毕后,才可以对dom元素进行操作,否则会获取不到相应的dom元素,但是DOMContentLoaded和[removed]还...

  • 回答 11

    基本概念CookieCookie 是小甜饼的意思。顾名思义,cookie 确实非常小,它的大小限制为4KB左右。它的主要用途有保存登录信息,比如你登录某个网站市场可以看到记住密码,这通常就是通过在 Cookie 中存入一段辨别用户身份的数据来实现的。localStoragelocalStor...

  • 回答 2

    在vscode 头疼的问题是 用浏览器查看网页!会是以文件夹的方式打开的!  我遇到这个问题 我还重新配置了Apache    ! 但是现在可以解决:使用vscode  ==================== 打开cmd   : 在cmd 控制台中输入  :   1.运行cnpm install live-server...

  • 回答 1

    在进行对象之间的合并的时候,就会使用到extend方法进行合并语法结构:$.extend(true,{},对象1,对象2...)但是这里需要考虑一个问题,如果对象间有相同的属性名,就会涉及到哪一个对象和哪一个对象的值覆盖合并的问题,如果对象中的属性值还是一个对象的话,那...

  • 回答 5
    已采纳

    先说下要实现什么功能,比如:限制图片大小不能超过30K,宽高为121x75上面需求提了,然后我直接把代码给你放出来,可以照着下面代码敲一遍试试就知道怎么限制图片宽高了 $(#picFile4).on(change,function(){ var imgFile = this.files[0]; va...

  • 回答 3

    用python爬取近30天百度指数代码均转载,如下:#1.登录url = ‘http://index.baidu.com/’driver = webdriver.Chrome(executable_path=‘C:/Program Files(x86)/Google/Chrome/Application/chromedriver.exe’)driver.get(url)cookieList = [......

  • 回答 7

    基本类型基本类型分为以下六种:string(字符串)boolean(布尔值)number(数字)symbol(符号)null(空值)undefined(未定义)注意:string 、number 、boolean 和 null  undefined 这五种类型统称为原始类型(Primitive),表示不能再细分下去的基本类...

  • 回答 11

    实体类中添加时间转换注解(注意时区问题)12345/**  * 开始时间  */ @JsonFormat(pattern = yyyy-MM-dd HH:mm:ss, timezone=GMT+8) private Date startTime;

  • 回答 5

    实例中包含加、减、乘、除四种运算,由于先乘和除的优先级别高,所以乘和除将首先被运算,接下来是加和减运算。乘和除优先级相同,所以左边的乘法将被先执行,然后是除法,接下来按从左到右的顺序进行加减运算...

没有解决我的问题,去提问