首页 文章 精选 留言 我的

精选列表

搜索[解释型编程语言],共10010篇文章
优秀的个人博客,低调大师

TypeScript 3.6 发布,微软脚本编程语言

TypeScript 3.6 已经发布了,更新内容如下: 使用更严格的生成器(Stricter Generators) TypeScript 3.6 引入了对迭代器和生成器函数(generator functions)的更严格检查。在早期版本中,生成器的使用者无法区分一个值是来自yield 操作或是从生成器返回。 另外,生成器仅仅假设yield 类型是任意的: 以第一段代码为例,在TypeScript 3.6 中,检查器会知道curr.value 的正确类型应为string,并在最后一个示例中纠正对 next() 的错误调用。这要归功于因在Iterator和IteratorResult类型声明中进行的一些更改而引入部分新的类型参数,以及TypeScript 用于代表称为Generator类型的生成器。 该版本中 Iterator 类型允许用户说明 yield 类型、返回的类型和 next 可以接受的类型。 在此基础上,新类型 Generator 是一个 Iterator,它同时存在 return 和 throw 方法,并且是可迭代的。 为了区分返回的值和生成的值,TypeScript 3.6 将 IteratorResult 类型转换为联合类型: type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>; interface IteratorYieldResult<TYield> { done?: false; value: TYield; } interface IteratorReturnResult<TReturn> { done: true; value: TReturn; } 简而言之,这意味着在直接处理迭代器时,将能够适当地缩小迭代器的值。 为了正确表示可以从调用 next( ) 传入生成器的类型,TypeScript 3.6 还可以推断生成器函数主体内的某些 yield 用途。 如果你希望显式,还可以使用显式返回类型从 yield 表达式强制执行返回、yield 和计算的值的类型。如下,只能用布尔值调用 next( ),并且取决于 done 的值,value 要么是 string,要么是 number。 /** * - yields numbers * - returns strings * - can be passed in booleans */ function* counter(): Generator<number, string, boolean> { let i = 0; while (true) { if (yield i++) { break; } } return "done!"; } var iter = counter(); var curr = iter.next() while (!curr.done) { console.log(curr.value); curr = iter.next(curr.value === 5) } console.log(curr.value.toUpperCase()); // prints: // // 0 // 1 // 2 // 3 // 4 // 5 // DONE! 更精确的数组扩展 在默认情况下,TypeScript 使用一个更简单的发射,它只支持数组类型,并支持使用 --downlevelIteration 标志在其他类型上进行迭代。在此标志下,发出的代码更准确,但要大得多。但是,在某些边缘情况下,受支持的数组还是存在一些差异,如下: [...Array(5)] 等效于以下数组: [undefined, undefined, undefined, undefined, undefined] 但是,TypeScript将原始代码转换为以下代码: Array(5).slice(); 这是不一样的,Array(5)生成长度为 5 的数组,但没有属性: 当 TypeScript 调用 Slice( ) 时,它还会创建一个数组,其中包含尚未设置的索引。 3.6 版本引入了一个新的 __spreadArrays 助手,用于精确地模拟 ECMAScript 2015 中在 --downlevelIteration 之外中发生的情况。__SpreadArray 也可在 tslib 中使用。 Improved UX Around Promises Promise是当前处理异步数据的最常见方法之一,不幸的是,使用Promise面向对象的 API 通常会让使用者感到困惑。因此针对Promise被错误处理的情况,TypeScript 3.6 引入了一些改进。 例如,在将其传递给另一个函数之前,Promise忘记.then()或者await内容通常是很常见的。TypeScript 的错误消息现在是专用的,并告知使用者他们可能应该考虑使用await关键字。 另外还提供快速修复: 更好的 Unicode支持标识符 当发射到 ES 2015或其他时,3.6 版本包含更好地支持标识符中的 Unicode 字符: 在 SystemJS 中支持import.meta 3.6 版本支持在将 module 目标设置为 system 时,将 import.meta 转换为 context.meta。 get and set Accessors Are Allowed in Ambient Contexts 在早期版本的 TypeScript 中,并不允许在环境上下文中 set 和 get 访问器,其基本原理是,就写入和读取这些属性而言,访问器与属性并没有区别;然而,由于 ECMAScript 的类字段提案可能与现有版本的 TypeScript 中的行为不同,则需要一种方法来沟通这种不同的行为,以便在子类中提供适当的错误。 因此 TypeScript 3.6 中,用户可以在环境上下文中编写getter 和 setter。 环境类和函数可以合并 在以前版本中,在任何情况下合并类和函数都是有错的。此版本中,环境类和函数(带有 declare 修饰符的类/函数,或 .d.ts 文件中的类/函数)可以合并。如下内容: 而不需要使用: 它的一个优点是可以轻松地表达可调用的构造函数模式,同时允许名称空间与这些声明合并(因为 var 声明不能与名称空间合并)。 APIs to Support--buildand--incremental TypeScript 3.6增加了两组用于操作项目引用和增量式程序构建的 API。 对于 --incremental,用户可以使用createIncrementalProgram 和 createIncrementalCompilerHost API。用户还可以使用新的 readBuilderProgram 函数从该API 生成的 .tsbuildinfo 文件中重新补充旧的程序实例,该函数仅用于创建新程序(即不能修改返回的实例,它仅用于其他 Create*Program 函数中的oldProgram 参数)。 New TypeScript Playground 此版本中,新的 TypeScript playground支持许多新的选择,包括: target 选项(允许用户从 ES5 切换到 ES3、es2015、esnext 等) 所有标记(包括 strict) 对普通 JavaScript 文件的支持(使用 allowJS 和 CheckJS) 当共享链接到 playground 示例时,这些选项也会持续存在,这样用户就可以更可靠地共享示例。 Semicolon-Aware Code Edits 像 Visual Studio 和 Visual Studio Code 这样的编辑器可以自动应用快速修复、重构和其他转换,比如从其他模块自动导入值。这些转换由 TypeScript 驱动,老版本的 TypeScript 无条件地在每条语句的末尾添加分号;不幸的是,这不符合许多用户的样式指南,许多用户对编辑器插入分号不满意。 在此版本中,在应用这类编辑时,TypeScript 可以检测文件是否使用分号。如果你的文件是缺少分号,TypeScript 则不会添加分号。 Smarter Auto-Imports JavaScript 有许多不同的模块语法或约定:ECMAScript 标准、Node 支持的模块语法或约定(CommonJS)、AMD、System.js 等等。在大多数情况下,TypeScript 将默认使用 ECMAScript 模块语法自动导入,在具有不同编译器设置的某些 TypeScript 项目中,或者在具有普通 JavaScript 和 Require 调用的 Node 项目中,这通常是不合适的。 在 3.6 版本中,在决定如何自动导入其他模块之前,它会查看现有的导入。 Breaking Changes 类成员 constructor 现在是构造函数 根据 ECMAScript 规范,名为 constructor 的方法的类声明现在是构造函数,无论它们是使用标识符名称声明,还是使用字符串名称声明。 DOM 更新 在 lib.dom.d.ts 中已经删除或更改了许多声明,这包括(但不限于)以下内容: 全局 window 不再定义为类型 Window,而是定义为类型 Window & type of globalThis。在某些情况下,将其类型称为 typeof window GlobalFetch 移除了,而是使用 WindowOrWorkerGlobalScope Navigator上的某些非标准属性已经消失 experimental-webgl 移除了,而是使用webgl和webgl2 JSDoc 注解不再合并 在 JavaScript 文件中,TypeScript 只会在紧接 JSDoc 注解之前确定声明的类型。 关键字不能包含转义序列 以前,关键字被允许包含转义序列。3.6 版本不再允许: 关于 TypeScript 3.6 更多信息,请见TypeScript 网站。使用 npm 命令获取: npm install -g typescript 还可以通过以下方式获得编辑器支持: 下载Visual Studio 2019/2017 Visual Studio Code Sublime Text 3 via PackageControl 发布说明: https://devblogs.microsoft.com/typescript/announcing-typescript-3-6/

