贪心学院-推荐系统算法工程师培养计划

xuebiancheng · · 17 次点击 · 开始浏览    置顶
## download:[贪心学院-推荐系统算法工程师培养计划](http://www.51xuebc.com/thread-363-1-1.html) Python3.8有哪些你要关注的新内容? Python3.8 都有哪些新功用,在文档手册中,大家能够有一个概览。这么多新内容,哪些是大家最先要关注一下的呢?下面,营长就带大家从深度和广度两方面,理解那些最大的变化,协助大家快速上手 Python3.8. 新功用手册: 在本文中,你将理解到Python 3.8如何: 运用赋值表达式简化一些代码构造 在你本人的函数中强迫执行仅位置参数 指定更准确的类型提示 运用f字符串停止更简单的调试 除了少数例外,Python 3.8对早期版本停止了许多小的改良。在本文结尾处,你将看到许多这些不太引人留意的更改,并讨论了一些使Python 3.8比其先前版本更快的优化。最后,你还会取得一些有关晋级到新版本的倡议。 一、赋值表达式(Assignment expressions) 引入赋值表达式,能够说是Python3.8 中最大的一个变化了。留意,如今曾经用新的符号了(:=),形似海象侧牙,也被称为"海象运算符”。赋值表达式能够在统一表达式中赋值并返回值,比方下面的代码,执行给变量分配值,并打印这个值 >>> walrus = False >>> print(walrus) False Python3.8中,能够运用 walrus 运算符将上面两个语句兼并为一句 >>> print(walrus := True) True 赋值表达式能够把 True 分配给 walrus,并直接 print 这个值。一定要有(:= ),不然表达式也是无法正常执行的,有了新的赋值表达式符号,不只在结构上更烦琐,有时也能够更分明的传达代码企图。 比方,在while循环中,就表现了(:= )的优势 inputs = list() current = input("Write something: ") while current != "quit": inputs.append(current) current = input("Write something: ") 上面的这段代码并不够优秀,需求不时反复 input 语句,并且需求以某种方式加到 current 列表中,然后在执行后面的代码,更好的处理计划是设置一个无限 while 循环,然后用 break中止循环 inputs = list() while True: current = input("Write something: ") if current == "quit": break inputs.append(current) 这段代码与上面的代码是等效的,不过,假如运用赋值表达式,还能够再进一步简化这段循环: inputs = list() while (current := input("Write something: ")) != "quit": inputs.append(current) 如今的代码固然更简化了,但是可读性就变差了,所以,大家要运用赋值表达式的办法还需求分离本身停止判别。 PEP572中描绘了复制表达式的一切细节,大家能够深化阅读。 仅位置参数(Positional-Only Arguments) 内置函数 float()可用于将文本字符串和数字类型转换成 float 对象,如下面的代码 >>> float("3.8") 3.8 >>> help(float) class float(object) | float(x=0, /) | | Convert a string or number to a floating point number, if possible. [...] float (/) 中 (/) 是什么意义?有关这局部内容的讨论能够参考下面的文档,今天的内容中不做为我们的重点内容 PEP 457 -- Notation For Positional-Only Parameters https://www.python.org/dev/peps/pep-0457/ 事实证明,固然float() 调用了参数 x,但并不允许运用其称号 >>> float(x="3.8") Traceback (most recent call last): File "", line 1, in TypeError: float() takes no keyword arguments 运用 float() 时,只允许按位置指定参数,而不能运用关键字参数。Python3.8 之前,这类仅位置参数只适用于内置参数,在我们本人定义的函数中,没有简单的办法指定参数为仅位置参数。 >>> def incr(x): ... return x + 1 ... >>> incr(3.8) 4.8 >>> incr(x=3.8) 4.8 上面这段代码运用了 *args,模仿了仅位置参数,但是不够灵敏,不易读,而在 Python3.8 中,能够用 / 来表示必需经过仅位置参数之前的参数,能够重写incr()接纳位置参数: >>> def incr(x, /): ... return x + 1 ... >>> incr(3.8) 4.8 >>> incr(x=3.8) Traceback (most recent call last): File "", line 1, in TypeError: incr() got some positional-only arguments passed as keyword arguments: 'x' 经过在 x 之后参加 /,就能够指定 x 为 仅位置参数。常规参数与仅位置参数分离运用,可将常规参数放在 / 之后: >>> def greet(name, /, greeting="Hello"): ... return f"{greeting}, {name}" ... >>> greet("?ukasz") 'Hello, ?ukasz' >>> greet("?ukasz", greeting="Awesome job") 'Awesome job, ?ukasz' >>> greet(name="?ukasz", greeting="Awesome job") Traceback (most recent call last): File "", line 1, in TypeError: greet() got some positional-only arguments passed as keyword arguments: 'name' greet() 中,/ 放在 name 和 greeting 之间,表示 name 是仅位置参数,greeting 是能够经过位置或关键字传送的常规参数。 大家可能觉得仅位置参数的可读性似乎并不好,但是运用后会发现,很多状况下,只要仅位置参数能够优化我们的代码。此外,运用仅位置函数还有一个益处,能够更轻松地重构函数,更改函数的称号时,不用担忧给其他代码带来的影响。仅位置函数还很好的补充了仅关键字参数,能够运用 * 指定仅关键字参数: >>> def to_fahrenheit(*, celsius): ... return 32 + celsius * 9 / 5 ... >>> to_fahrenheit(40) Traceback (most recent call last): File "", line 1, in TypeError: to_fahrenheit() takes 0 positional arguments but 1 was given >>> to_fahrenheit(celsius=40) 104.0 上段代码中,celsius 是仅关键字参数。 还能够经过按 / 和分隔的次第组合仅位置、常规和仅关键字参数 *,例如下段代码中,text 是仅位置参数,border 是常规参数(值为默许值),并且 width 是仅关键字参数(值为默许值): >>> def headline(text, /, border="?", *, width=50): ... return f" {text} ".center(width, border) ...text 是仅位置参数,因而不能运用关键字 text: >>> headline("Positional-only Arguments") '??????????? Positional-only Arguments ????????????' >>> headline(text="This doesn't work!") Traceback (most recent call last): File "", line 1, in TypeError: headline() got some positional-only arguments passed as keyword arguments: 'text' border 既能够运用关键字,也能够不运用关键字指定: >>> headline("Python 3.8", "=") '=================== Python 3.8 ===================' >>> headline("Real Python", border=":") ':::::::::::::::::: Real Python :::::::::::::::::::' 最后,width 必需用关键字指定: >>> >>> headline("Python", "?", width=38) '??????????????? Python ???????????????' >>> headline("Python", "?", 38) Traceback (most recent call last): File "", line 1, in TypeError: headline() takes from 1 to 2 positional arguments but 3 were given 更多细致类型 此时,Python的类型系统曾经相当成熟。但是,在Python 3.8中,键入中添加了一些新功用,以允许停止更准确的键入: 文字类型 打字字典 最终对象 协议 Python支持可选的类型提示,通常作为代码上的注释: def double(number: float) -> float: return 2 * number 在此示例中,数字应该是浮点数,并且double()函数也应该返回浮点数。但是,Python将这些注释视为提示。它们不会在运转时强迫执行: >>> double(3.14) 6.28 >>> double("I'm not a float") "I'm not a floatI'm not a float" double()将"我不是浮点数”作为参数,即便那不是浮点数。有些库能够在运转时运用类型,但这并不是Python类型系统的主要用例。 相反,类型提示允许静态类型检查器对Python代码停止类型检查,而无需实践运转脚本。这让人想起Java,Rust和Crystal等其他言语会呈现的编译器捕获类型错误。此外,类型提示可作为代码的文档,使其更易于阅读,并改善了IDE中的自动完胜利能。 留意:有几种可用的静态类型检查器,包括Pyright,Pytype和Pyre。本文中运用Mypy。你能够运用pip从PyPI装置Mypy: 从某种意义上说,Mypy是Python类型检查器的参考完成,并在Jukka Lehtasalo的指导下由Dropbox开发。Python的创立者Guido van Rossum是Mypy团队的成员。 你能够在原始PEP 484和Python类型检查(指南)中找到有关类型提示的更多信息。 Python 3.8已承受并包含四个有关类型检查的新PEP,每个都有简短示例。 PEP 586引入了文字类型。文字类型有点特殊,它代表一个或多个特定值。文字类型的一种用例是,当运用字符串参数描绘特定行为时,可以准确地添加类型。以下为示例: # draw_line.py def draw_line(direction: str) -> None: if direction == "horizontal": ... # Draw horizontal line elif direction == "vertical": ... # Draw vertical line else: raise ValueError(f"invalid direction {direction!r}") draw_line("up") 该程序将经过静态类型检查器,即便"向上”是无效方向。类型检查器仅检查" up”能否为字符串。在这种状况下,更精确地说方向必需是文字字符串"程度”或文字字符串"垂直”。运用文字类型,你能够完整做到这一点: 由于能够将方向的允许值暴露给类型检查器,你如今能够得到有关错误的正告: $ mypy draw_line.py draw_line.py:15: error: Argument 1 to "draw_line" has incompatible type "Literal['up']"; expected "Union[Literal['horizontal'], Literal['vertical']]" Found 1 error in 1 file (checked 1 source file) 根本语法是Literal []。例如,Literal [38]代表文字值38。你能够运用Union表示多个文字值之一: 由于这是一个相当普遍的用例,因而你能够(并且应该)运用更简单的表示法Literal [" horizontal”," vertical”]]。将类型添加到draw_line()时,你曾经运用了后者。假如认真查看上面Mypy的输出,你会发现它在内部将较简单的表示法转换为Union表示法。 在某些状况下,函数的返回值的类型取决于输入参数。一个示例是open(),它能够依据mode的值返回文本字符串或字节数组。这能够经过重载来处置。 以下示例表示计算器的流程,该计算器能够将答案返回为正数(38)或罗马数字(XXXVIII): # calculator.py from typing import Union ARABIC_TO_ROMAN = [(1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"), (90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")] def _convert_to_roman_numeral(number: int) -> str: """Convert number to a roman numeral string""" result = list() for arabic, roman in ARABIC_TO_ROMAN: count, number = divmod(number, arabic) result.append(roman * count) return "".join(result) def add(num_1: int, num_2: int, to_roman: bool = True) -> Union[str, int]: """Add two numbers""" result = num_1 + num_2 if to_roman: return _convert_to_roman_numeral(result) else: return result

关注本站微信公众号(和以上内容无关)Debiancn ,扫码关注:DebianCN

17 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传