优秀的个人博客,低调大师

符合语言习惯的 Python 优雅编程技巧

Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀的源代码值得阅读,比如:requests、flask、tornado,下面列举一些常见的Pythonic写法。 0. 程序必须先让人读懂,然后才能让计算机执行。 “Programs must be written for people to read, and only incidentally for machines to execute.” 1. 交换赋值 ##不推荐 temp = a a = b b = a ##推荐 a, b = b, a # 先生成一个元组(tuple)对象,然后unpack 2. Unpacking ##不推荐 l = ['David', 'Pythonista', '+1-514-555-1234'] first_name = l[0] last_name = l[1] phone_number = l[2] ##推荐 l = ['David', 'Pythonista', '+1-514-555-1234'] first_name, last_name, phone_number = l# Python 3 Only first, *middle, last = another_list 3. 使用操作符in ##不推荐if fruit == "apple" or fruit == "orange" or fruit == "berry":# 多次判断 ##推荐if fruit in ["apple", "orange", "berry"]:# 使用 in 更加简洁 4. 字符串操作 ##不推荐 colors = ['red', 'blue', 'green', 'yellow'] result = ''for s in colors: result += s # 每次赋值都丢弃以前的字符串对象, 生成一个新对象 ##推荐 colors = ['red', 'blue', 'green', 'yellow'] result = ''.join(colors) # 没有额外的内存分配 5. 字典键值列表 ##不推荐for key in my_dict.keys():# my_dict[key] ... ##推荐for key in my_dict:# my_dict[key] ...# 只有当循环中需要更改key值的情况下,我们需要使用 my_dict.keys()# 生成静态的键值列表。 6. 字典键值判断 ##不推荐if my_dict.has_key(key):# ...do something with d[key] ##推荐if key in my_dict:# ...do something with d[key] 7. 字典 get 和 setdefault 方法 ##不推荐 navs = {}for (portfolio, equity, position) in data:if portfolio not in navs: navs[portfolio] = 0 navs[portfolio] += position * prices[equity]##推荐 navs = {}for (portfolio, equity, position) in data:# 使用 get 方法 navs[portfolio] = navs.get(portfolio, 0) + position * prices[equity]# 或者使用 setdefault 方法 navs.setdefault(portfolio, 0) navs[portfolio] += position * prices[equity] 8. 判断真伪 ##不推荐if x == True:# ....if len(items) != 0:# ...if items != []:# ... ##推荐if x:# ....if items:# ... 9. 遍历列表以及索引 ##不推荐 items = 'zero one two three'.split()# method 1 i = 0for item in items:print i, item i += 1# method 2for i in range(len(items)):print i, items[i]##推荐 items = 'zero one two three'.split()for i, item in enumerate(items):print i, item 10. 列表推导 ##不推荐 new_list = []for item in a_list:if condition(item): new_list.append(fn(item)) ##推荐 new_list = [fn(item) for item in a_list if condition(item)] 11. 列表推导-嵌套 ##不推荐for sub_list in nested_list:if list_condition(sub_list):for item in sub_list:if item_condition(item):# do something... ##推荐 gen = (item for sl in nested_list if list_condition(sl) \for item in sl if item_condition(item))for item in gen:# do something... 12. 循环嵌套 ##不推荐for x in x_list:for y in y_list:for z in z_list:# do something for x &amp;amp; y ##推荐from itertools import productfor x, y, z in product(x_list, y_list, z_list):# do something for x, y, z 13. 尽量使用生成器代替列表 ##不推荐def my_range(n): i = 0 result = []while i &amp;lt; n: result.append(fn(i)) i += 1return result # 返回列表##推荐def my_range(n): i = 0 result = []while i &amp;lt; n:yield fn(i) # 使用生成器代替列表 i += 1 *尽量用生成器代替列表,除非必须用到列表特有的函数。 14. 中间结果尽量使用imap/ifilter代替map/filter ##不推荐 reduce(rf, filter(ff, map(mf, a_list)))##推荐from itertools import ifilter, imap reduce(rf, ifilter(ff, imap(mf, a_list))) *lazy evaluation 会带来更高的内存使用效率,特别是当处理大数据操作的时候。 15. 使用any/all函数 ##不推荐 found = Falsefor item in a_list:if condition(item): found = Truebreakif found:# do something if found... ##推荐if any(condition(item) for item in a_list):# do something if found... 16. 属性(property) ##不推荐class Clock(object):def __init__(self): self.__hour = 1def setHour(self, hour):if 25 &amp;gt; hour &amp;gt; 0: self.__hour = hourelse: raise BadHourExceptiondef getHour(self):return self.__hour##推荐class Clock(object):def __init__(self): self.__hour = 1def __setHour(self, hour):if 25 &amp;gt; hour &amp;gt; 0: self.__hour = hourelse: raise BadHourExceptiondef __getHour(self):return self.__hour hour = property(__getHour, __setHour) 17. 使用 with 处理文件打开 ##不推荐 f = open("some_file.txt")try: data = f.read()# 其他文件操作..finally: f.close()##推荐with open("some_file.txt") as f: data = f.read()# 其他文件操作... 18. 使用 with 忽视异常(仅限Python 3) ##不推荐try: os.remove("somefile.txt")except OSError:pass##推荐from contextlib import ignored # Python 3 onlywith ignored(OSError): os.remove("somefile.txt") 19. 使用 with 处理加锁 ##不推荐import threading lock = threading.Lock() lock.acquire()try:# 互斥操作...finally: lock.release()##推荐import threading lock = threading.Lock()with lock:# 互斥操作... 20. 参考 1) Idiomatic Python: http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html 2) PEP 8: Style Guide for Python Code: http://www.python.org/dev/peps/pep-0008/ 原文发布时间为:2018-11-15 本文作者:安生 本文来自云栖社区合作伙伴“ 数据与算法之美”,了解相关信息可以关注“ 数据与算法之美”。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册